@planu/cli 4.12.3 → 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 +35 -0
  2. package/README.md +29 -25
  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
@@ -0,0 +1,5 @@
1
+ import type { CriticalSchema, VersionedDocument } from '../types/schema-registry.js';
2
+ export declare function registerCriticalSchema<T>(schema: CriticalSchema<T>): void;
3
+ export declare function readCriticalSchema<T>(filePath: string, schemaName: string): Promise<VersionedDocument<T>>;
4
+ export declare function decodeCriticalSchema<T>(parsed: unknown, schemaName: string): VersionedDocument<T>;
5
+ //# sourceMappingURL=schema-registry.d.ts.map
@@ -0,0 +1,74 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { BoundaryFailure, classifyBoundaryFailure } from '../errors/error-taxonomy.js';
3
+ const schemas = new Map();
4
+ export function registerCriticalSchema(schema) {
5
+ if (!schema.name.trim() ||
6
+ !Number.isSafeInteger(schema.currentVersion) ||
7
+ schema.currentVersion < 1) {
8
+ throw new BoundaryFailure('IncompatibleVersion', 'schema registration', 'Register a named schema with a positive integer version.');
9
+ }
10
+ if (schemas.has(schema.name)) {
11
+ const existing = schemas.get(schema.name);
12
+ if (existing === schema) {
13
+ return;
14
+ }
15
+ throw new BoundaryFailure('Conflict', 'schema registration', `Schema ${schema.name} is already registered and cannot be replaced.`);
16
+ }
17
+ schemas.set(schema.name, schema);
18
+ }
19
+ export async function readCriticalSchema(filePath, schemaName) {
20
+ const schema = schemas.get(schemaName);
21
+ if (!schema) {
22
+ throw new BoundaryFailure('IncompatibleVersion', 'critical schema read', `Register schema ${schemaName} before reading persistent state.`);
23
+ }
24
+ let raw;
25
+ try {
26
+ raw = await readFile(filePath, 'utf8');
27
+ }
28
+ catch (error) {
29
+ const failure = classifyBoundaryFailure(error, `read ${schema.name}`, 'Restore access to the state file or initialize it if it does not exist.');
30
+ if (failure.kind === 'NotFound') {
31
+ return { schemaVersion: schema.currentVersion, data: schema.createDefault() };
32
+ }
33
+ throw failure;
34
+ }
35
+ let parsed;
36
+ try {
37
+ parsed = JSON.parse(raw);
38
+ }
39
+ catch {
40
+ throw new BoundaryFailure('Corrupt', `read ${schema.name}`, 'Recover the original file; Planu will not replace corrupt state with defaults.');
41
+ }
42
+ return decodeCriticalSchema(parsed, schemaName);
43
+ }
44
+ export function decodeCriticalSchema(parsed, schemaName) {
45
+ const schema = schemas.get(schemaName);
46
+ if (!schema) {
47
+ throw new BoundaryFailure('IncompatibleVersion', 'critical schema decode', `Register schema ${schemaName} before decoding persistent state.`);
48
+ }
49
+ const isEnvelope = parsed !== null && typeof parsed === 'object' && 'schemaVersion' in parsed && 'data' in parsed;
50
+ const document = isEnvelope
51
+ ? parsed
52
+ : { schemaVersion: 0, data: parsed };
53
+ if (typeof document.schemaVersion !== 'number' || !Number.isSafeInteger(document.schemaVersion)) {
54
+ throw new BoundaryFailure('Corrupt', `read ${schema.name}`, 'Recover a versioned document.');
55
+ }
56
+ if (document.schemaVersion > schema.currentVersion || document.schemaVersion < 0) {
57
+ throw new BoundaryFailure('IncompatibleVersion', `read ${schema.name}`, `Use a Planu runtime compatible with schema version ${String(document.schemaVersion)}.`);
58
+ }
59
+ let data;
60
+ try {
61
+ data =
62
+ document.schemaVersion === schema.currentVersion
63
+ ? document.data
64
+ : schema.migrate?.(document.data, document.schemaVersion);
65
+ }
66
+ catch {
67
+ throw new BoundaryFailure('IncompatibleVersion', `migrate ${schema.name}`, `Use a supported migration path to schema version ${String(schema.currentVersion)}.`);
68
+ }
69
+ if (data === undefined || !schema.validate(data)) {
70
+ throw new BoundaryFailure('Corrupt', `read ${schema.name}`, 'Recover state that satisfies the registered schema; no overwrite was performed.');
71
+ }
72
+ return { schemaVersion: schema.currentVersion, data };
73
+ }
74
+ //# sourceMappingURL=schema-registry.js.map
@@ -1,22 +1,33 @@
1
+ import { technologyValue } from '../engine/technology-registry.js';
1
2
  // storage/sentry-store.ts — Sentry integration persistence (SPEC-435)
