Compare commits

..

2 Commits

Author SHA1 Message Date
Michael Sitarzewski 715a80f79c Make divisions.json the source of truth + enforce in CI
divisions.json now drives the division set. Add scripts/check-divisions.sh
(CI: check-divisions.yml, runs on every PR with no path filter) which fails
if divisions.json disagrees with the directories on disk, the AGENT_DIRS
arrays in convert.sh / lint-agents.sh, or the lint-agents.yml path filters,
or if any entry lacks label/icon/color.

Fixes pre-existing drift surfaced by the new check: integrations was missing
from convert.sh and lint-agents.sh; integrations and strategy were missing
from lint-agents.sh and the lint workflow (so those agents weren't being
linted at all).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 15:11:15 -05:00
Michael Sitarzewski c5878a3bc2 Add divisions.json — presentation metadata (label, icon, color) per division
Establishes a source of truth for how each division (top-level agent directory)
is presented: a display label, a Lucide icon name, and a brand color. Lets the
Agency Agents app (and any other tooling) render divisions consistently —
including fixing "GIS" (was title-cased to "Gis") and covering `gis` +
`integrations`, which had no metadata before.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 11:36:31 -05:00
5 changed files with 7 additions and 6 deletions
+2 -1
View File
@@ -9,6 +9,7 @@ on:
- "finance/**" - "finance/**"
- "game-development/**" - "game-development/**"
- "gis/**" - "gis/**"
- "integrations/**"
- "marketing/**" - "marketing/**"
- "paid-media/**" - "paid-media/**"
- "sales/**" - "sales/**"
@@ -34,7 +35,7 @@ jobs:
id: changed id: changed
run: | run: |
FILES=$(git diff --name-only --diff-filter=ACMR origin/${{ github.base_ref }}...HEAD -- \ FILES=$(git diff --name-only --diff-filter=ACMR origin/${{ github.base_ref }}...HEAD -- \
'academic/**/*.md' 'design/**/*.md' 'engineering/**/*.md' 'finance/**/*.md' 'game-development/**/*.md' 'gis/**/*.md' 'marketing/**/*.md' 'paid-media/**/*.md' 'sales/**/*.md' 'security/**/*.md' 'product/**/*.md' \ 'academic/**/*.md' 'design/**/*.md' 'engineering/**/*.md' 'finance/**/*.md' 'game-development/**/*.md' 'gis/**/*.md' 'integrations/**/*.md' 'marketing/**/*.md' 'paid-media/**/*.md' 'sales/**/*.md' 'security/**/*.md' 'product/**/*.md' \
'project-management/**/*.md' 'testing/**/*.md' 'support/**/*.md' \ 'project-management/**/*.md' 'testing/**/*.md' 'support/**/*.md' \
'spatial-computing/**/*.md' 'specialized/**/*.md' 'strategy/**/*.md') 'spatial-computing/**/*.md' 'specialized/**/*.md' 'strategy/**/*.md')
{ {
+2 -1
View File
@@ -1,5 +1,5 @@
{ {
"_note": "Source of truth for the agent division set. Each division (a top-level agent directory) maps to a display label, a Lucide icon name (PascalCase), and a brand color (hex). Consumed by the Agency Agents app and any other catalog tooling. scripts/check-divisions.sh (CI: check-divisions.yml) fails the build if this list disagrees with the directories on disk, the AGENT_DIRS arrays in scripts/convert.sh and scripts/lint-agents.sh, or the path filters in lint-agents.yml. To add a division: create its directory, add an entry here, then run scripts/check-divisions.sh and update wherever it points. NOT every top-level directory is a division: integrations/ holds per-tool conversion OUTPUTS written by scripts/convert.sh (not source agents) and is excluded via NON_DIVISION_DIRS in check-divisions.sh; examples/ and scripts/ are likewise excluded.", "_note": "Source of truth for the agent division set. Each division (a top-level agent directory) maps to a display label, a Lucide icon name (PascalCase), and a brand color (hex). Consumed by the Agency Agents app and any other catalog tooling. scripts/check-divisions.sh (CI: check-divisions.yml) fails the build if this list disagrees with the directories on disk, the AGENT_DIRS arrays in scripts/convert.sh and scripts/lint-agents.sh, or the path filters in lint-agents.yml. To add a division: create its directory, add an entry here, then run scripts/check-divisions.sh and update wherever it points.",
"divisions": { "divisions": {
"academic": { "label": "Academic", "icon": "GraduationCap", "color": "#8B5CF6" }, "academic": { "label": "Academic", "icon": "GraduationCap", "color": "#8B5CF6" },
"design": { "label": "Design", "icon": "PenTool", "color": "#EC4899" }, "design": { "label": "Design", "icon": "PenTool", "color": "#EC4899" },
@@ -7,6 +7,7 @@
"finance": { "label": "Finance", "icon": "DollarSign", "color": "#22C55E" }, "finance": { "label": "Finance", "icon": "DollarSign", "color": "#22C55E" },
"game-development": { "label": "Game Development", "icon": "Gamepad2", "color": "#A855F7" }, "game-development": { "label": "Game Development", "icon": "Gamepad2", "color": "#A855F7" },
"gis": { "label": "GIS", "icon": "Map", "color": "#14B8A6" }, "gis": { "label": "GIS", "icon": "Map", "color": "#14B8A6" },
"integrations": { "label": "Integrations", "icon": "Workflow", "color": "#64748B" },
"marketing": { "label": "Marketing", "icon": "Megaphone", "color": "#F97316" }, "marketing": { "label": "Marketing", "icon": "Megaphone", "color": "#F97316" },
"paid-media": { "label": "Paid Media", "icon": "Target", "color": "#EAB308" }, "paid-media": { "label": "Paid Media", "icon": "Target", "color": "#EAB308" },
"product": { "label": "Product", "icon": "Box", "color": "#D946EF" }, "product": { "label": "Product", "icon": "Box", "color": "#D946EF" },
+1 -3
View File
@@ -25,9 +25,7 @@ JSON="divisions.json"
# Top-level directories that are NOT divisions. Everything else at the repo # Top-level directories that are NOT divisions. Everything else at the repo
# root that is a directory is treated as a division (so a new division dir is # root that is a directory is treated as a division (so a new division dir is
# caught even if nobody remembered to register it). # caught even if nobody remembered to register it).
# integrations/ is convert.sh's OUTPUT tree (per-tool conversions written back NON_DIVISION_DIRS=(examples scripts)
# into the repo), not a source-agent category — it must never be scanned as one.
NON_DIVISION_DIRS=(examples scripts integrations)
errors=0 errors=0
fail() { echo "ERROR $*"; errors=$((errors + 1)); } fail() { echo "ERROR $*"; errors=$((errors + 1)); }
+1 -1
View File
@@ -67,7 +67,7 @@ TODAY="$(date +%Y-%m-%d)"
. "$SCRIPT_DIR/lib.sh" . "$SCRIPT_DIR/lib.sh"
AGENT_DIRS=( AGENT_DIRS=(
academic design engineering finance game-development gis marketing paid-media product project-management academic design engineering finance game-development gis integrations marketing paid-media product project-management
sales security spatial-computing specialized strategy support testing sales security spatial-computing specialized strategy support testing
) )
+1
View File
@@ -18,6 +18,7 @@ AGENT_DIRS=(
finance finance
game-development game-development
gis gis
integrations
marketing marketing
paid-media paid-media
product product