wicked-garden 12.27.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 (640) hide show
  1. package/.claude-plugin/archetypes.json +166 -0
  2. package/.claude-plugin/components.json +75 -0
  3. package/.claude-plugin/marketplace.json +15 -0
  4. package/.claude-plugin/plugin.json +174 -0
  5. package/.claude-plugin/specialist.json +48 -0
  6. package/.claude-plugin/stack-registry.json +96 -0
  7. package/AGENTS.md +13 -0
  8. package/CHANGELOG.md +712 -0
  9. package/CONTRIBUTING.md +99 -0
  10. package/ETHOS.md +83 -0
  11. package/LICENSE +21 -0
  12. package/README.md +115 -0
  13. package/WICKED_GARDEN_BUS_EVENTS.md +149 -0
  14. package/agents/agentic/architect.md +449 -0
  15. package/agents/agentic/performance-analyst.md +702 -0
  16. package/agents/agentic/safety-reviewer.md +662 -0
  17. package/agents/crew/implementer.md +163 -0
  18. package/agents/crew/researcher.md +94 -0
  19. package/agents/crew/reviewer.md +184 -0
  20. package/agents/data/data-engineer.md +227 -0
  21. package/agents/engineering/api-documentarian.md +440 -0
  22. package/agents/engineering/migration-engineer.md +301 -0
  23. package/agents/engineering/solution-architect.md +208 -0
  24. package/agents/jam/brainstorm-facilitator.md +297 -0
  25. package/agents/jam/council.md +322 -0
  26. package/agents/jam/quick-facilitator.md +85 -0
  27. package/agents/persona/persona-agent.md +121 -0
  28. package/agents/platform/compliance-officer.md +266 -0
  29. package/agents/platform/privacy-expert.md +496 -0
  30. package/agents/platform/security-engineer.md +287 -0
  31. package/agents/product/a11y-expert.md +323 -0
  32. package/agents/product/requirements-analyst.md +238 -0
  33. package/agents/product/ui-reviewer.md +180 -0
  34. package/agents/product/ux-designer.md +199 -0
  35. package/agents/product/value-strategist.md +269 -0
  36. package/agents/qe/semantic-reviewer.md +78 -0
  37. package/commands/agentic/audit.md +24 -0
  38. package/commands/agentic/design.md +24 -0
  39. package/commands/agentic/frameworks.md +25 -0
  40. package/commands/agentic/review.md +27 -0
  41. package/commands/archetype/build.md +12 -0
  42. package/commands/archetype/decide.md +12 -0
  43. package/commands/archetype/explore.md +12 -0
  44. package/commands/archetype/incident.md +12 -0
  45. package/commands/archetype/migrate.md +12 -0
  46. package/commands/archetype/modernize.md +12 -0
  47. package/commands/archetype/review.md +14 -0
  48. package/commands/archetype/ship.md +12 -0
  49. package/commands/archetype/specify.md +12 -0
  50. package/commands/archetype/triage.md +12 -0
  51. package/commands/compile.md +37 -0
  52. package/commands/data/analyze.md +18 -0
  53. package/commands/data/data.md +21 -0
  54. package/commands/data/ml.md +18 -0
  55. package/commands/data/ontology.md +22 -0
  56. package/commands/data/pipeline.md +17 -0
  57. package/commands/deliberate.md +181 -0
  58. package/commands/engineering/add-field.md +77 -0
  59. package/commands/engineering/apply.md +58 -0
  60. package/commands/engineering/arch.md +26 -0
  61. package/commands/engineering/debug.md +27 -0
  62. package/commands/engineering/docs.md +27 -0
  63. package/commands/engineering/new-generator.md +257 -0
  64. package/commands/engineering/patch-plan.md +59 -0
  65. package/commands/engineering/plan.md +29 -0
  66. package/commands/engineering/remove.md +48 -0
  67. package/commands/engineering/rename.md +44 -0
  68. package/commands/engineering/review.md +32 -0
  69. package/commands/help.md +128 -0
  70. package/commands/install.md +118 -0
  71. package/commands/intent.md +54 -0
  72. package/commands/jam/brainstorm.md +37 -0
  73. package/commands/jam/council.md +49 -0
  74. package/commands/jam/quick.md +21 -0
  75. package/commands/jam/revisit.md +79 -0
  76. package/commands/persona/as.md +136 -0
  77. package/commands/persona/define.md +24 -0
  78. package/commands/persona/list.md +118 -0
  79. package/commands/platform/actions.md +20 -0
  80. package/commands/platform/assert.md +18 -0
  81. package/commands/platform/audit.md +23 -0
  82. package/commands/platform/compliance.md +20 -0
  83. package/commands/platform/gh.md +22 -0
  84. package/commands/platform/health.md +22 -0
  85. package/commands/platform/incident.md +23 -0
  86. package/commands/platform/infra.md +24 -0
  87. package/commands/platform/peer-health.md +103 -0
  88. package/commands/platform/plugin-health.md +58 -0
  89. package/commands/platform/security.md +38 -0
  90. package/commands/platform/toolchain.md +96 -0
  91. package/commands/platform/traces.md +20 -0
  92. package/commands/product/a11y.md +19 -0
  93. package/commands/product/acceptance.md +19 -0
  94. package/commands/product/align.md +20 -0
  95. package/commands/product/analyze.md +23 -0
  96. package/commands/product/elicit.md +19 -0
  97. package/commands/product/listen.md +24 -0
  98. package/commands/product/mockup.md +20 -0
  99. package/commands/product/screenshot.md +19 -0
  100. package/commands/product/strategy.md +40 -0
  101. package/commands/product/synthesize.md +23 -0
  102. package/commands/product/ux-review.md +42 -0
  103. package/commands/product/ux.md +20 -0
  104. package/commands/product/visual-direction.md +34 -0
  105. package/commands/prove.md +47 -0
  106. package/commands/report-issue.md +243 -0
  107. package/commands/reset.md +144 -0
  108. package/commands/search/blast-radius.md +58 -0
  109. package/commands/search/hotspots.md +55 -0
  110. package/commands/search/index.md +38 -0
  111. package/commands/search/lineage.md +47 -0
  112. package/commands/search/service-map.md +79 -0
  113. package/commands/setup.md +363 -0
  114. package/commands/smaht/briefing.md +200 -0
  115. package/commands/smaht/events-import.md +95 -0
  116. package/commands/smaht/state.md +19 -0
  117. package/commands/where-am-i.md +58 -0
  118. package/docs/README.md +32 -0
  119. package/docs/adr/0001-code-relationship-graph-engine.md +116 -0
  120. package/docs/adr/0002-major-cleanup-keep-cut.md +91 -0
  121. package/docs/adr/0003-peers-gate-required-layers-optin.md +41 -0
  122. package/docs/adr/0004-code-graph-moves-to-wicked-brain.md +47 -0
  123. package/docs/brain-chunk-format.md +135 -0
  124. package/docs/compiler.md +95 -0
  125. package/docs/daemon-api.md +70 -0
  126. package/docs/domains.md +197 -0
  127. package/docs/getting-started.md +208 -0
  128. package/docs/plans/2026-06-08-wicked-loom-conduct.md +1337 -0
  129. package/docs/plans/2026-06-08-wicked-loom-contract.md +638 -0
  130. package/docs/plans/2026-06-08-wicked-loom-cutover.md +1300 -0
  131. package/docs/plans/2026-06-08-wicked-loom-expand-compose.md +843 -0
  132. package/docs/plans/2026-06-08-wicked-loom-flow-cutover.md +403 -0
  133. package/docs/plans/2026-06-10-codegraph-to-brain-phase1a-graph-core.md +838 -0
  134. package/docs/plans/2026-06-10-codegraph-to-brain-phase1b-injected-edges.md +44 -0
  135. package/docs/required-peers.md +60 -0
  136. package/docs/specs/2026-06-08-wicked-loom-extraction.md +225 -0
  137. package/docs/specs/2026-06-10-codegraph-to-brain-migration.md +168 -0
  138. package/docs/v11/archetypes.md +231 -0
  139. package/hooks/hooks.json +275 -0
  140. package/hooks/scripts/bootstrap.py +1797 -0
  141. package/hooks/scripts/invoke.py +62 -0
  142. package/hooks/scripts/notification.py +166 -0
  143. package/hooks/scripts/permission_request.py +223 -0
  144. package/hooks/scripts/post_tool.py +1374 -0
  145. package/hooks/scripts/pre_compact.py +272 -0
  146. package/hooks/scripts/pre_tool.py +1278 -0
  147. package/hooks/scripts/prompt_submit.py +1109 -0
  148. package/hooks/scripts/session_end.py +95 -0
  149. package/hooks/scripts/stop.py +624 -0
  150. package/hooks/scripts/subagent_lifecycle.py +464 -0
  151. package/hooks/scripts/subscribers/on_gate_decided.py +84 -0
  152. package/hooks/scripts/task_completed.py +322 -0
  153. package/hooks/scripts/worktree_guard.py +148 -0
  154. package/hooks/subscriptions/on_gate_decided.json +9 -0
  155. package/install.mjs +128 -0
  156. package/package.json +41 -0
  157. package/pyproject.toml +59 -0
  158. package/schemas/README.md +32 -0
  159. package/schemas/assert_contracts.json +37 -0
  160. package/schemas/health_probe.json +46 -0
  161. package/schemas/plugin_status.json +37 -0
  162. package/scripts/_adapters/__init__.py +166 -0
  163. package/scripts/_adapters/jira_adapter.py +18 -0
  164. package/scripts/_adapters/linear_adapter.py +18 -0
  165. package/scripts/_adapters/miro_adapter.py +18 -0
  166. package/scripts/_adapters/notion_adapter.py +18 -0
  167. package/scripts/_agents.py +357 -0
  168. package/scripts/_brain_ingest/__init__.py +2 -0
  169. package/scripts/_brain_ingest/session_fact_extractor.py +341 -0
  170. package/scripts/_brain_port.py +163 -0
  171. package/scripts/_bus.py +1081 -0
  172. package/scripts/_bus_catalog_gen.py +93 -0
  173. package/scripts/_bus_consumers.json +46 -0
  174. package/scripts/_bus_emit.py +43 -0
  175. package/scripts/_capability_registry.py +334 -0
  176. package/scripts/_capability_resolver.py +322 -0
  177. package/scripts/_domain_store.py +559 -0
  178. package/scripts/_event_log_reader.py +154 -0
  179. package/scripts/_event_schema.py +305 -0
  180. package/scripts/_event_store.py +397 -0
  181. package/scripts/_heavy_cadence.py +324 -0
  182. package/scripts/_integration_resolver.py +321 -0
  183. package/scripts/_logger.py +151 -0
  184. package/scripts/_loom.py +482 -0
  185. package/scripts/_paths.py +133 -0
  186. package/scripts/_python.sh +22 -0
  187. package/scripts/_run.py +137 -0
  188. package/scripts/_session.py +502 -0
  189. package/scripts/_validate_registry.py +1042 -0
  190. package/scripts/_wicked_testing_probe.py +277 -0
  191. package/scripts/agentic/analyze_agents.py +391 -0
  192. package/scripts/agentic/detect_framework.py +420 -0
  193. package/scripts/agentic/issue_taxonomy.py +357 -0
  194. package/scripts/agentic/pattern_scorer.py +434 -0
  195. package/scripts/classify/persist.py +169 -0
  196. package/scripts/compiler/compile.py +552 -0
  197. package/scripts/compiler/phase0/VERDICT.md +60 -0
  198. package/scripts/compiler/phase0/detect.py +292 -0
  199. package/scripts/compiler/phase0/emit.py +228 -0
  200. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.bindings.json +30 -0
  201. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.lint-output.txt +17 -0
  202. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/failing-tests.txt +4 -0
  203. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/honest-tests.txt +2 -0
  204. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-fail.build.md +8 -0
  205. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-missing.build.md +8 -0
  206. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/honest.build.md +8 -0
  207. package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/wg_check_claims.py +174 -0
  208. package/scripts/compiler/phase0/evidence/command_iq.bindings.json +45 -0
  209. package/scripts/compiler/phase0/evidence/command_iq.lint-output.txt +17 -0
  210. package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/failing-tests.txt +4 -0
  211. package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/honest-tests.txt +3 -0
  212. package/scripts/compiler/phase0/evidence/command_iq.stage/fab-fail.build.md +8 -0
  213. package/scripts/compiler/phase0/evidence/command_iq.stage/fab-missing.build.md +8 -0
  214. package/scripts/compiler/phase0/evidence/command_iq.stage/honest.build.md +8 -0
  215. package/scripts/compiler/phase0/evidence/command_iq.stage/wg_check_claims.py +174 -0
  216. package/scripts/compiler/phase0/evidence/memos.bindings.json +28 -0
  217. package/scripts/compiler/phase0/evidence/memos.lint-output.txt +17 -0
  218. package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/failing-tests.txt +4 -0
  219. package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/honest-tests.txt +2 -0
  220. package/scripts/compiler/phase0/evidence/memos.stage/fab-fail.build.md +8 -0
  221. package/scripts/compiler/phase0/evidence/memos.stage/fab-missing.build.md +8 -0
  222. package/scripts/compiler/phase0/evidence/memos.stage/honest.build.md +8 -0
  223. package/scripts/compiler/phase0/evidence/memos.stage/wg_check_claims.py +174 -0
  224. package/scripts/compiler/phase0/evidence/verdict.json +104 -0
  225. package/scripts/compiler/phase0/evidence/wicked-bus.bindings.json +29 -0
  226. package/scripts/compiler/phase0/evidence/wicked-bus.lint-output.txt +17 -0
  227. package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/failing-tests.txt +4 -0
  228. package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/honest-tests.txt +3 -0
  229. package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-fail.build.md +8 -0
  230. package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-missing.build.md +8 -0
  231. package/scripts/compiler/phase0/evidence/wicked-bus.stage/honest.build.md +8 -0
  232. package/scripts/compiler/phase0/evidence/wicked-bus.stage/wg_check_claims.py +174 -0
  233. package/scripts/compiler/phase0/evidence/wire-vault-transcript.txt +60 -0
  234. package/scripts/compiler/phase0/run_probe.py +234 -0
  235. package/scripts/compiler/phase0/wire_vault.py +310 -0
  236. package/scripts/crew/__init__.py +0 -0
  237. package/scripts/crew/_task_audit_writer.py +243 -0
  238. package/scripts/crew/_task_reader.py +389 -0
  239. package/scripts/crew/archetypes_v11.py +348 -0
  240. package/scripts/crew/detectors/__init__.py +12 -0
  241. package/scripts/crew/flow_compiler.py +121 -0
  242. package/scripts/crew/phase_manager.py +703 -0
  243. package/scripts/crew/scope_delta.py +264 -0
  244. package/scripts/crew/specialist_resolver.py +218 -0
  245. package/scripts/crew/stack_registry.py +189 -0
  246. package/scripts/data/data_profiler.py +271 -0
  247. package/scripts/data/ontology_recommender.py +231 -0
  248. package/scripts/data/schema_validator.py +267 -0
  249. package/scripts/delivery/drift.py +739 -0
  250. package/scripts/delivery/telemetry.py +614 -0
  251. package/scripts/engineering/patch/codegraph_db.py +125 -0
  252. package/scripts/engineering/patch/generators/__init__.py +56 -0
  253. package/scripts/engineering/patch/generators/base.py +373 -0
  254. package/scripts/engineering/patch/generators/csharp_generator.py +494 -0
  255. package/scripts/engineering/patch/generators/go_generator.py +430 -0
  256. package/scripts/engineering/patch/generators/java_generator.py +928 -0
  257. package/scripts/engineering/patch/generators/jsp_generator.py +454 -0
  258. package/scripts/engineering/patch/generators/kotlin_generator.py +561 -0
  259. package/scripts/engineering/patch/generators/perl_generator.py +510 -0
  260. package/scripts/engineering/patch/generators/php_generator.py +644 -0
  261. package/scripts/engineering/patch/generators/propagation_engine.py +929 -0
  262. package/scripts/engineering/patch/generators/python_generator.py +487 -0
  263. package/scripts/engineering/patch/generators/ruby_generator.py +463 -0
  264. package/scripts/engineering/patch/generators/rust_generator.py +400 -0
  265. package/scripts/engineering/patch/generators/sql_generator.py +594 -0
  266. package/scripts/engineering/patch/generators/typescript_generator.py +439 -0
  267. package/scripts/engineering/patch/patch.py +800 -0
  268. package/scripts/engineering/patch/safety.py +429 -0
  269. package/scripts/jam/__init__.py +0 -0
  270. package/scripts/jam/_bus_consumers.py +271 -0
  271. package/scripts/jam/agentic_cli_registry.py +703 -0
  272. package/scripts/jam/consensus.py +737 -0
  273. package/scripts/jam/detect_clis.py +409 -0
  274. package/scripts/jam/jam.py +283 -0
  275. package/scripts/jam/save_transcript.py +171 -0
  276. package/scripts/loom/__init__.py +22 -0
  277. package/scripts/loom/cli.py +170 -0
  278. package/scripts/loom/compose.py +180 -0
  279. package/scripts/loom/gate.py +120 -0
  280. package/scripts/loom/manifest.py +140 -0
  281. package/scripts/loom/resolve.py +59 -0
  282. package/scripts/persona/__init__.py +0 -0
  283. package/scripts/persona/registry.py +688 -0
  284. package/scripts/platform/guard_pipeline.py +1214 -0
  285. package/scripts/platform/guard_profiles.py +216 -0
  286. package/scripts/platform/observability/assert_contracts.py +434 -0
  287. package/scripts/platform/observability/health_probe.py +915 -0
  288. package/scripts/platform/observability/ops_log_viewer.py +209 -0
  289. package/scripts/platform/prereq_doctor.py +567 -0
  290. package/scripts/qe/conditions_manifest.py +260 -0
  291. package/scripts/qe/content_sanitizer.py +160 -0
  292. package/scripts/qe/coverage_tracker.py +535 -0
  293. package/scripts/qe/discover_scenarios.py +243 -0
  294. package/scripts/qe/evidence_tracker.py +232 -0
  295. package/scripts/qe/prove.py +196 -0
  296. package/scripts/qe/registry_lookup.py +80 -0
  297. package/scripts/qe/registry_store.py +176 -0
  298. package/scripts/qe/semantic_review.py +1005 -0
  299. package/scripts/qe/vault_gate.py +382 -0
  300. package/scripts/qe/verdict_audit.py +175 -0
  301. package/scripts/qe/verdict_schema.py +335 -0
  302. package/scripts/reset.py +220 -0
  303. package/scripts/resolve_path.py +22 -0
  304. package/scripts/sentinel/invariants.py +402 -0
  305. package/scripts/sentinel/pre_push.py +73 -0
  306. package/scripts/setup/__init__.py +1 -0
  307. package/scripts/setup/detect_state.py +114 -0
  308. package/scripts/setup/migrate_legacy.py +67 -0
  309. package/scripts/setup/migrate_v6_projects.py +232 -0
  310. package/scripts/setup/onboarding.py +114 -0
  311. package/scripts/smaht/_bus_consumers.py +98 -0
  312. package/scripts/smaht/adapters/__init__.py +83 -0
  313. package/scripts/smaht/adapters/brain_adapter.py +254 -0
  314. package/scripts/smaht/adapters/context7_adapter.py +438 -0
  315. package/scripts/smaht/adapters/delegation_adapter.py +104 -0
  316. package/scripts/smaht/adapters/domain_adapter.py +206 -0
  317. package/scripts/smaht/adapters/events_adapter.py +231 -0
  318. package/scripts/smaht/adapters/tools_adapter.py +49 -0
  319. package/scripts/smaht/cheatsheet_store.py +236 -0
  320. package/scripts/smaht/context_package.py +386 -0
  321. package/scripts/smaht/knowledge_graph.py +395 -0
  322. package/scripts/smaht/propose_skills.py +856 -0
  323. package/scripts/smaht/test_cheatsheet_store.py +428 -0
  324. package/scripts/statusline.py +151 -0
  325. package/scripts/where_am_i.py +236 -0
  326. package/skills/agentic/agentic-patterns/SKILL.md +91 -0
  327. package/skills/agentic/agentic-patterns/refs/anti-patterns-design.md +283 -0
  328. package/skills/agentic/agentic-patterns/refs/anti-patterns-operational.md +216 -0
  329. package/skills/agentic/agentic-patterns/refs/pattern-catalog.md +329 -0
  330. package/skills/agentic/context-engineering/SKILL.md +142 -0
  331. package/skills/agentic/context-engineering/refs/caching-and-optimization.md +251 -0
  332. package/skills/agentic/context-engineering/refs/compression-techniques.md +171 -0
  333. package/skills/agentic/context-engineering/refs/cost-calculation-budget.md +250 -0
  334. package/skills/agentic/context-engineering/refs/cost-optimization-reporting.md +300 -0
  335. package/skills/agentic/context-engineering/refs/selective-loading.md +179 -0
  336. package/skills/agentic/frameworks/SKILL.md +191 -0
  337. package/skills/agentic/frameworks/refs/framework-profiles-1.md +209 -0
  338. package/skills/agentic/frameworks/refs/framework-profiles-2.md +214 -0
  339. package/skills/agentic/frameworks/refs/migration-patterns-paths.md +267 -0
  340. package/skills/agentic/frameworks/refs/migration-patterns-testing.md +208 -0
  341. package/skills/agentic/refs/audit.md +134 -0
  342. package/skills/agentic/refs/design.md +137 -0
  343. package/skills/agentic/refs/frameworks.md +102 -0
  344. package/skills/agentic/refs/review.md +160 -0
  345. package/skills/agentic/review-methodology/SKILL.md +186 -0
  346. package/skills/agentic/review-methodology/refs/deliverable-templates.md +246 -0
  347. package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +277 -0
  348. package/skills/agentic/review-methodology/refs/issue-taxonomy-reliability-safety.md +253 -0
  349. package/skills/agentic/trust-and-safety/SKILL.md +177 -0
  350. package/skills/agentic/trust-and-safety/refs/guardrails-actions.md +246 -0
  351. package/skills/agentic/trust-and-safety/refs/guardrails-input-output.md +238 -0
  352. package/skills/agentic/trust-and-safety/refs/guardrails-resources.md +209 -0
  353. package/skills/agentic/trust-and-safety/refs/safety-checklist-advanced.md +209 -0
  354. package/skills/agentic/trust-and-safety/refs/safety-checklist-core.md +215 -0
  355. package/skills/archetype/SKILL.md +104 -0
  356. package/skills/archetype/refs/build.md +142 -0
  357. package/skills/archetype/refs/decide.md +117 -0
  358. package/skills/archetype/refs/explore.md +66 -0
  359. package/skills/archetype/refs/incident.md +149 -0
  360. package/skills/archetype/refs/migrate.md +170 -0
  361. package/skills/archetype/refs/modernize.md +187 -0
  362. package/skills/archetype/refs/review.md +145 -0
  363. package/skills/archetype/refs/ship.md +117 -0
  364. package/skills/archetype/refs/specify.md +108 -0
  365. package/skills/archetype/refs/triage.md +62 -0
  366. package/skills/classify/SKILL.md +157 -0
  367. package/skills/data/analysis/SKILL.md +125 -0
  368. package/skills/data/analysis/refs/templates.md +170 -0
  369. package/skills/data/data/SKILL.md +118 -0
  370. package/skills/data/data/refs/examples.md +235 -0
  371. package/skills/data/ml/SKILL.md +125 -0
  372. package/skills/data/ml/refs/templates.md +172 -0
  373. package/skills/data/pipeline/SKILL.md +136 -0
  374. package/skills/data/pipeline/refs/templates.md +175 -0
  375. package/skills/data/refs/analyze.md +123 -0
  376. package/skills/data/refs/data.md +95 -0
  377. package/skills/data/refs/ml.md +118 -0
  378. package/skills/data/refs/pipeline.md +92 -0
  379. package/skills/deliberate/SKILL.md +125 -0
  380. package/skills/deliberate/refs/architecture-lens.md +37 -0
  381. package/skills/deliberate/refs/assumptions-lens.md +43 -0
  382. package/skills/deliberate/refs/code-lens.md +38 -0
  383. package/skills/deliberate/refs/content-lens.md +37 -0
  384. package/skills/deliberate/refs/data-lens.md +43 -0
  385. package/skills/deliberate/refs/design-lens.md +37 -0
  386. package/skills/deliberate/refs/opportunity-patterns.md +107 -0
  387. package/skills/deliberate/refs/ops-lens.md +43 -0
  388. package/skills/deliberate/refs/product-lens.md +46 -0
  389. package/skills/deliberate/refs/rethink-framework.md +77 -0
  390. package/skills/deliberate/refs/security-lens.md +47 -0
  391. package/skills/deliberate/refs/testing-lens.md +45 -0
  392. package/skills/deliberate/refs/timing-lens.md +42 -0
  393. package/skills/engineering/architecture/SKILL.md +177 -0
  394. package/skills/engineering/architecture/refs/adr-template.md +268 -0
  395. package/skills/engineering/architecture/refs/architecture-template-deployment.md +176 -0
  396. package/skills/engineering/architecture/refs/architecture-template-design.md +300 -0
  397. package/skills/engineering/architecture/refs/examples-ecommerce-analytics.md +299 -0
  398. package/skills/engineering/architecture/refs/examples-saas-trading.md +291 -0
  399. package/skills/engineering/architecture/refs/patterns-advanced.md +238 -0
  400. package/skills/engineering/architecture/refs/patterns-structural.md +303 -0
  401. package/skills/engineering/backend/SKILL.md +102 -0
  402. package/skills/engineering/backend/refs/checklists.md +146 -0
  403. package/skills/engineering/backend/refs/patterns.md +181 -0
  404. package/skills/engineering/debugging/SKILL.md +99 -0
  405. package/skills/engineering/debugging/refs/patterns.md +248 -0
  406. package/skills/engineering/debugging/refs/process.md +203 -0
  407. package/skills/engineering/docs/SKILL.md +97 -0
  408. package/skills/engineering/engineering/SKILL.md +88 -0
  409. package/skills/engineering/engineering/refs/checklists.md +91 -0
  410. package/skills/engineering/engineering/refs/templates.md +71 -0
  411. package/skills/engineering/frontend/SKILL.md +92 -0
  412. package/skills/engineering/frontend/refs/checklists.md +96 -0
  413. package/skills/engineering/frontend/refs/patterns.md +167 -0
  414. package/skills/engineering/integration/SKILL.md +183 -0
  415. package/skills/engineering/integration/refs/error-handling-best-practices.md +139 -0
  416. package/skills/engineering/integration/refs/error-handling-error-classes-typescript.md +212 -0
  417. package/skills/engineering/integration/refs/error-handling-error-response-format.md +301 -0
  418. package/skills/engineering/integration/refs/error-handling-retry-strategies.md +190 -0
  419. package/skills/engineering/integration/refs/event-schemas-best-practices.md +225 -0
  420. package/skills/engineering/integration/refs/event-schemas-event-naming-conventions.md +303 -0
  421. package/skills/engineering/integration/refs/event-schemas-event-structure.md +288 -0
  422. package/skills/engineering/integration/refs/graphql-best-practices.md +138 -0
  423. package/skills/engineering/integration/refs/graphql-error-handling.md +198 -0
  424. package/skills/engineering/integration/refs/graphql-graphql-basics.md +197 -0
  425. package/skills/engineering/integration/refs/graphql-query-examples.md +226 -0
  426. package/skills/engineering/integration/refs/graphql-schema-design-patterns.md +280 -0
  427. package/skills/engineering/integration/refs/grpc-grpc-overview.md +246 -0
  428. package/skills/engineering/integration/refs/grpc-implementation-examples.md +269 -0
  429. package/skills/engineering/integration/refs/grpc-metadata-headers.md +304 -0
  430. package/skills/engineering/integration/refs/grpc-testing.md +49 -0
  431. package/skills/engineering/integration/refs/openapi-template.yaml +682 -0
  432. package/skills/engineering/integration/refs/resilience-best-practices.md +109 -0
  433. package/skills/engineering/integration/refs/resilience-circuit-breaker-pattern.md +302 -0
  434. package/skills/engineering/integration/refs/resilience-rate-limiting.md +245 -0
  435. package/skills/engineering/integration/refs/resilience-timeout-pattern.md +212 -0
  436. package/skills/engineering/integration/refs/rest-api-fundamentals.md +299 -0
  437. package/skills/engineering/integration/refs/rest-api-responses-security.md +302 -0
  438. package/skills/engineering/integration/refs/versioning-breaking-changes.md +237 -0
  439. package/skills/engineering/integration/refs/versioning-migration-strategies.md +257 -0
  440. package/skills/engineering/integration/refs/versioning-versioning-strategies.md +296 -0
  441. package/skills/engineering/large-scale-migration/SKILL.md +65 -0
  442. package/skills/engineering/patch/SKILL.md +184 -0
  443. package/skills/engineering/refs/arch.md +126 -0
  444. package/skills/engineering/refs/debug.md +142 -0
  445. package/skills/engineering/refs/docs.md +190 -0
  446. package/skills/engineering/refs/plan.md +109 -0
  447. package/skills/engineering/refs/review.md +138 -0
  448. package/skills/engineering/system-design/SKILL.md +154 -0
  449. package/skills/engineering/system-design/refs/anti-patterns-big-ball-of-mud.md +254 -0
  450. package/skills/engineering/system-design/refs/anti-patterns-circular-dependencies.md +241 -0
  451. package/skills/engineering/system-design/refs/anti-patterns-feature-envy.md +168 -0
  452. package/skills/engineering/system-design/refs/anti-patterns-god-object.md +247 -0
  453. package/skills/engineering/system-design/refs/component-template-lifecycle.md +210 -0
  454. package/skills/engineering/system-design/refs/component-template-maintenance.md +219 -0
  455. package/skills/engineering/system-design/refs/component-template-structure.md +276 -0
  456. package/skills/engineering/system-design/refs/dependencies-best-practices.md +260 -0
  457. package/skills/engineering/system-design/refs/dependencies-dependency-principles.md +295 -0
  458. package/skills/engineering/system-design/refs/dependencies-dependency-tracking.md +261 -0
  459. package/skills/engineering/system-design/refs/interface-template-lifecycle.md +211 -0
  460. package/skills/engineering/system-design/refs/interface-template-maintenance.md +212 -0
  461. package/skills/engineering/system-design/refs/interface-template-structure.md +269 -0
  462. package/skills/engineering/system-design/refs/patterns-dependency-injection.md +151 -0
  463. package/skills/engineering/system-design/refs/patterns-facade-pattern.md +257 -0
  464. package/skills/engineering/system-design/refs/patterns-layered-pattern.md +204 -0
  465. package/skills/engineering/system-design/refs/patterns-plugin-architecture.md +229 -0
  466. package/skills/engineering/unit-test-quality/SKILL.md +194 -0
  467. package/skills/ground/SKILL.md +130 -0
  468. package/skills/integration-discovery/SKILL.md +168 -0
  469. package/skills/integration-discovery/refs/capabilities.md +282 -0
  470. package/skills/integration-discovery/refs/cli-detection.md +295 -0
  471. package/skills/integration-discovery/refs/discovery-sources.md +233 -0
  472. package/skills/integration-discovery/refs/task-patterns.md +206 -0
  473. package/skills/jam/SKILL.md +45 -0
  474. package/skills/jam/refs/facilitation-patterns.md +125 -0
  475. package/skills/jam/refs/quick.md +64 -0
  476. package/skills/jam/refs/synthesis-patterns.md +114 -0
  477. package/skills/multi-model/SKILL.md +168 -0
  478. package/skills/multi-model/refs/aichat.md +119 -0
  479. package/skills/multi-model/refs/aider.md +100 -0
  480. package/skills/multi-model/refs/auditability.md +238 -0
  481. package/skills/multi-model/refs/codex.md +169 -0
  482. package/skills/multi-model/refs/context.md +306 -0
  483. package/skills/multi-model/refs/copilot.md +161 -0
  484. package/skills/multi-model/refs/examples.md +224 -0
  485. package/skills/multi-model/refs/gemini.md +185 -0
  486. package/skills/multi-model/refs/goose.md +112 -0
  487. package/skills/multi-model/refs/llm.md +124 -0
  488. package/skills/multi-model/refs/opencode.md +196 -0
  489. package/skills/multi-model/refs/orchestration.md +188 -0
  490. package/skills/multi-model/refs/pi.md +208 -0
  491. package/skills/persona/SKILL.md +144 -0
  492. package/skills/persona/refs/define.md +133 -0
  493. package/skills/platform/actions/refs/actions.md +114 -0
  494. package/skills/platform/audit/SKILL.md +174 -0
  495. package/skills/platform/audit/refs/audit.md +145 -0
  496. package/skills/platform/audit/refs/checklists-evidence-operations.md +144 -0
  497. package/skills/platform/audit/refs/checklists-gdpr-pci-evidence.md +213 -0
  498. package/skills/platform/audit/refs/checklists-soc2-hipaa.md +120 -0
  499. package/skills/platform/audit/refs/frameworks-gdpr-pci.md +225 -0
  500. package/skills/platform/audit/refs/frameworks-soc2-hipaa.md +228 -0
  501. package/skills/platform/compliance/SKILL.md +169 -0
  502. package/skills/platform/compliance/refs/checklists.md +303 -0
  503. package/skills/platform/compliance/refs/compliance.md +117 -0
  504. package/skills/platform/compliance/refs/frameworks.md +282 -0
  505. package/skills/platform/errors/SKILL.md +183 -0
  506. package/skills/platform/errors/refs/patterns.md +271 -0
  507. package/skills/platform/errors/refs/severity.md +264 -0
  508. package/skills/platform/gate-benchmark-rebaseline/SKILL.md +108 -0
  509. package/skills/platform/gh/refs/gh.md +105 -0
  510. package/skills/platform/gh-cli/SKILL.md +120 -0
  511. package/skills/platform/gh-cli/refs/automation.md +63 -0
  512. package/skills/platform/gh-cli/refs/gh-ops.md +103 -0
  513. package/skills/platform/gh-cli/refs/patterns.md +132 -0
  514. package/skills/platform/gh-cli/scripts/gh_ops.py +454 -0
  515. package/skills/platform/github-actions/SKILL.md +159 -0
  516. package/skills/platform/github-actions/refs/security.md +150 -0
  517. package/skills/platform/github-actions/refs/templates.md +230 -0
  518. package/skills/platform/github-actions/refs/troubleshooting.md +174 -0
  519. package/skills/platform/github-actions/scripts/workflow_gen.py +215 -0
  520. package/skills/platform/gitlab-ci/SKILL.md +140 -0
  521. package/skills/platform/gitlab-ci/refs/templates.md +223 -0
  522. package/skills/platform/gitlab-ci/refs/troubleshooting.md +213 -0
  523. package/skills/platform/glab-cli/SKILL.md +133 -0
  524. package/skills/platform/glab-cli/refs/ci-debugging.md +95 -0
  525. package/skills/platform/glab-cli/refs/glab-ops.md +78 -0
  526. package/skills/platform/glab-cli/refs/patterns.md +131 -0
  527. package/skills/platform/glab-cli/scripts/glab_ops.py +313 -0
  528. package/skills/platform/health/SKILL.md +177 -0
  529. package/skills/platform/health/refs/health.md +72 -0
  530. package/skills/platform/health/refs/sources.md +302 -0
  531. package/skills/platform/incident/refs/incident.md +136 -0
  532. package/skills/platform/infra/refs/infra.md +104 -0
  533. package/skills/platform/observability/SKILL.md +128 -0
  534. package/skills/platform/observability/refs/toolchain-discovery.md +243 -0
  535. package/skills/platform/prereq-doctor/SKILL.md +57 -0
  536. package/skills/platform/prereq-doctor/refs/tool-registry.md +58 -0
  537. package/skills/platform/traces/refs/traces.md +101 -0
  538. package/skills/product/acceptance-criteria/SKILL.md +193 -0
  539. package/skills/product/acceptance-criteria/refs/ac-anti-patterns.md +291 -0
  540. package/skills/product/acceptance-criteria/refs/ac-examples.md +277 -0
  541. package/skills/product/accessibility/SKILL.md +197 -0
  542. package/skills/product/accessibility/refs/aria-patterns-basics.md +250 -0
  543. package/skills/product/accessibility/refs/aria-patterns-dynamic.md +187 -0
  544. package/skills/product/accessibility/refs/aria-patterns-interactive.md +246 -0
  545. package/skills/product/accessibility/refs/audit-report-findings.md +248 -0
  546. package/skills/product/accessibility/refs/audit-report-results.md +276 -0
  547. package/skills/product/accessibility/refs/common-violations-html-css.md +270 -0
  548. package/skills/product/accessibility/refs/common-violations-interactive.md +303 -0
  549. package/skills/product/accessibility/refs/keyboard-testing-basics.md +222 -0
  550. package/skills/product/accessibility/refs/keyboard-testing-patterns.md +173 -0
  551. package/skills/product/accessibility/refs/screen-reader-testing-advanced.md +294 -0
  552. package/skills/product/accessibility/refs/screen-reader-testing-commands.md +255 -0
  553. package/skills/product/accessibility/refs/wcag-checklist.md +262 -0
  554. package/skills/product/analyze/SKILL.md +164 -0
  555. package/skills/product/analyze/refs/algorithms.md +238 -0
  556. package/skills/product/analyze/refs/sentiment-patterns.md +180 -0
  557. package/skills/product/imagery/SKILL.md +97 -0
  558. package/skills/product/imagery/alter/SKILL.md +105 -0
  559. package/skills/product/imagery/alter/refs/editing-reference.md +146 -0
  560. package/skills/product/imagery/create/SKILL.md +109 -0
  561. package/skills/product/imagery/create/refs/prompt-engineering.md +112 -0
  562. package/skills/product/imagery/create/refs/provider-reference.md +219 -0
  563. package/skills/product/imagery/review/SKILL.md +101 -0
  564. package/skills/product/imagery/review/refs/analysis-lenses.md +136 -0
  565. package/skills/product/imagery/review/refs/quality-gates.md +153 -0
  566. package/skills/product/imagery/scripts/analyze.sh +23 -0
  567. package/skills/product/imagery/scripts/edit.sh +14 -0
  568. package/skills/product/imagery/scripts/generate.sh +13 -0
  569. package/skills/product/imagery/scripts/provider.py +787 -0
  570. package/skills/product/listen/SKILL.md +175 -0
  571. package/skills/product/listen/refs/channels.md +220 -0
  572. package/skills/product/mockup/SKILL.md +106 -0
  573. package/skills/product/mockup/refs/templates.md +95 -0
  574. package/skills/product/refs/a11y.md +109 -0
  575. package/skills/product/refs/acceptance.md +79 -0
  576. package/skills/product/refs/align.md +67 -0
  577. package/skills/product/refs/analyze.md +77 -0
  578. package/skills/product/refs/elicit.md +67 -0
  579. package/skills/product/refs/listen.md +58 -0
  580. package/skills/product/refs/mockup.md +77 -0
  581. package/skills/product/refs/screenshot.md +59 -0
  582. package/skills/product/refs/strategy.md +77 -0
  583. package/skills/product/refs/synthesize.md +54 -0
  584. package/skills/product/refs/ux-review.md +68 -0
  585. package/skills/product/refs/ux.md +101 -0
  586. package/skills/product/requirements-analysis/SKILL.md +136 -0
  587. package/skills/product/requirements-analysis/refs/requirements-example-auth.md +264 -0
  588. package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +88 -0
  589. package/skills/product/requirements-analysis/refs/requirements-output-format-template.md +247 -0
  590. package/skills/product/requirements-analysis/refs/user-story-guide.md +296 -0
  591. package/skills/product/requirements-graph/SKILL.md +155 -0
  592. package/skills/product/requirements-graph/refs/examples.md +223 -0
  593. package/skills/product/requirements-graph/refs/schema.md +162 -0
  594. package/skills/product/requirements-migrate/SKILL.md +90 -0
  595. package/skills/product/requirements-navigate/SKILL.md +141 -0
  596. package/skills/product/requirements-navigate/refs/meta-templates.md +141 -0
  597. package/skills/product/screenshot/SKILL.md +147 -0
  598. package/skills/product/strategy/SKILL.md +198 -0
  599. package/skills/product/strategy/refs/frameworks.md +295 -0
  600. package/skills/product/strategy/refs/templates-competitive-market.md +299 -0
  601. package/skills/product/strategy/refs/templates-roi-value.md +207 -0
  602. package/skills/product/synthesize/SKILL.md +116 -0
  603. package/skills/product/synthesize/refs/journey-mapping.md +212 -0
  604. package/skills/product/synthesize/refs/prioritization.md +193 -0
  605. package/skills/product/ux-review/SKILL.md +164 -0
  606. package/skills/product/visual-direction/SKILL.md +137 -0
  607. package/skills/product/visual-review/SKILL.md +131 -0
  608. package/skills/runtime-exec/SKILL.md +138 -0
  609. package/skills/search/codebase-narrator/SKILL.md +131 -0
  610. package/skills/search/codebase-narrator/refs/output-template.md +100 -0
  611. package/skills/smaht/SKILL.md +72 -0
  612. package/skills/smaht/discovery/SKILL.md +65 -0
  613. package/skills/smaht/intent/SKILL.md +89 -0
  614. package/skills/smaht/propose-skills/SKILL.md +142 -0
  615. package/skills/smaht/refs/state.md +76 -0
  616. package/skills/swarm/SKILL.md +132 -0
  617. package/skills/swarm/refs/fan-out.md +104 -0
  618. package/skills/swarm/refs/independent-verification.md +86 -0
  619. package/skills/swarm/refs/receipts-and-evidence.md +69 -0
  620. package/skills/swarm/refs/recon-synthesis.md +87 -0
  621. package/skills/swarm/refs/ship-discipline.md +90 -0
  622. package/skills/wickedizer/SKILL.md +147 -0
  623. package/skills/wickedizer/refs/artifact-types.md +238 -0
  624. package/skills/wickedizer/refs/complexity.md +278 -0
  625. package/skills/wickedizer/refs/de-ai-pass.md +140 -0
  626. package/skills/wickedizer/refs/failure-modes.md +249 -0
  627. package/skills/wickedizer/refs/patterns.md +282 -0
  628. package/skills/wickedizer/refs/review.md +221 -0
  629. package/skills/wickedizer/refs/structure.md +282 -0
  630. package/skills/wickedizer/refs/voice-profile.md +125 -0
  631. package/skills/workflow/SKILL.md +132 -0
  632. package/skills/workflow/refs/archetype-adjustments.md +205 -0
  633. package/skills/workflow/refs/evidence.md +58 -0
  634. package/skills/workflow/refs/integration.md +130 -0
  635. package/skills/workflow/refs/risk-dimension-signals.md +260 -0
  636. package/skills/workflow/refs/scoring-rubric.md +49 -0
  637. package/skills/workflow/refs/signal-keywords.md +176 -0
  638. package/skills/workflow/refs/specialist-routing-rules.md +159 -0
  639. package/skills/worktrees/SKILL.md +87 -0
  640. package/skills/worktrees/refs/recipes.md +96 -0