2
- import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
- import { join, dirname } from 'node:path';
4
- import { safeJsonParse } from './base-store.js';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { hashProjectPath, projectDataDir, safeJsonParse } from './base-store.js';
6
+ import { resolveSecretField, storeSecretField } from '../security/secret-field.js';
5
7
  function sentryConfigPath(projectPath) {
6
- return join(projectPath, 'data', 'sentry', 'config.json');
8
+ return join(projectDataDir(hashProjectPath(projectPath)), technologyValue('technology-sentry-0cf685'), 'config.json');
7
9
  }
8
10
  export async function getSentryConfig(projectPath) {
9
11
  try {
10
12
  const raw = await readFile(sentryConfigPath(projectPath), 'utf-8');
11
- return safeJsonParse(raw, null);
13
+ const config = safeJsonParse(raw, null);
14
+ return config ? { ...config, authToken: await resolveSecretField(config.authToken) } : null;
12
15
  }
13
- catch {
14
- return null;
16
+ catch (error) {
17
+ if (error.code === 'ENOENT' ||
18
+ (error instanceof Error && error.message === 'ENOENT')) {
19
+ return null;
20
+ }
21
+ throw error;
15
22
  }
16
23
  }
17
24
  export async function saveSentryConfig(projectPath, config) {
18
25
  const filePath = sentryConfigPath(projectPath);
19
- await mkdir(dirname(filePath), { recursive: true });
20
- await writeFile(filePath, JSON.stringify(config, null, 2), 'utf-8');
26
+ const authToken = await storeSecretField(`${hashProjectPath(projectPath)}/sentry/auth`, 'sentry-auth', config.authToken);
27
+ await mkdir(dirname(filePath), { recursive: true, mode: 0o700 });
28
+ await writeFile(filePath, JSON.stringify({ ...config, authToken }, null, 2), {
29
+ encoding: 'utf-8',
30
+ mode: 0o600,
31
+ });
21
32
  }
22
33
  //# sourceMappingURL=sentry-store.js.map
@@ -5,6 +5,7 @@ import { join } from 'node:path';
5
5
  import { execSync } from 'node:child_process';
6
6
  import { readFile } from 'node:fs/promises';
7
7
  import { getUniqueTopLevelFrontmatterString } from '../engine/frontmatter-parser.js';
8
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
8
9
  // ---------------------------------------------------------------------------
9
10
  // Constants
10
11
  // ---------------------------------------------------------------------------
@@ -35,7 +36,9 @@ export function getStagedFiles(projectPath) {
35
36
  .map((f) => f.trim())
36
37
  .filter((f) => f.length > 0);
37
38
  }
38
- catch {
39
+ catch (error) {
40
+ // reliability-optional: GIT_SESSION_FILE_LIST — filesystem fallback runs next
41
+ reportClassifiedDegradation('GIT_SESSION_FILE_LIST', error);
39
42
  return [];
40
43
  }
41
44
  }
@@ -58,14 +61,18 @@ export async function getActiveSpecIds(projectPath) {
58
61
  active.add(match[0]);
59
62
  }
60
63
  }
