@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
@@ -18,9 +18,16 @@ alwaysApply: true
18
18
  \`\`\`
19
19
  facilitate("what to build") → create_spec → challenge_spec → check_readiness
20
20
  → update_status(review) → approve → update_status(approved) → implement
21
- → validate → update_status(done)
21
+ → validate (ack) watch_job (completed) → inspect job.result → update_status(done)
22
22
  \`\`\`
23
23
 
24
+ ## Durable Validation Gate
25
+
26
+ 1. Call \`validate\` and capture \`operationId\`, \`projectId\`, \`workspaceId\`, and \`cursor\`
27
+ 2. Call \`watch_job\` with the latest cursor until terminal
28
+ 3. Require \`completed\` and inspect \`job.result.structuredContent\`; stop on \`failed\`, \`dead-letter\`, or \`cancelled\`
29
+ 4. Mark done only when the completed result reports \`ready: true\`, \`status: "passing"\`, and passing quality gates
30
+
24
31
  ## Session Start
25
32
 
26
33
  1. Call \`planu_status\` to see active specs
@@ -47,7 +54,7 @@ Planu enforces Spec Driven Development — spec first, then implement, then vali
47
54
 
48
55
  - Starting a new feature: use \`facilitate()\` or \`create_spec()\`
49
56
  - Resuming work: use \`planu_status\` to see what's in progress
50
- - Finishing work: use \`validate()\` then \`update_status(done)\`
57
+ - Finishing work: submit \`validate()\`, await \`watch_job()\`, inspect \`job.result.structuredContent\`, then use \`update_status(done)\`
51
58
 
52
59
  ## Mandatory Workflow
53
60
 
@@ -56,13 +63,16 @@ Planu enforces Spec Driven Development — spec first, then implement, then vali
56
63
  3. \`check_readiness(specId)\` — verify criteria are complete
57
64
  4. \`update_status(specId, "approved")\` — lock the spec
58
65
  5. Implement the code
59
- 6. \`validate(specId)\` — verify code matches spec
60
- 7. \`update_status(specId, "done")\` — mark complete
66
+ 6. \`validate(specId)\` — submit validation and capture the durable job acknowledgement
67
+ 7. \`watch_job(operationId, projectId, workspaceId, cursor)\` — repeat until terminal
68
+ 8. Require \`completed\` and inspect \`job.result.structuredContent\`
69
+ 9. \`update_status(specId, "done")\` — mark complete only after a completed passing result
61
70
 
62
71
  ## Rules
63
72
 
64
73
  - NEVER write production code before spec is \`approved\`
65
74
  - NEVER skip \`validate\` after implementation
75
+ - NEVER treat the \`validate\` acknowledgement as validation success
66
76
  - Specs stay \`spec.md\`-only. Do not recreate standalone \`technical.md\` or \`progress.md\`.
67
77
  `;
