@event4u/agent-config 3.3.0 → 4.2.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 (561) hide show
  1. package/.agent-src/README.md +2 -2
  2. package/.agent-src/commands/agent-handoff.md +31 -2
  3. package/.agent-src/commands/agent-status.md +5 -5
  4. package/.agent-src/commands/agents/audit.md +8 -8
  5. package/.agent-src/commands/agents/init.md +25 -1
  6. package/.agent-src/commands/agents/optimize.md +3 -3
  7. package/.agent-src/commands/agents/user.md +1 -1
  8. package/.agent-src/commands/agents.md +1 -1
  9. package/.agent-src/commands/analyze-reference-repo.md +1 -1
  10. package/.agent-src/commands/check-current-md.md +8 -8
  11. package/.agent-src/commands/{compress.md → condense.md} +55 -55
  12. package/.agent-src/commands/context/create.md +7 -4
  13. package/.agent-src/commands/context/refactor.md +3 -1
  14. package/.agent-src/commands/feature/dev.md +1 -1
  15. package/.agent-src/commands/feature/explore.md +1 -1
  16. package/.agent-src/commands/feature/plan.md +10 -8
  17. package/.agent-src/commands/feature/refactor.md +3 -1
  18. package/.agent-src/commands/feature/roadmap.md +7 -4
  19. package/.agent-src/commands/fix/portability.md +3 -3
  20. package/.agent-src/commands/fix/refs.md +4 -4
  21. package/.agent-src/commands/ghostwriter.md +2 -2
  22. package/.agent-src/commands/memory/learn-low-impact.md +3 -3
  23. package/.agent-src/commands/module/explore.md +34 -8
  24. package/.agent-src/commands/optimize/agents-dir.md +9 -7
  25. package/.agent-src/commands/optimize/augmentignore.md +2 -2
  26. package/.agent-src/commands/optimize/skills.md +9 -9
  27. package/.agent-src/commands/post-as.md +1 -1
  28. package/.agent-src/commands/project-analyze.md +2 -2
  29. package/.agent-src/commands/project-health.md +3 -2
  30. package/.agent-src/commands/research/deep.md +1 -1
  31. package/.agent-src/commands/research/report.md +1 -1
  32. package/.agent-src/commands/research.md +1 -1
  33. package/.agent-src/commands/roadmap/ai-council.md +1 -1
  34. package/.agent-src/commands/roadmap/create.md +9 -4
  35. package/.agent-src/commands/rule-compliance-audit.md +1 -1
  36. package/.agent-src/commands/upstream-contribute.md +14 -14
  37. package/.agent-src/commands/video/from-script.md +1 -1
  38. package/.agent-src/commands/video/scene.md +1 -1
  39. package/.agent-src/commands/video/stitch.md +1 -1
  40. package/.agent-src/commands/video/storyboard.md +1 -1
  41. package/.agent-src/commands/video.md +1 -1
  42. package/.agent-src/contexts/augment-infrastructure.md +1 -1
  43. package/.agent-src/contexts/authority/commit-mechanics.md +15 -0
  44. package/.agent-src/contexts/authority/kernel-rule-edits.md +3 -3
  45. package/.agent-src/contexts/authority/scope-mechanics.md +1 -1
  46. package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +28 -28
  47. package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +4 -4
  48. package/.agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
  49. package/.agent-src/contexts/contracts/artifact-engagement-flow.md +6 -6
  50. package/.agent-src/contexts/contracts/command-suggestion-flow.md +3 -3
  51. package/.agent-src/contexts/contracts/emergency-triage-block.md +4 -4
  52. package/.agent-src/contexts/contracts/frugality-charter.md +3 -3
  53. package/.agent-src/contexts/documentation-hierarchy.md +14 -7
  54. package/.agent-src/contexts/execution/autonomy-examples.md +1 -1
  55. package/.agent-src/contexts/execution/cheap-question-mechanics.md +39 -2
  56. package/.agent-src/contexts/execution/roadmap-process-loop.md +28 -5
  57. package/.agent-src/contexts/override-system.md +5 -5
  58. package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
  59. package/.agent-src/personas/advisors/first-principles.md +1 -1
  60. package/.agent-src/personas/hollywood-director.md +1 -1
  61. package/.agent-src/rules/architecture.md +5 -1
  62. package/.agent-src/rules/augment-edit-discipline.md +5 -5
  63. package/.agent-src/rules/augment-source-of-truth.md +15 -15
  64. package/.agent-src/rules/commit-conventions.md +1 -1
  65. package/.agent-src/rules/commit-policy.md +10 -0
  66. package/.agent-src/rules/domain-adoption-policy.md +3 -3
  67. package/.agent-src/rules/fast-path-marker-visibility.md +3 -3
  68. package/.agent-src/rules/finance-safety-floor.md +1 -1
  69. package/.agent-src/rules/framework-neutrality-in-generic-skills.md +8 -8
  70. package/.agent-src/rules/git-history-discipline.md +1 -1
  71. package/.agent-src/rules/improve-before-implement.md +2 -2
  72. package/.agent-src/rules/language-and-tone.md +2 -2
  73. package/.agent-src/rules/media-governance-routing.md +5 -5
  74. package/.agent-src/rules/no-attribution-footers.md +1 -0
  75. package/.agent-src/rules/no-cheap-questions.md +3 -0
  76. package/.agent-src/rules/no-decorative-emojis-in-git-surfaces.md +111 -0
  77. package/.agent-src/rules/no-pr-progress-comments.md +118 -0
  78. package/.agent-src/rules/no-roadmap-references.md +3 -3
  79. package/.agent-src/rules/non-destructive-by-default.md +1 -1
  80. package/.agent-src/rules/persona-governance.md +3 -3
  81. package/.agent-src/rules/preservation-guard.md +15 -15
  82. package/.agent-src/rules/roadmap-ci-steps-policy.md +7 -3
  83. package/.agent-src/rules/rule-type-governance.md +1 -1
  84. package/.agent-src/rules/skill-quality.md +1 -1
  85. package/.agent-src/rules/{caveman-speak.md → telegraph-speak.md} +15 -15
  86. package/.agent-src/rules/token-optimizer-maintenance.md +6 -6
  87. package/.agent-src/skills/agent-docs-writing/SKILL.md +17 -11
  88. package/.agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
  89. package/.agent-src/skills/check-refs/SKILL.md +2 -2
  90. package/.agent-src/skills/code-refactoring/SKILL.md +2 -2
  91. package/.agent-src/skills/command-writing/SKILL.md +19 -19
  92. package/.agent-src/skills/comp-banding/SKILL.md +1 -1
  93. package/.agent-src/skills/condense-memory/SKILL.md +131 -0
  94. package/.agent-src/skills/context-authoring/SKILL.md +2 -2
  95. package/.agent-src/skills/context-document/SKILL.md +5 -3
  96. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +3 -3
  97. package/.agent-src/skills/description-assist/SKILL.md +2 -2
  98. package/.agent-src/skills/git-workflow/SKILL.md +1 -1
  99. package/.agent-src/skills/guideline-writing/SKILL.md +5 -5
  100. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
  101. package/.agent-src/skills/lint-skills/SKILL.md +3 -3
  102. package/.agent-src/skills/md-language-check/SKILL.md +2 -2
  103. package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +138 -0
  104. package/.agent-src/skills/module-management/SKILL.md +166 -94
  105. package/.agent-src/skills/override-management/SKILL.md +1 -1
  106. package/.agent-src/skills/persona-writing/SKILL.md +5 -5
  107. package/.agent-src/skills/positioning-strategy/SKILL.md +1 -1
  108. package/.agent-src/skills/project-docs/SKILL.md +6 -4
  109. package/.agent-src/skills/readme-reviewer/SKILL.md +2 -2
  110. package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
  111. package/.agent-src/skills/roadmap-writing/SKILL.md +4 -2
  112. package/.agent-src/skills/rule-refactor/SKILL.md +5 -5
  113. package/.agent-src/skills/rule-writing/SKILL.md +18 -18
  114. package/.agent-src/skills/script-writing/SKILL.md +1 -1
  115. package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +6 -6
  116. package/.agent-src/skills/skill-management/SKILL.md +21 -21
  117. package/.agent-src/skills/skill-reviewer/SKILL.md +2 -2
  118. package/.agent-src/skills/skill-writing/SKILL.md +8 -8
  119. package/.agent-src/skills/skill-writing/evals/triggers.json +1 -1
  120. package/.agent-src/skills/token-optimizer/SKILL.md +4 -4
  121. package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -1
  122. package/.agent-src/skills/upstream-contribute/SKILL.md +17 -17
  123. package/.agent-src/templates/AGENTS.md +1 -0
  124. package/.agent-src/templates/agent-settings.md +24 -13
  125. package/.agent-src/templates/agents/agent-project-settings.example.yml +61 -2
  126. package/.agent-src/templates/command.md +5 -5
  127. package/.agent-src/templates/contexts.md +1 -1
  128. package/.agent-src/templates/copilot-instructions.md +8 -8
  129. package/.agent-src/templates/features.md +1 -1
  130. package/.agent-src/templates/hooks/pre-commit-frontmatter +2 -2
  131. package/.agent-src/templates/hooks/pre-commit-roadmap-progress +3 -3
  132. package/.agent-src/templates/persona.md +2 -2
  133. package/.agent-src/templates/roadmaps.md +1 -1
  134. package/.agent-src/templates/rule.md +13 -13
  135. package/.agent-src/templates/scripts/memory_lookup.py +1 -1
  136. package/.agent-src/templates/scripts/memory_status.py +2 -2
  137. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +195 -1
  138. package/.agent-src/templates/scripts/work_engine/orchestration.py +1 -1
  139. package/.agent-src/templates/skill-archive-note.md +5 -5
  140. package/.agent-src/templates/skill.md +1 -1
  141. package/.claude-plugin/marketplace.json +4 -4
  142. package/AGENTS.md +16 -17
  143. package/CHANGELOG.md +216 -3
  144. package/CONTRIBUTING.md +31 -12
  145. package/README.md +21 -12
  146. package/config/agent-settings.template.yml +22 -2
  147. package/config/discovery/unassigned-artefacts.yml +24 -24
  148. package/config/profiles/full.ini +1 -1
  149. package/dist/cli/agent-config.js +52 -3
  150. package/dist/cli/agent-config.js.map +1 -1
  151. package/dist/cli/commands/uiServe.js +9 -0
  152. package/dist/cli/commands/uiServe.js.map +1 -1
  153. package/dist/cli/registry.js +2 -1
  154. package/dist/cli/registry.js.map +1 -1
  155. package/dist/discovery/deprecation-report.md +1 -1
  156. package/dist/discovery/discovery-manifest.json +649 -606
  157. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  158. package/dist/discovery/discovery-manifest.summary.md +4 -4
  159. package/dist/discovery/orphan-report.md +1 -1
  160. package/dist/discovery/packs.json +439 -437
  161. package/dist/discovery/trust-report.md +5 -5
  162. package/dist/discovery/workspaces.json +450 -448
  163. package/dist/install/atomic.js +92 -0
  164. package/dist/install/atomic.js.map +1 -0
  165. package/dist/install/conflict.js +196 -0
  166. package/dist/install/conflict.js.map +1 -0
  167. package/dist/install/detect.js +218 -0
  168. package/dist/install/detect.js.map +1 -0
  169. package/dist/install/paths.js +82 -0
  170. package/dist/install/paths.js.map +1 -0
  171. package/dist/install/plan.js +157 -0
  172. package/dist/install/plan.js.map +1 -0
  173. package/dist/install/txlog.js +140 -0
  174. package/dist/install/txlog.js.map +1 -0
  175. package/dist/install/types.js +19 -0
  176. package/dist/install/types.js.map +1 -0
  177. package/dist/install/wizard-plan.js +184 -0
  178. package/dist/install/wizard-plan.js.map +1 -0
  179. package/dist/mcp/registry-manifest.json +4 -4
  180. package/dist/router.json +67 -19
  181. package/dist/server/app.js +6 -0
  182. package/dist/server/app.js.map +1 -1
  183. package/dist/server/routes/install.js +358 -0
  184. package/dist/server/routes/install.js.map +1 -0
  185. package/dist/server/routes/wizard.js +468 -32
  186. package/dist/server/routes/wizard.js.map +1 -1
  187. package/dist/server/routes/workspace.js +396 -0
  188. package/dist/server/routes/workspace.js.map +1 -0
  189. package/dist/server/schemas/settings.js +5 -3
  190. package/dist/server/schemas/settings.js.map +1 -1
  191. package/dist/ui/assets/index-BDAhhpDV.js +40 -0
  192. package/dist/ui/assets/index-BDAhhpDV.js.map +1 -0
  193. package/dist/ui/assets/index-BXZILUxe.css +1 -0
  194. package/dist/ui/index.html +2 -2
  195. package/docs/MIGRATION.md +1 -1
  196. package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
  197. package/docs/adrs/router/0001-three-tier-routing.md +4 -4
  198. package/docs/adrs/schema/0001-json-schema-frontmatter.md +1 -1
  199. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +4 -4
  200. package/docs/adrs/{caveman → telegraph}/0001-default-off-until-bench.md +9 -9
  201. package/docs/adrs/telegraph/README.md +9 -0
  202. package/docs/architecture/augment-projection.md +4 -4
  203. package/docs/architecture/claude-bundle.md +1 -1
  204. package/docs/architecture/current-onboard-baseline.md +3 -3
  205. package/docs/architecture/multi-tool-projection.md +10 -10
  206. package/docs/architecture/source-projection.md +27 -27
  207. package/docs/architecture.md +19 -15
  208. package/docs/archive/CHANGELOG-pre-2.11.0.md +2 -2
  209. package/docs/archive/CHANGELOG-pre-2.15.0.md +3 -3
  210. package/docs/archive/CHANGELOG-pre-2.16.0.md +1 -1
  211. package/docs/archive/CHANGELOG-pre-2.2.0.md +70 -70
  212. package/docs/archive/CHANGELOG-pre-2.20.0.md +2 -2
  213. package/docs/archive/CHANGELOG-pre-2.25.0.md +15 -15
  214. package/docs/archive/CHANGELOG-pre-3.0.0.md +4 -4
  215. package/docs/archive/CHANGELOG-pre-3.1.0.md +2 -2
  216. package/docs/archive/CHANGELOG-pre-3.2.0.md +3 -3
  217. package/docs/benchmark.md +65 -0
  218. package/docs/benchmarks.md +16 -16
  219. package/docs/catalog.md +17 -15
  220. package/docs/contracts/CHANGELOG-conventions.md +1 -1
  221. package/docs/contracts/STABILITY.md +2 -2
  222. package/docs/contracts/adoption-signal-floor.md +110 -0
  223. package/docs/contracts/adr-chat-history-split.md +4 -4
  224. package/docs/contracts/adr-command-suggestion.md +4 -4
  225. package/docs/contracts/adr-gtm-context-spine.md +1 -1
  226. package/docs/contracts/adr-implement-ticket-runtime.md +4 -4
  227. package/docs/contracts/adr-install-user-type-axis.md +1 -1
  228. package/docs/contracts/adr-layout.md +2 -2
  229. package/docs/contracts/adr-product-ui-track.md +10 -10
  230. package/docs/contracts/adr-user-types-axis.md +3 -3
  231. package/docs/contracts/adr-wing4-context-spine.md +1 -1
  232. package/docs/contracts/agent-memory-contract.md +3 -3
  233. package/docs/contracts/agents-md-tech-stack.md +2 -2
  234. package/docs/contracts/ai-council-config.md +2 -2
  235. package/docs/contracts/at-rest-encryption.md +4 -0
  236. package/docs/contracts/audit-log-v1.md +1 -1
  237. package/docs/contracts/benchmark-ab-contract.md +101 -0
  238. package/docs/contracts/benchmark-corpus-spec.md +1 -1
  239. package/docs/contracts/branch-protection-policy.md +98 -0
  240. package/docs/contracts/ci-cost-budget.md +106 -0
  241. package/docs/contracts/ci-green-floor.md +141 -0
  242. package/docs/contracts/command-clusters.md +6 -6
  243. package/docs/contracts/command-surface-tiers.md +2 -2
  244. package/docs/contracts/command-taxonomy.md +2 -2
  245. package/docs/contracts/{compression-default-kill-criterion.md → condensation-default-kill-criterion.md} +29 -29
  246. package/docs/contracts/config-presets.md +1 -1
  247. package/docs/contracts/context-paths.md +3 -3
  248. package/docs/contracts/context-spine.md +1 -1
  249. package/docs/contracts/cost-summary-schema.md +12 -12
  250. package/docs/contracts/cross-wing-handoff.md +4 -4
  251. package/docs/contracts/daily-workspace.md +4 -0
  252. package/docs/contracts/decision-trace-v1.md +2 -2
  253. package/docs/contracts/discovery-manifest.md +4 -4
  254. package/docs/contracts/explain-modes.md +4 -0
  255. package/docs/contracts/file-ownership-matrix.json +3493 -3318
  256. package/docs/contracts/file-ownership-matrix.md +3 -3
  257. package/docs/contracts/frontmatter-contract.md +4 -4
  258. package/docs/contracts/ghostwriter-schema.md +3 -3
  259. package/docs/contracts/gui-wizard.md +110 -97
  260. package/docs/contracts/harness-expectations.md +123 -0
  261. package/docs/contracts/host-agent-protocol.md +4 -0
  262. package/docs/contracts/implement-ticket-flow.md +9 -9
  263. package/docs/contracts/install-scopes.md +77 -0
  264. package/docs/contracts/iron-law-overrides.txt +1 -1
  265. package/docs/contracts/kernel-membership.md +26 -26
  266. package/docs/contracts/linear-ai-rules-inclusion.md +1 -1
  267. package/docs/contracts/linter-structural-model.md +2 -2
  268. package/docs/contracts/load-context-budget-model.md +4 -4
  269. package/docs/contracts/load-context-schema.md +13 -13
  270. package/docs/contracts/local-analytics.md +4 -0
  271. package/docs/contracts/local-knowledge-ingestion.md +1 -1
  272. package/docs/contracts/mcp-cloud-scope.md +2 -2
  273. package/docs/contracts/mcp-phase-1-scope.md +3 -3
  274. package/docs/contracts/measurement-baseline.md +5 -5
  275. package/docs/contracts/mental-models.md +30 -30
  276. package/docs/contracts/multi-tool-projection-fidelity.md +4 -4
  277. package/docs/contracts/namespace.md +4 -4
  278. package/docs/contracts/orchestration-dsl-v1.md +7 -7
  279. package/docs/contracts/package-self-orientation.md +12 -12
  280. package/docs/contracts/persona-schema.md +6 -6
  281. package/docs/contracts/pilot/language-and-tone.md +1 -1
  282. package/docs/contracts/plain-language-surface.md +117 -0
  283. package/docs/contracts/profile-system.md +3 -3
  284. package/docs/contracts/release-pr-gating.md +103 -0
  285. package/docs/contracts/role-experience.md +3 -3
  286. package/docs/contracts/rule-classification.md +13 -13
  287. package/docs/contracts/rule-interactions.md +4 -4
  288. package/docs/contracts/rule-interactions.yml +30 -30
  289. package/docs/contracts/rule-priority-hierarchy.md +13 -13
  290. package/docs/contracts/rule-router.md +2 -2
  291. package/docs/contracts/safety-model.md +1 -1
  292. package/docs/contracts/skill-distribution-channels.md +61 -0
  293. package/docs/contracts/skill-domains.md +2 -2
  294. package/docs/contracts/smoke-contracts.md +5 -5
  295. package/docs/contracts/telegraph-telemetry.md +83 -0
  296. package/docs/contracts/trust-and-safety.md +5 -5
  297. package/docs/contracts/ui-stack-extension.md +7 -7
  298. package/docs/contracts/ui-track-flow.md +9 -9
  299. package/docs/contracts/user-type-schema.md +4 -4
  300. package/docs/contracts/workflow-packs.md +4 -4
  301. package/docs/contracts/workspace-documents.md +4 -0
  302. package/docs/customization.md +28 -8
  303. package/docs/decisions/ADR-001-kernel-swap-deferred.md +6 -6
  304. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -11
  305. package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +2 -2
  306. package/docs/decisions/ADR-004-rule-governance-pruning.md +4 -4
  307. package/docs/decisions/ADR-005-subagent-worktrees.md +7 -7
  308. package/docs/decisions/ADR-011-domain-pack-readiness.md +6 -6
  309. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +3 -3
  310. package/docs/decisions/ADR-015-discovery-manifest-contract.md +3 -3
  311. package/docs/decisions/ADR-017-monorepo-physical-layout.md +10 -10
  312. package/docs/decisions/ADR-018-trust-and-safety-layer.md +6 -6
  313. package/docs/decisions/ADR-019-router-json-dist-location.md +2 -2
  314. package/docs/decisions/ADR-020-global-only-consumer-scope.md +2 -2
  315. package/docs/decisions/ADR-021-deployment-shape.md +3 -3
  316. package/docs/decisions/ADR-022-daily-workspace-decomposition.md +1 -1
  317. package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +2 -2
  318. package/docs/decisions/ADR-028-root-layout.md +7 -7
  319. package/docs/decisions/ADR-029-multi-workspace-deferred.md +2 -2
  320. package/docs/decisions/ADR-rule-kernel-and-router.md +5 -5
  321. package/docs/deploy/connector-setup.md +2 -2
  322. package/docs/deploy/policy-cookbook.md +2 -2
  323. package/docs/deploy/team-deployment-posture.md +20 -0
  324. package/docs/development.md +17 -17
  325. package/docs/distribution/registries.md +32 -0
  326. package/docs/distribution/registry-submissions.md +85 -0
  327. package/docs/distribution/telemetry-schema.md +1 -1
  328. package/docs/getting-started-by-role.md +45 -3
  329. package/docs/getting-started.md +2 -2
  330. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  331. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
  332. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  333. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  334. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  335. package/docs/guidelines/agent-infra/direct-answers-demos.md +1 -1
  336. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  337. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  338. package/docs/guidelines/agent-infra/layered-settings.md +56 -2
  339. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  340. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -2
  341. package/docs/guidelines/agent-infra/rule-type-governance.md +1 -1
  342. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  343. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +2 -2
  344. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  345. package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
  346. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  347. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +1 -1
  348. package/docs/guidelines/augment-portability-patterns.md +4 -4
  349. package/docs/guidelines/cross-role-handoff.md +2 -2
  350. package/docs/guidelines/php/php-coding-patterns.md +1 -1
  351. package/docs/guidelines/prompt-templates.md +6 -6
  352. package/docs/maintainers/dev-mode.md +1 -1
  353. package/docs/mcp.md +1 -1
  354. package/docs/parity/bench.json +3 -3
  355. package/docs/parity/ruflo.md +2 -2
  356. package/docs/profiles.md +11 -11
  357. package/docs/quality.md +11 -11
  358. package/docs/safety.md +3 -3
  359. package/docs/setup/mcp-client-config.md +1 -1
  360. package/docs/setup/mcp-r2-bootstrap.md +1 -1
  361. package/docs/setup/mcp-server-docker.md +3 -3
  362. package/docs/setup/per-ide/windsurf.md +1 -1
  363. package/docs/skills-catalog.md +8 -7
  364. package/docs/troubleshooting.md +1 -1
  365. package/docs/walkthroughs/daily-workspace-a11y.md +87 -0
  366. package/llms.txt +7 -6
  367. package/package.json +1 -1
  368. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  369. package/scripts/_archive/README.md +2 -2
  370. package/scripts/_archive/_backfill_skill_domains.py +3 -3
  371. package/scripts/_archive/_bootstrap_tier_frontmatter.py +3 -3
  372. package/scripts/_archive/_p43_bodies.py +10 -10
  373. package/scripts/_archive/{_p43_compress.py → _p43_condense.py} +5 -5
  374. package/scripts/_archive/_p4_migrate.py +7 -7
  375. package/scripts/_archive/_phase2_shim_helper.py +1 -1
  376. package/scripts/_archive/_pilot_council_question.py +5 -5
  377. package/scripts/_cli/explain_last/inputs.py +1 -1
  378. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  379. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  380. package/scripts/_lib/agent_settings.py +195 -1
  381. package/scripts/_lib/agent_src.py +19 -19
  382. package/scripts/_lib/bench_ab_cache.py +162 -0
  383. package/scripts/_lib/bench_ab_scoring.py +209 -0
  384. package/scripts/_lib/{bench_caveman.py → bench_telegraph.py} +21 -21
  385. package/scripts/_lib/{bench_caveman_report.py → bench_telegraph_report.py} +21 -21
  386. package/scripts/_lib/claude_desktop_bundler.py +5 -5
  387. package/scripts/_lib/module_detection.py +223 -0
  388. package/scripts/_lib/scope_guard.sh +162 -0
  389. package/scripts/_phase4_bucket.py +3 -3
  390. package/scripts/_pilot_measure.py +4 -4
  391. package/scripts/_tmp_scan_framework_leakage.py +1 -1
  392. package/scripts/adoption_report.py +195 -0
  393. package/scripts/adoption_snapshot.py +219 -0
  394. package/scripts/adoption_status.py +166 -0
  395. package/scripts/ai-video/lib/parse-blueprint.sh +1 -1
  396. package/scripts/ai_council/advisors.py +5 -5
  397. package/scripts/ai_council/compile_corpus.py +1 -1
  398. package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +3 -3
  399. package/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +2 -2
  400. package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +1 -1
  401. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +1 -1
  402. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +1 -1
  403. package/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +3 -3
  404. package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +1 -1
  405. package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +1 -1
  406. package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +6 -6
  407. package/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +1 -1
  408. package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +6 -6
  409. package/scripts/annotate_discovery.py +13 -13
  410. package/scripts/apply_modules_config.py +290 -0
  411. package/scripts/audit_adr_coverage.py +2 -2
  412. package/scripts/audit_auto_rules.py +2 -2
  413. package/scripts/audit_cloud_compatibility.py +3 -3
  414. package/scripts/audit_command_surface.py +9 -9
  415. package/scripts/audit_likelihood.py +2 -2
  416. package/scripts/audit_user_type_axis.py +2 -2
  417. package/scripts/bench_ab_cache_dispatch.py +68 -0
  418. package/scripts/bench_ab_clone.py +170 -0
  419. package/scripts/bench_ab_diff.py +227 -0
  420. package/scripts/bench_ab_integrity.py +143 -0
  421. package/scripts/bench_ab_run.py +235 -0
  422. package/scripts/bench_ab_task_runner.py +369 -0
  423. package/scripts/bench_ab_tracka_run.py +202 -0
  424. package/scripts/{bench_compress_memory.py → bench_condense_memory.py} +16 -16
  425. package/scripts/bench_run.py +33 -33
  426. package/scripts/bench_runner.py +2 -2
  427. package/scripts/bootstrap.sh +99 -0
  428. package/scripts/build_cloud_bundle.py +6 -6
  429. package/scripts/build_discovery_manifest.py +7 -7
  430. package/scripts/build_linear_digest.py +3 -3
  431. package/scripts/build_rule_trigger_matrix.py +8 -8
  432. package/scripts/chat_history.py +5 -5
  433. package/scripts/check_always_budget.py +11 -5
  434. package/scripts/check_augment_description_cap.py +3 -3
  435. package/scripts/check_cluster_patterns.py +2 -2
  436. package/scripts/check_command_count_messaging.py +3 -3
  437. package/scripts/{check_compression.py → check_condensation.py} +34 -34
  438. package/scripts/{check_compressed_paths.py → check_condensed_paths.py} +8 -8
  439. package/scripts/check_context_paths.py +7 -7
  440. package/scripts/check_council_layout.py +2 -2
  441. package/scripts/check_council_references.py +9 -9
  442. package/scripts/check_iron_law_prominence.py +2 -2
  443. package/scripts/check_kernel_rule_bundle.py +2 -2
  444. package/scripts/check_module_management_neutral.py +149 -0
  445. package/scripts/check_no_roadmap_refs.py +9 -9
  446. package/scripts/check_portability.py +3 -3
  447. package/scripts/check_public_catalog_links.py +4 -4
  448. package/scripts/check_references.py +7 -6
  449. package/scripts/check_release_pr_shape.py +112 -0
  450. package/scripts/check_reply_consistency.py +3 -3
  451. package/scripts/check_safety_floor_untouched.py +1 -1
  452. package/scripts/check_template_pin_drift.py +5 -5
  453. package/scripts/check_token_optimizer_freshness.py +3 -3
  454. package/scripts/ci_status.py +301 -0
  455. package/scripts/ci_time_ratio.py +1 -1
  456. package/scripts/cleanup_other_scope.sh +146 -0
  457. package/scripts/compile_router.py +10 -10
  458. package/scripts/{compress.py → condense.py} +64 -64
  459. package/scripts/condense.sh +18 -0
  460. package/scripts/{compress_memory.py → condense_memory.py} +33 -33
  461. package/scripts/config/presets.py +2 -2
  462. package/scripts/config/profiles.py +1 -1
  463. package/scripts/cost_by_conversation.py +3 -3
  464. package/scripts/cost_summary.py +7 -7
  465. package/scripts/count_token_optimizer_usage.sh +1 -1
  466. package/scripts/gen_discovery_baseline.py +5 -5
  467. package/scripts/generate_index.py +6 -6
  468. package/scripts/generate_ownership_matrix.py +10 -10
  469. package/scripts/generate_pack_manifests.py +1 -1
  470. package/scripts/ghostwriter_fixture_allowlist.txt +1 -1
  471. package/scripts/install +3 -3
  472. package/scripts/install-hooks.sh +6 -6
  473. package/scripts/install.py +273 -45
  474. package/scripts/install.sh +187 -1
  475. package/scripts/inventory_frontmatter.py +2 -2
  476. package/scripts/iron_law_sha.py +3 -3
  477. package/scripts/lint_agents_layout.py +14 -7
  478. package/scripts/lint_agents_md.py +4 -4
  479. package/scripts/lint_archived_skills.py +3 -3
  480. package/scripts/lint_artefact_frontmatter.py +2 -2
  481. package/scripts/lint_bench_ab.py +172 -0
  482. package/scripts/lint_bench_corpus.py +1 -1
  483. package/scripts/lint_command_tiers.py +5 -5
  484. package/scripts/lint_context_spine_usage.py +1 -1
  485. package/scripts/lint_framework_leakage.py +7 -7
  486. package/scripts/lint_framework_leakage_allowlist.json +152 -84
  487. package/scripts/lint_ghostwriter_source.py +3 -3
  488. package/scripts/lint_handoffs.py +1 -1
  489. package/scripts/lint_load_context.py +11 -11
  490. package/scripts/lint_media_policy_linkage.py +5 -5
  491. package/scripts/lint_namespace.py +1 -1
  492. package/scripts/lint_no_new_atomic_commands.py +2 -2
  493. package/scripts/lint_orchestration_dsl.py +1 -1
  494. package/scripts/lint_pack_boundaries.py +2 -2
  495. package/scripts/lint_persona_governance.py +4 -4
  496. package/scripts/lint_role_experiences.py +237 -0
  497. package/scripts/lint_rule_interactions.py +2 -2
  498. package/scripts/lint_rule_tiers.py +1 -1
  499. package/scripts/lint_trust_coherence.py +2 -2
  500. package/scripts/mcp_registry_submit.sh +187 -0
  501. package/scripts/mcp_server/tools.py +1 -1
  502. package/scripts/measure_frugality_savings.py +10 -10
  503. package/scripts/measure_patterns.py +1 -1
  504. package/scripts/measure_projection_bytes.py +5 -5
  505. package/scripts/measure_rule_budget.py +3 -3
  506. package/scripts/measure_skill_reduction.py +1 -1
  507. package/scripts/memory_lookup.py +1 -1
  508. package/scripts/memory_status.py +2 -2
  509. package/scripts/migrate_command_suggestions.py +3 -3
  510. package/scripts/mine_session.py +1 -1
  511. package/scripts/move_artefact.py +3 -3
  512. package/scripts/new_skill.py +2 -2
  513. package/scripts/pack_mcp_content.py +9 -9
  514. package/scripts/plan_physical_move.py +6 -6
  515. package/scripts/print_required_checks.py +196 -0
  516. package/scripts/probe_skill_registration.py +413 -0
  517. package/scripts/propose_modules_config.py +145 -0
  518. package/scripts/prototype_lint_contradictions.py +1 -1
  519. package/scripts/recruit_preflight.sh +152 -0
  520. package/scripts/refine_ticket_detect.py +3 -3
  521. package/scripts/release.py +20 -0
  522. package/scripts/render_benchmark_md.py +308 -0
  523. package/scripts/roadmap_progress_hook.py +1 -1
  524. package/scripts/run_skill_evals.py +2 -2
  525. package/scripts/runtime_registry.py +4 -4
  526. package/scripts/schemas/command.schema.json +4 -4
  527. package/scripts/schemas/rule.schema.json +5 -5
  528. package/scripts/schemas/skill.schema.json +3 -3
  529. package/scripts/schemas/user-type.schema.json +1 -1
  530. package/scripts/score_skill_selection.py +1 -1
  531. package/scripts/skill_collision_clusters.py +2 -2
  532. package/scripts/skill_linter.py +81 -81
  533. package/scripts/skill_overlap.py +5 -5
  534. package/scripts/skill_tools/audit_persona_coverage.py +2 -2
  535. package/scripts/skill_tools/audit_user_type_coverage.py +2 -2
  536. package/scripts/skill_tools/run_block_d_eval.py +1 -1
  537. package/scripts/skill_tools/score_skill_relevance.py +1 -1
  538. package/scripts/skill_tools/suggest_skill_for_task.py +1 -1
  539. package/scripts/skill_trigger_eval.py +3 -3
  540. package/scripts/smoke/kernel.sh +7 -1
  541. package/scripts/smoke/router.sh +5 -5
  542. package/scripts/smoke/skills.sh +1 -1
  543. package/scripts/smoke_quickstart.py +1 -1
  544. package/scripts/snapshot_agent_outputs.py +3 -3
  545. package/scripts/spotcheck_thin_root.py +1 -1
  546. package/scripts/{caveman_stats.py → telegraph_stats.py} +18 -18
  547. package/scripts/update_counts.py +1 -1
  548. package/scripts/validate_decision_engine.py +1 -1
  549. package/scripts/validate_frontmatter.py +1 -1
  550. package/scripts/validate_safe_paths.py +3 -3
  551. package/scripts/{validate_caveman_carveouts.py → validate_telegraph_carveouts.py} +7 -7
  552. package/scripts/verify_roadmap_closure.py +6 -6
  553. package/templates/consumer-settings/ONBOARDING.md +41 -0
  554. package/.agent-src/commands/install-via-agent.md +0 -129
  555. package/.agent-src/skills/compress-memory/SKILL.md +0 -131
  556. package/dist/ui/assets/index-D-DY1ywI.js +0 -35
  557. package/dist/ui/assets/index-D-DY1ywI.js.map +0 -1
  558. package/dist/ui/assets/index-Dqfhmg-d.css +0 -1
  559. package/docs/adrs/caveman/README.md +0 -9
  560. package/docs/contracts/caveman-telemetry.md +0 -83
  561. package/scripts/compress.sh +0 -18