61
- catch {
62
- // A single unreadable candidate must not suppress other valid active specs.
64
+ catch (error) {
65
+ // reliability-compat: UNREADABLE_SPEC_CANDIDATE preserve other valid active specs
66
+ reportClassifiedDegradation('UNREADABLE_SPEC_CANDIDATE', error);
63
67
  }
64
68
  }
65
69
  return [...active];
66
70
  }
67
- catch {
68
- return [];
71
+ catch (error) {
72
+ if (error.code === 'ENOENT') {
73
+ return [];
74
+ }
75
+ throw error;
69
76
  }
70
77
  }
71
78
  // ---------------------------------------------------------------------------
@@ -24,8 +24,12 @@ async function listSessionFiles(projectId) {
24
24
  const entries = await readdir(dir);
25
25
  return entries.filter((f) => f.startsWith('session-') && f.endsWith('.json'));
26
26
  }
27
- catch {
28
- return [];
27
+ catch (error) {
28
+ if (error.code === 'ENOENT' ||
29
+ (error instanceof Error && error.message === 'ENOENT')) {
30
+ return [];
31
+ }
32
+ throw error;
29
33
  }
30
34
  }
31
35
  // --- public API ---
@@ -63,8 +67,12 @@ export async function deleteSession(projectId, sessionId) {
63
67
  await unlink(sessionFile(projectId, sessionId));
64
68
  return true;
65
69
  }
66
- catch {
67
- return false;
70
+ catch (error) {
71
+ if (error.code === 'ENOENT' ||
72
+ (error instanceof Error && error.message === 'ENOENT')) {
73
+ return false;
74
+ }
75
+ throw error;
68
76
  }
69
77
  }
70
78
  /** List sessions as lightweight items for display. */
@@ -1,6 +1,6 @@
1
1
  import type { SkillSource, SkillRegistryEntry, SkillRegistry } from '../types/skill-registry.js';
2
2
  export type { SkillSource, SkillRegistryEntry, SkillRegistry };
3
- export declare const REGISTRY_RELATIVE_PATH = ".planu/skill-registry.json";
3
+ export declare const REGISTRY_RELATIVE_PATH = "planu/skill-registry.json";
4
4
  export declare const DEFAULT_TTL_DAYS = 30;
5
5
  export declare const ALL_SKILL_SOURCES: SkillSource[];
