@event4u/agent-config 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent-src/personas/engineering-manager.md +133 -0
- package/.agent-src/personas/finance-partner.md +129 -0
- package/.agent-src/personas/people-strategist.md +126 -0
- package/.agent-src/personas/strategist.md +129 -0
- package/.agent-src/skills/build-buy-partner/SKILL.md +145 -0
- package/.agent-src/skills/comp-banding/SKILL.md +160 -0
- package/.agent-src/skills/competitive-moat-analysis/SKILL.md +152 -0
- package/.agent-src/skills/contracts-cognition/SKILL.md +147 -0
- package/.agent-src/skills/data-handling-judgment/SKILL.md +155 -0
- package/.agent-src/skills/forecasting/SKILL.md +164 -0
- package/.agent-src/skills/hiring-loop-design/SKILL.md +167 -0
- package/.agent-src/skills/market-entry-analysis/SKILL.md +144 -0
- package/.agent-src/skills/onboarding-program/SKILL.md +157 -0
- package/.agent-src/skills/one-on-one-cadence/SKILL.md +161 -0
- package/.agent-src/skills/org-design/SKILL.md +158 -0
- package/.agent-src/skills/perf-feedback-craft/SKILL.md +157 -0
- package/.agent-src/skills/privacy-review/SKILL.md +160 -0
- package/.agent-src/skills/runway-cognition/SKILL.md +136 -0
- package/.agent-src/skills/scenario-modeling/SKILL.md +139 -0
- package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +165 -0
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +54 -7
- package/.agent-src/skills/vision-articulation/SKILL.md +146 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/scripts/telemetry/settings.py +65 -0
- package/.agent-src/templates/scripts/tier_usage_report.py +183 -0
- package/.claude-plugin/marketplace.json +18 -1
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +106 -0
- package/README.md +3 -3
- package/docs/architecture.md +37 -11
- package/docs/catalog.md +22 -4
- package/docs/contracts/adr-forecast-construction-shape.md +89 -0
- package/docs/contracts/adr-wing4-context-spine.md +125 -0
- package/docs/contracts/command-clusters.md +41 -0
- package/docs/contracts/command-surface-tiers.md +25 -9
- package/docs/contracts/context-spine.md +8 -0
- package/docs/contracts/mcp-beta-criteria.md +129 -0
- package/docs/guidelines/wing4-handoff.md +127 -0
- package/docs/mcp-server.md +1 -1
- package/package.json +1 -1
- package/scripts/_cli/cmd_doctor.py +527 -14
- package/scripts/_cli/cmd_validate.py +10 -0
- package/scripts/agent-config +19 -18
- package/scripts/install.py +5 -0
- package/scripts/lint_context_spine_usage.py +1 -0
- package/scripts/mcp_server/__init__.py +1 -0
- package/scripts/mcp_server/server.py +4 -3
- package/scripts/schemas/skill.schema.json +2 -2
- package/scripts/skill_linter.py +107 -3
package/scripts/agent-config
CHANGED
|
@@ -62,17 +62,6 @@ Tier 0 — daily-driver (init → sync → validate → work):
|
|
|
62
62
|
(Option-A loop; called by the /work command)
|
|
63
63
|
implement-ticket Drive the work_engine Python engine on a ticket envelope
|
|
64
64
|
(Option-A loop; called by the /implement-ticket command)
|
|
65
|
-
first-run Guided first-run setup — cost profile, settings, tooling
|
|
66
|
-
keys:install-anthropic Install the Anthropic API key for the AI Council
|
|
67
|
-
(interactive, /dev/tty only, writes ~/.config/agent-config/anthropic.key 0600)
|
|
68
|
-
keys:install-openai Install the OpenAI API key for the AI Council
|
|
69
|
-
(interactive, /dev/tty only, writes ~/.config/agent-config/openai.key 0600)
|
|
70
|
-
council:estimate Pre-call council cost preview (no API call, no spend)
|
|
71
|
-
Usage: council:estimate <question> [--input-mode prompt|roadmap]
|
|
72
|
-
council:run Run the council. Requires --confirm to spend.
|
|
73
|
-
Usage: council:run <question> --output <path> --confirm
|
|
74
|
-
council:render Re-render a saved council responses JSON to markdown
|
|
75
|
-
Usage: council:render <responses.json>
|
|
76
65
|
help Show this help (default Tier-0; --tier=1|all expands)
|
|
77
66
|
--version, -V Print package version
|
|
78
67
|
EOF
|
|
@@ -110,6 +99,17 @@ Tier 1 — power-user (release shape, audit, migration):
|
|
|
110
99
|
Flags: --json | --project=<path>
|
|
111
100
|
migrate One-shot migration off legacy composer / npm install paths
|
|
112
101
|
Flags: --dry-run (detect only)
|
|
102
|
+
first-run Guided first-run setup — cost profile, settings, tooling
|
|
103
|
+
keys:install-anthropic Install the Anthropic API key for the AI Council
|
|
104
|
+
(interactive, /dev/tty only, writes ~/.config/agent-config/anthropic.key 0600)
|
|
105
|
+
keys:install-openai Install the OpenAI API key for the AI Council
|
|
106
|
+
(interactive, /dev/tty only, writes ~/.config/agent-config/openai.key 0600)
|
|
107
|
+
council:estimate Pre-call council cost preview (no API call, no spend)
|
|
108
|
+
Usage: council:estimate <question> [--input-mode prompt|roadmap]
|
|
109
|
+
council:run Run the council. Requires --confirm to spend.
|
|
110
|
+
Usage: council:run <question> --output <path> --confirm
|
|
111
|
+
council:render Re-render a saved council responses JSON to markdown
|
|
112
|
+
Usage: council:render <responses.json>
|
|
113
113
|
EOF
|
|
114
114
|
fi
|
|
115
115
|
|
|
@@ -124,6 +124,7 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
|
|
|
124
124
|
(one-line MCP server onboarding; idempotent)
|
|
125
125
|
mcp:run Run the built-in MCP server over stdio
|
|
126
126
|
(requires `mcp:setup` first; see docs/mcp-server.md)
|
|
127
|
+
(experimental — beta gates: docs/contracts/mcp-beta-criteria.md)
|
|
127
128
|
roadmap:progress Regenerate agents/roadmaps-progress.md from open roadmaps
|
|
128
129
|
roadmap:progress-check Fail if agents/roadmaps-progress.md is stale (for CI)
|
|
129
130
|
hooks:install Install the pre-commit roadmap-progress hook
|
|
@@ -161,7 +162,7 @@ EOF
|
|
|
161
162
|
if [[ "$tier" == "0" ]]; then
|
|
162
163
|
cat <<'EOF'
|
|
163
164
|
|
|
164
|
-
(Hidden:
|
|
165
|
+
(Hidden: 15 Tier-1 + 26 Tier-2 commands. Run `./agent-config --help --tier=1`
|
|
165
166
|
or `--tier=all` to see them. Tier criteria: docs/contracts/command-surface-tiers.md.)
|
|
166
167
|
EOF
|
|
167
168
|
fi
|
|
@@ -173,14 +174,8 @@ Examples (Tier 0):
|
|
|
173
174
|
./agent-config sync --dry-run
|
|
174
175
|
./agent-config sync
|
|
175
176
|
./agent-config validate
|
|
176
|
-
./agent-config first-run
|
|
177
177
|
./agent-config work --state-file .work-state.json --prompt-file prompt.txt
|
|
178
178
|
./agent-config implement-ticket --state-file .work-state.json
|
|
179
|
-
./agent-config keys:install-anthropic
|
|
180
|
-
./agent-config keys:install-openai
|
|
181
|
-
./agent-config council:estimate prompt.txt
|
|
182
|
-
./agent-config council:run prompt.txt --output agents/council-sessions/out.json --confirm
|
|
183
|
-
./agent-config council:render agents/council-sessions/out.json
|
|
184
179
|
EOF
|
|
185
180
|
|
|
186
181
|
if [[ "$tier" == "1" || "$tier" == "all" ]]; then
|
|
@@ -203,6 +198,12 @@ Examples (Tier 1):
|
|
|
203
198
|
./agent-config versions --json
|
|
204
199
|
./agent-config init --offline --tools=claude-code,cursor --yes
|
|
205
200
|
./agent-config update --offline --to=2.2.0
|
|
201
|
+
./agent-config first-run
|
|
202
|
+
./agent-config keys:install-anthropic
|
|
203
|
+
./agent-config keys:install-openai
|
|
204
|
+
./agent-config council:estimate prompt.txt
|
|
205
|
+
./agent-config council:run prompt.txt --output agents/council-sessions/out.json --confirm
|
|
206
|
+
./agent-config council:render agents/council-sessions/out.json
|
|
206
207
|
EOF
|
|
207
208
|
fi
|
|
208
209
|
|
package/scripts/install.py
CHANGED
|
@@ -105,6 +105,11 @@ def warn(msg: str) -> None:
|
|
|
105
105
|
|
|
106
106
|
def fail(msg: str) -> "None":
|
|
107
107
|
print(f" ❌ {msg}", file=sys.stderr)
|
|
108
|
+
print(
|
|
109
|
+
" Diagnose: `./agent-config doctor` "
|
|
110
|
+
"(or `--check <id>` for a single category)",
|
|
111
|
+
file=sys.stderr,
|
|
112
|
+
)
|
|
108
113
|
sys.exit(1)
|
|
109
114
|
|
|
110
115
|
|
|
@@ -11,6 +11,7 @@ boundary in `agents/roadmaps/road-to-mcp-server.md`. No `tools`
|
|
|
11
11
|
primitive, no engine spawn, no shell execution.
|
|
12
12
|
|
|
13
13
|
Stability: experimental. Contract: `docs/contracts/mcp-phase-1-scope.md`.
|
|
14
|
+
Promotion to beta gated on `docs/contracts/mcp-beta-criteria.md`.
|
|
14
15
|
"""
|
|
15
16
|
from __future__ import annotations
|
|
16
17
|
|
|
@@ -125,9 +125,10 @@ def build_server(
|
|
|
125
125
|
name=SERVER_NAME,
|
|
126
126
|
version=__version__,
|
|
127
127
|
instructions=(
|
|
128
|
-
"agent-config MCP server (Phase 3, experimental
|
|
129
|
-
"
|
|
130
|
-
"
|
|
128
|
+
"agent-config MCP server (Phase 3, experimental; beta gates "
|
|
129
|
+
"in docs/contracts/mcp-beta-criteria.md). Exposes all skills "
|
|
130
|
+
"+ commands as instructional prompts, plus rules + guidelines "
|
|
131
|
+
"+ contexts as read-only resources."
|
|
131
132
|
),
|
|
132
133
|
)
|
|
133
134
|
|
|
@@ -72,9 +72,9 @@
|
|
|
72
72
|
"uniqueItems": true,
|
|
73
73
|
"items": {
|
|
74
74
|
"type": "string",
|
|
75
|
-
"enum": ["product", "team", "repo", "channel-stage", "funnel-stage", "customer-segment"]
|
|
75
|
+
"enum": ["product", "team", "repo", "channel-stage", "funnel-stage", "customer-segment", "fiscal-period", "org-stage", "regulatory-regime"]
|
|
76
76
|
},
|
|
77
|
-
"description": "Senior-skill opt-in for the context spine. Declares which slots under agents/context-spine/ the skill expects to read. Cross-wing slots (product, team, repo) are locked at 3 by council Q1 (KEEP-3); wing-scoped slots
|
|
77
|
+
"description": "Senior-skill opt-in for the context spine. Declares which slots under agents/context-spine/ the skill expects to read. Cross-wing slots (product, team, repo) are locked at 3 by council Q1 (KEEP-3); wing-scoped slots follow the per-wing ADR track in docs/contracts/context-spine.md § 5. Wing-3 (channel-stage, funnel-stage, customer-segment) authorized by docs/contracts/adr-gtm-context-spine.md; Wing-4 (fiscal-period, org-stage, regulatory-regime) authorized by docs/contracts/adr-wing4-context-spine.md."
|
|
78
78
|
},
|
|
79
79
|
"execution": {
|
|
80
80
|
"type": "object",
|
package/scripts/skill_linter.py
CHANGED
|
@@ -211,6 +211,48 @@ WING3_CHANNEL_TACTIC_PATTERN = re.compile(
|
|
|
211
211
|
re.IGNORECASE,
|
|
212
212
|
)
|
|
213
213
|
|
|
214
|
+
# --- Wing-4 Money/Strategy/Ops cognition-boundary patterns (council Q7 / J2) ---
|
|
215
|
+
# Triggered only when a skill's context_spine declares a Wing-4 slot.
|
|
216
|
+
# See docs/contracts/adr-wing4-context-spine.md and
|
|
217
|
+
# agents/roadmaps/road-to-money-strategy-ops.md § J2.
|
|
218
|
+
WING4_SPINE_SLOTS = {"fiscal-period", "org-stage", "regulatory-regime"}
|
|
219
|
+
|
|
220
|
+
# agent-operability: external finance / HR / legal SaaS URLs
|
|
221
|
+
WING4_SAAS_URL_PATTERN = re.compile(
|
|
222
|
+
r"https?://[\w.-]*\.(quickbooks|intuit|netsuite|xero|sage|"
|
|
223
|
+
r"carta|pulley|gusto|bamboohr|lattice|15five|justworks|"
|
|
224
|
+
r"docusign|ironclad|onetrust|rippling|workday|deel|"
|
|
225
|
+
r"namely|adp|paychex|trinet|hibob|cultureamp)\.(com|io|co)\b",
|
|
226
|
+
re.IGNORECASE,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# vendor-independence: finance / HR / legal brand / SDK slugs
|
|
230
|
+
WING4_VENDOR_BLACKLIST = re.compile(
|
|
231
|
+
r"\b(quickbooks|netsuite|xero|sage intacct|"
|
|
232
|
+
r"carta|pulley|gusto|bamboohr|lattice|15five|justworks|"
|
|
233
|
+
r"docusign|ironclad|onetrust|rippling|workday|deel|"
|
|
234
|
+
r"namely|adp|paychex|trinet|hibob|culture amp)\b",
|
|
235
|
+
re.IGNORECASE,
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# stage-agnosticism: prescriptive stage-specific thresholds that lock cognition
|
|
239
|
+
# Catches hardcoded runway / ARR / burn / team-size prescriptions tied to a
|
|
240
|
+
# specific funding stage. Framework-style framing ("read the org-stage slot",
|
|
241
|
+
# "applies across seed and public") passes; hard prescriptions ("18 months of
|
|
242
|
+
# runway", "Series A teams must hire") fire.
|
|
243
|
+
WING4_STAGE_AGNOSTIC_PATTERN = re.compile(
|
|
244
|
+
r"(?:"
|
|
245
|
+
r"\b\d+\s+months?\s+of\s+runway\b"
|
|
246
|
+
r"|\brunway\s+of\s+at\s+least\s+\d+\s+months?\b"
|
|
247
|
+
r"|\bminimum\s+runway\s+of\s+\d+\b"
|
|
248
|
+
r"|\b(?:seed|series\s+[a-d]|growth|pre-?ipo|post-?ipo)[-\s]stage\s+"
|
|
249
|
+
r"(?:companies|startups|teams|founders|orgs)\s+(?:must|should|always|never)\b"
|
|
250
|
+
r"|\bteam\s+of\s+\d+\s+(?:or\s+more|or\s+fewer)\b"
|
|
251
|
+
r"|\b(?:arr|mrr|burn\s+rate)\s+(?:of|over|under|above|below)\s+\$\d+"
|
|
252
|
+
r")",
|
|
253
|
+
re.IGNORECASE,
|
|
254
|
+
)
|
|
255
|
+
|
|
214
256
|
|
|
215
257
|
@dataclass
|
|
216
258
|
class Issue:
|
|
@@ -619,9 +661,9 @@ def lint_skill(path: Path, text: str) -> LintResult:
|
|
|
619
661
|
skill_name = path.parent.name if path.name == "SKILL.md" else path.stem
|
|
620
662
|
if skill_name and "-" not in skill_name and len(skill_name) >= 3:
|
|
621
663
|
# Single word without qualifier — likely too generic
|
|
622
|
-
ALLOWED_BARE_NOUNS = {"database", "devcontainer", "docker", "eloquent", "flux", "
|
|
623
|
-
"laravel", "livewire", "mcp", "openapi", "performance",
|
|
624
|
-
"terraform", "terragrunt", "traefik", "websocket"}
|
|
664
|
+
ALLOWED_BARE_NOUNS = {"database", "devcontainer", "docker", "eloquent", "flux", "forecasting",
|
|
665
|
+
"grafana", "laravel", "livewire", "mcp", "openapi", "performance",
|
|
666
|
+
"security", "terraform", "terragrunt", "traefik", "websocket"}
|
|
625
667
|
if skill_name.lower() not in ALLOWED_BARE_NOUNS:
|
|
626
668
|
issues.append(Issue("warning", "bare_noun_name",
|
|
627
669
|
f"Bare-noun skill name `{skill_name}` — consider adding a qualifier (e.g., `{skill_name}-management`)"))
|
|
@@ -660,6 +702,10 @@ def lint_skill(path: Path, text: str) -> LintResult:
|
|
|
660
702
|
if spine_slots and any(s in WING3_SPINE_SLOTS for s in spine_slots):
|
|
661
703
|
issues.extend(lint_wing3_boundaries(text))
|
|
662
704
|
|
|
705
|
+
# --- Wing-4 Money/Strategy/Ops cognition-boundary check (council Q7 / J2) ---
|
|
706
|
+
if spine_slots and any(s in WING4_SPINE_SLOTS for s in spine_slots):
|
|
707
|
+
issues.extend(lint_wing4_boundaries(text))
|
|
708
|
+
|
|
663
709
|
procedure_block = find_procedure_block(text)
|
|
664
710
|
if procedure_block is not None:
|
|
665
711
|
if not procedure_block:
|
|
@@ -1140,6 +1186,64 @@ def lint_wing3_boundaries(text: str) -> List[Issue]:
|
|
|
1140
1186
|
return issues
|
|
1141
1187
|
|
|
1142
1188
|
|
|
1189
|
+
def lint_wing4_boundaries(text: str) -> List[Issue]:
|
|
1190
|
+
"""Four Wing-4 Money/Strategy/Ops cognition-boundary checks.
|
|
1191
|
+
|
|
1192
|
+
Triggered when a skill's ``context_spine`` declares at least one
|
|
1193
|
+
Wing-4 slot (fiscal-period, org-stage, regulatory-regime). Enforces
|
|
1194
|
+
council Q7 / J2 verdict that Money/Strategy/Ops cognition stays:
|
|
1195
|
+
|
|
1196
|
+
- **agent-operability** — no external finance/HR/legal SaaS URLs.
|
|
1197
|
+
- **vendor-independence** — no QuickBooks/Carta/Gusto-class brand slugs.
|
|
1198
|
+
- **transferability** — no stack-locked tooling instructions.
|
|
1199
|
+
- **stage-agnosticism** — no prescriptive stage-specific thresholds.
|
|
1200
|
+
|
|
1201
|
+
Carve-outs are identical to Wing-3: fenced code, inline backticks,
|
|
1202
|
+
the ``## Do NOT`` block, and ``**WHEN NOT to use this**`` lists.
|
|
1203
|
+
Regulatory regime names (GDPR / HIPAA / SOC2 / PCI / CCPA) are
|
|
1204
|
+
cognition-relevant constraints, not vendors — they pass.
|
|
1205
|
+
"""
|
|
1206
|
+
issues: List[Issue] = []
|
|
1207
|
+
body = _strip_wing3_carve_outs(text)
|
|
1208
|
+
|
|
1209
|
+
match = WING4_SAAS_URL_PATTERN.search(body)
|
|
1210
|
+
if match:
|
|
1211
|
+
issues.append(Issue(
|
|
1212
|
+
"warning", "wing4_agent_operability",
|
|
1213
|
+
f"Wing-4 skill cites external SaaS URL `{match.group(0)}` outside "
|
|
1214
|
+
f"carve-outs — cognition skills must operate without SaaS auth "
|
|
1215
|
+
f"(council Q7 boundary)",
|
|
1216
|
+
))
|
|
1217
|
+
|
|
1218
|
+
match = WING4_VENDOR_BLACKLIST.search(body)
|
|
1219
|
+
if match:
|
|
1220
|
+
issues.append(Issue(
|
|
1221
|
+
"warning", "wing4_vendor_independence",
|
|
1222
|
+
f"Wing-4 skill names vendor `{match.group(0)}` outside carve-outs "
|
|
1223
|
+
f"— keep cognition vendor-agnostic (council Q7 boundary)",
|
|
1224
|
+
))
|
|
1225
|
+
|
|
1226
|
+
match = WING3_STACK_LOCKED_PATTERN.search(body)
|
|
1227
|
+
if match:
|
|
1228
|
+
issues.append(Issue(
|
|
1229
|
+
"warning", "wing4_transferability",
|
|
1230
|
+
f"Wing-4 skill includes stack-locked instruction `{match.group(0)}` "
|
|
1231
|
+
f"outside carve-outs — cognition should transfer across stacks "
|
|
1232
|
+
f"(council Q7 boundary)",
|
|
1233
|
+
))
|
|
1234
|
+
|
|
1235
|
+
match = WING4_STAGE_AGNOSTIC_PATTERN.search(body)
|
|
1236
|
+
if match:
|
|
1237
|
+
issues.append(Issue(
|
|
1238
|
+
"warning", "wing4_stage_agnosticism",
|
|
1239
|
+
f"Wing-4 skill prescribes stage-locked threshold "
|
|
1240
|
+
f"`{match.group(0)}` outside carve-outs — cognition must "
|
|
1241
|
+
f"transfer across seed and public (council Q7 boundary)",
|
|
1242
|
+
))
|
|
1243
|
+
|
|
1244
|
+
return issues
|
|
1245
|
+
|
|
1246
|
+
|
|
1143
1247
|
def lint_execution_metadata(execution: dict) -> List[Issue]:
|
|
1144
1248
|
"""Validate the execution block of a skill."""
|
|
1145
1249
|
issues: List[Issue] = []
|