@@ -0,0 +1,223 @@
1
+ """Detect module root directories from a project tree.
2
+
3
+ Phase B of road-to-configurable-modules. Lifts the multi-stack
4
+ detection table from ``commands/module/explore.md`` Step 1 into a
5
+ reusable, pure Python helper that the installer, onboarding wizard,
6
+ and ``/agents init`` flow all share.
7
+
8
+ Contract — pure, read-only, tolerant:
9
+
10
+ * :func:`detect_module_roots` walks the candidate paths once and
11
+ reports every directory that *exists*. It never creates files,
12
+ never recurses past the first level needed to score confidence,
13
+ and silently skips paths it cannot read.
14
+ * The return shape is a list of :class:`ModuleCandidate` typed
15
+ dicts ordered by descending confidence; callers may turn that
16
+ list straight into numbered options.
17
+ * Confidence is a three-step ladder:
18
+
19
+ - ``high`` — directory exists *and* its first level contains
20
+ plausible module subdirectories for the stack.
21
+ - ``medium`` — directory exists but is empty / unclear; still
22
+ surfaced so the installer can ask the user.
23
+ - Absent paths are skipped entirely; they never appear in the
24
+ output.
25
+
26
+ No interactive logic, no settings I/O, no logging side-effects.
27
+ Settings wiring lives in ``scripts/install.py`` (Step 2) and the
28
+ GUI wizard (Step 3).
29
+ """
30
+ from __future__ import annotations
31
+
32
+ from dataclasses import dataclass
33
+ from pathlib import Path
34
+ from typing import Iterable
35
+
36
+ #: Directory entry names that never count as modules. Mirrors the
37
+ #: ``modules.skip_dirs`` default from
38
+ #: ``templates/agents/agent-project-settings.example.yml``.
39
+ _SKIP_DIRS: frozenset[str] = frozenset({
40
+ ".module-template",
41
+ ".example",
42
+ })
43
+
44
+ #: Path segments that exclude a file from module-like detection.
45
+ #: Vendored dependencies, build artefacts, VCS state, IDE config —
46
+ #: never a real module no matter what shape the parent directory has.
47
+ _NOISE_SEGMENTS: frozenset[str] = frozenset({
48
+ "vendor",
49
+ "node_modules",
50
+ ".git",
51
+ ".idea",
52
+ ".vscode",
53
+ "dist",
54
+ "build",
55
+ "tmp",
56
+ "var",
57
+ "storage",
58
+ "bootstrap",
59
+ "public",
60
+ ".venv",
61
+ "venv",
62
+ "__pycache__",
63
+ })
64
+
65
+ #: Parent directory names that hint at a module layout when their
66
+ #: immediate child is a non-noise segment (i.e. ``Modules/User/...``,
67
+ #: ``packages/foo/...``). Case-sensitive — ``Modules`` (Laravel HMVC)
68
+ #: differs from ``modules`` (Node convention) intentionally; both are
69
+ #: accepted.
70
+ _MODULE_PARENTS: frozenset[str] = frozenset({
71
+ "Modules",
72
+ "modules",
73
+ "packages",
74
+ "apps",
75
+ "internal",
76
+ })
77
+
78
+
79
+ def is_module_like_path(rel_path: str) -> bool:
80
+ """Return ``True`` when ``rel_path`` sits inside a module-shaped tree.
81
+
82
+ Heuristic for the ``module-detect-on-the-fly`` skill: triggered by
83
+ repo-relative POSIX paths the agent is about to edit or reference.
84
+ A path is *module-like* when:
85
+
86
+ 1. None of its segments are in :data:`_NOISE_SEGMENTS` (vendored,
87
+ build, VCS, IDE state — never a real module).
88
+ 2. At least one segment matches :data:`_MODULE_PARENTS` AND has a
89
+ non-noise sibling directly underneath (so ``Modules/`` alone
90
+ does not trigger, but ``Modules/User/...`` does).
91
+
92
+ Pure, case-sensitive on parent names. Empty / dotted / Windows-style
93
+ inputs return ``False``. The function never touches the filesystem
94
+ — callers pass in a path string they already know about.
95
+ """
96
+ if not rel_path:
97
+ return False
98
+ normalised = rel_path.replace("\\", "/").strip("/")
99
+ if not normalised:
100
+ return False
101
+ parts = normalised.split("/")
102
+ for segment in parts:
103
+ if segment in _NOISE_SEGMENTS:
104
+ return False
105
+ for idx, segment in enumerate(parts[:-1]):
106
+ if segment not in _MODULE_PARENTS:
107
+ continue
108
+ child = parts[idx + 1]
109
+ if not child or child.startswith("."):
110
+ continue
111
+ if child in _SKIP_DIRS:
112
+ continue
113
+ return True
114
+ return False
115
+
116
+
117
+ @dataclass(frozen=True)
118
+ class ModuleCandidate:
119
+ """One detected module-root candidate.
120
+
121
+ Attributes mirror the JSON shape callers ultimately persist into
122
+ ``modules.root_paths`` (the ``path`` field) plus metadata used
123
+ by the installer to phrase the numbered-options prompt.
124
+ """
125
+
126
+ path: str
127
+ """Repo-relative POSIX path of the module root (e.g. ``app/Modules``)."""
128
+
129
+ stack: str
130
+ """Stack identifier — one of ``laravel-hmvc``, ``symfony-ddd``,
131
+ ``node-monorepo``, ``python-src``, ``go-internal``, ``composer-src``."""
132
+
133
+ namespace_template_guess: str
134
+ """PHP-style namespace template with ``{ModuleName}`` placeholder
135
+ (e.g. ``App\\Modules\\{ModuleName}``). Empty string for stacks
136
+ without a PHP-style namespace (Node, Python, Go)."""
137
+
138
+ confidence: str
139
+ """One of ``high`` or ``medium`` per the ladder in the module
140
+ docstring."""
141
+
142
+
143
+ # Detection rules — order encodes priority when two rules match the
144
+ # same directory. ``namespace_template`` is the value emitted as
145
+ # ``namespace_template_guess`` on a hit; empty for non-PHP stacks.
146
+ _RULES: tuple[tuple[str, str, str], ...] = (
147
+ ("app/Modules", "laravel-hmvc", "App\\Modules\\{ModuleName}"),
148
+ ("src/Module", "symfony-ddd", "App\\Module\\{ModuleName}"),
149
+ ("packages", "node-monorepo", ""),
150
+ ("apps", "node-monorepo", ""),
151
+ ("modules", "node-monorepo", ""),
152
+ ("src", "python-src", ""),
153
+ ("internal", "go-internal", ""),
154
+ ("cmd", "go-internal", ""),
155
+ )
156
+
157
+
158
+ def _list_module_subdirs(root: Path) -> list[Path]:
159
+ """Return first-level subdirectories of ``root`` that look like modules."""
160
+ try:
161
+ entries = sorted(root.iterdir())
162
+ except (OSError, PermissionError):
163
+ return []
164
+ out: list[Path] = []
165
+ for entry in entries:
166
+ if not entry.is_dir():
167
+ continue
168
+ if entry.name.startswith("."):
169
+ continue
170
+ if entry.name in _SKIP_DIRS:
171
+ continue
172
+ out.append(entry)
173
+ return out
174
+
175
+
176
+ def _score_confidence(stack: str, subdirs: Iterable[Path]) -> str:
177
+ """Return ``high`` when ``subdirs`` looks like a populated module root."""
178
+ subdirs_list = list(subdirs)
179
+ if not subdirs_list:
180
+ return "medium"
181
+ if stack in {"laravel-hmvc", "symfony-ddd"}:
182
+ capitalized = [d for d in subdirs_list if d.name[:1].isupper()]
183
+ return "high" if capitalized else "medium"
184
+ if stack == "node-monorepo":
185
+ with_pkg_json = [d for d in subdirs_list if (d / "package.json").is_file()]
186
+ return "high" if with_pkg_json else "medium"
187
+ if stack == "python-src":
188
+ with_init = [d for d in subdirs_list if (d / "__init__.py").is_file()]
189
+ return "high" if with_init else "medium"
190
+ if stack == "go-internal":
191
+ return "high" if subdirs_list else "medium"
192
+ return "medium"
193
+
194
+
195
+ def detect_module_roots(project_root: Path) -> list[ModuleCandidate]:
196
+ """Return module-root candidates discovered under ``project_root``.
197
+
198
+ Pure read-only scan. Walks each rule in :data:`_RULES`, reports
199
+ every directory that exists, and never recurses past the first
200
+ level needed to score confidence. Order: ``high`` first, then
201
+ ``medium``; rule order breaks ties. Absent paths never appear
202
+ in the output.
203
+ """
204
+ project_root = Path(project_root)
205
+ high: list[ModuleCandidate] = []
206
+ medium: list[ModuleCandidate] = []
207
+ for rel_path, stack, namespace_template in _RULES:
208
+ abs_path = project_root / rel_path
209
+ if not abs_path.is_dir():
210
+ continue
211
+ subdirs = _list_module_subdirs(abs_path)
212
+ confidence = _score_confidence(stack, subdirs)
213
+ candidate = ModuleCandidate(
214
+ path=rel_path,
215
+ stack=stack,
216
+ namespace_template_guess=namespace_template,
217
+ confidence=confidence,
218
+ )
219
+ if confidence == "high":
220
+ high.append(candidate)
221
+ else:
222
+ medium.append(candidate)
223
+ return high + medium
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env bash
2
+ # scope_guard.sh — detect cross-scope install drift for event4u/agent-config.
3
+ #
4
+ # Roadmap reference: road-to-clean-skill-distribution-channels.md, Phase B Step 2.
5
+ # Contract: docs/contracts/skill-distribution-channels.md + docs/contracts/install-scopes.md.
6
+ #
7
+ # Pre-install hook called by scripts/install.sh. Detects whether the same package
8
+ # is already installed at the OTHER scope (user-global vs project-local) for any
9
+ # of the six supported tools. Emits one verdict per tool plus a global verdict
10
+ # on stdout (one finding per line).
11
+ #
12
+ # Verdicts (per the roadmap contract):
13
+ # OK — no install at the other scope; the install can proceed.
14
+ # WARN — install at the other scope, SAME version as the one being installed.
15
+ # Same content; duplicate registration but no drift.
16
+ # DRIFT — install at the other scope, DIFFERENT version (or unreadable).
17
+ # Drift will produce the 2026-05-25 failure mode (stale frontmatter
18
+ # registered alongside fresh frontmatter).
19
+ #
20
+ # Output shape (line-oriented, parseable by install.sh):
21
+ # <verdict>\t<tool-id>\t<other-scope-path>\t<other-version>\t<this-version>
22
+ #
23
+ # A final summary line is emitted:
24
+ # SUMMARY\t<verdict>\t<count-OK>\t<count-WARN>\t<count-DRIFT>
25
+ #
26
+ # The script exits 0 always — verdict interpretation is the caller's job.
27
+
28
+ set -euo pipefail
29
+
30
+ THIS_SCOPE="${1:-project}" # project|user — which scope we're ABOUT to install to
31
+ SOURCE_DIR="${2:-}" # package source repo (read version from here)
32
+ TARGET_DIR="${3:-}" # consumer install root for "this" scope
33
+
34
+ # Default SOURCE_DIR to the package root when invoked from inside this repo.
35
+ if [[ -z "$SOURCE_DIR" ]]; then
36
+ SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
37
+ fi
38
+
39
+ # Resolve the version we're about to install. Authoritative source:
40
+ # package.json at the package root (release.py keeps this current).
41
+ this_version() {
42
+ local pkg="$SOURCE_DIR/package.json"
43
+ [[ -f "$pkg" ]] || { echo "unknown"; return; }
44
+ # Tiny scoped parser — no jq / python dependency.
45
+ awk -F'"' '/"version":/ { print $4; exit }' "$pkg" 2>/dev/null || echo "unknown"
46
+ }
47
+
48
+ # Resolve the version recorded at a given install root. Falls back through
49
+ # package.json → .augment-plugin/plugin.json → "unknown".
50
+ installed_version_at() {
51
+ local root="$1"
52
+ if [[ -f "$root/package.json" ]]; then
53
+ awk -F'"' '/"version":/ { print $4; exit }' "$root/package.json" 2>/dev/null && return
54
+ fi
55
+ if [[ -f "$root/.augment-plugin/plugin.json" ]]; then
56
+ awk -F'"' '/"version":/ { print $4; exit }' "$root/.augment-plugin/plugin.json" 2>/dev/null && return
57
+ fi
58
+ echo "unknown"
59
+ }
60
+
61
+ # Heuristic: does this look like an agent-config install (vs a vanilla user
62
+ # directory with the same path layout)? We accept "looks like" if the tool
63
+ # directory contains ≥ N entries that ALSO exist in the SOURCE_DIR tree —
64
+ # but we keep the check coarse: simply that the directory is non-empty.
65
+ dir_nonempty() {
66
+ [[ -d "$1" ]] && [[ -n "$(ls -A "$1" 2>/dev/null | head -1)" ]]
67
+ }
68
+
69
+ # Per-tool probe definitions: tool-id, user-scope path, project-scope path.
70
+ # Project-scope path is relative to "$TARGET_DIR" (or "$HOME/<proj>" for user).
71
+ probe_tool() {
72
+ local tool="$1"
73
+ local user_path="$2"
74
+ local project_path="$3"
75
+
76
+ local other_path other_scope this_scope_path
77
+ if [[ "$THIS_SCOPE" == "project" ]]; then
78
+ this_scope_path="$project_path"
79
+ other_path="$user_path"
80
+ other_scope="user"
81
+ else
82
+ this_scope_path="$user_path"
83
+ other_path="$project_path"
84
+ other_scope="project"
85
+ fi
86
+
87
+ if ! dir_nonempty "$other_path"; then
88
+ printf 'OK\t%s\t-\t-\t%s\n' "$tool" "$(this_version)"
89
+ return
90
+ fi
91
+
92
+ local other_root other_ver
93
+ # Walk up from the tool directory to find the install root (containing
94
+ # package.json or .augment-plugin/plugin.json).
95
+ other_root="$(cd "$other_path/.." 2>/dev/null && pwd)" || other_root=""
96
+ if [[ -n "$other_root" ]]; then
97
+ # Look up to 3 levels up for an install root.
98
+ local probe="$other_root"
99
+ for _ in 1 2 3; do
100
+ if [[ -f "$probe/package.json" ]] || [[ -f "$probe/.augment-plugin/plugin.json" ]]; then
101
+ other_root="$probe"
102
+ break
103
+ fi
104
+ probe="$(dirname "$probe")"
105
+ [[ "$probe" == "/" ]] && break
106
+ done
107
+ fi
108
+ other_ver="$(installed_version_at "$other_root")"
109
+
110
+ local this_ver
111
+ this_ver="$(this_version)"
112
+
113
+ if [[ "$other_ver" == "unknown" ]] || [[ "$this_ver" == "unknown" ]] || [[ "$other_ver" != "$this_ver" ]]; then
114
+ printf 'DRIFT\t%s\t%s\t%s\t%s\n' "$tool" "$other_path" "$other_ver" "$this_ver"
115
+ else
116
+ printf 'WARN\t%s\t%s\t%s\t%s\n' "$tool" "$other_path" "$other_ver" "$this_ver"
117
+ fi
118
+ }
119
+
120
+ main() {
121
+ # Resolve target root for project-scope probes.
122
+ local project_root="${TARGET_DIR:-$(pwd)}"
123
+ local home_root="${HOME:-/tmp}"
124
+
125
+ local count_ok=0 count_warn=0 count_drift=0 finding
126
+
127
+ # Each probe_tool call prints exactly one line. Use
128
+ # assignment-arithmetic (returns 0) rather than post-increment
129
+ # (returns the OLD value — 0 trips `set -e` on the first OK hit
130
+ # under bash 5+ / GitHub Actions runners).
131
+ while IFS= read -r finding; do
132
+ echo "$finding"
133
+ case "${finding%%$'\t'*}" in
134
+ OK) count_ok=$((count_ok + 1)) ;;
135
+ WARN) count_warn=$((count_warn + 1)) ;;
136
+ DRIFT) count_drift=$((count_drift + 1)) ;;
137
+ esac
138
+ done < <(
139
+ probe_tool claude-code "$home_root/.claude/skills" "$project_root/.claude/skills"
140
+ probe_tool augment "$home_root/.augment/skills" "$project_root/.augment/skills"
141
+ probe_tool cursor "$home_root/.cursor/rules" "$project_root/.cursor/rules"
142
+ probe_tool cline "$home_root/.clinerules" "$project_root/.clinerules"
143
+ probe_tool windsurf "$home_root/.windsurf/rules" "$project_root/.windsurf/rules"
144
+ probe_tool copilot "$home_root/.github/copilot-instructions.md" "$project_root/.github/copilot-instructions.md"
145
+ )
146
+
147
+ local overall
148
+ if [[ $count_drift -gt 0 ]]; then
149
+ overall=DRIFT
150
+ elif [[ $count_warn -gt 0 ]]; then
151
+ overall=WARN
152
+ else
153
+ overall=OK
154
+ fi
155
+ printf 'SUMMARY\t%s\t%d\t%d\t%d\n' "$overall" "$count_ok" "$count_warn" "$count_drift"
156
+ }
157
+
158
+ # Allow sourcing without executing (so other scripts can call individual
159
+ # functions). Only run main() when invoked directly.
160
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
161
+ main "$@"
162
+ fi
@@ -2,7 +2,7 @@
2
2
  """R3 Phase 4 — one-off artefact-to-pack bucket map.
3
3
 
4
4
  Encodes the council-locked mapping for all skills/rules/commands under
5
- .agent-src.uncompressed/. Run with `--check` to emit a CSV preview;
5
+ .agent-src.uncondensed/. Run with `--check` to emit a CSV preview;
6
6
  run with `--pack <id>` to print the artefact paths for that pack so
7
7
  the annotator can consume them via xargs.
8
8
 
@@ -17,7 +17,7 @@ import sys
17
17
  from pathlib import Path
18
18
 
19
19
  ROOT = Path(__file__).resolve().parents[1]
20
- SRC = ROOT / ".agent-src.uncompressed"
20
+ SRC = ROOT / ".agent-src.uncondensed"
21
21
 
22
22
  # Explicit per-name overrides (highest priority). Use when domain/keyword
23
23
  # heuristics misclassify. Council Q3 fallback is applied only if no entry.
@@ -80,7 +80,7 @@ NAME_TO_PACK: dict[str, str] = {
80
80
  "video-director": "ai-video", "canvas-design": "ai-video",
81
81
  # Meta (agent-config maintenance)
82
82
  "ai-council": "meta", "command-routing": "meta", "command-writing": "meta",
83
- "compress-memory": "meta", "context-authoring": "meta", "context-document": "meta",
83
+ "condense-memory": "meta", "context-authoring": "meta", "context-document": "meta",
84
84
  "copilot-agents-optimization": "meta", "copilot-config": "meta",
85
85
  "description-assist": "meta", "guideline-writing": "meta",
86
86
  "learning-to-rule-or-skill": "meta", "lint-skills": "meta",
@@ -1,4 +1,4 @@
1
- """Pilot compression ratio + Iron-Law checksum verification (one-off, not CI)."""
1
+ """Pilot condensation ratio + Iron-Law checksum verification (one-off, not CI)."""
2
2
  import sys, re, hashlib, statistics
3
3
  from pathlib import Path
4
4
 
@@ -15,9 +15,9 @@ def iron_law_sha(body: str) -> str:
15
15
 
16
16
 
17
17
  pairs = [
18
- ("agent-authority", ".agent-src.uncompressed/rules/agent-authority.md", "docs/contracts/pilot/agent-authority.md"),
19
- ("direct-answers", ".agent-src.uncompressed/rules/direct-answers.md", "docs/contracts/pilot/direct-answers.md"),
20
- ("language-and-tone", ".agent-src.uncompressed/rules/language-and-tone.md", "docs/contracts/pilot/language-and-tone.md"),
18
+ ("agent-authority", ".agent-src.uncondensed/rules/agent-authority.md", "docs/contracts/pilot/agent-authority.md"),
19
+ ("direct-answers", ".agent-src.uncondensed/rules/direct-answers.md", "docs/contracts/pilot/direct-answers.md"),
20
+ ("language-and-tone", ".agent-src.uncondensed/rules/language-and-tone.md", "docs/contracts/pilot/language-and-tone.md"),
21
21
  ]
22
22
 
23
23
  header = f"{'rule':25s} {'orig':>6s} {'pilot':>6s} {'r':>6s} {'budget':>7s} {'sha-orig':>16s} {'sha-pilot':>16s} {'IL':>3s}"
@@ -11,7 +11,7 @@ import re
11
11
  import sys
12
12
  from pathlib import Path
13
13
 
14
- ROOT = Path(".agent-src.uncompressed")
14
+ ROOT = Path(".agent-src.uncondensed")
15
15
 
16
16
  CARVE_OUT_PATTERNS = [
17
17
  r"laravel", r"^php-", r"^eloquent", r"^blade", r"^livewire", r"^flux",
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env python3
2
+ """Roll up ``adoption-snapshots.jsonl`` into a Markdown trend report.
3
+
4
+ Phase D Step 3 of ``road-to-adoption-proof-and-ci-green.md``.
5
+ Reads the JSONL produced by ``scripts/adoption_snapshot.py`` and
6
+ writes an ``agents/runtime/metrics/adoption-report.md`` snapshot
7
+ covering an 8-week rolling window per signal.
8
+
9
+ Mirrors the shape of ``scripts/skill_usage_report.py``: a single
10
+ file, ≤ 200 LOC, no external deps. The report is regenerated on
11
+ every invocation (idempotent for a given JSONL state).
12
+
13
+ CLI:
14
+
15
+ scripts/adoption_report.py [--in <path>] [--out <path>] [--weeks 8]
16
+
17
+ --in JSONL input (default
18
+ ``agents/runtime/metrics/adoption-snapshots.jsonl``).
19
+ --out Markdown output (default
20
+ ``agents/runtime/metrics/adoption-report.md``).
21
+ --weeks Window size (default 8).
22
+
23
+ Exit codes:
24
+
25
+ 0 — report written.
26
+ 1 — IO failure on read or write.
27
+ """
28
+ from __future__ import annotations
29
+
30
+ import argparse
31
+ import datetime as dt
32
+ import json
33
+ import sys
34
+ from pathlib import Path
35
+ from typing import Any
36
+
37
+
38
+ REPO_ROOT = Path(__file__).resolve().parent.parent
39
+ DEFAULT_IN = REPO_ROOT / "agents" / "runtime" / "metrics" / "adoption-snapshots.jsonl"
40
+ DEFAULT_OUT = REPO_ROOT / "agents" / "runtime" / "metrics" / "adoption-report.md"
41
+
42
+
43
+ def parse_jsonl(path: Path) -> list[dict[str, Any]]:
44
+ rows: list[dict[str, Any]] = []
45
+ if not path.exists():
46
+ return rows
47
+ for line in path.read_text(encoding="utf-8").splitlines():
48
+ line = line.strip()
49
+ if not line:
50
+ continue
51
+ try:
52
+ rows.append(json.loads(line))
53
+ except json.JSONDecodeError:
54
+ continue
55
+ return rows
56
+
57
+
58
+ def filter_window(rows: list[dict[str, Any]], weeks: int) -> list[dict[str, Any]]:
59
+ if not rows:
60
+ return rows
61
+ cutoff = dt.datetime.now(dt.timezone.utc) - dt.timedelta(weeks=weeks)
62
+ out: list[dict[str, Any]] = []
63
+ for r in rows:
64
+ ts = r.get("snapshot_at", "")
65
+ try:
66
+ when = dt.datetime.strptime(ts, "%Y-%m-%dT%H:%M:%SZ").replace(
67
+ tzinfo=dt.timezone.utc
68
+ )
69
+ except ValueError:
70
+ continue
71
+ if when >= cutoff:
72
+ out.append(r)
73
+ return out
74
+
75
+
76
+ def render_section(title: str, lines: list[str]) -> str:
77
+ return f"## {title}\n\n" + "\n".join(lines) + "\n\n"
78
+
79
+
80
+ def render_npm_downloads(rows: list[dict[str, Any]]) -> str:
81
+ lines = []
82
+ lines.append("| Snapshot | Last 7 days (npm installs) |")
83
+ lines.append("|---|---:|")
84
+ for r in rows:
85
+ signal = r.get("signals", {}).get("npm_downloads", {})
86
+ if "error" in signal:
87
+ cell = f"_(error: {signal['error'][:40]})_"
88
+ else:
89
+ cell = f"{signal.get('last_7_days', 0):,}"
90
+ lines.append(f"| `{r.get('snapshot_at', '?')}` | {cell} |")
91
+ return render_section("npm install count (last 7 days, weekly snapshot)", lines)
92
+
93
+
94
+ def render_npm_version(rows: list[dict[str, Any]]) -> str:
95
+ lines = []
96
+ lines.append("| Snapshot | Latest version | Version count |")
97
+ lines.append("|---|---|---:|")
98
+ for r in rows:
99
+ signal = r.get("signals", {}).get("npm_version", {})
100
+ if "error" in signal:
101
+ lines.append(f"| `{r.get('snapshot_at', '?')}` | _(error)_ | _(error)_ |")
102
+ else:
103
+ latest = signal.get("latest", "?")
104
+ count = signal.get("version_count", 0)
105
+ lines.append(f"| `{r.get('snapshot_at', '?')}` | `{latest}` | {count} |")
106
+ return render_section("npm version distribution", lines)
107
+
108
+
109
+ def render_github_stars(rows: list[dict[str, Any]]) -> str:
110
+ lines = []
111
+ lines.append("| Snapshot | Stars | Forks | Watchers |")
112
+ lines.append("|---|---:|---:|---:|")
113
+ for r in rows:
114
+ signal = r.get("signals", {}).get("github_stars", {})
115
+ if "error" in signal:
116
+ lines.append(f"| `{r.get('snapshot_at', '?')}` | _(error)_ | _(error)_ | _(error)_ |")
117
+ else:
118
+ lines.append(
119
+ f"| `{r.get('snapshot_at', '?')}` | "
120
+ f"{signal.get('stars', 0):,} | "
121
+ f"{signal.get('forks', 0):,} | "
122
+ f"{signal.get('watchers', 0):,} |"
123
+ )
124
+ return render_section("GitHub stars / forks / watchers", lines)
125
+
126
+
127
+ def render_topic_rank(rows: list[dict[str, Any]]) -> str:
128
+ lines = []
129
+ lines.append("| Snapshot | `agent-skills` rank | `cinematic-ai-video` rank |")
130
+ lines.append("|---|---:|---:|")
131
+ for r in rows:
132
+ signal = r.get("signals", {}).get("topic_rank", {})
133
+ as_block = signal.get("agent-skills", {})
134
+ cav_block = signal.get("cinematic-ai-video", {})
135
+ as_rank = "_(error)_" if "error" in as_block else (as_block.get("rank") or "—")
136
+ cav_rank = "_(error)_" if "error" in cav_block else (cav_block.get("rank") or "—")
137
+ lines.append(
138
+ f"| `{r.get('snapshot_at', '?')}` | {as_rank} | {cav_rank} |"
139
+ )
140
+ return render_section("Topic-search rank (`agent-skills` + `cinematic-ai-video`)", lines)
141
+
142
+
143
+ def render_report(rows: list[dict[str, Any]], weeks: int) -> str:
144
+ header = (
145
+ "# Adoption report — rolling trend\n\n"
146
+ f"> Generated by `scripts/adoption_report.py` from "
147
+ f"`agents/runtime/metrics/adoption-snapshots.jsonl`.\n"
148
+ f"> Window: rolling {weeks} weeks. Source contract: "
149
+ f"`docs/contracts/adoption-signal-floor.md`.\n\n"
150
+ )
151
+ if not rows:
152
+ header += (
153
+ "_No snapshots in the current window — run `python3 scripts/adoption_snapshot.py` "
154
+ "(scheduled weekly via the cron in `.github/workflows/`) to populate the trend._\n"
155
+ )
156
+ return header
157
+ return (
158
+ header
159
+ + render_npm_downloads(rows)
160
+ + render_npm_version(rows)
161
+ + render_github_stars(rows)
162
+ + render_topic_rank(rows)
163
+ )
164
+
165
+
166
+ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
167
+ p = argparse.ArgumentParser(prog="adoption_report")
168
+ p.add_argument("--in", dest="in_path", type=Path, default=DEFAULT_IN)
169
+ p.add_argument("--out", type=Path, default=DEFAULT_OUT)
170
+ p.add_argument("--weeks", type=int, default=8)
171
+ return p.parse_args(argv)
172
+
173
+
174
+ def main(argv: list[str] | None = None) -> int:
175
+ args = parse_args(argv)
176
+ try:
177
+ rows = parse_jsonl(args.in_path)
178
+ except OSError as exc:
179
+ print(f"error: failed to read {args.in_path}: {exc}", file=sys.stderr)
180
+ return 1
181
+ rows = filter_window(rows, args.weeks)
182
+ rows.sort(key=lambda r: r.get("snapshot_at", ""))
183
+ report = render_report(rows, args.weeks)
184
+ try:
185
+ args.out.parent.mkdir(parents=True, exist_ok=True)
186
+ args.out.write_text(report, encoding="utf-8")
187
+ except OSError as exc:
188
+ print(f"error: failed to write {args.out}: {exc}", file=sys.stderr)
189
+ return 1
190
+ print(f"adoption_report: wrote {args.out} ({len(rows)} snapshot(s))")
191
+ return 0
192
+
193
+
194
+ if __name__ == "__main__":
195
+ sys.exit(main())