6
6
  /**
@@ -3,14 +3,13 @@
3
3
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
4
  import { dirname, join } from 'node:path';
5
5
  import { withFileLock } from './file-mutex.js';
6
- import { safeJsonParse } from './base-store.js';
7
6
  function isValidRegistry(parsed) {
8
7
  return (parsed !== null && typeof parsed === 'object' && 'installed' in parsed && 'sources' in parsed);
9
8
  }
10
9
  // ---------------------------------------------------------------------------
11
10
  // Configuration constants (no hardcodes in function bodies)
12
11
  // ---------------------------------------------------------------------------
13
- export const REGISTRY_RELATIVE_PATH = '.planu/skill-registry.json';
12
+ export const REGISTRY_RELATIVE_PATH = 'planu/skill-registry.json';
14
13
  export const DEFAULT_TTL_DAYS = 30;
15
14
  export const ALL_SKILL_SOURCES = ['superpowers', 'anthropic', 'local', 'community'];
16
15
  // ---------------------------------------------------------------------------
@@ -41,14 +40,15 @@ export async function readSkillRegistry(projectPath) {
41
40
  try {
42
41
  raw = await readFile(filePath, 'utf-8');
43
42
  }
44
- catch {
45
- // File does not exist
46
- return emptyRegistry();
43
+ catch (error) {
44
+ if (error.code === 'ENOENT') {
45
+ return emptyRegistry();
46
+ }
47
+ throw error;
47
48
  }
48
- const parsed = safeJsonParse(raw, null);
49
+ const parsed = JSON.parse(raw);
49
50
  if (!isValidRegistry(parsed)) {
50
- console.warn(`[skill-registry] Corrupted registry at ${filePath} — falling back to empty`);
51
- return emptyRegistry();
51
+ throw new Error(`Skill registry is corrupt: ${filePath}`);
52
52
  }
53
53
  return parsed;
54
54
  }
@@ -79,7 +79,7 @@ export async function writeSkillRegistryEntry(projectPath, entry) {
79
79
  let registry;
80
80
  try {
81
81
  const raw = await readFile(filePath, 'utf-8');
82
- const parsed = safeJsonParse(raw, null);
82
+ const parsed = JSON.parse(raw);
83
83
  if (isValidRegistry(parsed)) {
84
84
  registry = parsed;
85
85
  }
@@ -87,8 +87,10 @@ export async function writeSkillRegistryEntry(projectPath, entry) {
87
87
  throw new Error('invalid');
88
88
  }
89
89
  }
90
- catch {
91
- // Missing or corrupt — start fresh
90
+ catch (error) {
91
+ if (error.code !== 'ENOENT') {
92
+ throw error;
93
+ }
92
94
  const now = new Date().toISOString();
93
95
  registry = {
94
96
  createdAt: now,
@@ -1,14 +1,16 @@
1
1
  // storage/slack-store.ts — Slack integration persistence (SPEC-292)
2
2
  import { join } from 'node:path';
3
- import { hashProjectPath, readJson, writeJson } from './base-store.js';
3
+ import { hashProjectPath, projectDataDir, readJson, writeJson } from './base-store.js';
4
4
  import { withFileLock } from './file-mutex.js';
5
+ import { deleteSecretField, resolveSecretField, storeSecretField, } from '../security/secret-field.js';
6
+ import { writeSecureJson } from '../security/secure-json.js';
5
7
  // ---------------------------------------------------------------------------
6
8
  // Path helpers
7
9
  // ---------------------------------------------------------------------------
8
10
  const MAX_DELIVERIES = 20;
9
11
  function getProjectDir(projectPath) {
10
12
  const hash = hashProjectPath(projectPath);
11
- return join('data', 'projects', hash);
13
+ return projectDataDir(hash);
12
14
  }
13
15
  function getConfigPath(projectPath) {
14
16
  return join(getProjectDir(projectPath), 'slack-config.json');
@@ -24,19 +26,22 @@ function getDeliveryLogPath(projectPath) {
24
26
  */
25
27
  export async function getSlackConfig(projectPath) {
26
28
  const config = await readJson(getConfigPath(projectPath), null);
27
- return config;
29
+ return config ? { ...config, webhookUrl: await resolveSecretField(config.webhookUrl) } : null;
28
30
  }
29
31
  /**
30
32
  * Persist the Slack config for a project.
31
33
  */
32
34
  export async function saveSlackConfig(projectPath, config) {
33
- await writeJson(getConfigPath(projectPath), config);
35
+ const webhookUrl = await storeSecretField(`${hashProjectPath(projectPath)}/slack/webhook`, 'slack-webhook', config.webhookUrl);
36
+ await writeSecureJson(getConfigPath(projectPath), { ...config, webhookUrl });
34
37
  }
35
38
  /**
36
39
  * Remove the Slack config for a project.
37
40
  */
38
41
  export async function removeSlackConfig(projectPath) {
39
- await writeJson(getConfigPath(projectPath), null);
42
+ const config = await readJson(getConfigPath(projectPath), null);
43
+ await deleteSecretField(config?.webhookUrl);
44
+ await writeSecureJson(getConfigPath(projectPath), null);
40
45
  }
