@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,29 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { chmod, mkdir, rename, unlink, writeFile } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ /** Atomically write a secret-reference projection without plaintext backup rotation. */
5
+ export async function writeSecureJson(path, value) {
6
+ const directory = dirname(path);
7
+ await mkdir(directory, { recursive: true, mode: 0o700 });
8
+ await chmod(directory, 0o700);
9
+ const temporary = `${path}.tmp.${process.pid.toString()}.${randomBytes(4).toString('hex')}`;
10
+ try {
11
+ await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600, flag: 'wx' });
12
+ await rename(temporary, path);
13
+ await chmod(path, 0o600);
14
+ }
15
+ catch (error) {
16
+ try {
17
+ await unlink(temporary);
18
+ }
19
+ catch (cleanupError) {
20
+ if (cleanupError.code !== 'ENOENT') {
21
+ throw new AggregateError([error, cleanupError], 'Secure JSON write and cleanup failed.', {
22
+ cause: cleanupError,
23
+ });
24
+ }
25
+ }
26
+ throw error;
27
+ }
28
+ }
29
+ //# sourceMappingURL=secure-json.js.map
@@ -1,8 +1,8 @@
1
- import { readJson, writeJson, hashProjectPath } from './base-store.js';
1
+ import { readJson, writeJson, hashProjectPath, projectDataDir } from './base-store.js';
2
2
  import { withFileLock } from './file-mutex.js';
3
3
  function surfacesFile(projectPath) {
4
4
  const hash = hashProjectPath(projectPath);
5
- return `data/projects/${hash}/api-surfaces.json`;
5
+ return `${projectDataDir(hash)}/api-surfaces.json`;
6
6
  }
7
7
  /** Load all API surfaces for a project. */
