@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.
Files changed (49) hide show
  1. package/.agent-src/personas/engineering-manager.md +133 -0
  2. package/.agent-src/personas/finance-partner.md +129 -0
  3. package/.agent-src/personas/people-strategist.md +126 -0
  4. package/.agent-src/personas/strategist.md +129 -0
  5. package/.agent-src/skills/build-buy-partner/SKILL.md +145 -0
  6. package/.agent-src/skills/comp-banding/SKILL.md +160 -0
  7. package/.agent-src/skills/competitive-moat-analysis/SKILL.md +152 -0
  8. package/.agent-src/skills/contracts-cognition/SKILL.md +147 -0
  9. package/.agent-src/skills/data-handling-judgment/SKILL.md +155 -0
  10. package/.agent-src/skills/forecasting/SKILL.md +164 -0
  11. package/.agent-src/skills/hiring-loop-design/SKILL.md +167 -0
  12. package/.agent-src/skills/market-entry-analysis/SKILL.md +144 -0
  13. package/.agent-src/skills/onboarding-program/SKILL.md +157 -0
  14. package/.agent-src/skills/one-on-one-cadence/SKILL.md +161 -0
  15. package/.agent-src/skills/org-design/SKILL.md +158 -0
  16. package/.agent-src/skills/perf-feedback-craft/SKILL.md +157 -0
  17. package/.agent-src/skills/privacy-review/SKILL.md +160 -0
  18. package/.agent-src/skills/runway-cognition/SKILL.md +136 -0
  19. package/.agent-src/skills/scenario-modeling/SKILL.md +139 -0
  20. package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +165 -0
  21. package/.agent-src/skills/unit-economics-modeling/SKILL.md +54 -7
  22. package/.agent-src/skills/vision-articulation/SKILL.md +146 -0
  23. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  24. package/.agent-src/templates/scripts/telemetry/settings.py +65 -0
  25. package/.agent-src/templates/scripts/tier_usage_report.py +183 -0
  26. package/.claude-plugin/marketplace.json +18 -1
  27. package/AGENTS.md +1 -1
  28. package/CHANGELOG.md +106 -0
  29. package/README.md +3 -3
  30. package/docs/architecture.md +37 -11
  31. package/docs/catalog.md +22 -4
  32. package/docs/contracts/adr-forecast-construction-shape.md +89 -0
  33. package/docs/contracts/adr-wing4-context-spine.md +125 -0
  34. package/docs/contracts/command-clusters.md +41 -0
  35. package/docs/contracts/command-surface-tiers.md +25 -9
  36. package/docs/contracts/context-spine.md +8 -0
  37. package/docs/contracts/mcp-beta-criteria.md +129 -0
  38. package/docs/guidelines/wing4-handoff.md +127 -0
  39. package/docs/mcp-server.md +1 -1
  40. package/package.json +1 -1
  41. package/scripts/_cli/cmd_doctor.py +527 -14
  42. package/scripts/_cli/cmd_validate.py +10 -0
  43. package/scripts/agent-config +19 -18
  44. package/scripts/install.py +5 -0
  45. package/scripts/lint_context_spine_usage.py +1 -0
  46. package/scripts/mcp_server/__init__.py +1 -0
  47. package/scripts/mcp_server/server.py +4 -3
  48. package/scripts/schemas/skill.schema.json +2 -2
  49. package/scripts/skill_linter.py +107 -3
@@ -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: 9 Tier-1 + 26 Tier-2 commands. Run `./agent-config --help --tier=1`
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
 
@@ -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
 
@@ -34,6 +34,7 @@ SKILL_GLOBS = (
34
34
  VALID_SLOTS = (
35
35
  "product", "team", "repo",
36
36
  "channel-stage", "funnel-stage", "customer-segment",
37
+ "fiscal-period", "org-stage", "regulatory-regime",
37
38
  )
38
39
 
39
40
  CONTEXT_SPINE_PAT = re.compile(
@@ -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). Exposes "
129
- "all skills + commands as instructional prompts, plus "
130
- "rules + guidelines + contexts as read-only resources."
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 (channel-stage, funnel-stage, customer-segment — Wing-3 GTM) follow the per-wing ADR track in docs/contracts/context-spine.md § 5. Wing-3 slots authorized by docs/contracts/adr-gtm-context-spine.md."
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",
@@ -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", "grafana",
623
- "laravel", "livewire", "mcp", "openapi", "performance", "security",
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] = []