@@ -0,0 +1,348 @@
1
+ #!/usr/bin/env python3
2
+ """archetypes_v11.py — Work-shape archetype detection + steering engine.
3
+
4
+ v11 reframes the crew workflow: instead of a fixed
5
+ clarify->design->build->test->review pipeline with a "rigor tier" dial,
6
+ each prompt is classified into one or more **work-shape archetypes**
7
+ (triage / explore / specify / decide / ship / review / incident /
8
+ build / migrate). Each archetype owns its own phase shape, produces,
9
+ HITL discipline, and cost band. Steering directives fire per archetype,
10
+ not per fixed-pipeline phase.
11
+
12
+ This is the v6.3 archetype-detect's spiritual successor — but v6.3
13
+ classified the *target kind* (code-repo / docs-only / config-infra /
14
+ multi-repo / etc.) and used it to pick gate thresholds. v11 classifies
15
+ the *work shape* and uses it to pick the entire workflow.
16
+
17
+ The two coexist during transition:
18
+ * scripts/crew/archetype_detect.py — v6.3 target-kind classifier,
19
+ consumed by gate-adjudicator.
20
+ * scripts/crew/archetypes_v11.py — v11 work-shape classifier,
21
+ consumed by steering-aware skills.
22
+
23
+ Stdlib-only. CLI shim at bottom of file.
24
+
25
+ Usage (library):
26
+ from archetypes_v11 import detect_archetypes, steering_directives
27
+
28
+ matches = detect_archetypes(
29
+ prompt="add caching to the dashboard",
30
+ signals={"complexity": 3, "blast_radius": "low"},
31
+ )
32
+ # matches -> [("build", 0.85, ["phrase: add"])]
33
+
34
+ directives = steering_directives(matches, signals)
35
+ # directives -> [{"archetype": "build", "phases": [...], "next_action": ...}]
36
+
37
+ Usage (CLI):
38
+ sh "${CLAUDE_PLUGIN_ROOT}/scripts/_python.sh" \\
39
+ "${CLAUDE_PLUGIN_ROOT}/scripts/crew/archetypes_v11.py" \\
40
+ detect --prompt "add caching to the dashboard"
41
+ """
42
+
43
+ from __future__ import annotations
44
+
45
+ import argparse
46
+ import json
47
+ import re
48
+ import sys
49
+ from pathlib import Path
50
+ from typing import Any, Dict, List, Optional, Tuple
51
+
52
+
53
+ _THIS_DIR = Path(__file__).resolve().parent
54
+ _PLUGIN_ROOT = _THIS_DIR.parents[1]
55
+ _CATALOG_PATH = _PLUGIN_ROOT / ".claude-plugin" / "archetypes.json"
56
+
57
+
58
+ # Confidence thresholds — kept as named constants so callers can grep
59
+ # for the doctrine and tests can lock them.
60
+ HIGH_CONFIDENCE = 0.7
61
+ MEDIUM_CONFIDENCE = 0.5
62
+ LOW_CONFIDENCE = 0.3
63
+
64
+
65
+ def load_catalog(path: Optional[Path] = None) -> Dict[str, Any]:
66
+ """Return the archetype catalog dict. Raises FileNotFoundError when
67
+ the catalog isn't present — callers should not silently fall back."""
68
+ catalog_path = path or _CATALOG_PATH
69
+ return json.loads(catalog_path.read_text(encoding="utf-8"))
70
+
71
+
72
+ def _phrase_score(prompt_lower: str, phrases: List[str]) -> Tuple[float, List[str]]:
73
+ """Score how strongly the prompt matches a phrase list.
74
+
75
+ First match scores 0.55 (above MEDIUM_CONFIDENCE so a single strong
76
+ keyword trips a directive). Each additional match adds 0.2 up to a
77
+ 0.9 cap. Returns (score, hits) so the steering directive can name
78
+ the matched phrases.
79
+
80
+ Calibration rationale: archetype phrases are *category words* like
81
+ 'implement' / 'outage' / 'migrate' — they are intentionally
82
+ high-signal. One should be enough to fire 'suggest' strength; two
83
+ should escalate to 'recommend'.
84
+ """
85
+ hits: List[str] = []
86
+ for phrase in phrases:
87
+ # Word-boundary match for short phrases; substring for multi-word
88
+ # (multi-word phrases are inherently boundary-safe).
89
+ if " " in phrase:
90
+ if phrase in prompt_lower:
91
+ hits.append(phrase)
92
+ else:
93
+ pattern = re.compile(rf"\b{re.escape(phrase)}\b", re.IGNORECASE)
94
+ if pattern.search(prompt_lower):
95
+ hits.append(phrase)
96
+ if not hits:
97
+ return 0.0, []
98
+ score = 0.55 + 0.2 * (len(hits) - 1)
99
+ return min(score, 0.9), hits
100
+
101
+
102
+ def _signal_score(
103
+ archetype_signals: Dict[str, Any],
104
+ signals: Dict[str, Any],
105
+ ) -> Tuple[float, List[str]]:
106
+ """Score how the caller-provided signals agree with the archetype's
107
+ declared signals. Each agreement adds 0.3 capped at 0.9.
108
+
109
+ Recognized boolean signal flags (any subset is fine):
110
+ - novelty_high, blast_radius_high, ambiguity_high,
111
+ spec_ambiguity_high, scope_unclear, multiple_viable_options,
112
+ reversibility_medium_or_low, reversibility_low,
113
+ state_complexity_high, post_build, code_change,
114
+ production_impact, independent_assessment_needed.
115
+
116
+ Boolean True in the archetype declaration is a *requirement* —
117
+ if the caller didn't pass that signal it scores 0.
118
+ """
119
+ hits: List[str] = []
120
+ score = 0.0
121
+ for key, declared in archetype_signals.items():
122
+ if key in ("phrases", "always_on"):
123
+ continue
124
+ if declared is True and signals.get(key) is True:
125
+ score += 0.3
126
+ hits.append(f"signal: {key}")
127
+ return min(score, 0.9), hits
128
+
129
+
130
+ def _detect_one_archetype(
131
+ name: str,
132
+ archetype: Dict[str, Any],
133
+ prompt_lower: str,
134
+ signals: Dict[str, Any],
135
+ ) -> Tuple[float, List[str]]:
136
+ """Score a single archetype against the prompt + signals.
137
+
138
+ Returns (combined_score, evidence). Combined score is the max of
139
+ phrase score and signal score plus 0.1 if both are non-zero
140
+ (concordance bonus), capped at 1.0.
141
+ """
142
+ arch_signals = archetype.get("signals") or {}
143
+ if arch_signals.get("always_on"):
144
+ return 1.0, ["always_on"]
145
+
146
+ phrase_list = list(arch_signals.get("phrases") or [])
147
+ p_score, p_hits = _phrase_score(prompt_lower, phrase_list)
148
+ s_score, s_hits = _signal_score(arch_signals, signals)
149
+
150
+ if p_score == 0 and s_score == 0:
151
+ return 0.0, []
152
+
153
+ combined = max(p_score, s_score)
154
+ if p_score > 0 and s_score > 0:
155
+ combined = min(combined + 0.1, 1.0)
156
+ return combined, p_hits + s_hits
157
+
158
+
159
+ def detect_archetypes(
160
+ prompt: str,
161
+ signals: Optional[Dict[str, Any]] = None,
162
+ *,
163
+ catalog: Optional[Dict[str, Any]] = None,
164
+ threshold: float = MEDIUM_CONFIDENCE,
165
+ ) -> List[Tuple[str, float, List[str]]]:
166
+ """Classify a prompt into one or more work-shape archetypes.
167
+
168
+ Args:
169
+ prompt: User prompt or task description.
170
+ signals: Optional dict with the boolean signal flags listed in
171
+ ``_signal_score``. Typically populated from the
172
+ propose-process 9-factor scoring or from runtime hooks.
173
+ catalog: Override catalog (testing).
174
+ threshold: Drop archetypes scoring below this. Default
175
+ MEDIUM_CONFIDENCE (0.5).
176
+
177
+ Returns:
178
+ List of ``(archetype_name, score, evidence)`` tuples sorted by
179
+ score descending. Always includes ``triage`` at the end as the
180
+ fallback when no other archetype scores >= threshold.
181
+
182
+ The triage archetype is special: it is always present in the result
183
+ so callers always have a routing target. When triage is the only
184
+ item returned, the caller should ask a clarifying question rather
185
+ than dispatch.
186
+ """
187
+ catalog = catalog or load_catalog()
188
+ archetypes = catalog.get("archetypes", {})
189
+ prompt_lower = (prompt or "").lower()
190
+ signals = signals or {}
191
+
192
+ matches: List[Tuple[str, float, List[str]]] = []
193
+ for name, archetype in archetypes.items():
194
+ if name == "triage":
195
+ continue # always-on; appended last
196
+ score, evidence = _detect_one_archetype(
197
+ name, archetype, prompt_lower, signals,
198
+ )
199
+ if score >= threshold:
200
+ matches.append((name, round(score, 3), evidence))
201
+
202
+ matches.sort(key=lambda m: m[1], reverse=True)
203
+
204
+ if not matches:
205
+ # No clear shape — return triage so caller knows to clarify
206
+ return [("triage", 1.0, ["no_other_archetype_above_threshold"])]
207
+
208
+ matches.append(("triage", 1.0, ["always_on"]))
209
+ return matches
210
+
211
+
212
+ def steering_directives(
213
+ matches: List[Tuple[str, float, List[str]]],
214
+ signals: Optional[Dict[str, Any]] = None,
215
+ *,
216
+ catalog: Optional[Dict[str, Any]] = None,
217
+ ) -> List[Dict[str, Any]]:
218
+ """Turn a match list into actionable steering directives.
219
+
220
+ Each directive is a dict the caller emits as a system reminder,
221
+ a TaskCreate, or a hook output. Shape:
222
+
223
+ {
224
+ "archetype": "build",
225
+ "score": 0.85,
226
+ "evidence": ["phrase: add", "signal: code_change"],
227
+ "phases": ["plan", "implement", "test", "review"],
228
+ "produces": ["shipped-code", "test-report"],
229
+ "hitl": "discrete:review-gate",
230
+ "cost_band": "high",
231
+ "maturity": "research",
232
+ "next_action": "Run `wicked-garden:engineering:implement` ...",
233
+ "strength": "recommend" # suggest | recommend | require
234
+ }
235
+
236
+ Strength escalates with score:
237
+ score >= HIGH_CONFIDENCE -> "recommend"
238
+ score >= MEDIUM_CONFIDENCE -> "suggest"
239
+ else -> "suggest" (informational)
240
+
241
+ triage at the bottom of the match list adds an informational
242
+ directive only if it is the *sole* match (no clear shape detected).
243
+ """
244
+ catalog = catalog or load_catalog()
245
+ archetypes = catalog.get("archetypes", {})
246
+ signals = signals or {}
247
+ sole_match = len(matches) == 1 and matches[0][0] == "triage"
248
+
249
+ directives: List[Dict[str, Any]] = []
250
+ for name, score, evidence in matches:
251
+ if name == "triage" and not sole_match:
252
+ continue
253
+ archetype = archetypes.get(name, {})
254
+ if score >= HIGH_CONFIDENCE:
255
+ strength = "recommend"
256
+ else:
257
+ strength = "suggest"
258
+ directives.append({
259
+ "archetype": name,
260
+ "score": score,
261
+ "evidence": evidence,
262
+ "phases": list(archetype.get("phases", [])),
263
+ "produces": list(archetype.get("produces", [])),
264
+ "hitl": archetype.get("hitl"),
265
+ "cost_band": archetype.get("cost_band"),
266
+ "maturity": archetype.get("maturity"),
267
+ "next_action": _next_action_for(name, archetype, signals),
268
+ "strength": strength,
269
+ })
270
+ return directives
271
+
272
+
273
+ def _next_action_for(
274
+ name: str,
275
+ archetype: Dict[str, Any],
276
+ signals: Dict[str, Any],
277
+ ) -> str:
278
+ """Render the recommended next-action string for an archetype.
279
+
280
+ Kept centralized here so the wording is consistent across system
281
+ reminders, hook output, and CLI display.
282
+ """
283
+ first_phase = (archetype.get("phases") or ["?"])[0]
284
+ return (
285
+ f"Enter '{name}' archetype at phase '{first_phase}'. "
286
+ f"Phases: {' -> '.join(archetype.get('phases', []))}. "
287
+ f"Produces: {', '.join(archetype.get('produces', []))}. "
288
+ f"HITL: {archetype.get('hitl', 'none')}."
289
+ )
290
+
291
+
292
+ # ---------------------------------------------------------------------------
293
+ # CLI
294
+ # ---------------------------------------------------------------------------
295
+
296
+ def _cli() -> None:
297
+ parser = argparse.ArgumentParser(
298
+ description="v11 work-shape archetype detector + steering engine."
299
+ )
300
+ sub = parser.add_subparsers(dest="action", required=True)
301
+
302
+ detect = sub.add_parser("detect", help="Detect archetypes from prompt + signals.")
303
+ detect.add_argument("--prompt", required=True)
304
+ detect.add_argument("--signals", default=None,
305
+ help="JSON object of boolean signal flags.")
306
+ detect.add_argument("--threshold", type=float, default=MEDIUM_CONFIDENCE)
307
+ detect.add_argument("--steering", action="store_true",
308
+ help="Also emit the per-archetype steering directives.")
309
+
310
+ catalog_cmd = sub.add_parser("catalog",
311
+ help="Print the archetype catalog as JSON.")
312
+ catalog_cmd.add_argument("--name", default=None,
313
+ help="Print only one archetype by name.")
314
+
315
+ args = parser.parse_args()
316
+
317
+ if args.action == "detect":
318
+ signals = json.loads(args.signals) if args.signals else {}
319
+ matches = detect_archetypes(args.prompt, signals,
320
+ threshold=args.threshold)
321
+ result: Dict[str, Any] = {
322
+ "matches": [
323
+ {"archetype": n, "score": s, "evidence": e}
324
+ for n, s, e in matches
325
+ ]
326
+ }
327
+ if args.steering:
328
+ result["directives"] = steering_directives(matches, signals)
329
+ json.dump(result, sys.stdout, indent=2, default=str)
330
+ sys.stdout.write("\n")
331
+ return
332
+
333
+ if args.action == "catalog":
334
+ catalog = load_catalog()
335
+ if args.name:
336
+ archetype = catalog.get("archetypes", {}).get(args.name)
337
+ if archetype is None:
338
+ print(f"Unknown archetype: {args.name}", file=sys.stderr)
339
+ sys.exit(1)
340
+ json.dump({args.name: archetype}, sys.stdout, indent=2)
341
+ else:
342
+ json.dump(catalog, sys.stdout, indent=2)
343
+ sys.stdout.write("\n")
344
+ return
345
+
346
+
347
+ if __name__ == "__main__":
348
+ _cli()
@@ -0,0 +1,12 @@
1
+ """crew.detectors — steering detector registry.
2
+
3
+ PR-2 of the steering detector epic (#679) ships the first real detector:
4
+ ``sensitive_path``. Each detector is a pure stdlib module that:
5
+
6
+ 1. Takes some observed input (changed paths, gate verdicts, test results, ...)
7
+ 2. Returns a list of payloads that conform to ``crew.steering_event_schema``
8
+ 3. Optionally provides an emitter helper to push those payloads onto wicked-bus
9
+
10
+ Detectors and emitters are kept SEPARATE so that tests can validate payload
11
+ shape without touching the bus.
12
+ """
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env python3
2
+ """flow_compiler.py — compile a garden archetype into a flow definition.
3
+
4
+ The §3.1 seam: garden owns the archetype catalog and emits a flow-definition
5
+ JSON that wicked-crew consumes. This module is the thin handoff contract —
6
+ it reads .claude-plugin/archetypes.json (phases, produces, hitl) plus the
7
+ hard-gate phase map and produces the flow-definition dict.
8
+
9
+ NOTE: `loom flow run` is RETIRED (ECOSYSTEM-RATIONALIZATION.md §5a Phase B).
10
+ Flow execution is now handled by wicked-crew. The flow-definition schema is
11
+ preserved so wicked-crew can consume it directly without a format migration.
12
+
13
+ Pure + deterministic: catalog in, dict out. The only I/O is reading the catalog.
14
+
15
+ Flow-definition shape (consumed by wicked-crew):
16
+ {
17
+ "flow_id": str,
18
+ "phases": [{ "name", "gate": "produces:<id>"|null, "hitl": str, "produces": [...] }],
19
+ "peers_required": [str],
20
+ "verifier_spec_ref": str|null,
21
+ }
22
+
23
+ Translation rules (see the cutover plan's Ambiguities section):
24
+ - The catalog's `hitl` is archetype-level; the flow def needs it per-phase.
25
+ Every phase defaults to "none"; the archetype's gate discipline is attached
26
+ to its gate phase — the hard-gate phase from _HARD_GATE_PHASES when present,
27
+ else the last phase — verbatim (so "hard:cutover-gate" lands on "cutover").
28
+ - The last phase of a GATING archetype carries gate="produces:<first-produces>";
29
+ gateless archetypes (triage/explore) carry gate=null on every phase.
30
+ - peers_required = ["vault","testing"] iff produces includes "test-report",
31
+ else ["vault"]. verifier_spec_ref is null (wired later, spec §9 / #887).
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import json
37
+ import os
38
+ import re
39
+ import sys
40
+ from pathlib import Path
41
+ from typing import Any, Dict, List, Optional
42
+
43
+ # scripts/crew/ is on sys.path; import the authoritative hard-gate map so the
44
+ # compiler and phase_manager agree by construction (the parity contract).
45
+ from phase_manager import _HARD_GATE_PHASES # noqa: E402
46
+
47
+ _FLOW_ID_RE = re.compile(r"^[A-Za-z0-9_-]{1,64}$")
48
+ # Archetypes whose `hitl` is "continuous"/"none" do not produce a re-derivable
49
+ # gated artifact -> the flow is gateless (no per-phase produces gate).
50
+ _GATELESS_HITL = ("none", "continuous")
51
+
52
+
53
+ def _catalog_path() -> Path:
54
+ """Resolve .claude-plugin/archetypes.json relative to the repo root."""
55
+ root = Path(os.environ["CLAUDE_PLUGIN_ROOT"]) if os.environ.get("CLAUDE_PLUGIN_ROOT") \
56
+ else Path(__file__).resolve().parents[2]
57
+ return root / ".claude-plugin" / "archetypes.json"
58
+
59
+
60
+ def _load_catalog() -> Dict[str, Any]:
61
+ return json.loads(_catalog_path().read_text(encoding="utf-8")).get("archetypes", {})
62
+
63
+
64
+ def _hard_phase_for(archetype: str) -> Optional[str]:
65
+ """The single hard-gate phase for an archetype, or None."""
66
+ pair = _HARD_GATE_PHASES.get(archetype, ())
67
+ return pair[0] if pair else None
68
+
69
+
70
+ def compile_flow(archetype: str, *, flow_id: str,
71
+ catalog: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
72
+ """Compile one archetype into a loom flow definition (a JSON-able dict)."""
73
+ if not isinstance(flow_id, str) or not _FLOW_ID_RE.match(flow_id):
74
+ raise ValueError(f"unsafe flow_id: {flow_id!r} (kebab/snake/alnum, max 64)")
75
+
76
+ cat = catalog if catalog is not None else _load_catalog()
77
+ arch = cat.get(archetype)
78
+ if not arch:
79
+ raise ValueError(f"unknown archetype: {archetype!r} (known: {sorted(cat)})")
80
+
81
+ phase_names: List[str] = list(arch.get("phases", []))
82
+ produces: List[str] = list(arch.get("produces", []))
83
+ hitl: str = arch.get("hitl", "none")
84
+ gateless = hitl in _GATELESS_HITL or not phase_names
85
+
86
+ hard_phase = _hard_phase_for(archetype)
87
+ # The gate phase: the hard-gate phase if declared, else the last phase.
88
+ gate_phase = hard_phase if hard_phase in phase_names else (
89
+ phase_names[-1] if phase_names else None)
90
+
91
+ first_produces = produces[0] if produces else None
92
+
93
+ phases: List[Dict[str, Any]] = []
94
+ for name in phase_names:
95
+ is_gate_phase = (name == gate_phase) and not gateless
96
+ phases.append({
97
+ "name": name,
98
+ "gate": f"produces:{first_produces}" if (is_gate_phase and first_produces) else None,
99
+ "hitl": hitl if (name == gate_phase and not gateless) else "none",
100
+ "produces": list(produces) if is_gate_phase else [],
101
+ })
102
+
103
+ peers = ["vault", "testing"] if "test-report" in produces else ["vault"]
104
+ return {
105
+ "flow_id": flow_id,
106
+ "phases": phases,
107
+ "peers_required": peers,
108
+ "verifier_spec_ref": None,
109
+ }
110
+
111
+
112
+ __all__ = ["compile_flow"]
113
+
114
+
115
+ if __name__ == "__main__":
116
+ import argparse
117
+ parser = argparse.ArgumentParser(description="Compile an archetype to a loom flow definition.")
118
+ parser.add_argument("archetype")
119
+ parser.add_argument("--flow-id", required=True)
120
+ a = parser.parse_args()
121
+ print(json.dumps(compile_flow(a.archetype, flow_id=a.flow_id), indent=2))