8
8
  export async function loadApiSurfaces(projectPath) {
@@ -6,5 +6,5 @@ export declare class ApprovalOperationBusyError extends Error {
6
6
  * processes. Reentrancy lets request_changes invoke update_status while retaining
7
7
  * the same outer exclusion boundary.
8
8
  */
9
- export declare function withApprovalSpecLock<T>(projectPath: string, specId: string, fn: () => Promise<T>): Promise<T>;
9
+ export declare function withApprovalSpecLock<T>(projectPathOrId: string, specId: string, fn: () => Promise<T>): Promise<T>;
10
10
  //# sourceMappingURL=approval-operation-lock.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { AsyncLocalStorage } from 'node:async_hooks';
3
- import { resolve } from 'node:path';
3
+ import { isAbsolute, resolve } from 'node:path';
4
4
  import { withFileLock } from './file-mutex.js';
5
5
  import { LockBusyError, withSpecLock } from '../engine/safety/cross-process-lock.js';
6
6
  const heldApprovalLocks = new AsyncLocalStorage();
@@ -19,8 +19,10 @@ export class ApprovalOperationBusyError extends Error {
19
19
  * processes. Reentrancy lets request_changes invoke update_status while retaining
20
20
  * the same outer exclusion boundary.
21
21
  */
22
- export async function withApprovalSpecLock(projectPath, specId, fn) {
23
- const normalizedProjectPath = resolve(projectPath);
22
+ export async function withApprovalSpecLock(projectPathOrId, specId, fn) {
23
+ const normalizedProjectPath = isAbsolute(projectPathOrId)
24
+ ? resolve(projectPathOrId)
25
+ : projectPathOrId;
24
26
  const lockId = approvalLockId(specId);
25
27
  const localLockKey = `${normalizedProjectPath}\0${lockId}`;
26
28
  const heldLocks = heldApprovalLocks.getStore();
@@ -2,7 +2,7 @@ import type { AuditTrailEntry, AuditReadFilters } from '../types/audit.js';
2
2
  /**
3
3
  * Append a single AuditTrailEntry to the JSONL file.
4
4
  * Synchronous to guarantee ordering relative to tool responses.
5
- * Never throws errors are swallowed so audit failures never affect tool execution.
5
+ * Fails closed: callers must observe and handle an audit persistence failure.
6
6
  */
7
7
  export declare function appendEntry(entry: AuditTrailEntry): void;
8
8
  /**
@@ -1,29 +1,26 @@
1
1
  // storage/audit-trail-store.ts — Append-only JSONL store for SPEC-387 EU AI Act audit trail
2
2
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
3
  import { join, dirname } from 'node:path';
4
- import { safeJsonParse } from './base-store.js';
4
+ import { globalDataDir } from './base-store.js';
5
5
  /** Path to the global audit trail JSONL file. */
6
- const AUDIT_FILE = join(process.cwd(), 'data', 'global', 'audit-trail.jsonl');
7
- /** Ensure the data/global directory exists (called at module load). */
6
+ function auditFile() {
7
+ return join(globalDataDir(), 'audit-trail.jsonl');
8
+ }
9
+ /** Ensure the global data directory exists immediately before a write. */
8
10
  function ensureDataDir() {
9
- const dir = dirname(AUDIT_FILE);
11
+ const dir = dirname(auditFile());
10
12
  if (!existsSync(dir)) {
11
13
  mkdirSync(dir, { recursive: true });
12
14
  }
13
15
  }
14
- ensureDataDir();
15
16
  /**
16
17
  * Append a single AuditTrailEntry to the JSONL file.
17
18
  * Synchronous to guarantee ordering relative to tool responses.
18
- * Never throws errors are swallowed so audit failures never affect tool execution.
19
+ * Fails closed: callers must observe and handle an audit persistence failure.
19
20
  */
20
21
  export function appendEntry(entry) {
21
- try {
22
- writeFileSync(AUDIT_FILE, JSON.stringify(entry) + '\n', { flag: 'a', encoding: 'utf-8' });
23
- }
24
- catch {
25
- // Silent — audit must never affect tool execution
26
- }
22
+ ensureDataDir();
23
+ writeFileSync(auditFile(), JSON.stringify(entry) + '\n', { flag: 'a', encoding: 'utf-8' });
27
24
  }
28
25
  /**
29
26
  * Read the hash of the last stored entry.
@@ -31,67 +28,56 @@ export function appendEntry(entry) {
31
28
  * Used to build the prevHash for the next entry.
32
29
  */
33
30
  export function getLastHash() {
34
- try {
35
- if (!existsSync(AUDIT_FILE)) {
36
- return '';
37
- }
38
- const content = readFileSync(AUDIT_FILE, 'utf-8');
39
- const lines = content.split('\n').filter((l) => l.trim().length > 0);
40
- if (lines.length === 0) {
41
- return '';
42
- }
43
- const lastLine = lines[lines.length - 1] ?? '';
44
- const parsed = safeJsonParse(lastLine, {});
45
- return typeof parsed.hash === 'string' ? parsed.hash : '';
31
+ if (!existsSync(auditFile())) {
32
+ return '';
46
33
  }
47
- catch {
34
+ const content = readFileSync(auditFile(), 'utf-8');
35
+ const lines = content.split('\n').filter((l) => l.trim().length > 0);
36
+ if (lines.length === 0) {
48
37
  return '';
49
38
  }
39
+ const parsed = JSON.parse(lines[lines.length - 1] ?? '');
40
+ if (typeof parsed.hash !== 'string') {
41
+ throw new Error('Audit trail tail is missing its hash.');
42
+ }
43
+ return parsed.hash;
50
44
  }
51
45
  /**
52
46
  * Read all entries from the JSONL file and apply optional filters.
53
47
  * Returns an empty array if the file does not exist or is unreadable.
54
48
  */
55
49
  export function readEntries(filters) {
56
- try {
57
- if (!existsSync(AUDIT_FILE)) {
58
- return [];
59
- }
60
- const content = readFileSync(AUDIT_FILE, 'utf-8');
61
- const lines = content.split('\n').filter((l) => l.trim().length > 0);
62
- let entries = [];
63
- for (const line of lines) {
64
- const entry = safeJsonParse(line, null);
65
- if (entry !== null) {
66
- entries.push(entry);
67
- }
68
- }
69
- if (filters === undefined) {
70
- return entries;
71
- }
72
- if (filters.fromDate !== undefined) {
73
- const from = filters.fromDate;
74
- entries = entries.filter((e) => e.timestamp >= from);
75
- }
76
- if (filters.toDate !== undefined) {
77
- const to = filters.toDate;
78
- entries = entries.filter((e) => e.timestamp <= to);
79
- }
80
- if (filters.specId !== undefined) {
81
- const sid = filters.specId;
82
- entries = entries.filter((e) => e.specId === sid);
83
- }
84
- if (filters.projectPath !== undefined) {
85
- const pp = filters.projectPath;
86
- entries = entries.filter((e) => e.projectPath === pp);
87
- }
88
- if (filters.limit !== undefined && filters.limit > 0) {
89
- entries = entries.slice(0, filters.limit);
90
- }
50
+ if (!existsSync(auditFile())) {
51
+ return [];
52
+ }
53
+ const content = readFileSync(auditFile(), 'utf-8');
54
+ const lines = content.split('\n').filter((l) => l.trim().length > 0);
55
+ let entries = [];
56
+ for (const line of lines) {
57
+ entries.push(JSON.parse(line));
58
+ }
59
+ if (filters === undefined) {
91
60
  return entries;
92
61
  }
93
- catch {
94
- return [];
62
+ if (filters.fromDate !== undefined) {
63
+ const from = filters.fromDate;
64
+ entries = entries.filter((e) => e.timestamp >= from);
65
+ }
66
+ if (filters.toDate !== undefined) {
67
+ const to = filters.toDate;
68
+ entries = entries.filter((e) => e.timestamp <= to);
69
+ }
70
+ if (filters.specId !== undefined) {
71
+ const sid = filters.specId;
72
+ entries = entries.filter((e) => e.specId === sid);
73
+ }
74
+ if (filters.projectPath !== undefined) {
75
+ const pp = filters.projectPath;
76
+ entries = entries.filter((e) => e.projectPath === pp);
77
+ }
78
+ if (filters.limit !== undefined && filters.limit > 0) {
79
+ entries = entries.slice(0, filters.limit);
95
80
  }
81
+ return entries;
96
82
  }
97
83
  //# sourceMappingURL=audit-trail-store.js.map
@@ -2,9 +2,11 @@
2
2
  import { readFile, mkdir } from 'node:fs/promises';
3
3
  import { dirname, join } from 'node:path';
4
4
  import { atomicWriteFile } from '../engine/safety/atomic-write-file.js';
5
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
6
+ import { projectDataDir } from './base-store.js';
5
7
  const MAX_ENTRIES = 500;
6
8
  function logPath(projectId) {
7
- return join('data', 'projects', projectId, 'autopilot-log.jsonl');
9
+ return join(projectDataDir(projectId), 'autopilot-log.jsonl');
8
10
  }
9
11
  /** Read all entries from autopilot-log.jsonl. Returns empty array if file missing. */
10
12
  async function readEntries(path) {
@@ -15,8 +17,12 @@ async function readEntries(path) {
15
17
  .filter(Boolean)
16
18
  .map((line) => JSON.parse(line));
17
19
  }
18
- catch {
19
- return [];
20
+ catch (error) {
21
+ if (error.code === 'ENOENT' ||
22
+ (error instanceof Error && error.message === 'ENOENT')) {
23
+ return [];
24
+ }
25
+ throw error;
20
26
  }
21
27
  }
22
28
  /**
@@ -32,8 +38,9 @@ export async function appendAutopilotLogEntry(projectId, entry) {
32
38
  const updated = [...existing, entry].slice(-MAX_ENTRIES);
33
39
  await atomicWriteFile(path, updated.map((e) => JSON.stringify(e)).join('\n') + '\n');
34
40
  }
35
- catch {
36
- // best-effort — never block caller
41
+ catch (error) {
42
+ // reliability-optional: AUTOPILOT_LOG_APPEND — never block caller
43
+ reportClassifiedDegradation('AUTOPILOT_LOG_APPEND', error);
37
44
  }
38
45
  }
39
46
  /**
@@ -21,9 +21,7 @@ export declare class CriticalJsonReadError extends Error {
21
21
  cause?: unknown;
22
22
  });
23
23
  }
24
- /**
25
- * Hash a project path into a deterministic projectId using SHA-256.
26
- */
24
+ /** Resolve the portable logical identity for an initialized project. */
27
25
  export declare function hashProjectPath(projectPath: string): string;
28
26
  /**
29
27
  * Read a JSON file from disk. Returns the parsed contents, or the provided
@@ -45,18 +43,20 @@ export declare function readCriticalJson<T>(filePath: string, defaultValue: T, o
45
43
  export declare function writeJson(filePath: string, data: unknown): Promise<void>;
46
44
  /**
47
45
  * Resolve the data directory for a given project.
48
- * Layout: ~/.planu/data/projects/{projectId}/ (absolute, independent of cwd)
46
+ * Layout: <platform-data-root>/planu/projects/{projectId}/ (absolute, independent of cwd)
49
47
  *
50
48
  * Symmetric with globalDataDir(). Override via PLANU_PROJECT_DATA_DIR
51
- * environment variable (useful in tests and CI).
49
+ * environment variable (useful in tests and CI). PLANU_HOME is the canonical
50
+ * product-wide override.
52
51
  *
53
- * Validates that projectId is a safe hex hash (no path traversal).
54
- * projectId is always produced by hashProjectPath(), which returns a 16-char hex string.
52
+ * Validates that projectId is a safe logical storage identifier (no path traversal).
53
+ * Canonical initialized projects use the 32-character UUID form returned by
54
+ * hashProjectPath(); explicit internal fixture IDs remain supported by this path port.
55
55
  */
56
56
  export declare function projectDataDir(projectId: string): string;
57
57
  /**
58
58
  * Resolve the global data directory.
59
- * Layout: ~/.planu/data/global/ (absolute, independent of cwd)
59
+ * Layout: <platform-data-root>/planu/global/ (absolute, independent of cwd)
60
60
  *
61
61
  * Using an absolute path anchored to the user's home directory ensures that
62
62
  * global state (license, usage, registered projects) persists across sessions
@@ -1,10 +1,11 @@
1
1
  // @crash-shield-ignore-file — config/cache reader for Planu-controlled JSON; writer is this codebase, shape guaranteed by build/seed.
2
2
  // base-store.ts — Shared JSON read/write logic for all stores
3
3
  import { readFile, mkdir } from 'node:fs/promises';
4
- import { dirname, join } from 'node:path';
5
- import { homedir } from 'node:os';
4
+ import { readFileSync } from 'node:fs';
5
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
6
6
  import { writeJsonSafe } from '../engine/safety/atomic-writer.js';
7
- import { fastHashProjectPath } from '../engine/core-bridge.js';
7
+ import { resolveStorageLayout } from './storage-layout.js';
8
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
8
9
  /**
9
10
  * Runtime-safe JSON.parse with typed fallback.
10
11
  *
@@ -28,7 +29,9 @@ export function safeJsonParse(raw, fallback) {
28
29
  }
29
30
  return parsed;
30
31
  }
31
- catch {
32
+ catch (error) {
33
+ // reliability-compat: SAFE_JSON_PARSE_FALLBACK — callers explicitly supply the fallback
34
+ reportClassifiedDegradation('SAFE_JSON_PARSE_FALLBACK', error);
32
35
  return fallback;
33
36
  }
34
37
  }
@@ -42,11 +45,35 @@ export class CriticalJsonReadError extends Error {
42
45
  this.name = 'CriticalJsonReadError';
43
46
  }
44
47
  }
45
- /**
46
- * Hash a project path into a deterministic projectId using SHA-256.
47
- */
48
+ /** Resolve the portable logical identity for an initialized project. */
48
49
  export function hashProjectPath(projectPath) {
49
- return fastHashProjectPath(projectPath).slice(0, 16);
50
+ if (!projectPath.trim()) {
51
+ throw new Error('[Planu] projectPath is required');
52
+ }
53
+ if (!isAbsolute(projectPath)) {
54
+ throw new Error('[Planu] projectPath must be absolute');
55
+ }
56
+ if (projectPath.includes('\0') || projectPath.length > 4_096) {
57
+ throw new Error('[Planu] projectPath is invalid');
58
+ }
59
+ const identityPath = join(projectPath, 'planu', 'project.json');
60
+ try {
61
+ const identity = JSON.parse(readFileSync(identityPath, 'utf8'));
62
+ if (identity && typeof identity === 'object' && 'logicalProjectId' in identity) {
63
+ const logicalId = identity.logicalProjectId;
64
+ if (typeof logicalId === 'string' &&
65
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(logicalId)) {
66
+ return logicalId.replaceAll('-', '').toLowerCase();
67
+ }
68
+ }
69
+ throw new Error('[Planu] project identity document is invalid');
70
+ }
71
+ catch (error) {
72
+ if (error instanceof Error && error.message.includes('identity document is invalid')) {
73
+ throw error;
74
+ }
75
+ throw new Error(`[Planu] Project identity is unavailable at ${identityPath}. Run planu init first.`, { cause: error });
76
+ }
50
77
  }
51
78
  /**
52
79
  * Ensure the parent directory for a file path exists.
@@ -118,27 +145,27 @@ export async function writeJson(filePath, data) {
118
145
  }
119
146
  /**
120
147
  * Resolve the data directory for a given project.
121
- * Layout: ~/.planu/data/projects/{projectId}/ (absolute, independent of cwd)
148
+ * Layout: <platform-data-root>/planu/projects/{projectId}/ (absolute, independent of cwd)
122
149
  *
123
150
  * Symmetric with globalDataDir(). Override via PLANU_PROJECT_DATA_DIR
124
- * environment variable (useful in tests and CI).
151
+ * environment variable (useful in tests and CI). PLANU_HOME is the canonical
152
+ * product-wide override.
125
153
  *
126
- * Validates that projectId is a safe hex hash (no path traversal).
127
- * projectId is always produced by hashProjectPath(), which returns a 16-char hex string.
154
+ * Validates that projectId is a safe logical storage identifier (no path traversal).
155
+ * Canonical initialized projects use the 32-character UUID form returned by
156
+ * hashProjectPath(); explicit internal fixture IDs remain supported by this path port.
128
157
  */
129
158
  export function projectDataDir(projectId) {
130
- if (!projectId ||
131
- projectId.includes('..') ||
132
- projectId.includes('/') ||
133
- projectId.includes('\\')) {
159
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(projectId)) {
134
160
  throw new Error(`[Planu] Invalid projectId: "${projectId}"`);
135
161
  }
136
- const root = process.env.PLANU_PROJECT_DATA_DIR ?? join(homedir(), '.planu', 'data');
137
- return `${root}/projects/${projectId}`;
162
+ const override = absoluteStorageOverride('PLANU_PROJECT_DATA_DIR');
163
+ const root = override ?? resolveStorageLayout().data;
164
+ return join(root, 'projects', projectId);
138
165
  }
139
166
  /**
140
167
  * Resolve the global data directory.
141
- * Layout: ~/.planu/data/global/ (absolute, independent of cwd)
168
+ * Layout: <platform-data-root>/planu/global/ (absolute, independent of cwd)
142
169
  *
143
170
  * Using an absolute path anchored to the user's home directory ensures that
144
171
  * global state (license, usage, registered projects) persists across sessions
@@ -148,10 +175,20 @@ export function projectDataDir(projectId) {
148
175
  * and CI environments where HOME is not writable).
149
176
  */
150
177
  export function globalDataDir() {
151
- return process.env.PLANU_GLOBAL_DATA_DIR ?? join(homedir(), '.planu', 'data', 'global');
178
+ return (absoluteStorageOverride('PLANU_GLOBAL_DATA_DIR') ?? join(resolveStorageLayout().data, 'global'));
152
179
  }
153
180
  // --- internal helpers ---
154
181
  function isNodeError(err) {
155
182
  return err instanceof Error && 'code' in err;
156
183
  }
184
+ function absoluteStorageOverride(name) {
185
+ const value = process.env[name]?.trim();
186
+ if (!value) {
187
+ return undefined;
188
+ }
189
+ if (!isAbsolute(value)) {
190
+ throw new Error(`[Planu] ${name} must be an absolute path`);
191
+ }
192
+ return resolve(value);
193
+ }
157
194
  //# sourceMappingURL=base-store.js.map
@@ -94,8 +94,11 @@ async function listCheckpointFiles(dir) {
94
94
  const entries = await readdir(dir);
95
95
  return entries.filter((f) => f.endsWith('.json')).sort();
96
96
  }
97
- catch {
98
- return [];
97
+ catch (error) {
98
+ if (error.code === 'ENOENT') {
99
+ return [];
100
+ }
101
+ throw error;
99
102
  }
100
103
  }
101
104
  //# sourceMappingURL=checkpoint-store.js.map
@@ -38,8 +38,8 @@ function readComments(filePath) {
38
38
  }
39
39
  return parsed;
40
40
  }
41
- catch {
42
- return [];
41
+ catch (error) {
42
+ throw new Error(`Comments store is corrupt: ${filePath}`, { cause: error });
43
43
  }
44
44
  }
45
45
  function writeComments(filePath, comments) {
@@ -39,8 +39,11 @@ export async function countComplianceAuditEvents(projectId) {
39
39
  const content = await readFile(file, 'utf-8');
40
40
  return content.split('\n').filter(Boolean).length;
41
41
  }
42
- catch {
43
- return 0;
42
+ catch (error) {
43
+ if (error.code === 'ENOENT') {
44
+ return 0;
45
+ }
46
+ throw error;
44
47
  }
45
48
  }
46
49
  //# sourceMappingURL=compliance-audit-store.js.map
@@ -1,17 +1,20 @@
1
1
  // storage/compliance-gate-config-store.ts — Compliance gate config persistence (SPEC-447)
2
2
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
3
  import { join, dirname } from 'node:path';
4
- import { safeJsonParse } from './base-store.js';
4
+ import { projectDataDir, safeJsonParse } from './base-store.js';
5
5
  function complianceGateConfigPath(projectId) {
6
- return join('data', 'projects', projectId, 'compliance-gate-config.json');
6
+ return join(projectDataDir(projectId), 'compliance-gate-config.json');
7
7
  }
8
8
  export async function getComplianceGateConfig(projectId) {
9
9
  try {
10
10
  const raw = await readFile(complianceGateConfigPath(projectId), 'utf-8');
11
11
  return safeJsonParse(raw, null);
12
12
  }
13
- catch {
14
- return null;
13
+ catch (error) {
14
+ if (error.code === 'ENOENT') {
15
+ return null;
16
+ }
17
+ throw error;
15
18
  }
16
19
  }
17
20
  export async function saveComplianceGateConfig(projectId, config) {
@@ -1,12 +1,12 @@
1
1
  // storage/compliance-store.ts — Compliance config persistence (SPEC-319)
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
  // ---------------------------------------------------------------------------
5
5
  // Path helpers
6
6
  // ---------------------------------------------------------------------------
7
7
  function projectDir(projectPath) {
8
8
  const id = hashProjectPath(projectPath);
9
- return join('data', 'projects', id);
9
+ return projectDataDir(id);
10
10
  }
11
11
  function configPath(projectPath) {
12
12
  return join(projectDir(projectPath), 'compliance-config.json');
@@ -1,6 +1,6 @@
1
- import { readJson, writeJson, hashProjectPath } from './base-store.js';
1
+ import { readJson, writeJson, hashProjectPath, projectDataDir } from './base-store.js';
2
2
  function profileFile(projectId) {
3
- return `data/projects/${projectId}/context-profile.json`;
3
+ return `${projectDataDir(projectId)}/context-profile.json`;
4
4
  }
5
5
  /**
6
6
  * Persist the active work phase for a project.
@@ -1,17 +1,21 @@
1
1
  // storage/crash-shield-store.ts — Crash Shield config persistence (SPEC-442)
2
2
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
3
  import { join, dirname } from 'node:path';
4
- import { safeJsonParse } from './base-store.js';
4
+ import { projectDataDir, safeJsonParse } from './base-store.js';
5
5
  function crashShieldConfigPath(projectId) {
6
- return join('data', 'projects', projectId, 'crash-shield-config.json');
6
+ return join(projectDataDir(projectId), 'crash-shield-config.json');
7
7
  }
8
8
  export async function getCrashShieldConfig(projectId) {
9
9
  try {
10
10
  const raw = await readFile(crashShieldConfigPath(projectId), 'utf-8');
11
11
  return safeJsonParse(raw, null);
12
12
  }
13
- catch {
14
- return null;
13
+ catch (error) {
14
+ if (error.code === 'ENOENT' ||
15
+ (error instanceof Error && error.message === 'ENOENT')) {
16
+ return null;
17
+ }
18
+ throw error;
15
19
  }
16
20
  }
17
21
  export async function saveCrashShieldConfig(config) {
@@ -3,6 +3,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
3
  import { join, dirname } from 'node:path';
4
4
  import { withFileLock } from './file-mutex.js';
5
5
  import { deliverFeedbackRemote } from './feedback-remote.js';
6
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
6
7
  // ---------------------------------------------------------------------------
7
8
  // Path helpers
8
9
  // ---------------------------------------------------------------------------
@@ -29,8 +30,8 @@ function readLedger(filePath) {
29
30
  }
30
31
  return parsed;
31
32
  }
32
- catch {
33
- return [];
33
+ catch (error) {
34
+ throw new Error(`Feedback ledger is corrupt: ${filePath}`, { cause: error });
34
35
  }
35
36
  }
36
37
  function writeLedger(filePath, entries) {
@@ -121,8 +122,10 @@ function readPlanuVersion(dataDir) {
121
122
  return pkg.version;
122
123
  }
123
124
  }
124
- catch {
125
- // continue
125
+ catch (error) {
126
+ // reliability-compat: PACKAGE_VERSION_LOOKUP — continue to the next package candidate
127
+ reportClassifiedDegradation('PACKAGE_VERSION_LOOKUP', error);
128
+ continue;
126
129
  }
127
130
  }
128
131
  }
@@ -196,8 +199,9 @@ export async function submitFeedback(dataDir, entry) {
196
199
  };
197
200
  entries.push(newEntry);
198
201
  writeLedger(filePath, entries);
199
- void deliverAndPersistRemote(dataDir, newEntry).catch((err) => {
200
- console.error('[planu] feedback remote delivery failed:', err);
202
+ void deliverAndPersistRemote(dataDir, newEntry).catch((error) => {
203
+ // reliability-optional: FEEDBACK_REMOTE_DELIVERY local ledger is authoritative
204
+ reportClassifiedDegradation('FEEDBACK_REMOTE_DELIVERY', error);
201
205
  });
202
206
  return Promise.resolve(newEntry);
203
207
  });
@@ -1,11 +1,13 @@
1
1
  // storage/figma-store.ts — Figma integration persistence (SPEC-418)
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 { resolveSecretField, storeSecretField } from '../security/secret-field.js';
6
+ import { writeSecureJson } from '../security/secure-json.js';
5
7
  const MAX_SYNC_LOG_ENTRIES = 50;
6
8
  function projectDir(projectPath) {
7
9
  const id = hashProjectPath(projectPath);
8
- return join('data', 'projects', id);
10
+ return projectDataDir(id);
9
11
  }
10
12
  function configPath(projectPath) {
11
13
  return join(projectDir(projectPath), 'figma-config.json');
@@ -17,10 +19,12 @@ function generatedSpecsPath(projectPath) {
17
19
  return join(projectDir(projectPath), 'figma-generated-specs.json');
18
20
  }
19
21
  export async function getFigmaConfig(projectPath) {
20
- return readJson(configPath(projectPath), null);
22
+ const config = await readJson(configPath(projectPath), null);
23
+ return config ? { ...config, accessToken: await resolveSecretField(config.accessToken) } : null;
21
24
  }
22
25
  export async function saveFigmaConfig(projectPath, config) {
23
- await writeJson(configPath(projectPath), config);
26
+ const accessToken = await storeSecretField(`${hashProjectPath(projectPath)}/figma/access`, 'figma-pat', config.accessToken);
27
+ await writeSecureJson(configPath(projectPath), { ...config, accessToken });
24
28
  }
25
29
  export async function getFigmaSyncLog(projectPath) {
26
30
  return readJson(syncLogPath(projectPath), []);