68
78
  const CODEX_NATIVE_SKILL_CONTENT = `# planu-native — Planu Lightweight Native Surface
@@ -18,7 +18,14 @@ Auto-generated by \`init_project\`. Do not edit manually.
18
18
  | implementing | work in progress |
19
19
  | done | implemented + validated |
20
20
 
21
- Flow: \`facilitate → create_spec → challenge_spec → check_readiness → approve → implement → validate → done\`
21
+ Flow: \`facilitate → create_spec → challenge_spec → check_readiness → approve → implement → validate (ack) watch_job (completed) → inspect job.result → done\`
22
+
23
+ ## Durable Validation Gate
24
+
25
+ 1. Call \`validate\` and capture \`operationId\`, \`projectId\`, \`workspaceId\`, and \`cursor\` from the acknowledgement.
26
+ 2. Call \`watch_job\` with those identifiers and the latest cursor. Repeat while state is non-terminal.
27
+ 3. Require state \`completed\`, then inspect \`job.result.structuredContent\`. Stop and report \`failed\`, \`dead-letter\`, or \`cancelled\`.
28
+ 4. Call \`update_status(done)\` only after the completed result reports \`ready: true\`, \`status: "passing"\`, and passing quality gates.
22
29
 
23
30
  ## Evidence Gates
24
31
 
@@ -45,7 +52,7 @@ Any new feature, bug fix, refactor, integration, or task > 5 min.
45
52
  ## Session End
46
53
 
47
54
  - \`session_checkpoint\` — persist context for the next session
48
- - \`update_status(done)\` — if work is complete
55
+ - \`update_status(done)\` — only after a completed passing validation job
49
56
 
50
57
  ## Quick Reference
51
58
 
@@ -63,6 +70,7 @@ Any new feature, bug fix, refactor, integration, or task > 5 min.
63
70
 
64
71
  - NEVER write code before spec is \`approved\`
65
72
  - NEVER skip \`validate\` after implementation
73
+ - NEVER treat the initial \`validate\` acknowledgement as a passing result
66
74
  - NEVER create design docs outside \`planu/specs/\`
67
75
  - NEVER recreate legacy \`technical.md\`, \`progress.md\`, or \`HU.md\` files for new specs
68
76
 
@@ -62,5 +62,5 @@ export interface ScaffoldWriteResult {
62
62
  * - ESLint/Prettier config
63
63
  * - Architecture rules
64
64
  */
65
- export declare function runScaffoldWriter(projectPath: string, projectId: string, knowledge: ProjectKnowledge, recommendedSkills: RecommendedSkill[], permissionsMode?: PermissionsMode, pluginsMode?: PluginInstallMode): Promise<ScaffoldWriteResult>;
65
+ export declare function runScaffoldWriter(projectPath: string, projectId: string, knowledge: ProjectKnowledge, recommendedSkills: RecommendedSkill[], permissionsMode?: PermissionsMode, pluginsMode?: PluginInstallMode, installSkills?: boolean): Promise<ScaffoldWriteResult>;
66
66
  //# sourceMappingURL=scaffold-writer.d.ts.map
@@ -28,7 +28,7 @@ import { generateWorkflowSkills } from '../../engine/skill-generator/workflow-sk
28
28
  * - Architecture rules
29
29
  */
30
30
  // eslint-disable-next-line complexity
31
- export async function runScaffoldWriter(projectPath, projectId, knowledge, recommendedSkills, permissionsMode, pluginsMode) {
31
+ export async function runScaffoldWriter(projectPath, projectId, knowledge, recommendedSkills, permissionsMode, pluginsMode, installSkills = true) {
32
32
  // Generate and write AI rules files
33
33
  const rulesResult = await runRulesWriter(projectPath, projectId, knowledge, recommendedSkills);
34
34
  // Git setup: hooks, flow detection, .gitignore (SPEC-001)
@@ -51,7 +51,7 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
51
51
  let opencodeConfigScaffolded = false;
52
52
  try {
53
53
  const { installInitHostAssets } = await import('./host-assets-writer.js');
54
- const hostAssets = await installInitHostAssets(projectPath, knowledge);
54
+ const hostAssets = await installInitHostAssets(projectPath, knowledge, installSkills);
55
55
  detectedAssetHosts = hostAssets.detectedHosts;
56
56
  hostRulesWritten = hostAssets.rulesInstalled.length;
57
57
  hostSkillsWritten = hostAssets.skillsInstalled.length;
@@ -152,7 +152,7 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
152
152
  }
153
153
  // SPEC-519: Write .claude/skills/compact.md if missing (best-effort)
154
154
  let compactSkillWritten = false;
155
- if (shouldWriteClaudeAssets) {
155
+ if (shouldWriteClaudeAssets && installSkills) {
156
156
  try {
157
157
  compactSkillWritten = await generateCompactSkillIfMissing(projectPath);
158
158
  }
@@ -161,7 +161,7 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
161
161
  }
162
162
  }
163
163
  // SPEC-655: Write .claude/skills/find-skills.md if missing (best-effort, idempotent)
164
- if (shouldWriteClaudeAssets) {
164
+ if (shouldWriteClaudeAssets && installSkills) {
165
165
  try {
166
166
  await generateFindSkillsIfMissing(projectPath);
167
167
  }
@@ -193,12 +193,14 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
193
193
  /* best-effort */
194
194
  }
195
195
  // SPEC-648: Generate per-client files (Cursor MDC, Codex skill) based on detected client
196
- try {
197
- const { generatePerClientFiles } = await import('./per-client-files-writer.js');
198
- await generatePerClientFiles(projectPath);
199
- }
200
- catch {
201
- /* best-effort */
196
+ if (installSkills) {
197
+ try {
198
+ const { generatePerClientFiles } = await import('./per-client-files-writer.js');
199
+ await generatePerClientFiles(projectPath);
200
+ }
201
+ catch {
202
+ /* best-effort */
203
+ }
202
204
  }
203
205
  // SPEC-530: Generate .claude/rules/conventions.md (best-effort, idempotent)
204
206
  let conventionsMdWritten = false;
@@ -225,7 +227,7 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
225
227
  }
226
228
  // SPEC-593: Write .claude/skills/planu-multi-teammate-review.md if missing (best-effort, idempotent)
227
229
  let multiTeammateReviewSkillWritten = false;
228
- if (shouldWriteClaudeAssets) {
230
+ if (shouldWriteClaudeAssets && installSkills) {
229
231
  try {
230
232
  multiTeammateReviewSkillWritten =
231
233
  await generateMultiTeammateReviewSkillIfMissing(projectPath);
@@ -253,7 +255,7 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
253
255
  // (idempotent — skips files already up-to-date; best-effort, no-op elsewhere)
254
256
  let planuSubagentsScaffolded = false;
255
257
  let planuUxSkillsScaffolded = 0;
256
- if (shouldWriteClaudeAssets) {
258
+ if (shouldWriteClaudeAssets && installSkills) {
257
259
  try {
258
260
  const { scaffoldPlanuSubagents, scaffoldPlanuSkills } = await import('../../hosts/claude-code/ux/index.js');
259
261
  const [subagentResult, skillResult] = await Promise.all([
@@ -302,11 +304,11 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
302
304
  /* best-effort — never fail init_project due to missing claude CLI */
303
305
  }
304
306
  }
305
- // SPEC-680: Create .planu/skill-registry.json if it does not exist (idempotent, best-effort)
307
+ // SPEC-680: Create planu/skill-registry.json if it does not exist (idempotent, best-effort)
306
308
  try {
307
309
  const { readFile: readFileFn } = await import('node:fs/promises');
308
310
  const { join: joinFn } = await import('node:path');
309
- const registryFilePath = joinFn(projectPath, '.planu', 'skill-registry.json');
311
+ const registryFilePath = joinFn(projectPath, 'planu', 'skill-registry.json');
310
312
  const existing = await readFileFn(registryFilePath, 'utf-8').catch(() => null);
311
313
  if (existing === null) {
312
314
  const now = new Date().toISOString();
@@ -324,7 +326,7 @@ export async function runScaffoldWriter(projectPath, projectId, knowledge, recom
324
326
  }
325
327
  // SPEC-685: Generate all 22 workflow skill files (idempotent, best-effort)
326
328
  let workflowSkillsWritten = 0;
327
- if (shouldWriteClaudeAssets) {
329
+ if (shouldWriteClaudeAssets && installSkills) {
328
330
  try {
329
331
  const skillResult = await generateWorkflowSkills(projectPath, knowledge);
330
332
  workflowSkillsWritten = skillResult.written.length;
@@ -0,0 +1,15 @@
1
+ import type { ToolResult } from '../../types/index.js';
2
+ export interface JobToolIdentityInput {
3
+ operationId: string;
4
+ projectId: string;
5
+ workspaceId?: string;
6
+ }
7
+ export interface WatchJobToolInput extends JobToolIdentityInput {
8
+ afterCursor?: string;
9
+ timeoutMs?: number;
10
+ }
11
+ export declare function handleGetJob(input: JobToolIdentityInput): Promise<ToolResult>;
12
+ export declare function handleWatchJob(input: WatchJobToolInput): Promise<ToolResult>;
13
+ export declare function handleCancelJob(input: JobToolIdentityInput): Promise<ToolResult>;
14
+ export declare function handleRestartJob(input: JobToolIdentityInput): Promise<ToolResult>;
15
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1,126 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { durableJobCursor, DurableJobRuntime } from '../../engine/execution/job-runtime.js';
54
+ import { scheduleValidateJobExecution } from '../../engine/execution/validate-job-executor.js';
55
+ function result(payload) {
56
+ return {
57
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
58
+ structuredContent: payload,
59
+ };
60
+ }
61
+ export function handleGetJob(input) {
62
+ const env_1 = { stack: [], error: void 0, hasError: false };
63
+ try {
64
+ const runtime = __addDisposableResource(env_1, new DurableJobRuntime(), false);
65
+ const job = runtime.get(input);
66
+ return Promise.resolve(result({ schemaVersion: 1, job, cursor: durableJobCursor(job) }));
67
+ }
68
+ catch (e_1) {
69
+ env_1.error = e_1;
70
+ env_1.hasError = true;
71
+ }
72
+ finally {
73
+ __disposeResources(env_1);
74
+ }
75
+ }
76
+ export async function handleWatchJob(input) {
77
+ const env_2 = { stack: [], error: void 0, hasError: false };
78
+ try {
79
+ const runtime = __addDisposableResource(env_2, new DurableJobRuntime(), false);
80
+ const job = await runtime.watch(input);
81
+ return result({ schemaVersion: 1, job, cursor: durableJobCursor(job) });
82
+ }
83
+ catch (e_2) {
84
+ env_2.error = e_2;
85
+ env_2.hasError = true;
86
+ }
87
+ finally {
88
+ __disposeResources(env_2);
89
+ }
90
+ }
91
+ export function handleCancelJob(input) {
92
+ const env_3 = { stack: [], error: void 0, hasError: false };
93
+ try {
94
+ const runtime = __addDisposableResource(env_3, new DurableJobRuntime(), false);
95
+ const job = runtime.cancel(input);
96
+ return Promise.resolve(result({ schemaVersion: 1, job, cursor: durableJobCursor(job) }));
97
+ }
98
+ catch (e_3) {
99
+ env_3.error = e_3;
100
+ env_3.hasError = true;
101
+ }
102
+ finally {
103
+ __disposeResources(env_3);
104
+ }
105
+ }
106
+ export function handleRestartJob(input) {
107
+ const env_4 = { stack: [], error: void 0, hasError: false };
108
+ try {
109
+ const runtime = __addDisposableResource(env_4, new DurableJobRuntime(), false);
110
+ const job = runtime.restart(input);
111
+ if (job.payload &&
112
+ typeof job.payload === 'object' &&
113
+ job.payload.kind === 'validate') {
114
+ scheduleValidateJobExecution(job.projectId, job.workspaceId);
115
+ }
116
+ return Promise.resolve(result({ schemaVersion: 1, job, cursor: durableJobCursor(job) }));
117
+ }
118
+ catch (e_4) {
119
+ env_4.error = e_4;
120
+ env_4.hasError = true;
121
+ }
122
+ finally {
123
+ __disposeResources(env_4);
124
+ }
125
+ }
126
+ //# sourceMappingURL=handlers.js.map
@@ -67,7 +67,7 @@ export async function handleListSpecs(params) {
67
67
  const projectId = resolved.projectId;
68
68
  const collector = new AutopilotSummaryCollector();
69
69
  // SPEC-756: lazy version check — fire-and-forget, non-blocking
70
- if (params.projectPath) {
70
+ if (detail === 'full' && params.projectPath) {
71
71
  checkBundledVersionGap(2000)
72
72
  .then(() => undefined)
73
73
  .catch(() => {
@@ -96,12 +96,12 @@ export async function handleListSpecs(params) {
96
96
  }
97
97
  // ─── Native optimized scan (SPEC-1004) ──────────────────────────────────
98
98
  let nativeBriefs = null;
99
- if (isNativeActive() && knowledge.projectPath) {
99
+ if (detail === 'full' && isNativeActive() && knowledge.projectPath) {
100
100
  nativeBriefs = fastScanSpecs(knowledge.projectPath);
101
101
  }
102
102
  // Read-only project signals only. Mutating discovery/migration/repair belongs
103
103
  // to init, validate, housekeeping, or explicit migration tools.
104
- if (knowledge.projectPath) {
104
+ if (detail === 'full' && knowledge.projectPath) {
105
105
  await collectReadOnlyProjectSignals(projectId, knowledge.projectPath, collector);
106
106
  }
107
107
  // Get all specs
@@ -233,7 +233,7 @@ export async function handleListSpecs(params) {
233
233
  const humanSummary = buildListSpecsSummary(allSpecs.length, statusCounts);
234
234
  // SPEC-467: Detect branches and include info for LLM branch-awareness
235
235
  let branchInfo = null;
236
- if (knowledge.projectPath) {
236
+ if (detail === 'full' && knowledge.projectPath) {
237
237
  try {
238
238
  const { detectBranches } = await import('../engine/git/branch-detector.js');
239
239
  branchInfo = detectBranches(knowledge.projectPath);
@@ -244,7 +244,7 @@ export async function handleListSpecs(params) {
244
244
  }
245
245
  // SPEC-487: Scan for ambiguous criteria — ask-then-act via InteractiveQuestion
246
246
  let migrationIssues = null;
247
- if (knowledge.projectPath) {
247
+ if (detail === 'full' && knowledge.projectPath) {
248
248
  try {
249
249
  const ambiguous = await scanForAmbiguousCriteria(knowledge.projectPath);
250
250
  if (ambiguous.length > 0) {
@@ -276,7 +276,7 @@ export async function handleListSpecs(params) {
276
276
  : null;
277
277
  // SPEC-1012: Detect specs released but still in non-terminal status (best-effort, non-blocking)
278
278
  let staleStatusWarnings = [];
279
- if (knowledge.projectPath) {
279
+ if (detail === 'full' && knowledge.projectPath) {
280
280
  try {
281
281
  const { detectReleaseStatusDrift } = await import('../engine/drift-detection/release-status-drift.js');
282
282
  staleStatusWarnings = await detectReleaseStatusDrift(knowledge.projectPath);
@@ -285,6 +285,34 @@ export async function handleListSpecs(params) {
285
285
  /* best-effort — never block list_specs */
286
286
  }
287
287
  }
288
+ const structuredContent = {
289
+ projectId,
290
+ filters: {
291
+ status: status ?? 'all',
292
+ type: type ?? 'all',
293
+ },
294
+ count: specs.length,
295
+ totalCount: allSpecs.length,
296
+ specs: structuredSpecs,
297
+ summary: {
298
+ byStatus: statusCounts,
299
+ byType: typeCounts,
300
+ totalDevHours: Math.round(totalDevHours * 10) / 10,
301
+ totalReviewHours: Math.round(totalReviewHours * 10) / 10,
302
+ totalCostUsd: Math.round(totalCostUsd * 100) / 100,
303
+ },
304
+ teamSuggestion: teamSuggestion ?? null,
305
+ message: ti('tools.list_specs.success', { count: String(specs.length) }),
306
+ teamDistributionHint: approvedSpecs.length >= 3
307
+ ? `${String(approvedSpecs.length)} specs approved — run plan_team_distribution for parallel assignment`
308
+ : undefined,
309
+ humanSummary,
310
+ branchInfo: branchInfo && branchInfo.count > 1 ? branchInfo : undefined,
311
+ autopilotSummary: collector.hasEntries() ? collector.getMessages() : undefined,
312
+ migrationIssues: migrationIssues ?? undefined,
313
+ interactiveQuestions: interactiveQuestions ?? undefined,
314
+ staleStatusWarnings: staleStatusWarnings.length > 0 ? staleStatusWarnings : undefined,
315
+ };
288
316
  return {
289
317
  content: [
290
318
  { type: 'text', text: textContent },
@@ -298,34 +326,7 @@ export async function handleListSpecs(params) {
298
326
  ]
299
327
  : []),
300
328
  ],
301
- structuredContent: {
302
- projectId,
303
- filters: {
304
- status: status ?? 'all',
305
- type: type ?? 'all',
306
- },
307
- count: specs.length,
308
- totalCount: allSpecs.length,
309
- specs: specsData,
310
- summary: {
311
- byStatus: statusCounts,
312
- byType: typeCounts,
313
- totalDevHours: Math.round(totalDevHours * 10) / 10,
314
- totalReviewHours: Math.round(totalReviewHours * 10) / 10,
315
- totalCostUsd: Math.round(totalCostUsd * 100) / 100,
316
- },
317
- teamSuggestion: teamSuggestion ?? null,
318
- message: ti('tools.list_specs.success', { count: String(specs.length) }),
319
- teamDistributionHint: approvedSpecs.length >= 3
320
- ? `${String(approvedSpecs.length)} specs approved — run plan_team_distribution for parallel assignment`
321
- : undefined,
322
- humanSummary,
323
- branchInfo: branchInfo && branchInfo.count > 1 ? branchInfo : undefined,
324
- autopilotSummary: collector.hasEntries() ? collector.getMessages() : undefined,
325
- migrationIssues: migrationIssues ?? undefined,
326
- interactiveQuestions: interactiveQuestions ?? undefined,
327
- staleStatusWarnings: staleStatusWarnings.length > 0 ? staleStatusWarnings : undefined,
328
- },
329
+ structuredContent,
329
330
  };
330
331
  }
331
332
  catch (error) {
@@ -1,8 +1,10 @@
1
1
  // tools/manage-plugins-handler.ts — Handler for manage_plugins tool (SPEC-085 AC-09, SPEC-603, SPEC-604)
2
+ import { dirname } from 'node:path';
2
3
  import { t, ti } from '../i18n/index.js';
3
4
  import { searchPlugins } from '../engine/plugin-installer/plugin-catalog.js';
4
5
  import { cleanupPluginArtifacts } from '../engine/plugin-installer/artifact-scanner.js';
5
6
  import { discoverPlugins, installPlugin, activatePlugin, deactivatePlugin, uninstallPlugin, readPluginState, loadPluginModule, generatePluginDocs, getPluginToolCount, getPluginWorkerCount, getPluginAnalyzerCount, getPluginTemplateCount, } from '../engine/plugins/index.js';
7
+ import { storageCatalogById } from '../storage/storage-catalog.js';
6
8
  function text(content) {
7
9
  return { content: [{ type: 'text', text: content }] };
8
10
  }
@@ -10,11 +12,17 @@ function resolveProjectPath(input) {
10
12
  /* v8 ignore next -- process.cwd() fallback never reached when projectPath is always provided */
11
13
  return input.projectPath ?? process.cwd();
12
14
  }
13
- const DATA_DIR = 'data';
15
+ function pluginStateDataRoot() {
16
+ const statePath = storageCatalogById('plugin-state').resolvedPath;
17
+ if (statePath === undefined) {
18
+ throw new Error('[Planu] Plugin state catalog entry has no resolved path');
19
+ }
20
+ return dirname(dirname(statePath));
21
+ }
14
22
  async function handleList(input) {
15
23
  const projectPath = resolveProjectPath(input);
16
24
  const plugins = await discoverPlugins(projectPath);
17
- const state = await readPluginState(DATA_DIR);
25
+ const state = await readPluginState(pluginStateDataRoot());
18
26
  const items = plugins.map((p) => {
19
27
  const persisted = state.plugins.find((s) => s.manifest.id === p.manifest.id);
20
28
  const currentState = persisted?.state ?? p.state;
@@ -42,7 +50,7 @@ async function handleInstall(input) {
42
50
  };
43
51
  }
44
52
  const projectPath = resolveProjectPath(input);
45
- const reg = await installPlugin(input.pluginPath, projectPath, DATA_DIR);
53
+ const reg = await installPlugin(input.pluginPath, projectPath, pluginStateDataRoot());
46
54
  return text(ti('tools.manage_plugins.installSuccess', {
47
55
  name: reg.manifest.name,
48
56
  id: reg.manifest.id,
@@ -60,7 +68,7 @@ async function handleActivate(input) {
60
68
  }
61
69
  const projectPath = resolveProjectPath(input);
62
70
  const builtInTools = new Set(); // Would be populated from server
63
- const reg = await activatePlugin(input.pluginId, projectPath, DATA_DIR, builtInTools);
71
+ const reg = await activatePlugin(input.pluginId, projectPath, pluginStateDataRoot(), builtInTools);
64
72
  if (reg.state === 'error') {
65
73
  return {
66
74
  content: [
@@ -86,7 +94,7 @@ async function handleDeactivate(input) {
86
94
  isError: true,
87
95
  };
88
96
  }
89
- const reg = await deactivatePlugin(input.pluginId, DATA_DIR);
97
+ const reg = await deactivatePlugin(input.pluginId, pluginStateDataRoot());
90
98
  return text(ti('tools.manage_plugins.deactivateSuccess', { name: reg.manifest.name }));
91
99
  }
92
100
  async function handleUninstall(input) {
@@ -102,7 +110,7 @@ async function handleUninstall(input) {
102
110
  };
103
111
  }
104
112
  const projectPath = resolveProjectPath(input);
105
- await uninstallPlugin(input.pluginId, projectPath, DATA_DIR);
113
+ await uninstallPlugin(input.pluginId, projectPath, pluginStateDataRoot());
106
114
  // SPEC-604: cleanup plugin artifacts from .claude/rules/, .claude/skills/, .claude/hooks/
107
115
  const cleaned = await cleanupPluginArtifacts(input.pluginId, projectPath);
108
116
  const baseMsg = ti('tools.manage_plugins.uninstallSuccess', { id: input.pluginId });
@@ -120,7 +128,7 @@ async function handleInfo(input) {
120
128
  isError: true,
121
129
  };
122
130
  }
123
- const state = await readPluginState(DATA_DIR);
131
+ const state = await readPluginState(pluginStateDataRoot());
124
132
  const reg = state.plugins.find((p) => p.manifest.id === input.pluginId);
125
133
  if (!reg) {
126
134
  return {
@@ -176,9 +184,9 @@ async function handleUpdate(input) {
176
184
  }
177
185
  const projectPath = resolveProjectPath(input);
178
186
  // Update strategy: uninstall (with artifact cleanup) then reinstall
179
- await uninstallPlugin(input.pluginId, projectPath, DATA_DIR);
187
+ await uninstallPlugin(input.pluginId, projectPath, pluginStateDataRoot());
180
188
  await cleanupPluginArtifacts(input.pluginId, projectPath);
181
- const reg = await installPlugin(input.pluginPath, projectPath, DATA_DIR);
189
+ const reg = await installPlugin(input.pluginPath, projectPath, pluginStateDataRoot());
182
190
  return text(`Plugin "${reg.manifest.name}" updated successfully to version ${reg.manifest.version}.`);
183
191
  }
184
192
  /**
@@ -2,6 +2,7 @@
2
2
  // feature-flags | status
3
3
  import { t } from '../../i18n/index.js';
4
4
  import { scoreMigratableComponents, generateMigrationPlan, generateRollbackPlan, createMigrationCheckpoint, buildRollbackExecutionPlan, generateFeatureFlagSpec, buildMigrationStatusReport, } from '../../engine/migration/index.js';
5
+ import { projectDataDir } from '../../storage/base-store.js';
5
6
  export function handleRollbackPlan(args) {
6
7
  const components = scoreMigratableComponents([
7
8
  {
@@ -56,7 +57,7 @@ export function handleRollbackPlan(args) {
56
57
  data,
57
58
  message: t('tools.migrate_tech.rollbackPlanSuccess'),
58
59
  warnings,
59
- savedTo: args.projectId ? `data/projects/${args.projectId}/rollback-plan.json` : undefined,
60
+ savedTo: args.projectId ? `${projectDataDir(args.projectId)}/rollback-plan.json` : undefined,
60
61
  };
61
62
  }
62
63
  export function handleCheckpoint(args) {
@@ -73,7 +74,7 @@ export function handleCheckpoint(args) {
73
74
  message: t('tools.migrate_tech.checkpointSuccess'),
74
75
  warnings: [],
75
76
  savedTo: args.projectId
76
- ? `data/projects/${args.projectId}/migration-checkpoints.json`
77
+ ? `${projectDataDir(args.projectId)}/migration-checkpoints.json`
77
78
  : undefined,
78
79
  };
79
80
  }
@@ -3,6 +3,7 @@
3
3
  // C10: webpack-to-vite → structured migration plan from catalog
4
4
  // C11: vite6-to-vite7 → structured migration plan from catalog
5
5
  import { readFile } from 'node:fs/promises';
6
+ import { projectDataDir } from '../../storage/base-store.js';
6
7
  // ---------------------------------------------------------------------------
7
8
  // Cache
8
9
  // ---------------------------------------------------------------------------
@@ -60,7 +61,7 @@ export async function handleWebpackToVite(args) {
60
61
  message: `Webpack to Vite migration plan generated — ${migration.phases.length} phases, ${migration.postMigrationChecklist.length} post-migration checks.`,
61
62
  warnings,
62
63
  savedTo: args.projectId
63
- ? `data/projects/${args.projectId}/webpack-to-vite-plan.json`
64
+ ? `${projectDataDir(args.projectId)}/webpack-to-vite-plan.json`
64
65
  : undefined,
65
66
  };
66
67
  }
@@ -85,7 +86,7 @@ export async function handleVite6ToVite7(args) {
85
86
  message: `Vite 6 → Vite 7 migration plan generated — ${migration.breakingChanges.length} breaking changes documented.`,
86
87
  warnings,
87
88
  savedTo: args.projectId
88
- ? `data/projects/${args.projectId}/vite6-to-vite7-plan.json`
89
+ ? `${projectDataDir(args.projectId)}/vite6-to-vite7-plan.json`
89
90
  : undefined,
90
91
  };
91
92
  }
@@ -1,6 +1,7 @@
1
1
  // tools/migrate-tech/core-handlers.ts — Handlers: analyze | map | plan | strategy | validate
2
2
  import { t } from '../../i18n/index.js';
3
3
  import { buildStackAnalysis, buildEquivalenceMap, generateMigrationPlan, recommendMigrationStrategy, generateParityValidation, } from '../../engine/migration/index.js';
4
+ import { projectDataDir } from '../../storage/base-store.js';
4
5
  export function handleAnalyze(args) {
5
6
  const data = buildStackAnalysis({
6
7
  language: args.sourceStack ?? 'unknown',
@@ -20,7 +21,9 @@ export function handleAnalyze(args) {
20
21
  data,
21
22
  message: t('tools.migrate_tech.analyzeSuccess'),
22
23
  warnings,
23
- savedTo: args.projectId ? `data/projects/${args.projectId}/migration-analysis.json` : undefined,
24
+ savedTo: args.projectId
25
+ ? `${projectDataDir(args.projectId)}/migration-analysis.json`
26
+ : undefined,
24
27
  };
25
28
  }
26
29
  export function handleMap(args) {
@@ -35,7 +38,7 @@ export function handleMap(args) {
35
38
  data,
36
39
  message: t('tools.migrate_tech.mapSuccess'),
37
40
  warnings,
38
- savedTo: args.projectId ? `data/projects/${args.projectId}/migration-map.json` : undefined,
41
+ savedTo: args.projectId ? `${projectDataDir(args.projectId)}/migration-map.json` : undefined,
39
42
  };
40
43
  }
41
44
  export function handlePlan(args) {
@@ -2,6 +2,7 @@
2
2
  // analyze-services | map-services | plan-services | validate-service
3
3
  import { t } from '../../i18n/index.js';
4
4
  import { analyzeDbSchema, buildDbMigrationMap, buildDbMigrationPlan, analyzeExternalServices, buildServiceEquivalenceMap, planServicesMigration, generateServiceValidationChecklist, } from '../../engine/migration/index.js';
5
+ import { projectDataDir } from '../../storage/base-store.js';
5
6
  export function handleAnalyzeDb(args) {
6
7
  const data = analyzeDbSchema({
7
8
  engine: args.sourceDbEngine ?? 'postgresql',
@@ -33,7 +34,7 @@ export function handleMapDb(args) {
33
34
  data,
34
35
  message: t('tools.migrate_tech.mapDbSuccess'),
35
36
  warnings,
36
- savedTo: args.projectId ? `data/projects/${args.projectId}/db-migration-map.json` : undefined,
37
+ savedTo: args.projectId ? `${projectDataDir(args.projectId)}/db-migration-map.json` : undefined,
37
38
  };
38
39
  }
39
40
  export function handlePlanDb(args) {
@@ -75,7 +76,9 @@ export function handleAnalyzeServices(args) {
75
76
  data,
76
77
  message: t('tools.migrate_tech.analyzeServicesSuccess'),
77
78
  warnings,
78
- savedTo: args.projectId ? `data/projects/${args.projectId}/services-analysis.json` : undefined,
79
+ savedTo: args.projectId
80
+ ? `${projectDataDir(args.projectId)}/services-analysis.json`
81
+ : undefined,
79
82
  };
80
83
  }
81
84
  export function handleMapServices(args) {
@@ -93,7 +96,7 @@ export function handleMapServices(args) {
93
96
  data,
94
97
  message: t('tools.migrate_tech.mapServicesSuccess'),
95
98
  warnings,
96
- savedTo: args.projectId ? `data/projects/${args.projectId}/services-map.json` : undefined,
99
+ savedTo: args.projectId ? `${projectDataDir(args.projectId)}/services-map.json` : undefined,
97
100
  };
98
101
  }
99
102
  export function handlePlanServices(args) {