@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
@@ -88,6 +88,43 @@ LEGACY_RENAME_MAP = {
88
88
 
89
89
  QUIET = False
90
90
 
91
+ # Machine-readable progress stream for the wizard `--apply-payload` real-apply
92
+ # bridge (road-to-single-install-source-of-truth § Phase 1). When True,
93
+ # `_emit_progress` writes NDJSON lines to stdout so the GUI can stream install
94
+ # progress; human-readable `info`/`success` output is suppressed via QUIET so
95
+ # the two never interleave (`warn`/`fail` still surface on stderr). Off for
96
+ # every normal CLI install.
97
+ PROGRESS_NDJSON = False
98
+
99
+
100
+ def _emit_progress(obj: "dict[str, Any]") -> None:
101
+ """Write one NDJSON progress line to stdout when PROGRESS_NDJSON is on.
102
+
103
+ No-op for normal CLI installs. The line shapes mirror the wizard SSE
104
+ frames the GUI already consumes: per-unit
105
+ ``{"type":"file","file":...,"status":...,"written":N,"total":M}`` and the
106
+ terminal ``{"type":"done"|"error",...}``.
107
+ """
108
+ if not PROGRESS_NDJSON:
109
+ return
110
+ sys.stdout.write(json.dumps(obj, separators=(",", ":")) + "\n")
111
+ sys.stdout.flush()
112
+
113
+
114
+ def _emit_progress_terminal(rc: int) -> None:
115
+ """Emit the terminal NDJSON frame for a real-apply run.
116
+
117
+ rc == 0 → ``{"type":"done"}``; otherwise ``{"type":"error",...}``. No-op
118
+ unless PROGRESS_NDJSON is on, so it is safe to call from every install
119
+ return path.
120
+ """
121
+ if not PROGRESS_NDJSON:
122
+ return
123
+ if rc == 0:
124
+ _emit_progress({"type": "done"})
125
+ else:
126
+ _emit_progress({"type": "error", "code": "E_INSTALL", "exitCode": rc})
127
+
91
128
 
92
129
  def info(msg: str) -> None:
93
130
  if not QUIET:
@@ -817,12 +854,42 @@ def _validate_user_type(package_root: Path, value: str) -> str:
817
854
  return cleaned
818
855
 
819
856
 
857
+ def _inject_packs(body: str, packs: "list[str]") -> str:
858
+ """Insert a top-level ``packs:`` block into a rendered settings body.
859
+
860
+ Inserted directly after the ``cost_profile:`` line so the active pack
861
+ selection sits beside the other install-time knobs. No-op when ``packs``
862
+ is empty — non-pack installs stay byte-identical to the template render.
863
+ """
864
+ if not packs:
865
+ return body
866
+ block = "packs:\n" + "".join(f" - {p}\n" for p in packs)
867
+ lines = body.splitlines(keepends=True)
868
+ out: list[str] = []
869
+ inserted = False
870
+ for line in lines:
871
+ out.append(line)
872
+ if not inserted and line.startswith("cost_profile:"):
873
+ if not line.endswith("\n"):
874
+ out[-1] = line + "\n"
875
+ out.append(block)
876
+ inserted = True
877
+ if not inserted:
878
+ # No cost_profile anchor (unexpected) — append at the end so the
879
+ # selection is still recorded rather than silently dropped.
880
+ if out and not out[-1].endswith("\n"):
881
+ out[-1] = out[-1] + "\n"
882
+ out.append(block)
883
+ return "".join(out)
884
+
885
+
820
886
  def ensure_agent_settings(
821
887
  project_root: Path,
822
888
  package_root: Path,
823
889
  profile: str,
824
890
  force: bool,
825
891
  user_type: str = "",
892
+ packs: "list[str] | None" = None,
826
893
  ) -> None:
827
894
  target = project_root / SETTINGS_FILE
828
895
  profile_source = package_root / "config" / "profiles" / f"{profile}.ini"
@@ -847,6 +914,7 @@ def ensure_agent_settings(
847
914
  # Inject runtime-only values (not part of the .ini profile presets).
848
915
  profile_values["user_type"] = _validate_user_type(package_root, user_type)
849
916
  template_body = _render_template(template, profile_values)
917
+ template_body = _inject_packs(template_body, packs or [])
850
918
 
851
919
  legacy_target = project_root / LEGACY_SETTINGS_FILE
852
920
  if legacy_target.is_file() and target.exists():
@@ -2921,12 +2989,12 @@ def _detect_legacy_for_migration(project_root: Path) -> list[str]:
2921
2989
 
2922
2990
  - ``AGENT_CONFIG_DEV_MODE=1`` is set (maintainer dogfood loop),
2923
2991
  - the project root IS the agent-config source repo
2924
- (``.agent-src.uncompressed/`` present),
2992
+ (``.agent-src.uncondensed/`` present),
2925
2993
  - the bridge marker already exists (project is already global-only).
2926
2994
  """
2927
2995
  if os.environ.get("AGENT_CONFIG_DEV_MODE") == "1":
2928
2996
  return []
2929
- if (project_root / ".agent-src.uncompressed").is_dir():
2997
+ if (project_root / ".agent-src.uncondensed").is_dir():
2930
2998
  return []
2931
2999
  if (project_root / CONSUMER_BRIDGE_MARKER_RELPATH).is_file():
2932
3000
  return []
@@ -3031,7 +3099,7 @@ def _write_consumer_bridge_marker(
3031
3099
  - ``AGENT_CONFIG_DEV_MODE=1`` (maintainer dev installs never lay the
3032
3100
  bridge into the source repo).
3033
3101
  - The project root is the agent-config source repo itself
3034
- (``.agent-src.uncompressed/`` present) — same rationale.
3102
+ (``.agent-src.uncondensed/`` present) — same rationale.
3035
3103
 
3036
3104
  Atomic write: ``tempfile`` in the same dir + ``os.replace``. Same
3037
3105
  pattern the lockfile uses (see ``scripts/_lib/installed_lock.py``).
@@ -3042,7 +3110,7 @@ def _write_consumer_bridge_marker(
3042
3110
  env_map = env if env is not None else os.environ
3043
3111
  if env_map.get("AGENT_CONFIG_DEV_MODE") == "1":
3044
3112
  return None
3045
- if (project_root / ".agent-src.uncompressed").is_dir():
3113
+ if (project_root / ".agent-src.uncondensed").is_dir():
3046
3114
  return None
3047
3115
 
3048
3116
  paths_mod = _load_user_global_paths_module()
@@ -3112,7 +3180,7 @@ def _write_per_tool_project_anchors(
3112
3180
 
3113
3181
  - Skipped under ``AGENT_CONFIG_DEV_MODE=1``.
3114
3182
  - Skipped inside the agent-config source repo
3115
- (``.agent-src.uncompressed/`` present).
3183
+ (``.agent-src.uncondensed/`` present).
3116
3184
  - Skipped when the tool is not in ``tools``.
3117
3185
 
3118
3186
  Atomic write per file (temp file + ``os.replace``); ``0o644``
@@ -3124,7 +3192,7 @@ def _write_per_tool_project_anchors(
3124
3192
  env_map = env if env is not None else os.environ
3125
3193
  if env_map.get("AGENT_CONFIG_DEV_MODE") == "1":
3126
3194
  return []
3127
- if (project_root / ".agent-src.uncompressed").is_dir():
3195
+ if (project_root / ".agent-src.uncondensed").is_dir():
3128
3196
  return []
3129
3197
 
3130
3198
  paths_mod = _load_user_global_paths_module()
@@ -3524,6 +3592,24 @@ def install_global(
3524
3592
  package_root = _resolve_package_root_for_global()
3525
3593
  deploy_results = _deploy_global_content(tools, force, package_root, written)
3526
3594
 
3595
+ # NDJSON progress for the wizard --apply-payload real-apply bridge. One
3596
+ # `file` frame per deployed tool unit (coarse, per AI-council 2026-05-27);
3597
+ # the GUI maps these to its SSE progress frames. No-op under normal CLI
3598
+ # installs (PROGRESS_NDJSON off). Emitted independent of QUIET because the
3599
+ # real-apply path sets QUIET=True to silence the human stream.
3600
+ if PROGRESS_NDJSON:
3601
+ ordered = sorted(deploy_results)
3602
+ total = len(ordered)
3603
+ for idx, tool_id in enumerate(ordered, start=1):
3604
+ w, _s, status, _ = deploy_results[tool_id]
3605
+ _emit_progress({
3606
+ "type": "file",
3607
+ "file": tool_id,
3608
+ "status": status,
3609
+ "written": idx,
3610
+ "total": total,
3611
+ })
3612
+
3527
3613
  if not QUIET:
3528
3614
  print()
3529
3615
  info("Deployed per-tool content:")
@@ -3548,12 +3634,12 @@ def install_global(
3548
3634
  # (ADR-008 Phase 3.2). Outside a project (e.g. plain `~/`) there is no
3549
3635
  # manifest to write and the global lockfile alone is the source of truth.
3550
3636
  # Skipped inside the agent-config source repo (detected by
3551
- # `.agent-src.uncompressed/`) — maintainers dogfood with their own
3637
+ # `.agent-src.uncondensed/`) — maintainers dogfood with their own
3552
3638
  # `.agent-settings.yml` and the manifest would be untracked noise.
3553
3639
  if (
3554
3640
  project_root is not None
3555
3641
  and (project_root / SETTINGS_FILE).exists()
3556
- and not (project_root / ".agent-src.uncompressed").is_dir()
3642
+ and not (project_root / ".agent-src.uncondensed").is_dir()
3557
3643
  ):
3558
3644
  # Collect deployed/marker paths per tool so the manifest records
3559
3645
  # the v2 ``files[]`` inventory (P1.4).
@@ -3571,7 +3657,7 @@ def install_global(
3571
3657
  # ``agents/.event4u-bridge.yml`` lets per-tool adapters locate
3572
3658
  # the global root from inside the repo. Skipped in maintainer
3573
3659
  # dev mode and in the source repo (see contract § Writer
3574
- # contract; the surrounding ``.agent-src.uncompressed`` guard
3660
+ # contract; the surrounding ``.agent-src.uncondensed`` guard
3575
3661
  # already covers the source-repo case, the dev-mode skip is
3576
3662
  # enforced inside the writer).
3577
3663
  marker_path = _write_consumer_bridge_marker(project_root, installed_version)
@@ -3697,6 +3783,17 @@ def parse_options(argv: list[str]) -> argparse.Namespace:
3697
3783
  "the comma-separated values are unioned. Default: all."
3698
3784
  ),
3699
3785
  )
3786
+ parser.add_argument(
3787
+ "--packs",
3788
+ default=None,
3789
+ help=(
3790
+ "comma-separated pack IDs to record as the active selection in "
3791
+ ".agent-settings.yml (project scope). Packs are a "
3792
+ "frontmatter/condense-time concept — recording the selection "
3793
+ "lets downstream condense/runtime honor it; install.py does not "
3794
+ "materialize packs. Default: none (base package only)."
3795
+ ),
3796
+ )
3700
3797
  parser.add_argument(
3701
3798
  "--no-smoke",
3702
3799
  action="store_true",
@@ -3794,7 +3891,7 @@ def parse_options(argv: list[str]) -> argparse.Namespace:
3794
3891
  dest="apply_payload",
3795
3892
  default=None,
3796
3893
  help=(
3797
- "path to a WizardApplyPayload JSON file (schemas/"
3894
+ "path to a WizardApplyPayload JSON file (internal/schemas/"
3798
3895
  "wizard-apply-payload.schema.json). When supplied, install.py "
3799
3896
  "reads the payload, validates schema_version, translates "
3800
3897
  "tools/packs/settings into CLI equivalents, and dispatches "
@@ -3805,6 +3902,13 @@ def parse_options(argv: list[str]) -> argparse.Namespace:
3805
3902
  )
3806
3903
  opts = parser.parse_args(argv)
3807
3904
  opts.tools = _merge_tools_aliases(opts.tools, opts.ai)
3905
+ # Normalize --packs (comma-separated string | None) to a list so the CLI
3906
+ # and the --apply-payload bridge agree on opts.packs being list[str].
3907
+ opts.packs = (
3908
+ [p.strip() for p in opts.packs.split(",") if p.strip()]
3909
+ if isinstance(opts.packs, str)
3910
+ else []
3911
+ )
3808
3912
  if opts.scope == "global" and opts.custom_path:
3809
3913
  fail("--custom-path is incompatible with --scope=global")
3810
3914
  if opts.global_install and opts.custom_path:
@@ -4072,7 +4176,7 @@ _INTERACTIVE_STACKS: tuple[tuple[str, str], ...] = (
4072
4176
  )
4073
4177
 
4074
4178
  _INTERACTIVE_VERBOSITIES: tuple[tuple[str, str], ...] = (
4075
- ("quiet", "Caveman / minimal output"),
4179
+ ("quiet", "Telegraph / minimal output"),
4076
4180
  ("normal", "Default verbosity"),
4077
4181
  ("verbose", "Full intent announcements + play-by-play"),
4078
4182
  )
@@ -4167,16 +4271,17 @@ def run_interactive_init(project_root: Path, force: bool) -> int:
4167
4271
  # --- Wizard auto-launch (Phase 6 follow-up) ---
4168
4272
  #
4169
4273
  # Auto-launches the browser configuration wizard at the tail of a
4170
- # successful install. The TS side ships a `gui` subcommand on the
4171
- # installer CLI; this Python parent acts as a supervisor that:
4274
+ # successful install. The unified CLI ships an `install` subcommand
4275
+ # (`dist/cli/agent-config.js`); this Python parent acts as a supervisor that:
4172
4276
  #
4173
4277
  # 1. evaluates gate conditions (TTY, CI, --no-ui, env override),
4174
4278
  # 2. validates the dist exists,
4175
- # 3. spawns `node <cli> gui --project-root <root>` via subprocess.Popen,
4279
+ # 3. spawns `node <cli> install --no-open --project-root <root>` via subprocess.Popen,
4176
4280
  # 4. captures stderr on a background thread (for failure surfacing),
4177
4281
  # 5. reads stdout line-by-line with a progressive timeout
4178
4282
  # (10s → 20s → 40s → 80s) and matches the strict readiness regex
4179
- # `^WIZARD_READY url=(http://(?:127.0.0.1|localhost):\d+/)\r?$`,
4283
+ # `^WIZARD_READY (http://(?:127.0.0.1|localhost):\d+/\S*)\r?$`
4284
+ # (the CLI prints `WIZARD_READY <url>` where url carries `?token=…`),
4180
4285
  # 6. on success: prints the URL banner and waits for the child to
4181
4286
  # exit (Ctrl-C in the parent terminal propagates to the child),
4182
4287
  # 7. on timeout: kills the child, prints captured stderr tail, falls
@@ -4186,7 +4291,7 @@ def run_interactive_init(project_root: Path, force: bool) -> int:
4186
4291
  # Roadmap: agents/roadmaps/wizard-install-py-wiring.md Step 3.
4187
4292
 
4188
4293
  _WIZARD_READY_RE = re.compile(
4189
- r"^WIZARD_READY url=(http://(?:127\.0\.0\.1|localhost):\d+/)\r?$"
4294
+ r"^WIZARD_READY (http://(?:127\.0\.0\.1|localhost):\d+/\S*)\r?$"
4190
4295
  )
4191
4296
  _WIZARD_TIMEOUTS = (10.0, 20.0, 40.0, 80.0) # cumulative budget 150s.
4192
4297
 
@@ -4195,8 +4300,8 @@ def _wizard_should_launch(opts: argparse.Namespace) -> tuple[bool, str]:
4195
4300
  """Evaluate gate conditions for the post-install wizard auto-launch.
4196
4301
 
4197
4302
  Returns (decision, reason). When decision is False the reason
4198
- string explains why (CI / no-tty / --no-ui / env override) and is
4199
- suitable for the pre-install banner Council Tier 2 § 8.
4303
+ string explains why (CI / no-tty / --no-ui / env override / explicit
4304
+ --tools) and is suitable for the pre-install banner Council Tier 2 § 8.
4200
4305
  """
4201
4306
  if getattr(opts, "no_ui", False):
4202
4307
  return (False, "--no-ui flag set")
@@ -4207,18 +4312,26 @@ def _wizard_should_launch(opts: argparse.Namespace) -> tuple[bool, str]:
4207
4312
  return (False, "CI environment detected")
4208
4313
  if not sys.stdout.isatty():
4209
4314
  return (False, "stdout is not a TTY")
4315
+ # Explicit `--tools=<list>` means the caller already knows what to
4316
+ # install — run the non-interactive CLI install, don't open the GUI
4317
+ # (road-to-single-install-source-of-truth § Phase 4). The implicit/
4318
+ # explicit `all` default does NOT suppress the wizard.
4319
+ tools_raw = getattr(opts, "tools", None)
4320
+ if tools_raw and not _tools_was_all(tools_raw):
4321
+ return (False, "explicit --tools= selection (headless install)")
4210
4322
  return (True, "")
4211
4323
 
4212
4324
 
4213
4325
  def _wizard_cli_dist(project_root: Path) -> Path | None:
4214
- """Resolve the installer dist path. Returns None if not built.
4326
+ """Resolve the unified CLI dist path. Returns None if not built.
4215
4327
 
4216
- Walks up from this file (scripts/install.py is at <pkg>/scripts/)
4217
- to <pkg>/packages/core/installer/dist/cli.js. That's the layout
4218
- the monorepo ships; consumer installs run `node <pkg>/.../cli.js`.
4328
+ Walks up from this file (scripts/install.py is at <pkg>/scripts/) to
4329
+ <pkg>/dist/cli/agent-config.js the published bin entry (package.json
4330
+ `bin`). The dead `packages/core/installer/dist/cli.js` layout was
4331
+ retired in road-to-single-install-source-of-truth § Phase 4.
4219
4332
  """
4220
4333
  package_root = Path(__file__).resolve().parent.parent
4221
- cli = package_root / "packages" / "core" / "installer" / "dist" / "cli.js"
4334
+ cli = package_root / "dist" / "cli" / "agent-config.js"
4222
4335
  return cli if cli.exists() else None
4223
4336
 
4224
4337
 
@@ -4233,17 +4346,18 @@ def _wizard_spawn(project_root: Path) -> int:
4233
4346
  cli = _wizard_cli_dist(project_root)
4234
4347
  if cli is None:
4235
4348
  print(
4236
- "(Wizard not available — installer package not built. "
4237
- "Run 'npm run build' inside packages/core/installer/.)"
4349
+ "(Wizard not available — CLI bundle not built. "
4350
+ "Run 'npm run build' at the package root to produce dist/cli/.)"
4238
4351
  )
4239
4352
  return 0
4240
4353
 
4241
- cmd = ["node", str(cli), "gui", "--project-root", str(project_root)]
4354
+ # Spawn the unified CLI's `install` subcommand (boots the UI server,
4355
+ # lands on Step 1 / AI tools). `--no-open` keeps the Python parent in
4356
+ # charge of the user-facing URL print (Tier 2 § 8 ordering) — the dead
4357
+ # `gui` subcommand + AGENT_CONFIG_GUI_NO_OPEN env were retired in
4358
+ # road-to-single-install-source-of-truth § Phase 4.
4359
+ cmd = ["node", str(cli), "install", "--no-open", "--project-root", str(project_root)]
4242
4360
  env = os.environ.copy()
4243
- # The Node child writes its own readiness banner; suppress the
4244
- # browser-open inside the child so the Python parent stays in
4245
- # charge of the user-facing URL print (Tier 2 § 8 ordering).
4246
- env.setdefault("AGENT_CONFIG_GUI_NO_OPEN", "1")
4247
4361
 
4248
4362
  try:
4249
4363
  child = subprocess.Popen( # noqa: S603 - cmd is locally-built, not user input
@@ -4255,7 +4369,7 @@ def _wizard_spawn(project_root: Path) -> int:
4255
4369
  bufsize=1, # line-buffered
4256
4370
  )
4257
4371
  except OSError as exc:
4258
- print(f"(Wizard failed to start: {exc}; run 'node {cli} gui' manually.)")
4372
+ print(f"(Wizard failed to start: {exc}; run 'node {cli} install --no-open' manually.)")
4259
4373
  return 0
4260
4374
 
4261
4375
  # Drain stderr on a background thread so a chatty child can't
@@ -4327,7 +4441,7 @@ def _wizard_await_ready(
4327
4441
  tail = "\n ".join(stderr_tail[-20:]) if stderr_tail else "(no stderr captured)"
4328
4442
  print(
4329
4443
  f"(Wizard server boot timed out after {int(sum(_WIZARD_TIMEOUTS))}s; "
4330
- f"run 'node {cli} gui' manually.)\n"
4444
+ f"run 'node {cli} install --no-open' manually.)\n"
4331
4445
  f" Last stderr:\n {tail}"
4332
4446
  )
4333
4447
  return 0
@@ -4445,10 +4559,9 @@ def main(argv: list[str]) -> int:
4445
4559
  f"--apply-payload schema_version must be 'wizard-v2' or "
4446
4560
  f"'installer-v1', got {schema_version!r}"
4447
4561
  )
4448
- # Translate payload → opts so the dry-run / real-install path
4449
- # downstream sees the same shape it would from CLI flags. Only
4450
- # dry-run preview is wired in Phase 1.5; real apply lands in a
4451
- # follow-up minor (kill-switch via package version per D7).
4562
+ # Translate payload → opts so the SAME canonical install path
4563
+ # downstream sees the shape it would from CLI flags — no second
4564
+ # code path (road-to-single-install-source-of-truth § Phase 1).
4452
4565
  if schema_version == "wizard-v2":
4453
4566
  tools = payload.get("tools") or []
4454
4567
  if isinstance(tools, list) and tools:
@@ -4457,6 +4570,36 @@ def main(argv: list[str]) -> int:
4457
4570
  opts.scope = "project"
4458
4571
  else:
4459
4572
  opts.scope = "global"
4573
+ # settings{} → --profile / --user-type. `settings` is the
4574
+ # merged .agent-settings.yml body; pull the two install-time
4575
+ # knobs the canonical installer consumes. Everything else in
4576
+ # the settings body is written by the wizard `/finish` 2PC
4577
+ # commit, not by install.py.
4578
+ settings = payload.get("settings") or {}
4579
+ if isinstance(settings, dict):
4580
+ cost_profile = settings.get("cost_profile")
4581
+ if isinstance(cost_profile, str) and cost_profile:
4582
+ opts.profile = cost_profile
4583
+ personal = settings.get("personal")
4584
+ if isinstance(personal, dict):
4585
+ user_type = personal.get("user_type")
4586
+ if isinstance(user_type, str) and user_type:
4587
+ opts.user_type = user_type
4588
+ # packs[] → declarative selection persisted into
4589
+ # .agent-settings.yml on the project path (ensure_agent_settings).
4590
+ # Packs are a frontmatter/condense-time concept; there is no
4591
+ # install-time materialization — the selection is recorded so
4592
+ # downstream condense/runtime honors it (AI-council 2026-05-27).
4593
+ packs = payload.get("packs") or []
4594
+ if isinstance(packs, list):
4595
+ opts.packs = [p for p in packs if isinstance(p, str)]
4596
+ # Per-tool user-hook opts → ensure_*_hook flags: deliberately
4597
+ # NOT wired. The wizard-v2 payload carries no hook fields, and
4598
+ # auto-enabling user-scope hooks (which write to the global
4599
+ # user config) on tool selection would silently widen install
4600
+ # scope — a non-destructive-by-default violation. Maps only
4601
+ # once the schema grows an explicit hooks field (AI-council
4602
+ # 2026-05-27, Gemini + Codex converged).
4460
4603
  elif schema_version == "installer-v1":
4461
4604
  ai_tools = payload.get("ai_tools") or []
4462
4605
  if isinstance(ai_tools, list) and ai_tools:
@@ -4466,13 +4609,13 @@ def main(argv: list[str]) -> int:
4466
4609
  opts.dry_run = True
4467
4610
  if opts.dry_run:
4468
4611
  return _apply_payload_preview(payload, opts)
4469
- # Real-apply path through the payload bridge is gated by the
4470
- # follow-up minor (Phase 1.9). Until then, fail loudly so the
4471
- # caller knows they need --dry-run.
4472
- fail(
4473
- "--apply-payload without --dry-run is not yet wired "
4474
- "(road-to-global-only-install § Phase 1.5 ships dry-run only)."
4475
- )
4612
+ # Real apply: stream machine-readable NDJSON progress on stdout and
4613
+ # silence human output so the GUI gets a clean stream. Then fall
4614
+ # through to the canonical install path below — no separate apply
4615
+ # implementation.
4616
+ global PROGRESS_NDJSON
4617
+ PROGRESS_NDJSON = True
4618
+ QUIET = True
4476
4619
 
4477
4620
  # --offline: propagate via env so child subprocesses (versions /
4478
4621
  # update / check_update_banner) honor the air-gap guarantee
@@ -4561,7 +4704,9 @@ def main(argv: list[str]) -> int:
4561
4704
  return rc
4562
4705
  # Pass detect_root so the manifest refresh runs when --global is
4563
4706
  # invoked from within a project tree (ADR-008 Phase 3.2).
4564
- return install_global(parsed_tools, opts.force, project_root=detect_root)
4707
+ rc = install_global(parsed_tools, opts.force, project_root=detect_root)
4708
+ _emit_progress_terminal(rc)
4709
+ return rc
4565
4710
 
4566
4711
  project_root = custom_path or Path(opts.project or os.environ.get("PROJECT_ROOT") or os.getcwd()).resolve()
4567
4712
  is_first_run = not (project_root / SETTINGS_FILE).exists()
@@ -4571,14 +4716,75 @@ def main(argv: list[str]) -> int:
4571
4716
  # never ships ahead of the bridge files it parameterizes.
4572
4717
  if rc == 0 and getattr(opts, "interactive", False):
4573
4718
  run_interactive_init(project_root, opts.force)
4719
+ _emit_progress_terminal(rc)
4574
4720
  return rc
4575
4721
  except ConflictAbort as exc:
4576
4722
  warn(exc.message)
4723
+ _emit_progress({"type": "error", "code": "E_CONFLICT_UNRESOLVED", "message": exc.message})
4577
4724
  return 1
4578
4725
  finally:
4579
4726
  _set_conflict_policy(None)
4580
4727
 
4581
4728
 
4729
+ def _propose_modules_config(project_root: Path, is_first_run: bool) -> None:
4730
+ """Surface module-root candidates as numbered options on first install.
4731
+
4732
+ Phase B Step 2 of road-to-configurable-modules. Hooks into the
4733
+ project-install path: when the install is first-run, the terminal
4734
+ is a TTY, ``.agent-project-settings.yml`` exists without a populated
4735
+ ``modules:`` block, and the detection helper finds at least one
4736
+ candidate, the installer prints the proposed block and asks the
4737
+ user to paste it into the team file. No automatic write — the
4738
+ layered-settings contract treats ``.agent-project-settings.yml``
4739
+ as user-curated.
4740
+
4741
+ Gates (any miss → silent no-op):
4742
+
4743
+ * ``is_first_run`` must be True — re-runs never re-prompt.
4744
+ * stdin + stdout must be TTYs — non-interactive installs (CI,
4745
+ wizard apply-payload, ``--quiet``) skip silently.
4746
+ * ``QUIET`` must be False.
4747
+ * The detection helper must surface at least one candidate.
4748
+ """
4749
+ if not is_first_run or QUIET or not sys.stdin.isatty() or not sys.stdout.isatty():
4750
+ return
4751
+ try:
4752
+ from scripts._lib.module_detection import detect_module_roots
4753
+ except ImportError:
4754
+ return
4755
+ try:
4756
+ candidates = detect_module_roots(project_root)
4757
+ except OSError:
4758
+ return
4759
+ if not candidates:
4760
+ return
4761
+ print()
4762
+ info("Module-root candidates detected — propose `modules:` block")
4763
+ info(
4764
+ "Paste into .agent-project-settings.yml to enable module-aware "
4765
+ "skills (or skip; the block stays opt-in)."
4766
+ )
4767
+ print()
4768
+ print(" modules:")
4769
+ print(" enabled: true")
4770
+ print(
4771
+ " root_paths: [" + ", ".join(c.path for c in candidates) + "]"
4772
+ )
4773
+ primary_ns = next(
4774
+ (c.namespace_template_guess for c in candidates if c.namespace_template_guess),
4775
+ "",
4776
+ )
4777
+ if primary_ns:
4778
+ print(f" namespace_template: '{primary_ns}'")
4779
+ print(" agent_folder: agents")
4780
+ print(" skip_dirs: [.module-template, .example]")
4781
+ print()
4782
+ info(
4783
+ "Re-run anytime via `python3 scripts/propose_modules_config.py` "
4784
+ "(installed under <package>/scripts/)."
4785
+ )
4786
+
4787
+
4582
4788
  def _main_project_install(
4583
4789
  opts: argparse.Namespace,
4584
4790
  project_root: Path,
@@ -4611,7 +4817,8 @@ def _main_project_install(
4611
4817
  print()
4612
4818
 
4613
4819
  ensure_agent_settings(
4614
- project_root, package_root, opts.profile, opts.force, opts.user_type
4820
+ project_root, package_root, opts.profile, opts.force, opts.user_type,
4821
+ packs=getattr(opts, "packs", None),
4615
4822
  )
4616
4823
 
4617
4824
  # Install-mode marker (Step 8 A5) — full path flips any prior
@@ -4686,6 +4893,21 @@ def _main_project_install(
4686
4893
  ensure_gemini_user_hooks(package_root, opts.force),
4687
4894
  )
4688
4895
 
4896
+ # NDJSON progress for the wizard --apply-payload real-apply bridge on the
4897
+ # project scope (scope_to_project_only=true). One `file` frame per enabled
4898
+ # tool unit, coarse per AI-council 2026-05-27. No-op under normal CLI.
4899
+ if PROGRESS_NDJSON and not opts.skip_bridges:
4900
+ ordered = sorted(tools)
4901
+ total = len(ordered)
4902
+ for idx, tool_id in enumerate(ordered, start=1):
4903
+ _emit_progress({
4904
+ "type": "file",
4905
+ "file": tool_id,
4906
+ "status": "deployed",
4907
+ "written": idx,
4908
+ "total": total,
4909
+ })
4910
+
4689
4911
  if not opts.skip_bridges and not opts.no_smoke:
4690
4912
  if not QUIET:
4691
4913
  print()
@@ -4728,6 +4950,12 @@ def _main_project_install(
4728
4950
  print(" Re-run complete. Walkthrough: https://github.com/event4u-app/agent-config/blob/main/docs/getting-started.md")
4729
4951
  print()
4730
4952
 
4953
+ # Module-root proposal (road-to-configurable-modules Phase B Step 2).
4954
+ # First-run TTY installs surface detected `modules:` candidates so
4955
+ # the user can paste an opt-in block into .agent-project-settings.yml.
4956
+ # Silent no-op on re-runs, CI, --quiet, and wizard apply-payload runs.
4957
+ _propose_modules_config(project_root, is_first_run)
4958
+
4731
4959
  # Wizard auto-launch (Phase 6 follow-up). Runs after the success
4732
4960
  # banner so the user sees install completion even if the wizard
4733
4961
  # boot times out. Gate was already evaluated at the top of main()