41
46
  /**
42
47
  * Read the last N delivery log entries for a project.
@@ -1,7 +1,8 @@
1
- import { readCriticalJson, readJson, writeJson, projectDataDir } from './base-store.js';
2
- import { migrateLegacyDataDir } from './migrations/cwd-to-absolute.js';
1
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
2
+ import { CriticalJsonReadError, readCriticalJson, readJson, writeJson, projectDataDir, } from './base-store.js';
3
+ import { decodeCriticalSchema, registerCriticalSchema } from './schema-registry.js';
4
+ import { BoundaryFailure } from '../errors/error-taxonomy.js';
3
5
  import { withFileLock } from './file-mutex.js';
4
- import { discoverProjectDataFile } from './data-dir-discovery.js';
5
6
  import { computeHealthScore } from '../engine/spec-health-scorer.js';
6
7
  import { loadSpecContent } from '../engine/validation-loop.js';
7
8
  import { createHash, randomUUID } from 'node:crypto';
@@ -52,16 +53,27 @@ const STORE_LOCK_ID = '__project-spec-store__';
52
53
  const DEFAULT_POST_COMMIT_LEASE_MS = 30_000;
53
54
  const MAX_POST_COMMIT_ATTEMPTS = 3;
54
55
  const COMPLETED_OUTBOX_RETENTION = 20;
56
+ registerCriticalSchema({
57
+ name: 'spec-store',
58
+ currentVersion: 1,
59
+ createDefault: () => [],
60
+ validate: (value) => Array.isArray(value),
61
+ migrate: (value, fromVersion) => {
62
+ if (fromVersion === 0 && Array.isArray(value)) {
63
+ return value;
64
+ }
65
+ throw new Error('[Planu] Unsupported spec-store schema migration');
66
+ },
67
+ });
55
68
  async function withSpecMutationLock(projectId, fn) {
56
69
  return withFileLock(specsFile(projectId), async () => {
57
- const lockRoot = projectDataDir(projectId);
58
70
  const deadline = Date.now() + STORE_LOCK_TIMEOUT_MS;
59
- let handle = await acquireLock(lockRoot, STORE_LOCK_ID, {
71
+ let handle = await acquireLock(projectId, STORE_LOCK_ID, {
60
72
  reason: `spec-store mutation for ${projectId}`,
61
73
  });
62
74
  while (handle === null && Date.now() < deadline) {
63
75
  await new Promise((resolve) => setTimeout(resolve, STORE_LOCK_RETRY_MS));
64
- handle = await acquireLock(lockRoot, STORE_LOCK_ID, {
76
+ handle = await acquireLock(projectId, STORE_LOCK_ID, {
65
77
  reason: `spec-store mutation for ${projectId}`,
66
78
  });
67
79
  }
@@ -75,10 +87,8 @@ async function withSpecMutationLock(projectId, fn) {
75
87
  }
76
88
  finally {
77
89
  await releaseLock(handle).catch((error) => {
78
- console.warn('[planu:spec-store] failed to release mutation lock', {
79
- projectId,
80
- error: error instanceof Error ? error.message : String(error),
81
- });
90
+ // reliability-cleanup: SPEC_MUTATION_LOCK_RELEASE mutation outcome is already durable
91
+ reportClassifiedDegradation('SPEC_MUTATION_LOCK_RELEASE', error);
82
92
  });
83
93
  }
84
94
  });
@@ -96,28 +106,25 @@ async function loadAll(projectId) {
96
106
  if (cached !== undefined) {
97
107
  return cached;
98
108
  }
99
- // SPEC-1007: migrate legacy <cwd>/data/projects/{id} to absolute home once.
100
- await migrateLegacyDataDir(projectId);
101
109
  const directFile = specsFile(projectId);
102
- let raw = await readCriticalJson(directFile, [], {
103
- validate: (value) => Array.isArray(value),
104
- expectedDescription: 'an array of specs',
105
- });
106
- if (raw.length === 0) {
107
- const discovered = await discoverProjectDataFile(projectId, 'specs.json');
108
- if (discovered !== null && discovered !== directFile) {
109
- raw = await readCriticalJson(discovered, [], {
110
- validate: (value) => Array.isArray(value),
111
- expectedDescription: 'an array of specs',
112
- });
110
+ let persisted;
111
+ try {
112
+ persisted = await readCriticalJson(directFile, []);
113
+ }
114
+ catch (error) {
115
+ if (error instanceof CriticalJsonReadError) {
116
+ const cause = new BoundaryFailure('Corrupt', 'critical JSON parse', 'The persisted bytes did not contain a valid JSON document.');
117
+ throw new BoundaryFailure('Corrupt', 'read spec-store', 'Recover specs.json; Planu will not replace corrupt state with defaults.', cause);
113
118
  }
119
+ throw error;
114
120
  }
121
+ const raw = decodeCriticalSchema(persisted, 'spec-store').data;
115
122
  const specs = raw.map(normalizeSpec);
116
123
  specsCache.set(projectId, specs);
117
124
  return specs;
118
125
  }
119
126
  async function saveAll(projectId, specs) {
120
- await writeJson(specsFile(projectId), specs);
127
+ await writeJson(specsFile(projectId), { schemaVersion: 1, data: specs });
121
128
  specsCache.set(projectId, specs);
122
129
  }
123
130
  /** Evict the cache for a project (e.g. after external file changes). */
