@planu/cli 4.13.0 → 4.14.1

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 (787) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +24 -24
  3. package/dist/cli/commands/inspect.d.ts +4 -0
  4. package/dist/cli/commands/inspect.js +144 -0
  5. package/dist/cli/commands/install.d.ts +19 -1
  6. package/dist/cli/commands/install.js +145 -43
  7. package/dist/cli/commands/job.d.ts +3 -0
  8. package/dist/cli/commands/job.js +119 -0
  9. package/dist/cli/commands/offline.d.ts +15 -0
  10. package/dist/cli/commands/offline.js +132 -0
  11. package/dist/cli/commands/serve.js +4 -0
  12. package/dist/cli/commands/spec.js +1 -1
  13. package/dist/cli/commands/storage.d.ts +3 -0
  14. package/dist/cli/commands/storage.js +102 -0
  15. package/dist/cli/commands/uninstall.d.ts +10 -0
  16. package/dist/cli/commands/uninstall.js +93 -7
  17. package/dist/cli/commands/validate.js +1 -1
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/router.js +9 -1
  20. package/dist/config/crash-shield-framework-rules.json +93 -0
  21. package/dist/config/environment-schema.json +149 -0
  22. package/dist/config/hardcode-exceptions.json +4 -0
  23. package/dist/config/license-plans.json +7 -0
  24. package/dist/config/native-release-public-key.pem +3 -0
  25. package/dist/config/native-targets.json +87 -0
  26. package/dist/config/product-public.d.ts +89 -0
  27. package/dist/config/product-public.js +140 -0
  28. package/dist/config/product-public.json +312 -0
  29. package/dist/config/product-public.ts +148 -0
  30. package/dist/config/release-compatibility.json +13 -0
  31. package/dist/config/release-policy.json +26 -0
  32. package/dist/config/runtime-policy.json +44 -0
  33. package/dist/config/skill-templates/planu-validate.md +7 -4
  34. package/dist/config/subagent-templates/planu-spec-implementer.md +7 -3
  35. package/dist/config/subagent-templates/planu-validator.md +10 -5
  36. package/dist/config/technology-registry.json +120 -0
  37. package/dist/config/version.js +7 -8
  38. package/dist/config/version.ts +10 -7
  39. package/dist/engine/abortable-process-runner.js +40 -9
  40. package/dist/engine/advanced-testing/accessibility-checker.js +12 -14
  41. package/dist/engine/advanced-testing/mutation-advisor.js +3 -4
  42. package/dist/engine/advanced-testing/property-based.js +2 -3
  43. package/dist/engine/advanced-testing/test-data-advisor.js +2 -3
  44. package/dist/engine/agent-generator.js +2 -1
  45. package/dist/engine/agent-handoff-store.js +2 -1
  46. package/dist/engine/agent-prompt-generator.js +7 -5
  47. package/dist/engine/agent-telemetry.js +2 -1
  48. package/dist/engine/ai-integration/gemini/extensions-advisor.js +41 -9
  49. package/dist/engine/ambiguity-detector.js +12 -11
  50. package/dist/engine/analyzer/db-engine.js +2 -3
  51. package/dist/engine/analyzer/detectors.js +13 -14
  52. package/dist/engine/analyzer/env-setup.js +9 -10
  53. package/dist/engine/analyzer-env-scanner/env-example.js +7 -8
  54. package/dist/engine/api-spec-generator/graphql-parser.js +2 -2
  55. package/dist/engine/api-validation/graphql-schema-validator.js +2 -1
  56. package/dist/engine/api-validation/openapi-impl-validator.js +6 -7
  57. package/dist/engine/architecture-detector.js +10 -8
  58. package/dist/engine/auth/config.d.ts +1 -1
  59. package/dist/engine/auth/config.js +4 -3
  60. package/dist/engine/auto-updater/atomic-upgrade.d.ts +8 -0
  61. package/dist/engine/auto-updater/atomic-upgrade.js +381 -0
  62. package/dist/engine/auto-updater/config-detector.js +9 -3
  63. package/dist/engine/auto-updater/config-patcher.d.ts +0 -4
  64. package/dist/engine/auto-updater/config-patcher.js +10 -15
  65. package/dist/engine/auto-updater/index.d.ts +3 -1
  66. package/dist/engine/auto-updater/index.js +44 -30
  67. package/dist/engine/auto-updater/npm-registry.js +10 -2
  68. package/dist/engine/auto-updater/release-verifier.d.ts +3 -0
  69. package/dist/engine/auto-updater/release-verifier.js +112 -0
  70. package/dist/engine/auto-updater/upgrade-lock.d.ts +6 -0
  71. package/dist/engine/auto-updater/upgrade-lock.js +28 -0
  72. package/dist/engine/auto-updater/upgrade-trust-state.d.ts +7 -0
  73. package/dist/engine/auto-updater/upgrade-trust-state.js +59 -0
  74. package/dist/engine/autopilot/audit-logger.js +2 -5
  75. package/dist/engine/best-practices-library.js +2 -1
  76. package/dist/engine/browser-validator.js +2 -1
  77. package/dist/engine/build-tool-detector.js +3 -2
  78. package/dist/engine/ci-generator/context-builders.js +7 -5
  79. package/dist/engine/ci-generator/stack-detector.js +0 -2
  80. package/dist/engine/ci-generator/yaml-builder.js +0 -2
  81. package/dist/engine/claude-config-auditor/rules-auditor.js +4 -3
  82. package/dist/engine/code-transforms/typescript/ast-utils.js +2 -3
  83. package/dist/engine/complexity-budget/trivial-detector.js +2 -1
  84. package/dist/engine/compliance-test-generator/index.js +7 -2
  85. package/dist/engine/compliance-test-generator/test-formatter.js +2 -2
  86. package/dist/engine/config-health/mcp-config-checker.js +2 -1
  87. package/dist/engine/config-health/ts-checker-scripts.js +4 -3
  88. package/dist/engine/config-health/ts-checker.js +3 -2
  89. package/dist/engine/convention-injector.js +5 -7
  90. package/dist/engine/convention-scanner/convention-parser.js +3 -2
  91. package/dist/engine/core-bridge-duplicate-blocks.d.ts +3 -0
  92. package/dist/engine/core-bridge-duplicate-blocks.js +57 -0
  93. package/dist/engine/core-bridge-gaps.d.ts +4 -0
  94. package/dist/engine/core-bridge-gaps.js +75 -0
  95. package/dist/engine/core-bridge.d.ts +9 -9
  96. package/dist/engine/core-bridge.js +196 -283
  97. package/dist/engine/cost-tracking/ledger.js +2 -5
  98. package/dist/engine/coverage-gap-analyzer.js +10 -1
  99. package/dist/engine/crash-shield/detectors/framework-detector.d.ts +2 -0
  100. package/dist/engine/crash-shield/detectors/framework-detector.js +110 -192
  101. package/dist/engine/crash-shield/detectors/typescript-detector.js +2 -1
  102. package/dist/engine/dashboard/data-loader.js +2 -1
  103. package/dist/engine/data-projects-gc/gc-runner.d.ts +7 -0
  104. package/dist/engine/data-projects-gc/gc-runner.js +113 -3
  105. package/dist/engine/data-projects-gc/scanner.js +5 -1
  106. package/dist/engine/decision-store.js +11 -14
  107. package/dist/engine/deleter/core.js +5 -5
  108. package/dist/engine/dep-auditor/abandonment-data.js +2 -1
  109. package/dist/engine/dep-auditor/abandonment-registry.js +3 -1
  110. package/dist/engine/dep-auditor/cve-fetcher.js +3 -0
  111. package/dist/engine/dep-auditor/dep-duplicates-detector.js +36 -4
  112. package/dist/engine/dep-auditor/license-registry.js +2 -0
  113. package/dist/engine/dependency-evaluator.d.ts +14 -0
  114. package/dist/engine/dependency-evaluator.js +81 -0
  115. package/dist/engine/deploy/providers/fly.js +7 -7
  116. package/dist/engine/deploy/providers/netlify.js +7 -7
  117. package/dist/engine/deploy/providers/railway.js +10 -12
  118. package/dist/engine/deploy/providers/vercel.js +7 -9
  119. package/dist/engine/deprecation-scanner/pattern-loader.js +0 -2
  120. package/dist/engine/desktop-detector.js +2 -3
  121. package/dist/engine/detect-duplication.js +2 -1
  122. package/dist/engine/detectors/advanced-framework-detector/css-state-detector.js +2 -1
  123. package/dist/engine/detectors/advanced-framework-detector/legacy-detector.js +2 -3
  124. package/dist/engine/detectors/advanced-framework-detector/modern-detector.js +3 -4
  125. package/dist/engine/detectors/agent-framework-detector.js +3 -2
  126. package/dist/engine/detectors/ai-native-detector.js +4 -6
  127. package/dist/engine/detectors/cache-db-detector.js +4 -3
  128. package/dist/engine/detectors/cicd-detector.js +4 -3
  129. package/dist/engine/detectors/deployment-detector.js +11 -12
  130. package/dist/engine/detectors/frontend-perf-detector.js +14 -9
  131. package/dist/engine/detectors/library-detector-multilang-a.js +16 -3
  132. package/dist/engine/detectors/library-detector-node.js +14 -4
  133. package/dist/engine/detectors/library-detector-python.js +7 -1
  134. package/dist/engine/detectors/library-detector.js +0 -2
  135. package/dist/engine/detectors/llm-detector/provider-maps.js +3 -2
  136. package/dist/engine/detectors/mcp-candidate-detector.js +12 -16
  137. package/dist/engine/detectors/mfe-detector.js +6 -7
  138. package/dist/engine/detectors/monitoring-detector.js +4 -3
  139. package/dist/engine/detectors/otel-detector.js +3 -2
  140. package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -2
  141. package/dist/engine/detectors/otel-ecosystem-detectors.js +4 -3
  142. package/dist/engine/detectors/platform-specialty-detector.js +3 -5
  143. package/dist/engine/detectors/template-engine-detector.js +3 -4
  144. package/dist/engine/doc-generator/builders.js +2 -3
  145. package/dist/engine/doc-generator/mobile-distribution-guide.js +13 -17
  146. package/dist/engine/doc-generator/portal/dirty-flag-map.d.ts +2 -2
  147. package/dist/engine/doc-generator/portal/portal-regenerator.js +3 -47
  148. package/dist/engine/domain-detector.js +3 -6
  149. package/dist/engine/dynamic-knowledge/knowledge-cache.js +3 -4
  150. package/dist/engine/dynamic-knowledge/knowledge-merger.js +17 -2
  151. package/dist/engine/dynamic-knowledge/web-researcher.js +15 -14
  152. package/dist/engine/dynamic-migration-detector/manifest-readers-extended.js +0 -2
  153. package/dist/engine/e2e-test-generator.js +4 -3
  154. package/dist/engine/ecosystem-absorber/knowledge-cache.js +2 -1
  155. package/dist/engine/ecosystem-absorber/platform-crawler.js +2 -2
  156. package/dist/engine/escalator/retry-counter.js +2 -1
  157. package/dist/engine/evidence-gates/artifact-reader.d.ts +6 -0
  158. package/dist/engine/evidence-gates/artifact-reader.js +105 -21
  159. package/dist/engine/evidence-gates/lifecycle-gate.d.ts +2 -1
  160. package/dist/engine/evidence-gates/lifecycle-gate.js +54 -0
  161. package/dist/engine/execution/context.d.ts +19 -0
  162. package/dist/engine/execution/context.js +127 -0
  163. package/dist/engine/execution/deadline-io.d.ts +21 -0
  164. package/dist/engine/execution/deadline-io.js +45 -0
  165. package/dist/engine/execution/job-executor.d.ts +16 -0
  166. package/dist/engine/execution/job-executor.js +140 -0
  167. package/dist/engine/execution/job-runtime.d.ts +78 -0
  168. package/dist/engine/execution/job-runtime.js +220 -0
  169. package/dist/engine/execution/native-relevance-scorer.d.ts +6 -0
  170. package/dist/engine/execution/native-relevance-scorer.js +64 -0
  171. package/dist/engine/execution/native-worker-dispatch.d.ts +3 -0
  172. package/dist/engine/execution/native-worker-dispatch.js +46 -0
  173. package/dist/engine/execution/native-worker-protocol.d.ts +6 -0
  174. package/dist/engine/execution/native-worker-protocol.js +33 -0
  175. package/dist/engine/execution/native-worker-runtime.d.ts +4 -0
  176. package/dist/engine/execution/native-worker-runtime.js +177 -0
  177. package/dist/engine/execution/native-worker-thread.d.ts +2 -0
  178. package/dist/engine/execution/native-worker-thread.js +66 -0
  179. package/dist/engine/execution/operation-journal.d.ts +66 -0
  180. package/dist/engine/execution/operation-journal.js +260 -0
  181. package/dist/engine/execution/outbox-worker.d.ts +31 -0
  182. package/dist/engine/execution/outbox-worker.js +192 -0
  183. package/dist/engine/execution/validate-job-executor.d.ts +24 -0
  184. package/dist/engine/execution/validate-job-executor.js +342 -0
  185. package/dist/engine/execution/validate-job-payload.d.ts +5 -0
  186. package/dist/engine/execution/validate-job-payload.js +87 -0
  187. package/dist/engine/execution/validate-job-recovery.d.ts +4 -0
  188. package/dist/engine/execution/validate-job-recovery.js +47 -0
  189. package/dist/engine/execution/validate-worker-runtime.d.ts +5 -0
  190. package/dist/engine/execution/validate-worker-runtime.js +100 -0
  191. package/dist/engine/execution/validate-worker-thread.d.ts +2 -0
  192. package/dist/engine/execution/validate-worker-thread.js +71 -0
  193. package/dist/engine/execution-plan/desktop-distribution.js +3 -7
  194. package/dist/engine/execution-plan/mobile-distribution.js +4 -9
  195. package/dist/engine/execution-plan/phases.js +4 -5
  196. package/dist/engine/execution-plan/plan-utils.js +8 -5
  197. package/dist/engine/facilitate/context-loader.js +3 -9
  198. package/dist/engine/figma/code-connect-fetcher.js +9 -8
  199. package/dist/engine/filesystem-watcher/index.d.ts +3 -3
  200. package/dist/engine/filesystem-watcher/index.js +5 -5
  201. package/dist/engine/framework-detector.js +14 -15
  202. package/dist/engine/git/planu-autocommit.js +8 -7
  203. package/dist/engine/git/repository-probe.d.ts +3 -0
  204. package/dist/engine/git/repository-probe.js +13 -0
  205. package/dist/engine/global-rules-manager.js +2 -2
  206. package/dist/engine/handoff-artifacts/io.js +2 -3
  207. package/dist/engine/handoff-artifacts/schemas/red-tests-handoff.js +8 -1
  208. package/dist/engine/handoff-artifacts/schemas.d.ts +4 -0
  209. package/dist/engine/handoff-artifacts/schemas.js +5 -0
  210. package/dist/engine/hook-generator/stack-hook-templates.js +4 -4
  211. package/dist/engine/hooks/config-loader.js +1 -1
  212. package/dist/engine/hooks/context-injector.js +4 -7
  213. package/dist/engine/hooks/file-watcher.js +1 -14
  214. package/dist/engine/hooks-reconciler.js +6 -4
  215. package/dist/engine/infrastructure/component-mapper.js +5 -7
  216. package/dist/engine/infrastructure/docker-compose-generator.js +8 -10
  217. package/dist/engine/infrastructure/index.js +6 -3
  218. package/dist/engine/infrastructure/kubernetes-generator.js +2 -2
  219. package/dist/engine/infrastructure/railway-generator.js +10 -8
  220. package/dist/engine/infrastructure/signal-detector.js +6 -8
  221. package/dist/engine/infrastructure/terraform-generator.js +6 -8
  222. package/dist/engine/legal-compliance/detector.js +3 -2
  223. package/dist/engine/local-first/storage-advisor.js +5 -6
  224. package/dist/engine/macos-keychain-native-port.d.ts +5 -0
  225. package/dist/engine/macos-keychain-native-port.js +26 -0
  226. package/dist/engine/marketplace-fetcher/cache.js +3 -1
  227. package/dist/engine/mcp-config/mcp-config-writer.d.ts +2 -2
  228. package/dist/engine/mcp-config/mcp-config-writer.js +10 -8
  229. package/dist/engine/migration/db-migrator.js +2 -5
  230. package/dist/engine/migration/equivalence-mapper.js +12 -13
  231. package/dist/engine/migration/service-catalogs.js +6 -7
  232. package/dist/engine/migration/service-migrator-catalogs.js +6 -7
  233. package/dist/engine/mobile-detector-ios.js +2 -3
  234. package/dist/engine/mobile-detector.js +16 -4
  235. package/dist/engine/model-router/complexity-analyzer.js +4 -7
  236. package/dist/engine/multi-agent-review/security-analyzer.js +3 -1
  237. package/dist/engine/multi-app-detector/app-type.js +26 -21
  238. package/dist/engine/multi-app-detector/core.js +3 -2
  239. package/dist/engine/multi-teammate-review/disagreement-counter.js +2 -1
  240. package/dist/engine/multi-teammate-review/panel-orchestrator.js +0 -2
  241. package/dist/engine/mutation-config-generator.js +10 -7
  242. package/dist/engine/native-capability-policy.d.ts +4 -0
  243. package/dist/engine/native-capability-policy.js +24 -0
  244. package/dist/engine/native-platform.d.ts +3 -0
  245. package/dist/engine/native-platform.js +44 -0
  246. package/dist/engine/native-runtime-handshake.d.ts +20 -0
  247. package/dist/engine/native-runtime-handshake.js +230 -0
  248. package/dist/engine/network-policy.d.ts +27 -0
  249. package/dist/engine/network-policy.js +174 -0
  250. package/dist/engine/next-spec-resolver/dependency-filter.js +2 -22
  251. package/dist/engine/nfr-profile-detector.js +12 -16
  252. package/dist/engine/nli-keywords.js +8 -9
  253. package/dist/engine/oauth/config-guard.js +4 -5
  254. package/dist/engine/observability/local-execution-spans.d.ts +15 -0
  255. package/dist/engine/observability/local-execution-spans.js +63 -0
  256. package/dist/engine/orchestrator/runtime.js +0 -1
  257. package/dist/engine/package-registry.js +2 -6
  258. package/dist/engine/performance-analyzer.js +2 -5
  259. package/dist/engine/permissions-merger/stack-detectors.js +5 -5
  260. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +39 -0
  261. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +1310 -0
  262. package/dist/engine/planu-core.darwin-x64.node.manifest.json +39 -0
  263. package/dist/engine/planu-core.darwin-x64.node.sbom.json +1310 -0
  264. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +38 -0
  265. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +1310 -0
  266. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +38 -0
  267. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +1310 -0
  268. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +38 -0
  269. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +1310 -0
  270. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +38 -0
  271. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +1310 -0
  272. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +38 -0
  273. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +1310 -0
  274. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +38 -0
  275. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +1310 -0
  276. package/dist/engine/platform-detector/desktop.js +15 -2
  277. package/dist/engine/platform-detector/extensions.js +2 -1
  278. package/dist/engine/platform-detector/games.js +2 -1
  279. package/dist/engine/platform-detector.js +3 -2
  280. package/dist/engine/platform-engineering/idp-detector.js +2 -1
  281. package/dist/engine/plugin-installer/stack-matcher.js +9 -17
  282. package/dist/engine/plugins/lifecycle.js +6 -2
  283. package/dist/engine/prior-decisions/contradiction-detector.js +60 -30
  284. package/dist/engine/project-dna/stack-detector.js +15 -17
  285. package/dist/engine/project-graph/builder.js +11 -0
  286. package/dist/engine/project-graph/cache.js +1 -1
  287. package/dist/engine/project-graph/freshness-projection.d.ts +16 -0
  288. package/dist/engine/project-graph/freshness-projection.js +95 -0
  289. package/dist/engine/project-graph/index.d.ts +1 -0
  290. package/dist/engine/project-graph/index.js +1 -0
  291. package/dist/engine/project-graph/query.js +15 -25
  292. package/dist/engine/project-health-checker.js +3 -4
  293. package/dist/engine/project-scanner/stack-detector.js +17 -17
  294. package/dist/engine/property-test-generator.js +2 -3
  295. package/dist/engine/qa-gate.d.ts +1 -0
  296. package/dist/engine/qa-gate.js +6 -4
  297. package/dist/engine/quality-gates/gate-catalog.js +47 -46
  298. package/dist/engine/quality-gates/gate-injector.js +9 -4
  299. package/dist/engine/registry/core.js +0 -2
  300. package/dist/engine/registry/loader.js +9 -12
  301. package/dist/engine/registry/matcher.js +129 -24
  302. package/dist/engine/resilience-detector/concurrency-detector.js +4 -4
  303. package/dist/engine/resilience-detector/middleware-detector.js +11 -13
  304. package/dist/engine/resilience-detector/validation-detector.js +17 -4
  305. package/dist/engine/reverse-engineer/config-analyzer.js +9 -8
  306. package/dist/engine/reverse-engineer/orchestrator.js +5 -9
  307. package/dist/engine/reverse-engineer/test-file-parser.js +6 -3
  308. package/dist/engine/rules-generator/index.js +6 -5
  309. package/dist/engine/runtime-policy.d.ts +7 -0
  310. package/dist/engine/runtime-policy.js +101 -0
  311. package/dist/engine/runtime-security/checkers/content-security.js +21 -6
  312. package/dist/engine/runtime-security/checkers/file-permissions.js +0 -2
  313. package/dist/engine/safety/atomic-write-file.js +20 -9
  314. package/dist/engine/safety/atomic-writer.js +10 -3
  315. package/dist/engine/safety/cross-process-lock.d.ts +3 -40
  316. package/dist/engine/safety/cross-process-lock.js +268 -272
  317. package/dist/engine/safety/file-mutex.d.ts +2 -9
  318. package/dist/engine/safety/file-mutex.js +155 -87
  319. package/dist/engine/safety/health-monitor.js +15 -6
  320. package/dist/engine/safety/lock-lease-store.d.ts +79 -0
  321. package/dist/engine/safety/lock-lease-store.js +372 -0
  322. package/dist/engine/safety/lock-scavenger.d.ts +2 -5
  323. package/dist/engine/safety/lock-scavenger.js +158 -76
  324. package/dist/engine/safety/lock-staleness.js +4 -1
  325. package/dist/engine/safety/obsolete-lock-guard.d.ts +8 -0
  326. package/dist/engine/safety/obsolete-lock-guard.js +31 -0
  327. package/dist/engine/safety/transaction.js +3 -3
  328. package/dist/engine/sandbox/index.js +2 -1
  329. package/dist/engine/sandbox/runner-detect.js +3 -2
  330. package/dist/engine/sandbox/runner-docker.js +4 -3
  331. package/dist/engine/scan-project/module-discoverer.js +3 -2
  332. package/dist/engine/schema-generator.js +16 -9
  333. package/dist/engine/security-analyzer/criteria-generator.js +2 -3
  334. package/dist/engine/self-healing/healer.js +4 -4
  335. package/dist/engine/session-safeguard/learnings-buffer.d.ts +1 -2
  336. package/dist/engine/session-safeguard/learnings-buffer.js +42 -65
  337. package/dist/engine/shared-agent-memory.js +66 -74
  338. package/dist/engine/skill-adapter/command-rewriter.js +3 -2
  339. package/dist/engine/skill-adapter/index.js +3 -3
  340. package/dist/engine/skill-adapter/placeholder-map.js +3 -2
  341. package/dist/engine/skill-bootstrap/stack-matcher.js +47 -48
  342. package/dist/engine/skill-generation/stack-content-generator.js +0 -2
  343. package/dist/engine/skill-generator/workflow-skill-generator.js +2 -1
  344. package/dist/engine/skill-registry/ttl-refresh.js +3 -1
  345. package/dist/engine/skills/skills-fetcher.js +3 -6
  346. package/dist/engine/skills-reconciler.js +19 -39
  347. package/dist/engine/spec-coverage/test-finder.js +7 -6
  348. package/dist/engine/spec-diff-engine.js +3 -3
  349. package/dist/engine/spec-generator/api-key-resolver.d.ts +1 -1
  350. package/dist/engine/spec-generator/api-key-resolver.js +3 -24
  351. package/dist/engine/spec-generators/issue-extractor.js +9 -3
  352. package/dist/engine/spec-migrator/drift-detector.js +5 -13
  353. package/dist/engine/spec-migrator/filesystem-import.js +14 -10
  354. package/dist/engine/spec-migrator/planu-canonical-policy.js +10 -1
  355. package/dist/engine/spec-migrator/strict-planu-cleanup.js +24 -25
  356. package/dist/engine/spec-registry/adapter.d.ts +0 -5
  357. package/dist/engine/spec-registry/adapter.js +45 -46
  358. package/dist/engine/spec-registry/client.js +2 -0
  359. package/dist/engine/spec-source-sync.js +3 -2
  360. package/dist/engine/spec-templates/custom-loader.js +2 -3
  361. package/dist/engine/spec-templates/templates-domain-specific.js +8 -5
  362. package/dist/engine/spec-templates/templates-perf-integration.js +2 -3
  363. package/dist/engine/stack-auditor/manifest-reader.js +0 -2
  364. package/dist/engine/staleness/stale-implementing.js +7 -7
  365. package/dist/engine/tdd-scaffold-generator.js +24 -11
  366. package/dist/engine/teammate-router/green-phase-verifier.js +2 -1
  367. package/dist/engine/teammate-router/red-phase-verifier.js +2 -1
  368. package/dist/engine/technology-registry.d.ts +11 -0
  369. package/dist/engine/technology-registry.js +142 -0
  370. package/dist/engine/telemetry/error-reporter.d.ts +1 -2
  371. package/dist/engine/telemetry/error-reporter.js +11 -18
  372. package/dist/engine/telemetry/health-checker.js +5 -14
  373. package/dist/engine/telemetry/index.d.ts +0 -1
  374. package/dist/engine/telemetry/index.js +0 -1
  375. package/dist/engine/telemetry/stance.js +3 -2
  376. package/dist/engine/telemetry/telemetry-client.d.ts +1 -5
  377. package/dist/engine/telemetry/telemetry-client.js +45 -29
  378. package/dist/engine/telemetry/telemetry-store.d.ts +3 -3
  379. package/dist/engine/telemetry/telemetry-store.js +30 -23
  380. package/dist/engine/test-framework-detector/detectors.js +8 -8
  381. package/dist/engine/test-framework-detector/strategy.js +8 -9
  382. package/dist/engine/test-generators/agent-test-templates.js +2 -3
  383. package/dist/engine/test-generators/contract-test-generator.d.ts +1 -1
  384. package/dist/engine/test-generators/contract-test-generator.js +9 -202
  385. package/dist/engine/test-generators/platform-test-templates-b.js +2 -3
  386. package/dist/engine/test-generators/platform-test-templates.js +2 -5
  387. package/dist/engine/test-mocks-generator.js +4 -3
  388. package/dist/engine/test-plan-generator.js +30 -12
  389. package/dist/engine/test-scaffold-generator/advanced-scaffold.js +4 -5
  390. package/dist/engine/test-scaffold-generator/unit-scaffold.js +5 -6
  391. package/dist/engine/timing/budget.d.ts +6 -17
  392. package/dist/engine/timing/budget.js +80 -64
  393. package/dist/engine/tool-groups/group-manager.js +3 -3
  394. package/dist/engine/universal-rules/installer.js +1 -1
  395. package/dist/engine/universal-rules/rules/planu-modes.js +2 -0
  396. package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -0
  397. package/dist/engine/update-notifier.js +8 -5
  398. package/dist/engine/validation/approved-spec-portability.d.ts +12 -0
  399. package/dist/engine/validation/approved-spec-portability.js +107 -0
  400. package/dist/engine/validation/durable-validation.d.ts +36 -0
  401. package/dist/engine/validation/durable-validation.js +335 -0
  402. package/dist/engine/validation/validation-freshness.d.ts +36 -0
  403. package/dist/engine/validation/validation-freshness.js +427 -0
  404. package/dist/engine/validation/validation-receipt-codec.d.ts +13 -0
  405. package/dist/engine/validation/validation-receipt-codec.js +182 -0
  406. package/dist/engine/validation/validation-receipt.d.ts +59 -0
  407. package/dist/engine/validation/validation-receipt.js +282 -0
  408. package/dist/engine/validation/validation-source-policy.d.ts +4 -0
  409. package/dist/engine/validation/validation-source-policy.js +16 -0
  410. package/dist/engine/validation/validation-submission.d.ts +36 -0
  411. package/dist/engine/validation/validation-submission.js +128 -0
  412. package/dist/engine/validation-evidence-ledger.js +41 -0
  413. package/dist/engine/validation-impact-planner.js +25 -9
  414. package/dist/engine/validator/spec-compliance-runner.d.ts +1 -1
  415. package/dist/engine/validator/spec-compliance-runner.js +17 -8
  416. package/dist/engine/validator/validation-report-writer.js +1 -1
  417. package/dist/engine/validator.js +2 -1
  418. package/dist/engine/verify-integrations/index.js +1 -1
  419. package/dist/engine/version-resolver.js +5 -6
  420. package/dist/engine/web-fetcher/stack-advisor.js +156 -92
  421. package/dist/engine/web-fetcher/stack-detector.js +114 -54
  422. package/dist/engine/workspace-manager.js +3 -2
  423. package/dist/errors/classified-degradation.d.ts +3 -0
  424. package/dist/errors/classified-degradation.js +10 -0
  425. package/dist/errors/degradation-sink.d.ts +3 -0
  426. package/dist/errors/degradation-sink.js +5 -0
  427. package/dist/errors/error-taxonomy.d.ts +12 -0
  428. package/dist/errors/error-taxonomy.js +62 -0
  429. package/dist/hosts/claude-code/ux/mcp-prompts.js +10 -4
  430. package/dist/hosts/claude-code/ux/mcp-resources.js +4 -2
  431. package/dist/hosts/codex/config-scaffold.js +4 -3
  432. package/dist/hosts/gemini/config-scaffold.js +2 -1
  433. package/dist/hosts/gemini/multimodal-spec-flow.js +7 -4
  434. package/dist/index.js +21 -6
  435. package/dist/resources/patterns.js +3 -1
  436. package/dist/resources/specs.js +3 -1
  437. package/dist/resources/templates.js +3 -1
  438. package/dist/security/adapters/environment.d.ts +12 -0
  439. package/dist/security/adapters/environment.js +25 -0
  440. package/dist/security/adapters/linux-secret-service.d.ts +8 -0
  441. package/dist/security/adapters/linux-secret-service.js +60 -0
  442. package/dist/security/adapters/macos-keychain.d.ts +18 -0
  443. package/dist/security/adapters/macos-keychain.js +90 -0
  444. package/dist/security/adapters/windows-credential-manager.d.ts +8 -0
  445. package/dist/security/adapters/windows-credential-manager.js +58 -0
  446. package/dist/security/redactor.d.ts +5 -0
  447. package/dist/security/redactor.js +58 -0
  448. package/dist/security/secret-field.d.ts +5 -0
  449. package/dist/security/secret-field.js +17 -0
  450. package/dist/security/secret-migration.d.ts +3 -0
  451. package/dist/security/secret-migration.js +123 -0
  452. package/dist/security/secret-provider.d.ts +23 -0
  453. package/dist/security/secret-provider.js +145 -0
  454. package/dist/security/secure-json.d.ts +3 -0
  455. package/dist/security/secure-json.js +29 -0
  456. package/dist/storage/api-surfaces-store.js +2 -2
  457. package/dist/storage/approval-operation-lock.d.ts +1 -1
  458. package/dist/storage/approval-operation-lock.js +5 -3
  459. package/dist/storage/audit-trail-store.d.ts +1 -1
  460. package/dist/storage/audit-trail-store.js +48 -62
  461. package/dist/storage/autopilot-log-store.js +12 -5
  462. package/dist/storage/base-store.d.ts +8 -8
  463. package/dist/storage/base-store.js +57 -20
  464. package/dist/storage/checkpoint-store.js +5 -2
  465. package/dist/storage/comments-store.js +2 -2
  466. package/dist/storage/compliance-audit-store.js +5 -2
  467. package/dist/storage/compliance-gate-config-store.js +7 -4
  468. package/dist/storage/compliance-store.js +2 -2
  469. package/dist/storage/context-profile-store.js +2 -2
  470. package/dist/storage/crash-shield-store.js +8 -4
  471. package/dist/storage/feedback-store.js +10 -6
  472. package/dist/storage/figma-store.js +8 -4
  473. package/dist/storage/file-mutex.js +9 -1
  474. package/dist/storage/gaps-log.js +7 -4
  475. package/dist/storage/global-projects-store.js +4 -2
  476. package/dist/storage/ideas-store.js +2 -2
  477. package/dist/storage/index.d.ts +5 -0
  478. package/dist/storage/index.js +5 -0
  479. package/dist/storage/knowledge-store/knowledge.js +27 -33
  480. package/dist/storage/lessons-store.js +2 -2
  481. package/dist/storage/license-store.js +13 -41
  482. package/dist/storage/migrations/canonical-storage.d.ts +15 -0
  483. package/dist/storage/migrations/canonical-storage.js +599 -0
  484. package/dist/storage/oauth-store.js +36 -8
  485. package/dist/storage/path-resolver.js +16 -3
  486. package/dist/storage/pr-store.js +2 -2
  487. package/dist/storage/project-drift-store.js +20 -8
  488. package/dist/storage/project-identity.d.ts +32 -0
  489. package/dist/storage/project-identity.js +194 -0
  490. package/dist/storage/project-resolver.js +14 -7
  491. package/dist/storage/release-notes-store.js +2 -6
  492. package/dist/storage/runtime-db.d.ts +186 -0
  493. package/dist/storage/runtime-db.js +1054 -0
  494. package/dist/storage/schema-registry.d.ts +5 -0
  495. package/dist/storage/schema-registry.js +74 -0
  496. package/dist/storage/sentry-store.js +20 -9
  497. package/dist/storage/session-state-store.js +12 -5
  498. package/dist/storage/session-store.js +12 -4
  499. package/dist/storage/skill-registry-storage.d.ts +1 -1
  500. package/dist/storage/skill-registry-storage.js +13 -11
  501. package/dist/storage/slack-store.js +10 -5
  502. package/dist/storage/spec-store.js +31 -24
  503. package/dist/storage/status-store/file-lock.js +31 -9
  504. package/dist/storage/status-store/self-healing.js +10 -5
  505. package/dist/storage/status-store/version-sync.js +8 -6
  506. package/dist/storage/steering-store.js +2 -2
  507. package/dist/storage/storage-bundle.d.ts +5 -0
  508. package/dist/storage/storage-bundle.js +117 -0
  509. package/dist/storage/storage-catalog-validation.d.ts +3 -0
  510. package/dist/storage/storage-catalog-validation.js +20 -0
  511. package/dist/storage/storage-catalog.d.ts +25 -0
  512. package/dist/storage/storage-catalog.js +390 -0
  513. package/dist/storage/storage-layout.d.ts +24 -0
  514. package/dist/storage/storage-layout.js +101 -0
  515. package/dist/storage/storybook-store.js +2 -2
  516. package/dist/storage/supabase-store.js +24 -6
  517. package/dist/storage/tdd-policy-store.js +8 -6
  518. package/dist/storage/tech-debt-store.js +3 -3
  519. package/dist/storage/technology-selection-store.d.ts +1 -1
  520. package/dist/storage/technology-selection-store.js +6 -3
  521. package/dist/storage/token-cache-store.js +3 -3
  522. package/dist/storage/token-ledger-store.js +13 -8
  523. package/dist/storage/transition-log.js +7 -4
  524. package/dist/storage/trash-store.js +15 -6
  525. package/dist/storage/vector-store/migrator.js +7 -2
  526. package/dist/storage/vector-store/sqlite-adapter.js +4 -1
  527. package/dist/storage/webhook-server-store.js +2 -2
  528. package/dist/tools/api-spec-generator-handler.js +3 -2
  529. package/dist/tools/auto-update-handler.d.ts +1 -1
  530. package/dist/tools/auto-update-handler.js +1 -1
  531. package/dist/tools/browser-validate-handler.js +2 -1
  532. package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +8 -5
  533. package/dist/tools/challenge-spec/scenarios-desktop.js +8 -3
  534. package/dist/tools/challenge-spec/scenarios-failure.js +7 -2
  535. package/dist/tools/challenge-spec/security-challenge-scenarios.js +3 -3
  536. package/dist/tools/clarify-requirements/multiple-choice.js +53 -41
  537. package/dist/tools/comments-handler.js +2 -3
  538. package/dist/tools/compliance-test-handler.js +2 -2
  539. package/dist/tools/configure-telemetry.js +11 -11
  540. package/dist/tools/create-spec/auto-pipeline.js +13 -1
  541. package/dist/tools/create-spec/autopilot-analyzer.d.ts +1 -1
  542. package/dist/tools/create-spec/autopilot-analyzer.js +2 -4
  543. package/dist/tools/create-spec/mcp-tool-contract.d.ts +10 -4
  544. package/dist/tools/create-spec/mcp-tool-contract.js +7 -36
  545. package/dist/tools/create-spec/post-creation.d.ts +2 -1
  546. package/dist/tools/create-spec/post-creation.js +56 -54
  547. package/dist/tools/create-spec/relevance-scorer.d.ts +1 -1
  548. package/dist/tools/create-spec/relevance-scorer.js +17 -1
  549. package/dist/tools/create-spec/spec-builder.js +2 -12
  550. package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +14 -0
  551. package/dist/tools/create-spec/spec-created-outbox-consumer.js +176 -0
  552. package/dist/tools/create-spec.js +385 -520
  553. package/dist/tools/define-ui-contract/agent-interaction-contract.js +2 -4
  554. package/dist/tools/define-ui-contract-desktop/desktop-contract.js +12 -4
  555. package/dist/tools/define-ui-contract-desktop/native-contract.js +7 -3
  556. package/dist/tools/define-ui-contract-extensions.js +2 -3
  557. package/dist/tools/define-ui-contract-mobile.js +5 -9
  558. package/dist/tools/define-ui-contract-web/component-tree.js +4 -3
  559. package/dist/tools/define-ui-contract.js +7 -4
  560. package/dist/tools/deploy/deploy-spec.js +2 -4
  561. package/dist/tools/deploy/deploy-status.js +2 -4
  562. package/dist/tools/design-schema/nosql-category-schemas.js +2 -3
  563. package/dist/tools/design-schema-sql/migrations.js +3 -2
  564. package/dist/tools/design-schema-sql/tables.js +4 -1
  565. package/dist/tools/design-schema.js +4 -3
  566. package/dist/tools/feedback-handler.js +2 -4
  567. package/dist/tools/gc-data-projects.js +5 -5
  568. package/dist/tools/generate-execution-plan.js +3 -4
  569. package/dist/tools/generate-sub-agent.js +2 -1
  570. package/dist/tools/generate-tests/generators/a11y-tests-generator.js +5 -4
  571. package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
  572. package/dist/tools/generate-tests/generators/concurrency-test-generator/js-templates.js +9 -4
  573. package/dist/tools/generate-tests/generators/concurrency-test-generator.js +8 -4
  574. package/dist/tools/generate-tests/generators/database/detectors.js +9 -3
  575. package/dist/tools/generate-tests/generators/database/index.js +2 -4
  576. package/dist/tools/generate-tests/generators/event-test-generator.js +5 -4
  577. package/dist/tools/generate-tests/generators/game-tests-generator.js +2 -1
  578. package/dist/tools/generate-tests/generators/graphql-test-generator.js +11 -5
  579. package/dist/tools/generate-tests/generators/grpc-test-generator.js +2 -3
  580. package/dist/tools/generate-tests/generators/llm-security-test-generator.js +4 -3
  581. package/dist/tools/generate-tests/generators/local-first-test-generator.js +4 -3
  582. package/dist/tools/generate-tests/generators/mcp-tests-generator.js +11 -9
  583. package/dist/tools/generate-tests/generators/microservices/index.js +2 -3
  584. package/dist/tools/generate-tests/generators/otel-test-generator.js +6 -3
  585. package/dist/tools/generate-tests/generators/security/detectors.js +2 -5
  586. package/dist/tools/generate-tests/generators/security/index.js +2 -4
  587. package/dist/tools/generate-tests/generators/supply-chain-test-generator.js +2 -3
  588. package/dist/tools/generate-tests/generators/visual-regression-generator.js +14 -17
  589. package/dist/tools/generate-tests/generators/websocket-test-generator.js +2 -3
  590. package/dist/tools/generate-tests/test-helpers.js +11 -12
  591. package/dist/tools/generate-tests-content.js +4 -3
  592. package/dist/tools/generate-tests.js +7 -4
  593. package/dist/tools/git/git-helpers.d.ts +0 -2
  594. package/dist/tools/git/git-helpers.js +7 -7
  595. package/dist/tools/github-pr-handler.js +10 -3
  596. package/dist/tools/heal-spec-docs.js +6 -53
  597. package/dist/tools/hook-generator-handler.js +6 -6
  598. package/dist/tools/init-constitution/platform-principles.js +4 -2
  599. package/dist/tools/init-project/agents-md-writer.js +14 -5
  600. package/dist/tools/init-project/claude-md-generator.js +19 -12
  601. package/dist/tools/init-project/handler.js +165 -73
  602. package/dist/tools/init-project/host-assets-writer.d.ts +1 -1
  603. package/dist/tools/init-project/host-assets-writer.js +4 -2
  604. package/dist/tools/init-project/lifecycle-helpers.js +3 -5
  605. package/dist/tools/init-project/lint-scaffolder.js +6 -2
  606. package/dist/tools/init-project/migration-runner.d.ts +10 -1
  607. package/dist/tools/init-project/migration-runner.js +68 -3
  608. package/dist/tools/init-project/per-client-files-writer.js +14 -4
  609. package/dist/tools/init-project/rules-generator.js +10 -2
  610. package/dist/tools/init-project/scaffold-writer.d.ts +1 -1
  611. package/dist/tools/init-project/scaffold-writer.js +17 -15
  612. package/dist/tools/jobs/handlers.d.ts +15 -0
  613. package/dist/tools/jobs/handlers.js +126 -0
  614. package/dist/tools/list-specs.js +35 -34
  615. package/dist/tools/manage-plugins-handler.js +17 -9
  616. package/dist/tools/migrate-tech/advanced-handlers.js +3 -2
  617. package/dist/tools/migrate-tech/build-tool-handlers.js +3 -2
  618. package/dist/tools/migrate-tech/core-handlers.js +5 -2
  619. package/dist/tools/migrate-tech/data-handlers.js +6 -3
  620. package/dist/tools/migrate-tech-advanced/rollback-handlers.js +3 -2
  621. package/dist/tools/migrate-tech-advanced/service-handlers.js +5 -2
  622. package/dist/tools/oauth-handler.js +7 -1
  623. package/dist/tools/register-sdd-tools.d.ts +1 -1
  624. package/dist/tools/register-sdd-tools.js +5 -0
  625. package/dist/tools/register-spec-tools/core-spec-tools.js +31 -0
  626. package/dist/tools/registry/auth.js +13 -5
  627. package/dist/tools/registry/publish.js +7 -4
  628. package/dist/tools/resolve-project-path.d.ts +2 -2
  629. package/dist/tools/resolve-project-path.js +7 -7
  630. package/dist/tools/reverse-engineer/analyzer.js +14 -14
  631. package/dist/tools/rollback-release.js +3 -2
  632. package/dist/tools/safe-handler.js +295 -171
  633. package/dist/tools/schema-generator-handler.js +2 -1
  634. package/dist/tools/schemas/output-schemas.d.ts +88 -82
  635. package/dist/tools/schemas/output-schemas.js +12 -94
  636. package/dist/tools/schemas/plugins-schemas.js +0 -2
  637. package/dist/tools/schemas/registry.js +0 -2
  638. package/dist/tools/schemas/skill-registry-schemas.js +0 -2
  639. package/dist/tools/schemas/validate-output-schema.d.ts +256 -0
  640. package/dist/tools/schemas/validate-output-schema.js +212 -0
  641. package/dist/tools/sentry-handler.js +6 -1
  642. package/dist/tools/skill-bootstrap-handler.js +7 -4
  643. package/dist/tools/status-handler.js +4 -0
  644. package/dist/tools/storage-bundle-handler.d.ts +9 -0
  645. package/dist/tools/storage-bundle-handler.js +29 -0
  646. package/dist/tools/storage-paths-handler.d.ts +9 -0
  647. package/dist/tools/storage-paths-handler.js +17 -0
  648. package/dist/tools/suggest-mcp-server.js +11 -5
  649. package/dist/tools/suggest-mcps.js +29 -9
  650. package/dist/tools/suggest-tooling/advanced-testing-catalog.js +4 -5
  651. package/dist/tools/suggest-tooling/build-tool-catalog.js +2 -1
  652. package/dist/tools/suggest-tooling/css-framework-catalog.js +13 -7
  653. package/dist/tools/suggest-tooling/framework-catalog.js +3 -5
  654. package/dist/tools/suggest-tooling/frontend-perf-catalog.js +2 -6
  655. package/dist/tools/suggest-tooling/handler.js +10 -4
  656. package/dist/tools/suggest-tooling/hypermedia-catalog.js +11 -3
  657. package/dist/tools/suggest-tooling/linting-catalog.js +4 -7
  658. package/dist/tools/suggest-tooling/llm-security-catalog.js +2 -1
  659. package/dist/tools/suggest-tooling/local-first-catalog.js +7 -5
  660. package/dist/tools/suggest-tooling/observability-catalog.js +3 -4
  661. package/dist/tools/suggest-tooling/otel-catalog.js +4 -1
  662. package/dist/tools/suggest-tooling/resilience-catalog.js +16 -5
  663. package/dist/tools/suggest-tooling/skills-catalog.js +10 -9
  664. package/dist/tools/suggest-tooling/supply-chain-catalog.js +2 -3
  665. package/dist/tools/supabase-handler.js +2 -1
  666. package/dist/tools/token-intelligence-handler.js +2 -2
  667. package/dist/tools/token-recording.js +2 -2
  668. package/dist/tools/token-savings-handler.js +2 -2
  669. package/dist/tools/tool-registry/core-tools.js +131 -0
  670. package/dist/tools/tool-registry/group-infra.js +10 -12
  671. package/dist/tools/tool-registry/group-quality-compliance.js +5 -12
  672. package/dist/tools/update-status/approval-gates.d.ts +13 -0
  673. package/dist/tools/update-status/approval-gates.js +81 -0
  674. package/dist/tools/update-status/batch.js +4 -2
  675. package/dist/tools/update-status/dod-gates.d.ts +6 -24
  676. package/dist/tools/update-status/dod-gates.js +60 -135
  677. package/dist/tools/update-status/done-receipt-verifier.d.ts +15 -0
  678. package/dist/tools/update-status/done-receipt-verifier.js +145 -0
  679. package/dist/tools/update-status/evidence-gate.js +154 -2
  680. package/dist/tools/update-status/file-sync.js +23 -12
  681. package/dist/tools/update-status/gate-harness.d.ts +7 -0
  682. package/dist/tools/update-status/gate-harness.js +8 -0
  683. package/dist/tools/update-status/index.js +228 -325
  684. package/dist/tools/update-status/qa-gate.d.ts +1 -1
  685. package/dist/tools/update-status/qa-gate.js +2 -2
  686. package/dist/tools/update-status/side-effects.js +30 -37
  687. package/dist/tools/update-status/transition-guard.d.ts +4 -2
  688. package/dist/tools/update-status/transition-guard.js +57 -10
  689. package/dist/tools/update-status-convention-gate.js +24 -23
  690. package/dist/tools/update-status-reconcile.js +2 -2
  691. package/dist/tools/validate-api-contract-handler.js +3 -3
  692. package/dist/tools/validate-lint.js +20 -13
  693. package/dist/tools/validate.d.ts +3 -1
  694. package/dist/tools/validate.js +213 -5
  695. package/dist/transports/http-transport.js +84 -61
  696. package/dist/transports/middleware/with-telemetry.js +3 -2
  697. package/dist/types/abortable-process.d.ts +2 -0
  698. package/dist/types/advanced-framework.js +0 -2
  699. package/dist/types/atomic-upgrade.d.ts +71 -0
  700. package/dist/types/atomic-upgrade.js +2 -0
  701. package/dist/types/ci.js +0 -2
  702. package/dist/types/core-bridge.d.ts +78 -1
  703. package/dist/types/crash-shield-framework-rules.d.ts +24 -0
  704. package/dist/types/crash-shield-framework-rules.js +2 -0
  705. package/dist/types/data-gc.d.ts +16 -0
  706. package/dist/types/deploy.js +0 -2
  707. package/dist/types/durable-job.d.ts +78 -0
  708. package/dist/types/durable-job.js +2 -0
  709. package/dist/types/durable-validation.d.ts +60 -0
  710. package/dist/types/durable-validation.js +2 -0
  711. package/dist/types/estimation.d.ts +2 -0
  712. package/dist/types/evidence-gates.d.ts +9 -1
  713. package/dist/types/execution.d.ts +43 -0
  714. package/dist/types/handoff-artifacts.d.ts +2 -0
  715. package/dist/types/index.d.ts +2 -0
  716. package/dist/types/index.js +2 -0
  717. package/dist/types/infrastructure.js +0 -2
  718. package/dist/types/lifecycle.js +0 -2
  719. package/dist/types/migration/canonical-storage.d.ts +37 -0
  720. package/dist/types/migration/canonical-storage.js +2 -0
  721. package/dist/types/migration/index.d.ts +1 -1
  722. package/dist/types/native-worker.d.ts +48 -0
  723. package/dist/types/native-worker.js +2 -0
  724. package/dist/types/network-policy.d.ts +12 -0
  725. package/dist/types/network-policy.js +2 -0
  726. package/dist/types/oauth.js +0 -2
  727. package/dist/types/observability.d.ts +32 -0
  728. package/dist/types/outbox-worker.d.ts +35 -0
  729. package/dist/types/outbox-worker.js +11 -0
  730. package/dist/types/permissions-config.d.ts +0 -27
  731. package/dist/types/permissions-config.js +0 -2
  732. package/dist/types/plugin-install.d.ts +0 -11
  733. package/dist/types/plugin-install.js +0 -2
  734. package/dist/types/portal.d.ts +1 -0
  735. package/dist/types/product-public.d.ts +75 -0
  736. package/dist/types/product-public.js +2 -0
  737. package/dist/types/project/inputs.d.ts +2 -0
  738. package/dist/types/project/mfe-detection.js +0 -2
  739. package/dist/types/project/platform-mobile.js +0 -2
  740. package/dist/types/project/platform-specialty.js +0 -2
  741. package/dist/types/project-knowledge-graph.d.ts +7 -0
  742. package/dist/types/runtime-database.d.ts +10 -0
  743. package/dist/types/runtime-database.js +2 -0
  744. package/dist/types/runtime-policy.d.ts +40 -0
  745. package/dist/types/runtime-policy.js +2 -0
  746. package/dist/types/safety.d.ts +4 -5
  747. package/dist/types/schema-registry.d.ts +12 -0
  748. package/dist/types/schema-registry.js +2 -0
  749. package/dist/types/security.d.ts +52 -0
  750. package/dist/types/skill-registry.js +0 -2
  751. package/dist/types/spec/inputs.d.ts +2 -0
  752. package/dist/types/spec-lock-v2.d.ts +13 -7
  753. package/dist/types/spec-lock-v2.js +1 -1
  754. package/dist/types/spec-registry.js +0 -2
  755. package/dist/types/storage-bundle.d.ts +13 -0
  756. package/dist/types/storage-bundle.js +2 -0
  757. package/dist/types/storage-catalog.d.ts +18 -0
  758. package/dist/types/storage-catalog.js +2 -0
  759. package/dist/types/team-planner.js +0 -2
  760. package/dist/types/technology-registry.d.ts +35 -0
  761. package/dist/types/technology-registry.js +2 -0
  762. package/dist/types/technology-symbols.generated.d.ts +117 -0
  763. package/dist/types/technology-symbols.generated.js +2 -0
  764. package/dist/types/telemetry.d.ts +3 -3
  765. package/dist/types/transport.d.ts +2 -0
  766. package/dist/types/validate-worker.d.ts +44 -0
  767. package/dist/types/validate-worker.js +2 -0
  768. package/dist/types/validation-evidence.d.ts +1 -1
  769. package/dist/types/validation-receipt.d.ts +104 -0
  770. package/dist/types/validation-receipt.js +2 -0
  771. package/package.json +31 -20
  772. package/planu-native.json +1 -1
  773. package/planu-plugin.json +1 -1
  774. package/dist/engine/telemetry/geo-resolver.d.ts +0 -9
  775. package/dist/engine/telemetry/geo-resolver.js +0 -43
  776. package/dist/storage/data-dir-discovery.d.ts +0 -31
  777. package/dist/storage/data-dir-discovery.js +0 -140
  778. package/dist/storage/migrations/cwd-to-absolute.d.ts +0 -25
  779. package/dist/storage/migrations/cwd-to-absolute.js +0 -281
  780. package/dist/tools/create-spec/adapters/prior-decisions-hint.d.ts +0 -14
  781. package/dist/tools/create-spec/adapters/prior-decisions-hint.js +0 -30
  782. package/dist/tools/init-project/ancestor-data-detector.d.ts +0 -22
  783. package/dist/tools/init-project/ancestor-data-detector.js +0 -81
  784. package/dist/tools/update-status/force-done-audit.d.ts +0 -2
  785. package/dist/tools/update-status/force-done-audit.js +0 -23
  786. package/dist/types/migration/cwd-to-absolute.d.ts +0 -8
  787. package/dist/types/migration/cwd-to-absolute.js +0 -3
