@event4u/agent-config 3.3.0 → 4.1.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 (585) 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 +181 -3
  144. package/CONTRIBUTING.md +31 -12
  145. package/README.md +18 -10
  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/apply.js +238 -0
  164. package/dist/install/apply.js.map +1 -0
  165. package/dist/install/atomic.js +92 -0
  166. package/dist/install/atomic.js.map +1 -0
  167. package/dist/install/bridges/augment.js +20 -0
  168. package/dist/install/bridges/augment.js.map +1 -0
  169. package/dist/install/bridges/claude.js +44 -0
  170. package/dist/install/bridges/claude.js.map +1 -0
  171. package/dist/install/bridges/cline.js +69 -0
  172. package/dist/install/bridges/cline.js.map +1 -0
  173. package/dist/install/bridges/copilot.js +28 -0
  174. package/dist/install/bridges/copilot.js.map +1 -0
  175. package/dist/install/bridges/cursor.js +34 -0
  176. package/dist/install/bridges/cursor.js.map +1 -0
  177. package/dist/install/bridges/gemini.js +39 -0
  178. package/dist/install/bridges/gemini.js.map +1 -0
  179. package/dist/install/bridges/index.js +88 -0
  180. package/dist/install/bridges/index.js.map +1 -0
  181. package/dist/install/bridges/marker-content.js +153 -0
  182. package/dist/install/bridges/marker-content.js.map +1 -0
  183. package/dist/install/bridges/markers.js +42 -0
  184. package/dist/install/bridges/markers.js.map +1 -0
  185. package/dist/install/bridges/types.js +31 -0
  186. package/dist/install/bridges/types.js.map +1 -0
  187. package/dist/install/bridges/vscode.js +26 -0
  188. package/dist/install/bridges/vscode.js.map +1 -0
  189. package/dist/install/bridges/windsurf.js +35 -0
  190. package/dist/install/bridges/windsurf.js.map +1 -0
  191. package/dist/install/conflict.js +196 -0
  192. package/dist/install/conflict.js.map +1 -0
  193. package/dist/install/detect.js +218 -0
  194. package/dist/install/detect.js.map +1 -0
  195. package/dist/install/paths.js +82 -0
  196. package/dist/install/paths.js.map +1 -0
  197. package/dist/install/plan.js +157 -0
  198. package/dist/install/plan.js.map +1 -0
  199. package/dist/install/txlog.js +140 -0
  200. package/dist/install/txlog.js.map +1 -0
  201. package/dist/install/types.js +19 -0
  202. package/dist/install/types.js.map +1 -0
  203. package/dist/install/wizard-plan.js +184 -0
  204. package/dist/install/wizard-plan.js.map +1 -0
  205. package/dist/mcp/registry-manifest.json +4 -4
  206. package/dist/router.json +67 -19
  207. package/dist/server/app.js +6 -0
  208. package/dist/server/app.js.map +1 -1
  209. package/dist/server/routes/install.js +547 -0
  210. package/dist/server/routes/install.js.map +1 -0
  211. package/dist/server/routes/wizard.js +301 -6
  212. package/dist/server/routes/wizard.js.map +1 -1
  213. package/dist/server/routes/workspace.js +396 -0
  214. package/dist/server/routes/workspace.js.map +1 -0
  215. package/dist/server/schemas/settings.js +4 -3
  216. package/dist/server/schemas/settings.js.map +1 -1
  217. package/dist/ui/assets/index-BXZILUxe.css +1 -0
  218. package/dist/ui/assets/index-DLEuEW1V.js +35 -0
  219. package/dist/ui/assets/index-DLEuEW1V.js.map +1 -0
  220. package/dist/ui/index.html +2 -2
  221. package/docs/MIGRATION.md +1 -1
  222. package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
  223. package/docs/adrs/router/0001-three-tier-routing.md +4 -4
  224. package/docs/adrs/schema/0001-json-schema-frontmatter.md +1 -1
  225. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +4 -4
  226. package/docs/adrs/{caveman → telegraph}/0001-default-off-until-bench.md +9 -9
  227. package/docs/adrs/telegraph/README.md +9 -0
  228. package/docs/architecture/augment-projection.md +4 -4
  229. package/docs/architecture/claude-bundle.md +1 -1
  230. package/docs/architecture/current-onboard-baseline.md +3 -3
  231. package/docs/architecture/multi-tool-projection.md +10 -10
  232. package/docs/architecture/source-projection.md +27 -27
  233. package/docs/architecture.md +19 -15
  234. package/docs/archive/CHANGELOG-pre-2.11.0.md +2 -2
  235. package/docs/archive/CHANGELOG-pre-2.15.0.md +3 -3
  236. package/docs/archive/CHANGELOG-pre-2.16.0.md +1 -1
  237. package/docs/archive/CHANGELOG-pre-2.2.0.md +70 -70
  238. package/docs/archive/CHANGELOG-pre-2.20.0.md +2 -2
  239. package/docs/archive/CHANGELOG-pre-2.25.0.md +15 -15
  240. package/docs/archive/CHANGELOG-pre-3.0.0.md +4 -4
  241. package/docs/archive/CHANGELOG-pre-3.1.0.md +2 -2
  242. package/docs/archive/CHANGELOG-pre-3.2.0.md +3 -3
  243. package/docs/benchmark.md +65 -0
  244. package/docs/benchmarks.md +16 -16
  245. package/docs/catalog.md +17 -15
  246. package/docs/contracts/CHANGELOG-conventions.md +1 -1
  247. package/docs/contracts/STABILITY.md +2 -2
  248. package/docs/contracts/adoption-signal-floor.md +110 -0
  249. package/docs/contracts/adr-chat-history-split.md +4 -4
  250. package/docs/contracts/adr-command-suggestion.md +4 -4
  251. package/docs/contracts/adr-gtm-context-spine.md +1 -1
  252. package/docs/contracts/adr-implement-ticket-runtime.md +4 -4
  253. package/docs/contracts/adr-install-user-type-axis.md +1 -1
  254. package/docs/contracts/adr-layout.md +2 -2
  255. package/docs/contracts/adr-product-ui-track.md +10 -10
  256. package/docs/contracts/adr-user-types-axis.md +3 -3
  257. package/docs/contracts/adr-wing4-context-spine.md +1 -1
  258. package/docs/contracts/agent-memory-contract.md +3 -3
  259. package/docs/contracts/agents-md-tech-stack.md +2 -2
  260. package/docs/contracts/ai-council-config.md +2 -2
  261. package/docs/contracts/at-rest-encryption.md +4 -0
  262. package/docs/contracts/audit-log-v1.md +1 -1
  263. package/docs/contracts/benchmark-ab-contract.md +101 -0
  264. package/docs/contracts/benchmark-corpus-spec.md +1 -1
  265. package/docs/contracts/branch-protection-policy.md +98 -0
  266. package/docs/contracts/ci-cost-budget.md +106 -0
  267. package/docs/contracts/ci-green-floor.md +141 -0
  268. package/docs/contracts/command-clusters.md +6 -6
  269. package/docs/contracts/command-surface-tiers.md +2 -2
  270. package/docs/contracts/command-taxonomy.md +2 -2
  271. package/docs/contracts/{compression-default-kill-criterion.md → condensation-default-kill-criterion.md} +29 -29
  272. package/docs/contracts/config-presets.md +1 -1
  273. package/docs/contracts/context-paths.md +3 -3
  274. package/docs/contracts/context-spine.md +1 -1
  275. package/docs/contracts/cost-summary-schema.md +12 -12
  276. package/docs/contracts/cross-wing-handoff.md +4 -4
  277. package/docs/contracts/daily-workspace.md +4 -0
  278. package/docs/contracts/decision-trace-v1.md +2 -2
  279. package/docs/contracts/discovery-manifest.md +4 -4
  280. package/docs/contracts/explain-modes.md +4 -0
  281. package/docs/contracts/file-ownership-matrix.json +3493 -3318
  282. package/docs/contracts/file-ownership-matrix.md +3 -3
  283. package/docs/contracts/frontmatter-contract.md +4 -4
  284. package/docs/contracts/ghostwriter-schema.md +3 -3
  285. package/docs/contracts/gui-wizard.md +1 -1
  286. package/docs/contracts/harness-expectations.md +123 -0
  287. package/docs/contracts/host-agent-protocol.md +4 -0
  288. package/docs/contracts/implement-ticket-flow.md +9 -9
  289. package/docs/contracts/install-scopes.md +77 -0
  290. package/docs/contracts/iron-law-overrides.txt +1 -1
  291. package/docs/contracts/kernel-membership.md +26 -26
  292. package/docs/contracts/linear-ai-rules-inclusion.md +1 -1
  293. package/docs/contracts/linter-structural-model.md +2 -2
  294. package/docs/contracts/load-context-budget-model.md +4 -4
  295. package/docs/contracts/load-context-schema.md +13 -13
  296. package/docs/contracts/local-analytics.md +4 -0
  297. package/docs/contracts/local-knowledge-ingestion.md +1 -1
  298. package/docs/contracts/mcp-cloud-scope.md +2 -2
  299. package/docs/contracts/mcp-phase-1-scope.md +3 -3
  300. package/docs/contracts/measurement-baseline.md +5 -5
  301. package/docs/contracts/mental-models.md +30 -30
  302. package/docs/contracts/multi-tool-projection-fidelity.md +4 -4
  303. package/docs/contracts/namespace.md +4 -4
  304. package/docs/contracts/orchestration-dsl-v1.md +7 -7
  305. package/docs/contracts/package-self-orientation.md +12 -12
  306. package/docs/contracts/persona-schema.md +6 -6
  307. package/docs/contracts/pilot/language-and-tone.md +1 -1
  308. package/docs/contracts/plain-language-surface.md +117 -0
  309. package/docs/contracts/profile-system.md +3 -3
  310. package/docs/contracts/release-pr-gating.md +103 -0
  311. package/docs/contracts/role-experience.md +3 -3
  312. package/docs/contracts/rule-classification.md +13 -13
  313. package/docs/contracts/rule-interactions.md +4 -4
  314. package/docs/contracts/rule-interactions.yml +30 -30
  315. package/docs/contracts/rule-priority-hierarchy.md +13 -13
  316. package/docs/contracts/rule-router.md +2 -2
  317. package/docs/contracts/safety-model.md +1 -1
  318. package/docs/contracts/skill-distribution-channels.md +61 -0
  319. package/docs/contracts/skill-domains.md +2 -2
  320. package/docs/contracts/smoke-contracts.md +5 -5
  321. package/docs/contracts/telegraph-telemetry.md +83 -0
  322. package/docs/contracts/trust-and-safety.md +5 -5
  323. package/docs/contracts/ui-stack-extension.md +7 -7
  324. package/docs/contracts/ui-track-flow.md +9 -9
  325. package/docs/contracts/user-type-schema.md +4 -4
  326. package/docs/contracts/workflow-packs.md +4 -4
  327. package/docs/contracts/workspace-documents.md +4 -0
  328. package/docs/customization.md +28 -8
  329. package/docs/decisions/ADR-001-kernel-swap-deferred.md +6 -6
  330. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -11
  331. package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +2 -2
  332. package/docs/decisions/ADR-004-rule-governance-pruning.md +4 -4
  333. package/docs/decisions/ADR-005-subagent-worktrees.md +7 -7
  334. package/docs/decisions/ADR-011-domain-pack-readiness.md +6 -6
  335. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +3 -3
  336. package/docs/decisions/ADR-015-discovery-manifest-contract.md +3 -3
  337. package/docs/decisions/ADR-017-monorepo-physical-layout.md +10 -10
  338. package/docs/decisions/ADR-018-trust-and-safety-layer.md +6 -6
  339. package/docs/decisions/ADR-019-router-json-dist-location.md +2 -2
  340. package/docs/decisions/ADR-020-global-only-consumer-scope.md +2 -2
  341. package/docs/decisions/ADR-021-deployment-shape.md +1 -1
  342. package/docs/decisions/ADR-022-daily-workspace-decomposition.md +1 -1
  343. package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +2 -2
  344. package/docs/decisions/ADR-028-root-layout.md +7 -7
  345. package/docs/decisions/ADR-029-multi-workspace-deferred.md +2 -2
  346. package/docs/decisions/ADR-rule-kernel-and-router.md +5 -5
  347. package/docs/deploy/team-deployment-posture.md +20 -0
  348. package/docs/development.md +17 -17
  349. package/docs/distribution/registries.md +32 -0
  350. package/docs/distribution/registry-submissions.md +85 -0
  351. package/docs/distribution/telemetry-schema.md +1 -1
  352. package/docs/getting-started-by-role.md +45 -3
  353. package/docs/getting-started.md +2 -2
  354. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  355. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
  356. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  357. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  358. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  359. package/docs/guidelines/agent-infra/direct-answers-demos.md +1 -1
  360. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  361. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  362. package/docs/guidelines/agent-infra/layered-settings.md +56 -2
  363. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  364. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -2
  365. package/docs/guidelines/agent-infra/rule-type-governance.md +1 -1
  366. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  367. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +2 -2
  368. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  369. package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
  370. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  371. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +1 -1
  372. package/docs/guidelines/augment-portability-patterns.md +4 -4
  373. package/docs/guidelines/cross-role-handoff.md +2 -2
  374. package/docs/guidelines/php/php-coding-patterns.md +1 -1
  375. package/docs/guidelines/prompt-templates.md +6 -6
  376. package/docs/maintainers/dev-mode.md +1 -1
  377. package/docs/mcp.md +1 -1
  378. package/docs/parity/bench.json +3 -3
  379. package/docs/parity/ruflo.md +2 -2
  380. package/docs/profiles.md +11 -11
  381. package/docs/quality.md +11 -11
  382. package/docs/safety.md +3 -3
  383. package/docs/setup/mcp-client-config.md +1 -1
  384. package/docs/setup/mcp-r2-bootstrap.md +1 -1
  385. package/docs/setup/mcp-server-docker.md +3 -3
  386. package/docs/setup/per-ide/windsurf.md +1 -1
  387. package/docs/skills-catalog.md +8 -7
  388. package/docs/troubleshooting.md +1 -1
  389. package/docs/walkthroughs/daily-workspace-a11y.md +87 -0
  390. package/llms.txt +7 -6
  391. package/package.json +1 -1
  392. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  393. package/scripts/_archive/README.md +2 -2
  394. package/scripts/_archive/_backfill_skill_domains.py +3 -3
  395. package/scripts/_archive/_bootstrap_tier_frontmatter.py +3 -3
  396. package/scripts/_archive/_p43_bodies.py +10 -10
  397. package/scripts/_archive/{_p43_compress.py → _p43_condense.py} +5 -5
  398. package/scripts/_archive/_p4_migrate.py +7 -7
  399. package/scripts/_archive/_phase2_shim_helper.py +1 -1
  400. package/scripts/_archive/_pilot_council_question.py +5 -5
  401. package/scripts/_cli/explain_last/inputs.py +1 -1
  402. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  403. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  404. package/scripts/_lib/agent_settings.py +195 -1
  405. package/scripts/_lib/agent_src.py +19 -19
  406. package/scripts/_lib/bench_ab_cache.py +162 -0
  407. package/scripts/_lib/bench_ab_scoring.py +209 -0
  408. package/scripts/_lib/{bench_caveman.py → bench_telegraph.py} +21 -21
  409. package/scripts/_lib/{bench_caveman_report.py → bench_telegraph_report.py} +21 -21
  410. package/scripts/_lib/claude_desktop_bundler.py +5 -5
  411. package/scripts/_lib/module_detection.py +223 -0
  412. package/scripts/_lib/scope_guard.sh +162 -0
  413. package/scripts/_phase4_bucket.py +3 -3
  414. package/scripts/_pilot_measure.py +4 -4
  415. package/scripts/_tmp_scan_framework_leakage.py +1 -1
  416. package/scripts/adoption_report.py +195 -0
  417. package/scripts/adoption_snapshot.py +219 -0
  418. package/scripts/adoption_status.py +166 -0
  419. package/scripts/ai-video/lib/parse-blueprint.sh +1 -1
  420. package/scripts/ai_council/advisors.py +5 -5
  421. package/scripts/ai_council/compile_corpus.py +1 -1
  422. package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +3 -3
  423. package/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +2 -2
  424. package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +1 -1
  425. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +1 -1
  426. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +1 -1
  427. package/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +3 -3
  428. package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +1 -1
  429. package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +1 -1
  430. package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +6 -6
  431. package/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +1 -1
  432. package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +6 -6
  433. package/scripts/annotate_discovery.py +13 -13
  434. package/scripts/apply_modules_config.py +290 -0
  435. package/scripts/audit_adr_coverage.py +2 -2
  436. package/scripts/audit_auto_rules.py +2 -2
  437. package/scripts/audit_cloud_compatibility.py +3 -3
  438. package/scripts/audit_command_surface.py +9 -9
  439. package/scripts/audit_likelihood.py +2 -2
  440. package/scripts/audit_user_type_axis.py +2 -2
  441. package/scripts/bench_ab_cache_dispatch.py +68 -0
  442. package/scripts/bench_ab_clone.py +170 -0
  443. package/scripts/bench_ab_diff.py +227 -0
  444. package/scripts/bench_ab_integrity.py +143 -0
  445. package/scripts/bench_ab_run.py +235 -0
  446. package/scripts/bench_ab_task_runner.py +369 -0
  447. package/scripts/bench_ab_tracka_run.py +202 -0
  448. package/scripts/{bench_compress_memory.py → bench_condense_memory.py} +16 -16
  449. package/scripts/bench_run.py +33 -33
  450. package/scripts/bench_runner.py +2 -2
  451. package/scripts/bootstrap.sh +99 -0
  452. package/scripts/build_cloud_bundle.py +6 -6
  453. package/scripts/build_discovery_manifest.py +7 -7
  454. package/scripts/build_linear_digest.py +3 -3
  455. package/scripts/build_rule_trigger_matrix.py +8 -8
  456. package/scripts/chat_history.py +5 -5
  457. package/scripts/check_always_budget.py +11 -5
  458. package/scripts/check_augment_description_cap.py +3 -3
  459. package/scripts/check_cluster_patterns.py +2 -2
  460. package/scripts/check_command_count_messaging.py +3 -3
  461. package/scripts/{check_compression.py → check_condensation.py} +34 -34
  462. package/scripts/{check_compressed_paths.py → check_condensed_paths.py} +8 -8
  463. package/scripts/check_context_paths.py +7 -7
  464. package/scripts/check_council_layout.py +2 -2
  465. package/scripts/check_council_references.py +9 -9
  466. package/scripts/check_iron_law_prominence.py +2 -2
  467. package/scripts/check_kernel_rule_bundle.py +2 -2
  468. package/scripts/check_module_management_neutral.py +149 -0
  469. package/scripts/check_no_roadmap_refs.py +9 -9
  470. package/scripts/check_portability.py +3 -3
  471. package/scripts/check_public_catalog_links.py +4 -4
  472. package/scripts/check_references.py +7 -6
  473. package/scripts/check_release_pr_shape.py +112 -0
  474. package/scripts/check_reply_consistency.py +3 -3
  475. package/scripts/check_safety_floor_untouched.py +1 -1
  476. package/scripts/check_template_pin_drift.py +5 -5
  477. package/scripts/check_token_optimizer_freshness.py +3 -3
  478. package/scripts/ci_status.py +301 -0
  479. package/scripts/ci_time_ratio.py +1 -1
  480. package/scripts/cleanup_other_scope.sh +146 -0
  481. package/scripts/compile_router.py +10 -10
  482. package/scripts/{compress.py → condense.py} +64 -64
  483. package/scripts/condense.sh +18 -0
  484. package/scripts/{compress_memory.py → condense_memory.py} +33 -33
  485. package/scripts/config/presets.py +2 -2
  486. package/scripts/config/profiles.py +1 -1
  487. package/scripts/cost_by_conversation.py +3 -3
  488. package/scripts/cost_summary.py +7 -7
  489. package/scripts/count_token_optimizer_usage.sh +1 -1
  490. package/scripts/gen_discovery_baseline.py +5 -5
  491. package/scripts/generate_index.py +6 -6
  492. package/scripts/generate_ownership_matrix.py +10 -10
  493. package/scripts/generate_pack_manifests.py +1 -1
  494. package/scripts/ghostwriter_fixture_allowlist.txt +1 -1
  495. package/scripts/install +3 -3
  496. package/scripts/install-hooks.sh +6 -6
  497. package/scripts/install.py +76 -11
  498. package/scripts/install.sh +187 -1
  499. package/scripts/inventory_frontmatter.py +2 -2
  500. package/scripts/iron_law_sha.py +3 -3
  501. package/scripts/lint_agents_layout.py +14 -7
  502. package/scripts/lint_agents_md.py +4 -4
  503. package/scripts/lint_archived_skills.py +3 -3
  504. package/scripts/lint_artefact_frontmatter.py +2 -2
  505. package/scripts/lint_bench_ab.py +172 -0
  506. package/scripts/lint_bench_corpus.py +1 -1
  507. package/scripts/lint_command_tiers.py +5 -5
  508. package/scripts/lint_context_spine_usage.py +1 -1
  509. package/scripts/lint_framework_leakage.py +7 -7
  510. package/scripts/lint_framework_leakage_allowlist.json +144 -84
  511. package/scripts/lint_ghostwriter_source.py +3 -3
  512. package/scripts/lint_handoffs.py +1 -1
  513. package/scripts/lint_load_context.py +11 -11
  514. package/scripts/lint_media_policy_linkage.py +5 -5
  515. package/scripts/lint_namespace.py +1 -1
  516. package/scripts/lint_no_new_atomic_commands.py +2 -2
  517. package/scripts/lint_orchestration_dsl.py +1 -1
  518. package/scripts/lint_pack_boundaries.py +2 -2
  519. package/scripts/lint_persona_governance.py +4 -4
  520. package/scripts/lint_role_experiences.py +237 -0
  521. package/scripts/lint_rule_interactions.py +2 -2
  522. package/scripts/lint_rule_tiers.py +1 -1
  523. package/scripts/lint_trust_coherence.py +2 -2
  524. package/scripts/mcp_registry_submit.sh +187 -0
  525. package/scripts/mcp_server/tools.py +1 -1
  526. package/scripts/measure_frugality_savings.py +10 -10
  527. package/scripts/measure_patterns.py +1 -1
  528. package/scripts/measure_projection_bytes.py +5 -5
  529. package/scripts/measure_rule_budget.py +3 -3
  530. package/scripts/measure_skill_reduction.py +1 -1
  531. package/scripts/memory_lookup.py +1 -1
  532. package/scripts/memory_status.py +2 -2
  533. package/scripts/migrate_command_suggestions.py +3 -3
  534. package/scripts/mine_session.py +1 -1
  535. package/scripts/move_artefact.py +3 -3
  536. package/scripts/new_skill.py +2 -2
  537. package/scripts/pack_mcp_content.py +9 -9
  538. package/scripts/plan_physical_move.py +6 -6
  539. package/scripts/print_required_checks.py +196 -0
  540. package/scripts/probe_skill_registration.py +413 -0
  541. package/scripts/propose_modules_config.py +145 -0
  542. package/scripts/prototype_lint_contradictions.py +1 -1
  543. package/scripts/recruit_preflight.sh +152 -0
  544. package/scripts/refine_ticket_detect.py +3 -3
  545. package/scripts/release.py +20 -0
  546. package/scripts/render_benchmark_md.py +308 -0
  547. package/scripts/roadmap_progress_hook.py +1 -1
  548. package/scripts/run_skill_evals.py +2 -2
  549. package/scripts/runtime_registry.py +4 -4
  550. package/scripts/schemas/command.schema.json +4 -4
  551. package/scripts/schemas/rule.schema.json +5 -5
  552. package/scripts/schemas/skill.schema.json +3 -3
  553. package/scripts/schemas/user-type.schema.json +1 -1
  554. package/scripts/score_skill_selection.py +1 -1
  555. package/scripts/skill_collision_clusters.py +2 -2
  556. package/scripts/skill_linter.py +81 -81
  557. package/scripts/skill_overlap.py +5 -5
  558. package/scripts/skill_tools/audit_persona_coverage.py +2 -2
  559. package/scripts/skill_tools/audit_user_type_coverage.py +2 -2
  560. package/scripts/skill_tools/run_block_d_eval.py +1 -1
  561. package/scripts/skill_tools/score_skill_relevance.py +1 -1
  562. package/scripts/skill_tools/suggest_skill_for_task.py +1 -1
  563. package/scripts/skill_trigger_eval.py +3 -3
  564. package/scripts/smoke/kernel.sh +7 -1
  565. package/scripts/smoke/router.sh +5 -5
  566. package/scripts/smoke/skills.sh +1 -1
  567. package/scripts/smoke_quickstart.py +1 -1
  568. package/scripts/snapshot_agent_outputs.py +3 -3
  569. package/scripts/spotcheck_thin_root.py +1 -1
  570. package/scripts/{caveman_stats.py → telegraph_stats.py} +18 -18
  571. package/scripts/update_counts.py +1 -1
  572. package/scripts/validate_decision_engine.py +1 -1
  573. package/scripts/validate_frontmatter.py +1 -1
  574. package/scripts/validate_safe_paths.py +3 -3
  575. package/scripts/{validate_caveman_carveouts.py → validate_telegraph_carveouts.py} +7 -7
  576. package/scripts/verify_roadmap_closure.py +6 -6
  577. package/templates/consumer-settings/ONBOARDING.md +41 -0
  578. package/.agent-src/commands/install-via-agent.md +0 -129
  579. package/.agent-src/skills/compress-memory/SKILL.md +0 -131
  580. package/dist/ui/assets/index-D-DY1ywI.js +0 -35
  581. package/dist/ui/assets/index-D-DY1ywI.js.map +0 -1
  582. package/dist/ui/assets/index-Dqfhmg-d.css +0 -1
  583. package/docs/adrs/caveman/README.md +0 -9
  584. package/docs/contracts/caveman-telemetry.md +0 -83
  585. package/scripts/compress.sh +0 -18
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Detection layer — Phase A2 port of `scripts/install.py:detect_*`.
3
+ *
4
+ * Pure functions only: read once, return a plan. No side effects in
5
+ * the detection itself — atomic writes and conflict resolution happen
6
+ * in later phases against the data this module returns.
7
+ *
8
+ * Mirrors:
9
+ * - `SCOPE_DETECT_MANIFESTS` → {@link SCOPE_DETECT_MANIFESTS}
10
+ * - `SCOPE_DETECT_AI_DIRS` → {@link SCOPE_DETECT_AI_DIRS}
11
+ * - `SCOPE_DETECT_AI_FILES` → {@link SCOPE_DETECT_AI_FILES}
12
+ * - `detect_scope(cwd)` → {@link detectScope}
13
+ * - `detect_package_root(project_root)` → {@link detectPackageRoot}
14
+ * - `detect_package_type(...)` → {@link detectPackageType}
15
+ *
16
+ * v4 addition (no Python counterpart): {@link discoverPacks} walks the
17
+ * monorepo `packages/` tree to enumerate available packs.
18
+ */
19
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
20
+ import { homedir } from 'node:os';
21
+ import { join, resolve } from 'node:path';
22
+ /**
23
+ * Settings-file name used as the strongest project-scope signal.
24
+ *
25
+ * Matches `SETTINGS_FILE` in `scripts/install.py`. Presence in `cwd`
26
+ * short-circuits scope detection to `'project'` without consulting
27
+ * the manifest / AI-tool lists.
28
+ */
29
+ export const SETTINGS_FILE = '.agent-settings.yml';
30
+ /**
31
+ * Manifest files that, when present, count as a project-shape signal.
32
+ *
33
+ * Listed in the order they are most commonly canonical; detection
34
+ * short-circuits on the first hit. `.git/` is intentionally absent —
35
+ * monorepos, dotfile-git repos, and non-Git workspaces all break it
36
+ * (ADR-007 D2).
37
+ */
38
+ export const SCOPE_DETECT_MANIFESTS = [
39
+ 'package.json',
40
+ 'composer.json',
41
+ 'pyproject.toml',
42
+ 'Cargo.toml',
43
+ 'go.mod',
44
+ 'Gemfile',
45
+ ];
46
+ /** Project-local AI-tool config directories that count as a presence signal. */
47
+ export const SCOPE_DETECT_AI_DIRS = [
48
+ '.claude',
49
+ '.cursor',
50
+ '.windsurf',
51
+ '.augment',
52
+ '.clinerules',
53
+ '.copilot',
54
+ '.gemini',
55
+ '.codex',
56
+ '.aider',
57
+ '.continue',
58
+ '.roo',
59
+ '.kilocode',
60
+ ];
61
+ /** Project-local AI-tool config files that count as a presence signal. */
62
+ export const SCOPE_DETECT_AI_FILES = [
63
+ 'CLAUDE.md',
64
+ 'AGENTS.md',
65
+ 'GEMINI.md',
66
+ '.windsurfrules',
67
+ '.aider.conf.yml',
68
+ ];
69
+ /**
70
+ * Multi-signal scope detection (ADR-007 D2 / Phase 1.3).
71
+ *
72
+ * 1:1 port of `scripts/install.py:detect_scope`. Pure — no side effects.
73
+ */
74
+ export function detectScope(cwd) {
75
+ if (existsSync(join(cwd, SETTINGS_FILE))) {
76
+ return { scope: 'project', reason: `existing ${SETTINGS_FILE}` };
77
+ }
78
+ const manifest = SCOPE_DETECT_MANIFESTS.find((m) => existsSync(join(cwd, m)));
79
+ const aiDir = SCOPE_DETECT_AI_DIRS.find((d) => isDir(join(cwd, d)));
80
+ const aiFile = SCOPE_DETECT_AI_FILES.find((f) => existsSync(join(cwd, f)));
81
+ if (manifest !== undefined && (aiDir !== undefined || aiFile !== undefined)) {
82
+ const marker = aiDir ?? aiFile;
83
+ return {
84
+ scope: 'prompt',
85
+ reason: `manifest (${manifest}) + AI-tool config (${marker ?? ''})`,
86
+ };
87
+ }
88
+ return { scope: 'global', reason: 'no project-scope signals' };
89
+ }
90
+ /**
91
+ * Map a {@link Scope} to the {@link InstallTarget} consumed by plan builder.
92
+ *
93
+ * `prompt` is treated as ambiguous — caller resolves via CLI flag or UI.
94
+ * Defaulting `prompt` to `global` here would silently swallow the signal.
95
+ */
96
+ export function scopeToTarget(scope) {
97
+ if (scope === 'project')
98
+ return 'project';
99
+ if (scope === 'global')
100
+ return 'global';
101
+ return null;
102
+ }
103
+ /**
104
+ * Detect project shape from manifest markers — pure read of cwd.
105
+ *
106
+ * Manifest-to-kind mapping mirrors {@link SCOPE_DETECT_MANIFESTS}:
107
+ * `package.json` → npm, `composer.json` → composer, etc.
108
+ */
109
+ export function detectProjectShape(root) {
110
+ const manifest = SCOPE_DETECT_MANIFESTS.find((m) => existsSync(join(root, m)));
111
+ if (manifest === undefined) {
112
+ return { kind: 'unknown', root, manifest: null };
113
+ }
114
+ const kind = {
115
+ 'package.json': 'npm',
116
+ 'composer.json': 'composer',
117
+ 'pyproject.toml': 'pyproject',
118
+ 'Cargo.toml': 'cargo',
119
+ 'go.mod': 'go',
120
+ Gemfile: 'ruby',
121
+ }[manifest] ?? 'unknown';
122
+ return { kind, root, manifest };
123
+ }
124
+ /** Read AI-tool presence flags from `root`. Pure — no writes. */
125
+ export function detectToolPresence(root) {
126
+ return {
127
+ augment: isDir(join(root, '.augment')),
128
+ claude: isDir(join(root, '.claude')),
129
+ cursor: isDir(join(root, '.cursor')),
130
+ cline: isDir(join(root, '.clinerules')),
131
+ windsurf: isDir(join(root, '.windsurf')) || existsSync(join(root, '.windsurfrules')),
132
+ agentsMd: existsSync(join(root, 'AGENTS.md')),
133
+ };
134
+ }
135
+ /**
136
+ * Discover packs under a workspace root (`packages/pack-*` convention).
137
+ *
138
+ * Returns absolute paths to every directory under `<workspace>/packages/`
139
+ * whose name starts with `pack-`. v4-only addition — the legacy Python
140
+ * installer has no equivalent because packs are a v4 concept.
141
+ */
142
+ export function discoverPacks(workspaceRoot) {
143
+ const packagesDir = join(workspaceRoot, 'packages');
144
+ if (!isDir(packagesDir)) {
145
+ return [];
146
+ }
147
+ return readdirSync(packagesDir)
148
+ .filter((name) => name.startsWith('pack-'))
149
+ .map((name) => resolve(packagesDir, name))
150
+ .filter(isDir);
151
+ }
152
+ /**
153
+ * Locate the agent-config package root from a project root.
154
+ *
155
+ * 1:1 port of `scripts/install.py:detect_package_root` — prefers an
156
+ * npm-installed copy under `node_modules/@event4u/agent-config/`,
157
+ * falls back to the project root itself for in-package development
158
+ * (presence of `config/profiles/minimal.ini` is the development-mode
159
+ * signal in the Python script; we mirror it).
160
+ *
161
+ * Returns `null` instead of failing — caller decides UX (Python `fail`
162
+ * exits the process; the TS engine surfaces the error to the wizard).
163
+ */
164
+ export function detectPackageRoot(projectRoot) {
165
+ const npmPath = join(projectRoot, 'node_modules', '@event4u', 'agent-config');
166
+ if (isDir(npmPath)) {
167
+ return resolve(npmPath);
168
+ }
169
+ if (existsSync(join(projectRoot, 'config', 'profiles', 'minimal.ini'))) {
170
+ return projectRoot;
171
+ }
172
+ return null;
173
+ }
174
+ /** Classify a package root as `npm` (under node_modules) or `local`. */
175
+ export function detectPackageType(packageRoot) {
176
+ return packageRoot.split(/[\\/]/).includes('node_modules') ? 'npm' : 'local';
177
+ }
178
+ function isDir(path) {
179
+ try {
180
+ return statSync(path).isDirectory();
181
+ }
182
+ catch {
183
+ return false;
184
+ }
185
+ }
186
+ /**
187
+ * Detect a v3.x install at `~/.event4u/agent-config/` (or the override
188
+ * passed in). Returns `present: false` when the directory or the
189
+ * `VERSION` file is missing, or when the recorded major version is not
190
+ * `3.x`. The caller decides what to do with `present: true` — the wire
191
+ * route in `installRoute` exposes the structure 1:1.
192
+ */
193
+ export function detectLegacyV3(opts = {}) {
194
+ const home = opts.home ?? homedir();
195
+ const path = join(home, '.event4u', 'agent-config');
196
+ const backupTarget = join(home, '.event4u', 'agent-config.v3.bak');
197
+ if (!isDir(path)) {
198
+ return { present: false, path, version: null, backupTarget };
199
+ }
200
+ const versionFile = join(path, 'VERSION');
201
+ if (!existsSync(versionFile)) {
202
+ return { present: false, path, version: null, backupTarget };
203
+ }
204
+ let raw = '';
205
+ try {
206
+ raw = readFileSync(versionFile, 'utf8').trim();
207
+ }
208
+ catch {
209
+ return { present: false, path, version: null, backupTarget };
210
+ }
211
+ const firstLine = raw.split('\n', 1)[0]?.trim() ?? '';
212
+ const major = firstLine.split('.')[0]?.trim();
213
+ if (major !== '3') {
214
+ return { present: false, path, version: firstLine || null, backupTarget };
215
+ }
216
+ return { present: true, path, version: firstLine, backupTarget };
217
+ }
218
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/install/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Centralised path resolution for the unified TS install engine.
3
+ *
4
+ * Council Finding #16: every downstream module reads paths from one
5
+ * place — no inline `os.tmpdir()` or `~/.event4u/...` literals scattered
6
+ * across A2–A6.
7
+ *
8
+ * All helpers accept an optional `home` argument so tests can drive
9
+ * platform behaviour (POSIX vs Windows env-var fallback) without
10
+ * mocking `node:os`. Production callers omit it and `os.homedir()` is
11
+ * consulted lazily.
12
+ *
13
+ * Platform notes:
14
+ * - POSIX: `os.homedir()` reads `$HOME`.
15
+ * - Windows: `os.homedir()` reads `$USERPROFILE`, then `$HOMEDRIVE+$HOMEPATH`.
16
+ *
17
+ * The install root and log path live under a fixed `.event4u/agent-config/`
18
+ * sub-tree so both platforms land on the same logical location.
19
+ */
20
+ import { homedir, tmpdir } from 'node:os';
21
+ import { join } from 'node:path';
22
+ /**
23
+ * Sub-tree under the user's home where v4 installs land.
24
+ *
25
+ * Matches the legacy Python installer's target (`~/.event4u/agent-config/`)
26
+ * so v3 and v4 read/write the same physical tree and v3-detection (Phase E2)
27
+ * can introspect a prior install without a migration step.
28
+ */
29
+ export const INSTALL_ROOT_SUBPATH = '.event4u/agent-config';
30
+ /**
31
+ * Active transaction log filename written by Phase A4 atomic-writer.
32
+ *
33
+ * Per Phase A4 + council Finding #18: rotation produces sibling files
34
+ * (`install-log.<ISO>.jsonl.gz`); recovery only scans the active log.
35
+ */
36
+ export const INSTALL_LOG_FILENAME = 'install-log.jsonl';
37
+ /**
38
+ * Resolve the home directory.
39
+ *
40
+ * `home` override is accepted so tests can pin platform behaviour
41
+ * without mocking the `node:os` module. Empty / falsy override falls
42
+ * back to `os.homedir()`.
43
+ */
44
+ function resolveHome(home) {
45
+ if (home && home.length > 0) {
46
+ return home;
47
+ }
48
+ const fromOs = homedir();
49
+ if (!fromOs) {
50
+ throw new Error('Cannot resolve home directory — both $HOME (POSIX) and $USERPROFILE (Windows) are unset.');
51
+ }
52
+ return fromOs;
53
+ }
54
+ /**
55
+ * Absolute path to the v4 install root: `~/.event4u/agent-config/`.
56
+ *
57
+ * Stable across platforms because the suffix is a POSIX-style join
58
+ * applied via `path.join`, which normalises separators per platform.
59
+ */
60
+ export function getInstallRoot(home) {
61
+ return join(resolveHome(home), INSTALL_ROOT_SUBPATH);
62
+ }
63
+ /**
64
+ * Absolute path to the active transaction log:
65
+ * `~/.event4u/agent-config/install-log.jsonl`.
66
+ *
67
+ * Phase A4 writers append here on every successful atomic rename.
68
+ */
69
+ export function getLogPath(home) {
70
+ return join(getInstallRoot(home), INSTALL_LOG_FILENAME);
71
+ }
72
+ /**
73
+ * OS-level temp directory.
74
+ *
75
+ * Wraps `os.tmpdir()` so callers funnel through one symbol — drop-in
76
+ * replacement when a future test harness needs to redirect temp writes
77
+ * to a scratch dir without monkey-patching `node:os`.
78
+ */
79
+ export function getTempPath() {
80
+ return tmpdir();
81
+ }
82
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/install/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,IAAa;IAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACX,0FAA0F,CAC7F,CAAC;IACN,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IACxC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACpC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Plan builder — Phase A3 port of `scripts/install.py:_build_install_plan`.
3
+ *
4
+ * Pure: walks one or more source directories, computes the target path
5
+ * + SHA-256 of every file, and returns a declarative {@link InstallPlan}.
6
+ * The applier (Phase A4) consumes the plan verbatim — it never recomputes
7
+ * paths or re-reads the source tree.
8
+ *
9
+ * Mirrors:
10
+ * - `_sha256_of_file(path)` → {@link sha256File}
11
+ * - `_file_entry(path, kind, ...)` → {@link fileEntry}
12
+ * - `_files_by_tool_from_deploy(...)` → buildInstallPlan loop
13
+ * - `_copy_dir_dereferencing_symlinks` walk → {@link walkSourceTree}
14
+ *
15
+ * v4 simplifies the Python shape: instead of three helper tables
16
+ * (`GLOBAL_DEPLOY_SOURCES` × `USER_SCOPE_PATHS` × `_bridge_marker`) the
17
+ * planner receives a flat list of `(srcDir, destDir, toolId, kind)`
18
+ * tuples. The mapping table lives in a higher layer (B0 dispatcher) so
19
+ * the planner stays a pure file walker.
20
+ */
21
+ import { createHash } from 'node:crypto';
22
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
23
+ import { join, relative, resolve } from 'node:path';
24
+ /**
25
+ * Hex SHA-256 of `path` content, or `null` if unreadable.
26
+ *
27
+ * 1:1 port of `_sha256_of_file`. Bridges intentionally skip this and
28
+ * pass `null` (their content is a pointer, not committed bytes).
29
+ */
30
+ export function sha256File(path) {
31
+ try {
32
+ const data = readFileSync(path);
33
+ return createHash('sha256').update(data).digest('hex');
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Build one v2 `files[]` entry.
41
+ *
42
+ * 1:1 port of `_file_entry(path, kind, hash_content=...)`. `hashContent`
43
+ * toggles SHA-256 computation: deployed/marker pass `true`, bridges pass
44
+ * `false` (sha256 stays `null`).
45
+ */
46
+ export function fileEntry(path, kind, options) {
47
+ return {
48
+ path,
49
+ kind,
50
+ sha256: options.hashContent ? sha256File(path) : null,
51
+ };
52
+ }
53
+ /**
54
+ * Recursively list every file under `dir` (depth-first, sorted).
55
+ *
56
+ * Symlinks are followed via `statSync` (matches Python's
57
+ * `_copy_dir_dereferencing_symlinks` behaviour). Missing directories
58
+ * return `[]` rather than throwing — caller already validated `srcDir`.
59
+ */
60
+ export function walkSourceTree(dir) {
61
+ const out = [];
62
+ walkInto(dir, out);
63
+ return out;
64
+ }
65
+ function walkInto(dir, out) {
66
+ let entries;
67
+ try {
68
+ entries = readdirSync(dir).sort();
69
+ }
70
+ catch {
71
+ return;
72
+ }
73
+ for (const name of entries) {
74
+ const full = join(dir, name);
75
+ let isDir;
76
+ try {
77
+ isDir = statSync(full).isDirectory();
78
+ }
79
+ catch {
80
+ continue;
81
+ }
82
+ if (isDir) {
83
+ walkInto(full, out);
84
+ }
85
+ else {
86
+ out.push(full);
87
+ }
88
+ }
89
+ }
90
+ /**
91
+ * Build a declarative install plan.
92
+ *
93
+ * For each {@link PlanSource}, walks `srcDir` and emits one {@link FileEntry}
94
+ * per file with `path = destDir + (file path relative to srcDir)` and a
95
+ * fresh SHA-256 of the source file (computed once, never recomputed by
96
+ * the applier). Bridges (`kind=bridge`) keep `sha256=null` per the
97
+ * Python schema.
98
+ *
99
+ * The applier (Phase A4) is path-only — it does not re-walk `srcDir`
100
+ * and does not re-hash. The plan is the source of truth.
101
+ */
102
+ export function buildInstallPlan(inputs) {
103
+ const filesByTool = {};
104
+ for (const source of inputs.sources) {
105
+ const bucket = filesByTool[source.toolId] ?? [];
106
+ const files = walkSourceTree(source.srcDir);
107
+ for (const srcFile of files) {
108
+ const rel = relative(source.srcDir, srcFile);
109
+ const destPath = resolve(source.destDir, rel);
110
+ bucket.push(fileEntry(srcFile, source.kind, {
111
+ hashContent: source.kind !== 'bridge',
112
+ }));
113
+ // Override `path` so the entry reflects the *target* (the
114
+ // applier writes here), not the source we read from.
115
+ bucket[bucket.length - 1] = {
116
+ ...bucket[bucket.length - 1],
117
+ path: destPath,
118
+ };
119
+ }
120
+ filesByTool[source.toolId] = bucket;
121
+ }
122
+ // Ensure every requested toolId appears, even with zero files —
123
+ // mirrors `_files_by_tool_from_deploy` emitting `[]` so a shrinking
124
+ // install actually shrinks the recorded inventory.
125
+ for (const source of inputs.sources) {
126
+ if (!(source.toolId in filesByTool)) {
127
+ filesByTool[source.toolId] = [];
128
+ }
129
+ }
130
+ return {
131
+ version: 2,
132
+ target: inputs.target,
133
+ root: inputs.root,
134
+ filesByTool,
135
+ mergedKeysByTool: {},
136
+ policy: inputs.policy,
137
+ };
138
+ }
139
+ /**
140
+ * True when the plan would not modify any file on disk.
141
+ *
142
+ * Wizard renders the "nothing to do" screen on `true` (Phase B2).
143
+ */
144
+ export function isEmptyPlan(plan) {
145
+ for (const entries of Object.values(plan.filesByTool)) {
146
+ if (entries.length > 0) {
147
+ return false;
148
+ }
149
+ }
150
+ for (const entries of Object.values(plan.mergedKeysByTool)) {
151
+ if (entries.length > 0) {
152
+ return false;
153
+ }
154
+ }
155
+ return true;
156
+ }
157
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/install/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Transaction log — Phase A4 (council Finding #18).
3
+ *
4
+ * Append-only JSONL at `getLogPath()` (`~/.event4u/agent-config/install-log.jsonl`).
5
+ * Each successful atomic write appends one entry; recovery on crash is
6
+ * `tail -n` + reverse-apply. No PID lockfile (per Phase-A4 decision 8).
7
+ *
8
+ * Rotation: 10 MB OR 30 days, whichever first. Rotated copies move to
9
+ * `install-log.<ISO>.jsonl.gz` siblings; recovery never scans them.
10
+ *
11
+ * Recovery cap: at most the **last 500 entries** of the active log are
12
+ * scanned. Older incomplete tails are treated as abandoned and surfaced
13
+ * to the wizard as "previous run aborted; ignoring".
14
+ */
15
+ import { createGzip } from 'node:zlib';
16
+ import { createReadStream, createWriteStream, existsSync, readFileSync, renameSync, statSync, unlinkSync } from 'node:fs';
17
+ import { dirname } from 'node:path';
18
+ import { pipeline } from 'node:stream/promises';
19
+ import { atomicAppendLine } from './atomic.js';
20
+ /** Rotate the active log when it reaches this size (council Finding #18). */
21
+ export const ROTATION_MAX_BYTES = 10 * 1024 * 1024;
22
+ /** Rotate the active log when its first entry is older than this (ms). */
23
+ export const ROTATION_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
24
+ /** Recovery scans at most the last N entries of the active log. */
25
+ export const RECOVERY_DEPTH_CAP = 500;
26
+ /** Append one entry to the active log, rotating first if thresholds tripped. */
27
+ export function appendTxLog(logPath, entry) {
28
+ if (shouldRotate(logPath)) {
29
+ rotateLogSync(logPath);
30
+ }
31
+ atomicAppendLine(logPath, JSON.stringify(entry));
32
+ }
33
+ /**
34
+ * Read at most the last {@link RECOVERY_DEPTH_CAP} entries from the active log.
35
+ *
36
+ * Returns entries in chronological order (oldest of the tail first).
37
+ * Malformed lines are dropped silently \u2014 partial-write tails should not
38
+ * crash recovery.
39
+ */
40
+ export function readRecentEntries(logPath) {
41
+ if (!existsSync(logPath)) {
42
+ return [];
43
+ }
44
+ const raw = readFileSync(logPath, 'utf8');
45
+ const lines = raw.split('\n').filter((l) => l.length > 0);
46
+ const tail = lines.slice(-RECOVERY_DEPTH_CAP);
47
+ const out = [];
48
+ for (const line of tail) {
49
+ const parsed = tryParseEntry(line);
50
+ if (parsed !== null) {
51
+ out.push(parsed);
52
+ }
53
+ }
54
+ return out;
55
+ }
56
+ /**
57
+ * True when the active log breaches one of the rotation thresholds.
58
+ *
59
+ * Size threshold trips on byte-count alone; age threshold reads the
60
+ * first line and compares its `ts` against `now`.
61
+ */
62
+ export function shouldRotate(logPath, now = new Date()) {
63
+ if (!existsSync(logPath)) {
64
+ return false;
65
+ }
66
+ let size = 0;
67
+ try {
68
+ size = statSync(logPath).size;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ if (size >= ROTATION_MAX_BYTES) {
74
+ return true;
75
+ }
76
+ const firstTs = readFirstTimestamp(logPath);
77
+ if (firstTs === null) {
78
+ return false;
79
+ }
80
+ return now.getTime() - firstTs >= ROTATION_MAX_AGE_MS;
81
+ }
82
+ /**
83
+ * Rotate the active log to `install-log.<ISO>.jsonl.gz` and remove the original.
84
+ *
85
+ * Sync wrapper around the async gzip pipeline so callers stay sequential.
86
+ * `appendTxLog` blocks on this \u2014 acceptable: rotations are rare (10 MB
87
+ * or 30 days) and the gzip is fire-and-forget afterwards.
88
+ */
89
+ export function rotateLogSync(logPath) {
90
+ if (!existsSync(logPath)) {
91
+ return;
92
+ }
93
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
94
+ const rotated = logPath.replace(/\.jsonl$/, `.${stamp}.jsonl`);
95
+ renameSync(logPath, rotated);
96
+ // Best-effort gzip in the background; failure is non-fatal because
97
+ // the rotated `.jsonl` is already a valid recovery artefact.
98
+ void gzipInPlace(rotated).catch(() => { });
99
+ }
100
+ async function gzipInPlace(source) {
101
+ const target = `${source}.gz`;
102
+ await pipeline(createReadStream(source), createGzip(), createWriteStream(target));
103
+ try {
104
+ unlinkSync(source);
105
+ }
106
+ catch {
107
+ /* swallow \u2014 gzip succeeded, leak is acceptable */
108
+ }
109
+ }
110
+ function readFirstTimestamp(logPath) {
111
+ try {
112
+ const raw = readFileSync(logPath, 'utf8');
113
+ const firstLine = raw.split('\n', 1)[0] ?? '';
114
+ const parsed = tryParseEntry(firstLine);
115
+ if (parsed === null)
116
+ return null;
117
+ const t = Date.parse(parsed.ts);
118
+ return Number.isFinite(t) ? t : null;
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ }
124
+ function tryParseEntry(line) {
125
+ try {
126
+ const obj = JSON.parse(line);
127
+ if (typeof obj.ts !== 'string' || typeof obj.kind !== 'string' || typeof obj.path !== 'string') {
128
+ return null;
129
+ }
130
+ return obj;
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ }
136
+ /** Resolve the directory holding `logPath` \u2014 helper for callers (apply.ts). */
137
+ export function txLogDir(logPath) {
138
+ return dirname(logPath);
139
+ }
140
+ //# sourceMappingURL=txlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txlog.js","sourceRoot":"","sources":["../../src/install/txlog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Core types for the unified TypeScript install engine (v4.0.0).
3
+ *
4
+ * Mirrors the on-disk schema used by the legacy Python installer
5
+ * (`scripts/install.py`) so the v4 engine reads/writes the same
6
+ * `~/.event4u/agent-config/` tree and v2 manifest entries without a
7
+ * migration step.
8
+ *
9
+ * Phase A1 — foundation. Sub-types referenced by `detect`, `plan`,
10
+ * apply, and conflict-resolution modules. Pure types, no runtime
11
+ * dependencies.
12
+ *
13
+ * Reference: `scripts/install.py`
14
+ * - `_file_entry()` → {@link FileEntry}
15
+ * - `class ConflictPolicy` → {@link ConflictPolicy}
16
+ * - v2 manifest `files_by_tool` → {@link InstallPlan.filesByTool}
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/install/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}