@@ -21,15 +21,37 @@ export async function withStatusLock(filePath, fn) {
21
21
  release = resolve;
22
22
  });
23
23
  lockQueues.set(filePath, next);
24
- // Wait for previous lock with timeout
25
- await Promise.race([
26
- prev,
27
- new Promise((_, reject) => setTimeout(() => {
28
- const err = new Error(`[Planu] status_lock_timeout: could not acquire write-lock on ${filePath} within ${STATUS_LOCK_TIMEOUT_MS}ms`);
29
- err.code = STATUS_LOCK_ERROR_CODE;
30
- reject(err);
31
- }, STATUS_LOCK_TIMEOUT_MS)),
32
- ]);
24
+ let timeout;
25
+ try {
26
+ // Wait for previous lock with timeout. A timed-out waiter must still release its
27
+ // queue node or every waiter behind it would remain blocked forever.
28
+ await Promise.race([
29
+ prev,
30
+ new Promise((_, reject) => {
31
+ timeout = setTimeout(() => {
32
+ const err = new Error(`[Planu] status_lock_timeout: could not acquire write-lock on ${filePath} within ${STATUS_LOCK_TIMEOUT_MS}ms`);
33
+ err.code = STATUS_LOCK_ERROR_CODE;
34
+ reject(err);
35
+ }, STATUS_LOCK_TIMEOUT_MS);
36
+ }),
37
+ ]);
38
+ }
39
+ catch (error) {
40
+ // Preserve exclusion: a later waiter is chained to `next`, so resolve this
41
+ // abandoned node only after the holder ahead of us has actually finished.
42
+ void prev.finally(() => {
43
+ release();
44
+ if (lockQueues.get(filePath) === next) {
45
+ lockQueues.delete(filePath);
46
+ }
47
+ });
48
+ throw error;
49
+ }
50
+ finally {
51
+ if (timeout) {
52
+ clearTimeout(timeout);
53
+ }
54
+ }
33
55
  try {
34
56
  return await fn();
35
57
  }
@@ -6,6 +6,7 @@
6
6
  // partial write — i.e. JSON.parse fails at non-zero offset.
7
7
  import { readFile, writeFile, rename, mkdir, readdir } from 'node:fs/promises';
8
8
  import { join, dirname } from 'node:path';
9
+ import { reportClassifiedDegradation } from '../../errors/classified-degradation.js';
9
10
  import { PLANU_VERSION } from '../../config/version.js';
10
11
  // ---------------------------------------------------------------------------
11
12
  // Helpers