@@ -1,7 +1,14 @@
1
+ import { technologyValue } from '../../engine/technology-registry.js';
1
2
  function wrap(name, content) {
2
3
  return `<!-- planu:${name} -->\n${content}\n<!-- planu:${name} -->`;
3
4
  }
4
- const SERVERLESS_PLATFORMS = ['vercel', 'netlify', 'lambda', 'cloudflare-workers', 'deno-deploy'];
5
+ const SERVERLESS_PLATFORMS = [
6
+ technologyValue('technology-vercel-9d3508'),
7
+ technologyValue('technology-netlify-58465a'),
8
+ 'lambda',
9
+ 'cloudflare-workers',
10
+ 'deno-deploy',
11
+ ];
5
12
  function isServerlessPlatform(knowledge) {
6
13
  const services = knowledge.externalServices.map((s) => s.toLowerCase());
7
14
  const deployPlatform = (knowledge.conventions['deploy-platform'] ?? '').toLowerCase();
@@ -110,14 +117,14 @@ function buildArchitecture(knowledge) {
110
117
  return wrap('architecture', `## Architecture\n${items.join('\n')}`);
111
118
  }
112
119
  function detectTestFramework(testCommand) {
113
- if (testCommand.includes('vitest')) {
114
- return 'Vitest';
120
+ if (testCommand.includes(technologyValue('technology-vitest-a9127f'))) {
121
+ return technologyValue('technology-vitest-7fc39e');
115
122
  }
116
- if (testCommand.includes('jest')) {
117
- return 'Jest';
123
+ if (testCommand.includes(technologyValue('technology-jest-35e99f'))) {
124
+ return technologyValue('technology-jest-1f30f0');
118
125
  }
119
- if (testCommand.includes('pytest')) {
120
- return 'pytest';
126
+ if (testCommand.includes(technologyValue('technology-pytest-2b0121'))) {
127
+ return technologyValue('technology-pytest-2b0121');
121
128
  }
122
129
  if (testCommand.includes('go test')) {
123
130
  return 'go test';
@@ -165,9 +172,9 @@ function buildCiCd(knowledge) {
165
172
  return wrap('cicd', `## CI/CD\n- **Platform**: ${label}`);
166
173
  }
167
174
  const DEPLOY_PLATFORM_MAP = {
168
- vercel: 'Vercel',
169
- netlify: 'Netlify',
170
- railway: 'Railway',
175
+ vercel: technologyValue('technology-vercel-68edc7'),
176
+ netlify: technologyValue('technology-netlify-55c13c'),
177
+ railway: technologyValue('technology-railway-3e12c4'),
171
178
  heroku: 'Heroku',
172
179
  'aws-lambda': 'AWS Lambda',
173
180
  'aws-ecs': 'AWS ECS',
@@ -176,8 +183,8 @@ const DEPLOY_PLATFORM_MAP = {
176
183
  fly: 'Fly.io',
177
184
  render: 'Render',
178
185
  cloudflare: 'Cloudflare Pages/Workers',
179
- docker: 'Docker',
180
- kubernetes: 'Kubernetes',
186
+ docker: technologyValue('technology-docker-e6169e'),
187
+ kubernetes: technologyValue('technology-kubernetes-a37d07'),
181
188
  };
182
189
  function buildDeployment(knowledge) {
183
190
  const fromConventions = knowledge.conventions['deploy-platform'] ?? null;
@@ -1,7 +1,11 @@
1
+ import { technologyValue } from '../../engine/technology-registry.js';
1
2
  import { elicitOrFallback, questionsToFormSchema } from '../../engine/elicitation/elicit-helper.js';
2
3
  import { ti } from '../../i18n/index.js';
3
4
  import { AutopilotSummaryCollector } from '../../engine/autopilot/summary-collector.js';
4
- import { hashProjectPath, knowledgeStore, globalStore, licenseStore, technologySelectionStore, } from '../../storage/index.js';
5
+ import { knowledgeStore, globalStore, licenseStore, technologySelectionStore, projectDataDir, } from '../../storage/index.js';
6
+ import { migrateCanonicalStorage } from '../../storage/migrations/canonical-storage.js';
7
+ import { deriveWorkspaceKey, ensureProjectIdentity } from '../../storage/project-identity.js';
8
+ import { resolveStorageLayout } from '../../storage/storage-layout.js';
5
9
  import { addProject } from '../../storage/global-projects-store.js';
6
10
  import { getCurrentTier } from '../license-gate.js';
7
11
  import { checkLimits } from '../../engine/license-validator.js';
@@ -19,11 +23,12 @@ import { detectStackPatterns } from './stack-detector.js';
19
23
  import { buildProjectConfig } from './config-builder.js';
20
24
  import { runSpecMigrations, listProjectSpecs } from './migration-runner.js';
21
25
  import { runScaffoldWriter } from './scaffold-writer.js';
22
- import { detectAncestorDataDirs, buildAncestorDataWarning } from './ancestor-data-detector.js';
23
26
  import { readAutoInstallFlag, orchestrateSkillInstalls, runHealthCheckWithBaseline, runConventionScanSafe, fireTelemetry, } from './lifecycle-helpers.js';
24
27
  import { injectProactiveRules } from '../../engine/claude-md-injector/index.js';
25
28
  import { discoverSkillsForInit } from '../../engine/skill-bootstrap/registry-fetcher.js';
26
29
  import { join } from 'node:path';
30
+ import { createHash } from 'node:crypto';
31
+ import { homedir } from 'node:os';
27
32
  import { mkdir, stat } from 'node:fs/promises';
28
33
  import { generateAgentTeamsRulesIfMissing, generateWorkflowRulesIfMissing, } from './rules-generator.js';
29
34
  import { installUniversalRules } from '../../engine/universal-rules/installer.js';
@@ -37,14 +42,27 @@ import { applyStackBasedGroupActivations } from './tool-group-activator.js';
37
42
  import { checkGate } from '../../engine/clarification-gate/gate.js';
38
43
  import { upsertToken, hashQuestions } from '../../engine/clarification-gate/token-store.js';
39
44
  import { reconcileInteractiveQuestionHooks } from '../reconcile-interactive-question-hooks.js';
45
+ import { installSessionSafeguardHook } from '../reconcile-session-safeguard-hook.js';
40
46
  import { resolveNewProjectOnboarding } from '../../engine/onboarding/new-project-resolver.js';
41
47
  import { interactiveResult } from '../response-helpers.js';
42
48
  /** Frontend framework groups — mutually exclusive. Two or more detected → multi-stack conflict. */
43
49
  const FRONTEND_FRAMEWORK_GROUPS = [
44
- ['react', 'next', 'next.js', 'nextjs', 'remix', 'preact'],
45
- ['vue', 'nuxt', 'nuxt.js', 'nuxtjs'],
46
- ['angular', 'angularjs'],
47
- ['svelte', 'sveltekit'],
50
+ [
51
+ technologyValue('technology-react-275976'),
52
+ 'next',
53
+ technologyValue('technology-next-js-0d857f'),
54
+ technologyValue('technology-nextjs-c93379'),
55
+ technologyValue('technology-remix-0c5d96'),
56
+ 'preact',
57
+ ],
58
+ [
59
+ technologyValue('technology-vue-564382'),
60
+ technologyValue('technology-nuxt-22c407'),
61
+ 'nuxt.js',
62
+ 'nuxtjs',
63
+ ],
64
+ [technologyValue('technology-angular-a39f89'), 'angularjs'],
65
+ [technologyValue('technology-svelte-c190ac'), technologyValue('technology-sveltekit-eefb03')],
48
66
  ['solid', 'solidstart'],
49
67
  ['qwik'],
50
68
  ['ember'],
@@ -71,16 +89,6 @@ function detectMultipleFrameworks(stack) {
71
89
  }
72
90
  // eslint-disable-next-line max-lines-per-function
73
91
  export async function handleInitProject(params, server) {
74
- // SPEC-584: Gate check — block if pending clarification token exists and no answers provided
75
- const gateProjectId = hashProjectPath(params.projectPath);
76
- const gateResult = await checkGate({
77
- projectId: gateProjectId,
78
- toolName: 'init_project',
79
- clarificationAnswers: params.clarificationAnswers,
80
- });
81
- if (!gateResult.allow) {
82
- return gateResult.error;
83
- }
84
92
  // eslint-disable-next-line max-lines-per-function, complexity
85
93
  return trackCost(params.projectPath, 'init_project', async () => {
86
94
  const { projectPath, mode, locale, hourlyRate, experienceLevel, userProfile, autoInstallSkills, workMode, } = params;
@@ -137,42 +145,119 @@ export async function handleInitProject(params, server) {
137
145
  };
138
146
  }
139
147
  }
140
- const projectId = hashProjectPath(projectPath);
141
- // SPEC-1007: migrate legacy <cwd>/data/projects/{id} into ~/.planu/data/
142
- // before any storage call so the rest of init_project sees a single
143
- // canonical location. Best-effort — errors here are surfaced via the
144
- // ancestor warning below rather than aborting the whole init.
145
- try {
146
- const { migrateLegacyDataDir } = await import('../../storage/migrations/cwd-to-absolute.js');
147
- await migrateLegacyDataDir(projectId, projectPath);
148
- }
149
- catch {
150
- // ignore — fall through to detectAncestorDataDirs which will warn.
148
+ // Legacy identities were the first 16 chars (and, briefly, all 64 chars)
149
+ // of the raw path hash. Derive them independently of project.json so a
150
+ // second init can still discover pre-cutover storage.
151
+ const legacyFullProjectId = createHash('sha256').update(projectPath).digest('hex');
152
+ const legacyProjectId = legacyFullProjectId.slice(0, 16);
153
+ const hadProjectIdentity = await stat(join(projectPath, 'planu', 'project.json'))
154
+ .then((identityStat) => identityStat.isFile())
155
+ .catch(() => false);
156
+ const identity = await ensureProjectIdentity(projectPath, {
157
+ workspaceKey: await deriveWorkspaceKey(projectPath),
158
+ });
159
+ const logicalProjectId = identity.project.logicalProjectId;
160
+ const projectId = /^[0-9a-f-]{36}$/i.test(logicalProjectId)
161
+ ? logicalProjectId.replaceAll('-', '').toLowerCase()
162
+ : logicalProjectId;
163
+ // The clarification gate is keyed by the portable identity. Creating the
164
+ // identity must happen first so init never falls back to a path-derived ID.
165
+ const gateResult = await checkGate({
166
+ projectId,
167
+ toolName: 'init_project',
168
+ clarificationAnswers: params.clarificationAnswers,
169
+ });
170
+ if (!gateResult.allow) {
171
+ return gateResult.error;
151
172
  }
152
- // Detect divergent ancestor data dirs that would otherwise corrupt state
153
- // silently (e.g. user ran init_project from /repo/ then from /repo/sub/).
154
- // Read-only we surface the finding but never touch existing data.
155
- const ancestorReport = await detectAncestorDataDirs(projectPath, projectId);
156
- const ancestorWarning = buildAncestorDataWarning(ancestorReport);
157
- if (ancestorWarning !== null) {
158
- console.warn(`[Planu] init_project: ${ancestorWarning}`);
173
+ // The only accepted legacy source is derived from the explicit projectPath.
174
+ // There is no CWD/ancestor discovery, so launching MCP elsewhere cannot
175
+ // select a different state tree.
176
+ const destinationRoot = projectDataDir(projectId);
177
+ const legacyRoots = [
178
+ join(projectPath, 'data', 'projects', legacyProjectId),
179
+ join(resolveStorageLayout().projects, legacyProjectId),
180
+ join(resolveStorageLayout().projects, legacyFullProjectId),
181
+ join(homedir(), '.planu', 'data', 'projects', legacyProjectId),
182
+ join(homedir(), '.planu', 'data', 'projects', legacyFullProjectId),
183
+ ].filter((root) => root !== destinationRoot);
184
+ const migration = await migrateCanonicalStorage({ legacyRoots, destinationRoot });
185
+ if (migration.status === 'error' || migration.status === 'rolled-back') {
186
+ return {
187
+ content: [
188
+ { type: 'text', text: migration.reason ?? 'Canonical storage migration failed.' },
189
+ ],
190
+ isError: true,
191
+ };
159
192
  }
160
193
  // Check if project is already initialized
161
194
  const existing = await knowledgeStore.getKnowledge(projectId);
162
- const isUpdate = existing !== null;
163
- // License: check project limit only for new projects
164
- if (!isUpdate) {
165
- const tier = await getCurrentTier();
166
- const projectCount = await licenseStore.countActiveProjects();
167
- const limitCheck = checkLimits(tier, projectCount, 'maxProjects');
168
- if (!limitCheck.allowed) {
169
- return { content: [{ type: 'text', text: limitCheck.message }], isError: true };
195
+ const isUpdate = hadProjectIdentity || existing !== null;
196
+ const authorizedMigrations = params.authorizedMigrations ?? [];
197
+ if (isUpdate && authorizedMigrations.length === 0) {
198
+ return {
199
+ content: [
200
+ {
201
+ type: 'text',
202
+ text: 'Project already initialized. Safe update completed without changing repository files.',
203
+ },
204
+ ],
205
+ structuredContent: {
206
+ projectId,
207
+ projectPath,
208
+ isUpdate: true,
209
+ repositoryFilesChanged: [],
210
+ authorizedMigrations: [],
211
+ },
212
+ };
213
+ }
214
+ if (isUpdate) {
215
+ if (existing === null) {
216
+ return {
217
+ content: [
218
+ {
219
+ type: 'text',
220
+ text: 'Repository migration requires recovered canonical project knowledge.',
221
+ },
222
+ ],
223
+ isError: true,
224
+ };
170
225
  }
226
+ const migrationResult = await runSpecMigrations(projectPath, projectId, existing, {
227
+ repositoryMigration: 'planu-spec-format-v1',
228
+ });
229
+ return {
230
+ content: [
231
+ {
232
+ type: 'text',
233
+ text: migrationResult.criticalMigrationFailures.length === 0
234
+ ? 'Authorized planu-spec-format-v1 migration completed.'
235
+ : `Authorized migration completed with ${String(migrationResult.criticalMigrationFailures.length)} blocking issue(s).`,
236
+ },
237
+ ],
238
+ structuredContent: {
239
+ projectId,
240
+ projectPath,
241
+ isUpdate: true,
242
+ authorizedMigrations,
243
+ repositoryFilesChanged: migrationResult.changedPaths ?? [],
244
+ migrationReportPath: migrationResult.migrationReportPath,
245
+ criticalMigrationFailures: migrationResult.criticalMigrationFailures,
246
+ },
247
+ ...(migrationResult.criticalMigrationFailures.length > 0 ? { isError: true } : {}),
248
+ };
249
+ }
250
+ // The update branches returned above; only new projects reach the limit gate.
251
+ const tier = await getCurrentTier();
252
+ const projectCount = await licenseStore.countActiveProjects();
253
+ const limitCheck = checkLimits(tier, projectCount, 'maxProjects');
254
+ if (!limitCheck.allowed) {
255
+ return { content: [{ type: 'text', text: limitCheck.message }], isError: true };
171
256
  }
172
257
  // Get global config for defaults
173
258
  const globalConfig = await globalStore.getGlobalConfig();
174
- const effectiveLocale = locale ?? existing?.locale ?? globalConfig.defaultLocale;
175
- const effectiveExperience = experienceLevel ?? existing?.experienceLevel ?? globalConfig.defaultExperienceLevel;
259
+ const effectiveLocale = locale ?? globalConfig.defaultLocale;
260
+ const effectiveExperience = experienceLevel ?? globalConfig.defaultExperienceLevel;
176
261
  // Run full project analysis
177
262
  const knowledge = await analyzeProject(projectPath, projectId, effectiveLocale, effectiveExperience);
178
263
  if (approvedTechnologyContract !== null) {
@@ -219,15 +304,18 @@ export async function handleInitProject(params, server) {
219
304
  interactiveQuestions: questions,
220
305
  },
221
306
  };
222
- upsertToken({
223
- toolName: 'init_project',
224
- projectId,
225
- questionsHash: hashQuestions(questions),
226
- emittedAt: new Date().toISOString(),
227
- questions,
228
- }).catch(() => {
307
+ try {
308
+ await upsertToken({
309
+ toolName: 'init_project',
310
+ projectId,
311
+ questionsHash: hashQuestions(questions),
312
+ emittedAt: new Date().toISOString(),
313
+ questions,
314
+ });
315
+ }
316
+ catch {
229
317
  /* best-effort */
230
- });
318
+ }
231
319
  return earlyReturn;
232
320
  }
233
321
  // SPEC-026a: Compute project completeness score
@@ -271,14 +359,16 @@ export async function handleInitProject(params, server) {
271
359
  const configResult = await buildProjectConfig(projectPath, projectId, knowledge, workMode);
272
360
  const { planuConfigPath, planuConfigGenerated, whatsNew } = configResult;
273
361
  // Run spec migrations (v0.30 -> v0.40, legacy paths, prefix normalization)
274
- const { discoveryResult, migrationResult, folderMigrationResult, criticalMigrationFailures, nonCriticalWarnings: nonCriticalMigrationWarnings, migrationReportPath, } = await runSpecMigrations(projectPath, projectId, knowledge);
362
+ const { discoveryResult, migrationResult, folderMigrationResult, criticalMigrationFailures, nonCriticalWarnings: nonCriticalMigrationWarnings, migrationReportPath, changedPaths: migrationChangedPaths = [], } = await runSpecMigrations(projectPath, projectId, knowledge, {
363
+ repositoryMigration: 'initialization',
364
+ });
275
365
  // Auto-fetch recommended skills based on detected stack
276
366
  const recommendedSkills = await fetchRecommendedSkills(knowledge);
277
367
  // Auto-install or queue skills (opt-out via planu.json or input param, SPEC-185)
278
368
  const autoInstallFromConfig = autoInstallSkills ?? (await readAutoInstallFlag(planuConfigPath));
279
369
  const { skillsAutoInstalled, skillsPendingInstall, skillsSkipped } = await orchestrateSkillInstalls(recommendedSkills, projectPath, autoInstallFromConfig);
280
370
  // Write scaffold files: rules, git setup, constitution, CLAUDE.md, lint, architecture rules
281
- const scaffoldResult = await runScaffoldWriter(projectPath, projectId, knowledge, recommendedSkills, params.permissionsMode, params.pluginsMode);
371
+ const scaffoldResult = await runScaffoldWriter(projectPath, projectId, knowledge, recommendedSkills, params.permissionsMode, params.pluginsMode, autoInstallFromConfig);
282
372
  const { platform, generatedRules, rulesWritten, additionalFilesWritten, hooksInstalled, gitFlowType, gitignoreUpdated, gitRepoDetected, constitutionInitialized, claudeMdUpdated, eslintCreated, prettierCreated, lintSuggestions, architectureRulesWritten, architectureRulesSkipped, planuWorkflowInjected, planuHooksConfigured, planuRulesWritten, gitAutoStageInjected, } = scaffoldResult;
283
373
  // SPEC-444: Inject proactive behavior rules into project CLAUDE.md
284
374
  const proactiveRulesInjected = await injectProactiveRules(join(projectPath, 'CLAUDE.md'), '1.22.0')
@@ -464,20 +554,19 @@ export async function handleInitProject(params, server) {
464
554
  discoveredRegistrySkills,
465
555
  branchInfo,
466
556
  });
557
+ if (toolResult.structuredContent) {
558
+ toolResult.structuredContent.repositoryFilesChanged = migrationChangedPaths;
559
+ toolResult.structuredContent.authorizedMigrations = authorizedMigrations;
560
+ }
467
561
  // Inject autopilotSummary into structuredContent
468
562
  if (collector.hasEntries() && toolResult.structuredContent) {
469
563
  toolResult.structuredContent.autopilotSummary = collector.getMessages();
470
564
  }
471
- // SPEC-584: Auto-install PostToolUse hook in the client project (fire-and-forget)
472
- reconcileInteractiveQuestionHooks(projectPath).catch(() => {
473
- /* best-effort never block init_project */
474
- });
475
- // SPEC-585: Install PreCompaction session-safeguard hook (fire-and-forget)
476
- import('../reconcile-session-safeguard-hook.js')
477
- .then(({ installSessionSafeguardHook }) => installSessionSafeguardHook(projectPath))
478
- .catch(() => {
479
- /* best-effort — never block init_project */
480
- });
565
+ // SPEC-584/585: These installers both mutate .claude/settings.json. Await them
566
+ // sequentially so init_project never returns while repository writes are pending.
567
+ // Failures remain best-effort and must not prevent project initialization.
568
+ await reconcileInteractiveQuestionHooks(projectPath).catch(() => undefined);
569
+ await installSessionSafeguardHook(projectPath).catch(() => undefined);
481
570
  // SPEC-595: If interactiveQuestions are present and client supports elicitation, use native UI
482
571
  const rawEmitted = toolResult.structuredContent?.interactiveQuestions;
483
572
  if (server !== undefined && Array.isArray(rawEmitted) && rawEmitted.length > 0) {
@@ -500,15 +589,18 @@ export async function handleInitProject(params, server) {
500
589
  // SPEC-584: Persist token when emitting interactiveQuestions so gate blocks retries
501
590
  if (Array.isArray(rawEmitted) && rawEmitted.length > 0) {
502
591
  const emittedQuestions = rawEmitted;
503
- upsertToken({
504
- toolName: 'init_project',
505
- projectId,
506
- questionsHash: hashQuestions(emittedQuestions),
507
- emittedAt: new Date().toISOString(),
508
- questions: emittedQuestions,
509
- }).catch(() => {
510
- /* best-effort — token persistence should not block the response */
511
- });
592
+ try {
593
+ await upsertToken({
594
+ toolName: 'init_project',
595
+ projectId,
596
+ questionsHash: hashQuestions(emittedQuestions),
597
+ emittedAt: new Date().toISOString(),
598
+ questions: emittedQuestions,
599
+ });
600
+ }
601
+ catch {
602
+ /* best-effort — token persistence should not fail the response */
603
+ }
512
604
  }
513
605
  // SPEC-756: lazy version check — fire-and-forget, non-blocking
514
606
  checkBundledVersionGap(2000)
@@ -17,5 +17,5 @@ export interface InitHostAssetsResult {
17
17
  * host configs that should stay in sync too.
18
18
  */
19
19
  export declare function detectInitAssetHosts(projectPath: string): Promise<InitAssetHost[]>;
20
- export declare function installInitHostAssets(projectPath: string, _knowledge: ProjectKnowledge): Promise<InitHostAssetsResult>;
20
+ export declare function installInitHostAssets(projectPath: string, _knowledge: ProjectKnowledge, installSkills?: boolean): Promise<InitHostAssetsResult>;
21
21
  //# sourceMappingURL=host-assets-writer.d.ts.map
@@ -153,7 +153,7 @@ async function scaffoldHostConfig(projectPath, host) {
153
153
  }
154
154
  return false;
155
155
  }
156
- export async function installInitHostAssets(projectPath, _knowledge) {
156
+ export async function installInitHostAssets(projectPath, _knowledge, installSkills = true) {
157
157
  const detectedHosts = await detectInitAssetHosts(projectPath);
158
158
  const rulesInstalled = [];
159
159
  const skillsInstalled = [];
@@ -165,7 +165,9 @@ export async function installInitHostAssets(projectPath, _knowledge) {
165
165
  continue;
166
166
  }
167
167
  rulesInstalled.push(...(await installRulesForHost(projectPath, host)));
168
- skillsInstalled.push(...(await installCoreSkillsForHost(projectPath, host)));
168
+ if (installSkills) {
169
+ skillsInstalled.push(...(await installCoreSkillsForHost(projectPath, host)));
170
+ }
169
171
  }
170
172
  return { detectedHosts, rulesInstalled, skillsInstalled, opencodeConfigured };
171
173
  }
@@ -3,7 +3,7 @@ import { autoInstallRecommendedSkills } from './skill-auto-installer.js';
3
3
  import { checkProjectHealth, } from '../../engine/project-health-checker.js';
4
4
  import { saveBaseline } from '../../storage/convention-baseline.js';
5
5
  import { scanProject } from '../../engine/project-scanner/index.js';
6
- import { isTelemetryEnabled, hasNeverBeenPrompted, markAsPrompted, getOrCreateInstallationId, sendTelemetryEvent, } from '../../engine/telemetry/index.js';
6
+ import { isTelemetryEnabled, hasNeverBeenPrompted, markAsPrompted, sendTelemetryEvent, } from '../../engine/telemetry/index.js';
7
7
  import { generateProjectRules, writeRules } from '../../engine/rules-generator/index.js';
8
8
  import { getWhatsNew } from '../../engine/whats-new.js';
9
9
  import { PLANU_VERSION } from '../../config/version.js';
@@ -102,12 +102,11 @@ export function generateAndWriteRules(projectPath) {
102
102
  }
103
103
  }
104
104
  export async function fireTelemetry(knowledge) {
105
- const [enabled, neverPrompted, installationId] = await Promise.all([
105
+ const [enabled, neverPrompted] = await Promise.all([
106
106
  isTelemetryEnabled().catch(() => false),
107
107
  hasNeverBeenPrompted().catch(() => false),
108
- getOrCreateInstallationId().catch(() => ''),
109
108
  ]);
110
- if (enabled && installationId) {
109
+ if (enabled) {
111
110
  sendTelemetryEvent({
112
111
  event: 'init_project',
113
112
  properties: {
@@ -118,7 +117,6 @@ export async function fireTelemetry(knowledge) {
118
117
  nodeVersion: process.version,
119
118
  specCount: knowledge.specCount ?? 0,
120
119
  },
121
- installationId,
122
120
  });
123
121
  }
124
122
  if (neverPrompted) {
@@ -1,3 +1,4 @@
1
+ import { technologyValue } from '../../engine/technology-registry.js';
1
2
  import { readFile, writeFile, access } from 'node:fs/promises';
2
3
  import { join } from 'node:path';
3
4
  const ESLINT_CONFIG_FILES = [
@@ -72,7 +73,8 @@ function hasDevDep(packageJson, dep) {
72
73
  }
73
74
  function buildEslintConfig(framework) {
74
75
  const isNext = framework?.toLowerCase().includes('next') ?? false;
75
- const isReact = !isNext && (framework?.toLowerCase().includes('react') ?? false);
76
+ const isReact = !isNext &&
77
+ (framework?.toLowerCase().includes(technologyValue('technology-react-275976')) ?? false);
76
78
  if (isNext) {
77
79
  return `import nextPlugin from '@next/eslint-plugin-next';
78
80
  import tseslint from 'typescript-eslint';
@@ -143,7 +145,9 @@ export async function scaffoldLintConfig(projectPath, knowledge) {
143
145
  suggestions: [],
144
146
  };
145
147
  const lang = knowledge.language.toLowerCase();
146
- const isJsTs = lang === 'typescript' || lang === 'javascript' || lang === 'unknown';
148
+ const isJsTs = lang === technologyValue('technology-typescript-969545') ||
149
+ lang === 'javascript' ||
150
+ lang === 'unknown';
147
151
  if (!isJsTs) {
148
152
  // Python/Go/Rust — suggest language-specific linters, skip file generation
149
153
  if (lang === 'python') {
@@ -11,6 +11,10 @@ export interface MigrationRunResult {
11
11
  renamedCount: number;
12
12
  errors: string[];
13
13
  } | null;
14
+ filesystemImportResult: {
15
+ importedCount: number;
16
+ errors: string[];
17
+ } | null;
14
18
  migrationResult: {
15
19
  migratedCount: number;
16
20
  errors: string[];
@@ -22,6 +26,10 @@ export interface MigrationRunResult {
22
26
  criticalMigrationFailures: MigrationRunIssue[];
23
27
  nonCriticalWarnings: MigrationRunIssue[];
24
28
  migrationReportPath: string | null;
29
+ changedPaths?: string[];
30
+ }
31
+ interface SpecMigrationOptions {
32
+ repositoryMigration?: 'initialization' | 'planu-spec-format-v1';
25
33
  }
26
34
  /**
27
35
  * Run all spec migration passes during init_project:
@@ -30,7 +38,8 @@ export interface MigrationRunResult {
30
38
  * 3. Reconcile stale paths in specs.json
31
39
  * 4. Migrate spec folders without SPEC-XXX- prefix
32
40
  */
33
- export declare function runSpecMigrations(projectPath: string, projectId: string, knowledge: ProjectKnowledge): Promise<MigrationRunResult>;
41
+ export declare function runSpecMigrations(projectPath: string, projectId: string, knowledge: ProjectKnowledge, options?: SpecMigrationOptions): Promise<MigrationRunResult>;
34
42
  /** Return all specs for the project (needed by caller for health check refs). */
35
43
  export declare function listProjectSpecs(projectId: string): Promise<Spec[]>;
44
+ export {};
36
45
  //# sourceMappingURL=migration-runner.d.ts.map
@@ -1,7 +1,48 @@
1
1
  // tools/init-project/migration-runner.ts — Spec migration orchestration during init_project
2
2
  import { specStore, knowledgeStore } from '../../storage/index.js';
3
3
  import { projectDataDir, writeJson } from '../../storage/base-store.js';
4
- import { filterLegacySpecs, migrateSpecs, filterUnprefixedSpecs, migrateSpecFolderNames, discoverAndFlattenSpecs, reconcileSpecPaths, migrateAllSpecsToLean, } from '../../engine/spec-migrator.js';
4
+ import { filterLegacySpecs, migrateSpecs, filterUnprefixedSpecs, migrateSpecFolderNames, discoverAndFlattenSpecs, reconcileSpecPaths, migrateAllSpecsToLean, importFilesystemSpecs, } from '../../engine/spec-migrator.js';
5
+ import { createHash } from 'node:crypto';
6
+ import { lstat, readFile, readdir, readlink } from 'node:fs/promises';
7
+ import { join, relative } from 'node:path';
8
+ async function snapshotPlanuTree(projectPath) {
9
+ const root = join(projectPath, 'planu');
10
+ const snapshot = new Map();
11
+ const pending = [root];
12
+ try {
13
+ while (pending.length > 0) {
14
+ const directory = pending.pop();
15
+ if (directory === undefined) {
16
+ continue;
17
+ }
18
+ const entries = await readdir(directory, { withFileTypes: true }).catch(() => []);
19
+ for (const entry of entries) {
20
+ const absolute = join(directory, entry.name);
21
+ const path = relative(projectPath, absolute).replaceAll('\\', '/');
22
+ if (entry.isDirectory()) {
23
+ pending.push(absolute);
24
+ }
25
+ else if (entry.isSymbolicLink()) {
26
+ snapshot.set(path, `link:${await readlink(absolute)}`);
27
+ }
28
+ else if ((await lstat(absolute)).isFile()) {
29
+ snapshot.set(path, createHash('sha256')
30
+ .update(await readFile(absolute))
31
+ .digest('hex'));
32
+ }
33
+ }
34
+ }
35
+ }
36
+ catch {
37
+ // Test doubles and unreadable files degrade reporting, never migration safety.
38
+ }
39
+ return snapshot;
40
+ }
41
+ function changedPaths(before, after) {
42
+ return [...new Set([...before.keys(), ...after.keys()])]
43
+ .filter((path) => before.get(path) !== after.get(path))
44
+ .sort();
45
+ }
5
46
  function issueFromError(phase, severity, err) {
6
47
  return {
7
48
  phase,
@@ -19,7 +60,9 @@ function issuesFromMessages(phase, severity, messages) {
19
60
  * 3. Reconcile stale paths in specs.json
20
61
  * 4. Migrate spec folders without SPEC-XXX- prefix
21
62
  */
22
- export async function runSpecMigrations(projectPath, projectId, knowledge) {
63
+ export async function runSpecMigrations(projectPath, projectId, knowledge, options = {}) {
64
+ const before = await snapshotPlanuTree(projectPath);
65
+ const authorizedUpdate = options.repositoryMigration === 'planu-spec-format-v1';
23
66
  // Auto-discover and flatten specs in subcategory folders (v0.30 → v0.40 migration)
24
67
  let discoveryResult = null;
25
68
  const criticalMigrationFailures = [];
@@ -31,6 +74,16 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
31
74
  catch (err) {
32
75
  criticalMigrationFailures.push(issueFromError('discover-and-flatten-specs', 'critical', err));
33
76
  }
77
+ // Rebuild missing mutable index records from the portable Git contract.
78
+ // This is required after a storage-root migration or a clean-machine import.
79
+ let filesystemImportResult = null;
80
+ try {
81
+ filesystemImportResult = await importFilesystemSpecs(projectPath, { listSpecs: specStore.listSpecs, createSpec: specStore.createSpec }, projectId);
82
+ criticalMigrationFailures.push(...issuesFromMessages('filesystem-spec-import', 'critical', filesystemImportResult.errors));
83
+ }
84
+ catch (err) {
85
+ criticalMigrationFailures.push(issueFromError('filesystem-spec-import', 'critical', err));
86
+ }
34
87
  // Auto-migrate legacy specs if detected (docs/sdd/specs/ → planu/specs/)
35
88
  let allSpecs = [];
36
89
  try {
@@ -41,7 +94,14 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
41
94
  }
42
95
  const legacySpecs = filterLegacySpecs(allSpecs);
43
96
  let migrationResult = null;
44
- if (legacySpecs.length > 0) {
97
+ if (legacySpecs.length > 0 && authorizedUpdate) {
98
+ criticalMigrationFailures.push({
99
+ phase: 'legacy-spec-migration',
100
+ severity: 'critical',
101
+ message: 'planu-spec-format-v1 is confined to planu/ and cannot migrate legacy docs/sdd paths.',
102
+ });
103
+ }
104
+ else if (legacySpecs.length > 0) {
45
105
  try {
46
106
  migrationResult = await migrateSpecs(projectPath, legacySpecs, {
47
107
  listSpecs: specStore.listSpecs,
@@ -110,6 +170,7 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
110
170
  catch (err) {
111
171
  criticalMigrationFailures.push(issueFromError('strict-planu-cleanup', 'critical', err));
112
172
  }
173
+ const repositoryFilesChanged = changedPaths(before, await snapshotPlanuTree(projectPath));
113
174
  let migrationReportPath = null;
114
175
  try {
115
176
  const reportPath = `${projectDataDir(projectId)}/reports/init-migrations/latest.json`;
@@ -118,10 +179,12 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
118
179
  projectId,
119
180
  generatedAt: new Date().toISOString(),
120
181
  discoveryResult,
182
+ filesystemImportResult,
121
183
  migrationResult,
122
184
  folderMigrationResult,
123
185
  criticalMigrationFailures,
124
186
  nonCriticalWarnings,
187
+ changedPaths: repositoryFilesChanged,
125
188
  });
126
189
  migrationReportPath = reportPath;
127
190
  }
@@ -130,11 +193,13 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
130
193
  }
131
194
  return {
132
195
  discoveryResult,
196
+ filesystemImportResult,
133
197
  migrationResult,
134
198
  folderMigrationResult,
135
199
  criticalMigrationFailures,
136
200
  nonCriticalWarnings,
137
201
  migrationReportPath,
202
+ changedPaths: repositoryFilesChanged,
138
203
  };
139
204
  }
140
205
  /** Return all specs for the project (needed by caller for health check refs). */