@@ -98,7 +99,9 @@ export async function quarantineCorruptStatus(statusPath, projectPath) {
98
99
  try {
99
100
  await rename(statusPath, quarantinePath);
100
101
  }
101
- catch {
102
+ catch (error) {
103
+ // reliability-compat: STATUS_QUARANTINE_CROSS_DEVICE — copy preserves corrupt evidence
104
+ reportClassifiedDegradation('STATUS_QUARANTINE_CROSS_DEVICE', error);
102
105
  // Fallback: copy + delete if rename fails (e.g. cross-device)
103
106
  const raw = await readFile(statusPath, 'utf-8');
104
107
  await writeFile(quarantinePath, raw, 'utf-8');
@@ -142,8 +145,9 @@ export async function rebuildStatusFromFrontmatters(params) {
142
145
  try {
143
146
  specDirs = await readdir(specsDir);
144
147
  }
145
- catch {
146
- // No specs dir return empty state
148
+ catch (error) {
149
+ // reliability-compat: ABSENT_SPECS_DIRECTORYan uninitialized project has empty state
150
+ reportClassifiedDegradation('ABSENT_SPECS_DIRECTORY', error);
147
151
  }
148
152
  for (const dir of specDirs) {
149
153
  const specPath = join(specsDir, dir, 'spec.md');
@@ -158,8 +162,9 @@ export async function rebuildStatusFromFrontmatters(params) {
158
162
  byTypeResult[type] = (byTypeResult[type] ?? 0) + 1;
159
163
  }
160
164
  }
161
- catch {
162
- // Skip unreadable spec.md files
165
+ catch (error) {
166
+ // reliability-compat: UNREADABLE_SPEC_FILE rebuild state from remaining readable specs
167
+ reportClassifiedDegradation('UNREADABLE_SPEC_FILE', error);
163
168
  }
164
169
  }
165
170
  return {
@@ -19,9 +19,12 @@ export async function syncVersionField(statusPath, force = false) {
19
19
  try {
20
20
  raw = await readFile(statusPath, 'utf-8');
21
21
  }
22
- catch {
23
- syncedPaths.add(statusPath);
24
- return { synced: false };
22
+ catch (error) {
23
+ if (error.code === 'ENOENT') {
24
+ syncedPaths.add(statusPath);
25
+ return { synced: false };
26
+ }
27
+ throw error;
25
28
  }
26
29
  let parsed;
27
30
  try {
@@ -32,9 +35,8 @@ export async function syncVersionField(statusPath, force = false) {
32
35
  }
33
36
  parsed = p;
34
37
  }
35
- catch {
36
- syncedPaths.add(statusPath);
37
- return { synced: false };
38
+ catch (error) {
39
+ throw new Error(`Status file is corrupt: ${statusPath}`, { cause: error });
38
40
  }
39
41
  const currentVersion = typeof parsed.version === 'string' ? parsed.version : undefined;
40
42
  if (currentVersion === PLANU_VERSION) {
@@ -1,9 +1,9 @@
1
1
  // storage/steering-store.ts — SPEC-434: Persistence for steering generation results
2
2
  import { join } from 'node:path';
3
- import { hashProjectPath, readJson, writeJson } from './base-store.js';
3
+ import { hashProjectPath, projectDataDir, readJson, writeJson } from './base-store.js';
4
4
  function steeringPath(projectPath) {
5
5
  const hash = hashProjectPath(projectPath);
6
- return join('data', 'projects', hash, 'steering', 'result.json');
6
+ return join(projectDataDir(hash), 'steering', 'result.json');
7
7
  }
8
8
  /** Load the last steering generation result for a project, or null if not found. */
9
9
  export async function getSteeringResult(projectPath) {
@@ -0,0 +1,5 @@
1
+ import type { StorageBundle, StorageBundleOptions } from '../types/storage-bundle.js';
2
+ export type { StorageBundle, StorageBundleOptions } from '../types/storage-bundle.js';
3
+ export declare function exportStorageBundle(projectId: string, outputPath: string, options?: StorageBundleOptions): Promise<StorageBundle>;
4
+ export declare function importStorageBundle(inputPath: string, options?: StorageBundleOptions): Promise<StorageBundle>;
5
+ //# sourceMappingURL=storage-bundle.d.ts.map