@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.
- package/CHANGELOG.md +35 -0
- package/README.md +29 -25
- package/dist/cli/commands/inspect.d.ts +4 -0
- package/dist/cli/commands/inspect.js +144 -0
- package/dist/cli/commands/install.d.ts +19 -1
- package/dist/cli/commands/install.js +145 -43
- package/dist/cli/commands/job.d.ts +3 -0
- package/dist/cli/commands/job.js +119 -0
- package/dist/cli/commands/offline.d.ts +15 -0
- package/dist/cli/commands/offline.js +132 -0
- package/dist/cli/commands/serve.js +4 -0
- package/dist/cli/commands/spec.js +1 -1
- package/dist/cli/commands/storage.d.ts +3 -0
- package/dist/cli/commands/storage.js +102 -0
- package/dist/cli/commands/uninstall.d.ts +10 -0
- package/dist/cli/commands/uninstall.js +93 -7
- package/dist/cli/commands/validate.js +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/router.js +9 -1
- package/dist/config/crash-shield-framework-rules.json +93 -0
- package/dist/config/environment-schema.json +149 -0
- package/dist/config/hardcode-exceptions.json +4 -0
- package/dist/config/license-plans.json +7 -0
- package/dist/config/native-release-public-key.pem +3 -0
- package/dist/config/native-targets.json +87 -0
- package/dist/config/product-public.d.ts +89 -0
- package/dist/config/product-public.js +140 -0
- package/dist/config/product-public.json +312 -0
- package/dist/config/product-public.ts +148 -0
- package/dist/config/release-compatibility.json +13 -0
- package/dist/config/release-policy.json +26 -0
- package/dist/config/runtime-policy.json +44 -0
- package/dist/config/skill-templates/planu-validate.md +7 -4
- package/dist/config/subagent-templates/planu-spec-implementer.md +7 -3
- package/dist/config/subagent-templates/planu-validator.md +10 -5
- package/dist/config/technology-registry.json +120 -0
- package/dist/config/version.js +7 -8
- package/dist/config/version.ts +10 -7
- package/dist/engine/abortable-process-runner.js +40 -9
- package/dist/engine/advanced-testing/accessibility-checker.js +12 -14
- package/dist/engine/advanced-testing/mutation-advisor.js +3 -4
- package/dist/engine/advanced-testing/property-based.js +2 -3
- package/dist/engine/advanced-testing/test-data-advisor.js +2 -3
- package/dist/engine/agent-generator.js +2 -1
- package/dist/engine/agent-handoff-store.js +2 -1
- package/dist/engine/agent-prompt-generator.js +7 -5
- package/dist/engine/agent-telemetry.js +2 -1
- package/dist/engine/ai-integration/gemini/extensions-advisor.js +41 -9
- package/dist/engine/ambiguity-detector.js +12 -11
- package/dist/engine/analyzer/db-engine.js +2 -3
- package/dist/engine/analyzer/detectors.js +13 -14
- package/dist/engine/analyzer/env-setup.js +9 -10
- package/dist/engine/analyzer-env-scanner/env-example.js +7 -8
- package/dist/engine/api-spec-generator/graphql-parser.js +2 -2
- package/dist/engine/api-validation/graphql-schema-validator.js +2 -1
- package/dist/engine/api-validation/openapi-impl-validator.js +6 -7
- package/dist/engine/architecture-detector.js +10 -8
- package/dist/engine/auth/config.d.ts +1 -1
- package/dist/engine/auth/config.js +4 -3
- package/dist/engine/auto-updater/atomic-upgrade.d.ts +8 -0
- package/dist/engine/auto-updater/atomic-upgrade.js +381 -0
- package/dist/engine/auto-updater/config-detector.js +9 -3
- package/dist/engine/auto-updater/config-patcher.d.ts +0 -4
- package/dist/engine/auto-updater/config-patcher.js +10 -15
- package/dist/engine/auto-updater/index.d.ts +3 -1
- package/dist/engine/auto-updater/index.js +44 -30
- package/dist/engine/auto-updater/npm-registry.js +10 -2
- package/dist/engine/auto-updater/release-verifier.d.ts +3 -0
- package/dist/engine/auto-updater/release-verifier.js +112 -0
- package/dist/engine/auto-updater/upgrade-lock.d.ts +6 -0
- package/dist/engine/auto-updater/upgrade-lock.js +28 -0
- package/dist/engine/auto-updater/upgrade-trust-state.d.ts +7 -0
- package/dist/engine/auto-updater/upgrade-trust-state.js +59 -0
- package/dist/engine/autopilot/audit-logger.js +2 -5
- package/dist/engine/best-practices-library.js +2 -1
- package/dist/engine/browser-validator.js +2 -1
- package/dist/engine/build-tool-detector.js +3 -2
- package/dist/engine/ci-generator/context-builders.js +7 -5
- package/dist/engine/ci-generator/stack-detector.js +0 -2
- package/dist/engine/ci-generator/yaml-builder.js +0 -2
- package/dist/engine/claude-config-auditor/rules-auditor.js +4 -3
- package/dist/engine/code-transforms/typescript/ast-utils.js +2 -3
- package/dist/engine/complexity-budget/trivial-detector.js +2 -1
- package/dist/engine/compliance-test-generator/index.js +7 -2
- package/dist/engine/compliance-test-generator/test-formatter.js +2 -2
- package/dist/engine/config-health/mcp-config-checker.js +2 -1
- package/dist/engine/config-health/ts-checker-scripts.js +4 -3
- package/dist/engine/config-health/ts-checker.js +3 -2
- package/dist/engine/convention-injector.js +5 -7
- package/dist/engine/convention-scanner/convention-parser.js +3 -2
- package/dist/engine/core-bridge-duplicate-blocks.d.ts +3 -0
- package/dist/engine/core-bridge-duplicate-blocks.js +57 -0
- package/dist/engine/core-bridge-gaps.d.ts +4 -0
- package/dist/engine/core-bridge-gaps.js +75 -0
- package/dist/engine/core-bridge.d.ts +9 -9
- package/dist/engine/core-bridge.js +196 -283
- package/dist/engine/cost-tracking/ledger.js +2 -5
- package/dist/engine/coverage-gap-analyzer.js +10 -1
- package/dist/engine/crash-shield/detectors/framework-detector.d.ts +2 -0
- package/dist/engine/crash-shield/detectors/framework-detector.js +110 -192
- package/dist/engine/crash-shield/detectors/typescript-detector.js +2 -1
- package/dist/engine/dashboard/data-loader.js +2 -1
- package/dist/engine/data-projects-gc/gc-runner.d.ts +7 -0
- package/dist/engine/data-projects-gc/gc-runner.js +113 -3
- package/dist/engine/data-projects-gc/scanner.js +5 -1
- package/dist/engine/decision-store.js +11 -14
- package/dist/engine/deleter/core.js +5 -5
- package/dist/engine/dep-auditor/abandonment-data.js +2 -1
- package/dist/engine/dep-auditor/abandonment-registry.js +3 -1
- package/dist/engine/dep-auditor/cve-fetcher.js +3 -0
- package/dist/engine/dep-auditor/dep-duplicates-detector.js +36 -4
- package/dist/engine/dep-auditor/license-registry.js +2 -0
- package/dist/engine/dependency-evaluator.d.ts +14 -0
- package/dist/engine/dependency-evaluator.js +81 -0
- package/dist/engine/deploy/providers/fly.js +7 -7
- package/dist/engine/deploy/providers/netlify.js +7 -7
- package/dist/engine/deploy/providers/railway.js +10 -12
- package/dist/engine/deploy/providers/vercel.js +7 -9
- package/dist/engine/deprecation-scanner/pattern-loader.js +0 -2
- package/dist/engine/desktop-detector.js +2 -3
- package/dist/engine/detect-duplication.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/css-state-detector.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/legacy-detector.js +2 -3
- package/dist/engine/detectors/advanced-framework-detector/modern-detector.js +3 -4
- package/dist/engine/detectors/agent-framework-detector.js +3 -2
- package/dist/engine/detectors/ai-native-detector.js +4 -6
- package/dist/engine/detectors/cache-db-detector.js +4 -3
- package/dist/engine/detectors/cicd-detector.js +4 -3
- package/dist/engine/detectors/deployment-detector.js +11 -12
- package/dist/engine/detectors/frontend-perf-detector.js +14 -9
- package/dist/engine/detectors/library-detector-multilang-a.js +16 -3
- package/dist/engine/detectors/library-detector-node.js +14 -4
- package/dist/engine/detectors/library-detector-python.js +7 -1
- package/dist/engine/detectors/library-detector.js +0 -2
- package/dist/engine/detectors/llm-detector/provider-maps.js +3 -2
- package/dist/engine/detectors/mcp-candidate-detector.js +12 -16
- package/dist/engine/detectors/mfe-detector.js +6 -7
- package/dist/engine/detectors/monitoring-detector.js +4 -3
- package/dist/engine/detectors/otel-detector.js +3 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.js +4 -3
- package/dist/engine/detectors/platform-specialty-detector.js +3 -5
- package/dist/engine/detectors/template-engine-detector.js +3 -4
- package/dist/engine/doc-generator/builders.js +2 -3
- package/dist/engine/doc-generator/mobile-distribution-guide.js +13 -17
- package/dist/engine/doc-generator/portal/dirty-flag-map.d.ts +2 -2
- package/dist/engine/doc-generator/portal/portal-regenerator.js +3 -47
- package/dist/engine/domain-detector.js +3 -6
- package/dist/engine/dynamic-knowledge/knowledge-cache.js +3 -4
- package/dist/engine/dynamic-knowledge/knowledge-merger.js +17 -2
- package/dist/engine/dynamic-knowledge/web-researcher.js +15 -14
- package/dist/engine/dynamic-migration-detector/manifest-readers-extended.js +0 -2
- package/dist/engine/e2e-test-generator.js +4 -3
- package/dist/engine/ecosystem-absorber/knowledge-cache.js +2 -1
- package/dist/engine/ecosystem-absorber/platform-crawler.js +2 -2
- package/dist/engine/escalator/retry-counter.js +2 -1
- package/dist/engine/evidence-gates/artifact-reader.d.ts +6 -0
- package/dist/engine/evidence-gates/artifact-reader.js +105 -21
- package/dist/engine/evidence-gates/lifecycle-gate.d.ts +2 -1
- package/dist/engine/evidence-gates/lifecycle-gate.js +54 -0
- package/dist/engine/execution/context.d.ts +19 -0
- package/dist/engine/execution/context.js +127 -0
- package/dist/engine/execution/deadline-io.d.ts +21 -0
- package/dist/engine/execution/deadline-io.js +45 -0
- package/dist/engine/execution/job-executor.d.ts +16 -0
- package/dist/engine/execution/job-executor.js +140 -0
- package/dist/engine/execution/job-runtime.d.ts +78 -0
- package/dist/engine/execution/job-runtime.js +220 -0
- package/dist/engine/execution/native-relevance-scorer.d.ts +6 -0
- package/dist/engine/execution/native-relevance-scorer.js +64 -0
- package/dist/engine/execution/native-worker-dispatch.d.ts +3 -0
- package/dist/engine/execution/native-worker-dispatch.js +46 -0
- package/dist/engine/execution/native-worker-protocol.d.ts +6 -0
- package/dist/engine/execution/native-worker-protocol.js +33 -0
- package/dist/engine/execution/native-worker-runtime.d.ts +4 -0
- package/dist/engine/execution/native-worker-runtime.js +177 -0
- package/dist/engine/execution/native-worker-thread.d.ts +2 -0
- package/dist/engine/execution/native-worker-thread.js +66 -0
- package/dist/engine/execution/operation-journal.d.ts +66 -0
- package/dist/engine/execution/operation-journal.js +260 -0
- package/dist/engine/execution/outbox-worker.d.ts +31 -0
- package/dist/engine/execution/outbox-worker.js +192 -0
- package/dist/engine/execution/validate-job-executor.d.ts +24 -0
- package/dist/engine/execution/validate-job-executor.js +342 -0
- package/dist/engine/execution/validate-job-payload.d.ts +5 -0
- package/dist/engine/execution/validate-job-payload.js +87 -0
- package/dist/engine/execution/validate-job-recovery.d.ts +4 -0
- package/dist/engine/execution/validate-job-recovery.js +47 -0
- package/dist/engine/execution/validate-worker-runtime.d.ts +5 -0
- package/dist/engine/execution/validate-worker-runtime.js +100 -0
- package/dist/engine/execution/validate-worker-thread.d.ts +2 -0
- package/dist/engine/execution/validate-worker-thread.js +71 -0
- package/dist/engine/execution-plan/desktop-distribution.js +3 -7
- package/dist/engine/execution-plan/mobile-distribution.js +4 -9
- package/dist/engine/execution-plan/phases.js +4 -5
- package/dist/engine/execution-plan/plan-utils.js +8 -5
- package/dist/engine/facilitate/context-loader.js +3 -9
- package/dist/engine/figma/code-connect-fetcher.js +9 -8
- package/dist/engine/filesystem-watcher/index.d.ts +3 -3
- package/dist/engine/filesystem-watcher/index.js +5 -5
- package/dist/engine/framework-detector.js +14 -15
- package/dist/engine/git/planu-autocommit.js +8 -7
- package/dist/engine/git/repository-probe.d.ts +3 -0
- package/dist/engine/git/repository-probe.js +13 -0
- package/dist/engine/global-rules-manager.js +2 -2
- package/dist/engine/handoff-artifacts/io.js +2 -3
- package/dist/engine/handoff-artifacts/schemas/red-tests-handoff.js +8 -1
- package/dist/engine/handoff-artifacts/schemas.d.ts +4 -0
- package/dist/engine/handoff-artifacts/schemas.js +5 -0
- package/dist/engine/hook-generator/stack-hook-templates.js +4 -4
- package/dist/engine/hooks/config-loader.js +1 -1
- package/dist/engine/hooks/context-injector.js +4 -7
- package/dist/engine/hooks/file-watcher.js +1 -14
- package/dist/engine/hooks-reconciler.js +6 -4
- package/dist/engine/infrastructure/component-mapper.js +5 -7
- package/dist/engine/infrastructure/docker-compose-generator.js +8 -10
- package/dist/engine/infrastructure/index.js +6 -3
- package/dist/engine/infrastructure/kubernetes-generator.js +2 -2
- package/dist/engine/infrastructure/railway-generator.js +10 -8
- package/dist/engine/infrastructure/signal-detector.js +6 -8
- package/dist/engine/infrastructure/terraform-generator.js +6 -8
- package/dist/engine/legal-compliance/detector.js +3 -2
- package/dist/engine/local-first/storage-advisor.js +5 -6
- package/dist/engine/macos-keychain-native-port.d.ts +5 -0
- package/dist/engine/macos-keychain-native-port.js +26 -0
- package/dist/engine/marketplace-fetcher/cache.js +3 -1
- package/dist/engine/mcp-config/mcp-config-writer.d.ts +2 -2
- package/dist/engine/mcp-config/mcp-config-writer.js +10 -8
- package/dist/engine/migration/db-migrator.js +2 -5
- package/dist/engine/migration/equivalence-mapper.js +12 -13
- package/dist/engine/migration/service-catalogs.js +6 -7
- package/dist/engine/migration/service-migrator-catalogs.js +6 -7
- package/dist/engine/mobile-detector-ios.js +2 -3
- package/dist/engine/mobile-detector.js +16 -4
- package/dist/engine/model-router/complexity-analyzer.js +4 -7
- package/dist/engine/multi-agent-review/security-analyzer.js +3 -1
- package/dist/engine/multi-app-detector/app-type.js +26 -21
- package/dist/engine/multi-app-detector/core.js +3 -2
- package/dist/engine/multi-teammate-review/disagreement-counter.js +2 -1
- package/dist/engine/multi-teammate-review/panel-orchestrator.js +0 -2
- package/dist/engine/mutation-config-generator.js +10 -7
- package/dist/engine/native-capability-policy.d.ts +4 -0
- package/dist/engine/native-capability-policy.js +24 -0
- package/dist/engine/native-platform.d.ts +3 -0
- package/dist/engine/native-platform.js +44 -0
- package/dist/engine/native-runtime-handshake.d.ts +20 -0
- package/dist/engine/native-runtime-handshake.js +230 -0
- package/dist/engine/network-policy.d.ts +27 -0
- package/dist/engine/network-policy.js +174 -0
- package/dist/engine/next-spec-resolver/dependency-filter.js +2 -22
- package/dist/engine/nfr-profile-detector.js +12 -16
- package/dist/engine/nli-keywords.js +8 -9
- package/dist/engine/oauth/config-guard.js +4 -5
- package/dist/engine/observability/local-execution-spans.d.ts +15 -0
- package/dist/engine/observability/local-execution-spans.js +63 -0
- package/dist/engine/orchestrator/runtime.js +0 -1
- package/dist/engine/package-registry.js +2 -6
- package/dist/engine/performance-analyzer.js +2 -5
- package/dist/engine/permissions-merger/stack-detectors.js +5 -5
- package/dist/engine/planu-core.darwin-arm64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-arm64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +1310 -0
- package/dist/engine/platform-detector/desktop.js +15 -2
- package/dist/engine/platform-detector/extensions.js +2 -1
- package/dist/engine/platform-detector/games.js +2 -1
- package/dist/engine/platform-detector.js +3 -2
- package/dist/engine/platform-engineering/idp-detector.js +2 -1
- package/dist/engine/plugin-installer/stack-matcher.js +9 -17
- package/dist/engine/plugins/lifecycle.js +6 -2
- package/dist/engine/prior-decisions/contradiction-detector.js +60 -30
- package/dist/engine/project-dna/stack-detector.js +15 -17
- package/dist/engine/project-graph/builder.js +11 -0
- package/dist/engine/project-graph/cache.js +1 -1
- package/dist/engine/project-graph/freshness-projection.d.ts +16 -0
- package/dist/engine/project-graph/freshness-projection.js +95 -0
- package/dist/engine/project-graph/index.d.ts +1 -0
- package/dist/engine/project-graph/index.js +1 -0
- package/dist/engine/project-graph/query.js +15 -25
- package/dist/engine/project-health-checker.js +3 -4
- package/dist/engine/project-scanner/stack-detector.js +17 -17
- package/dist/engine/property-test-generator.js +2 -3
- package/dist/engine/qa-gate.d.ts +1 -0
- package/dist/engine/qa-gate.js +6 -4
- package/dist/engine/quality-gates/gate-catalog.js +47 -46
- package/dist/engine/quality-gates/gate-injector.js +9 -4
- package/dist/engine/registry/core.js +0 -2
- package/dist/engine/registry/loader.js +9 -12
- package/dist/engine/registry/matcher.js +129 -24
- package/dist/engine/resilience-detector/concurrency-detector.js +4 -4
- package/dist/engine/resilience-detector/middleware-detector.js +11 -13
- package/dist/engine/resilience-detector/validation-detector.js +17 -4
- package/dist/engine/reverse-engineer/config-analyzer.js +9 -8
- package/dist/engine/reverse-engineer/orchestrator.js +5 -9
- package/dist/engine/reverse-engineer/test-file-parser.js +6 -3
- package/dist/engine/rules-generator/index.js +6 -5
- package/dist/engine/runtime-policy.d.ts +7 -0
- package/dist/engine/runtime-policy.js +101 -0
- package/dist/engine/runtime-security/checkers/content-security.js +21 -6
- package/dist/engine/runtime-security/checkers/file-permissions.js +0 -2
- package/dist/engine/safety/atomic-write-file.js +20 -9
- package/dist/engine/safety/atomic-writer.js +10 -3
- package/dist/engine/safety/cross-process-lock.d.ts +3 -40
- package/dist/engine/safety/cross-process-lock.js +268 -272
- package/dist/engine/safety/file-mutex.d.ts +2 -9
- package/dist/engine/safety/file-mutex.js +155 -87
- package/dist/engine/safety/health-monitor.js +15 -6
- package/dist/engine/safety/lock-lease-store.d.ts +79 -0
- package/dist/engine/safety/lock-lease-store.js +372 -0
- package/dist/engine/safety/lock-scavenger.d.ts +2 -5
- package/dist/engine/safety/lock-scavenger.js +158 -76
- package/dist/engine/safety/lock-staleness.js +4 -1
- package/dist/engine/safety/obsolete-lock-guard.d.ts +8 -0
- package/dist/engine/safety/obsolete-lock-guard.js +31 -0
- package/dist/engine/safety/transaction.js +3 -3
- package/dist/engine/sandbox/index.js +2 -1
- package/dist/engine/sandbox/runner-detect.js +3 -2
- package/dist/engine/sandbox/runner-docker.js +4 -3
- package/dist/engine/scan-project/module-discoverer.js +3 -2
- package/dist/engine/schema-generator.js +16 -9
- package/dist/engine/security-analyzer/criteria-generator.js +2 -3
- package/dist/engine/self-healing/healer.js +4 -4
- package/dist/engine/session-safeguard/learnings-buffer.d.ts +1 -2
- package/dist/engine/session-safeguard/learnings-buffer.js +42 -65
- package/dist/engine/shared-agent-memory.js +66 -74
- package/dist/engine/skill-adapter/command-rewriter.js +3 -2
- package/dist/engine/skill-adapter/index.js +3 -3
- package/dist/engine/skill-adapter/placeholder-map.js +3 -2
- package/dist/engine/skill-bootstrap/stack-matcher.js +47 -48
- package/dist/engine/skill-generation/stack-content-generator.js +0 -2
- package/dist/engine/skill-generator/workflow-skill-generator.js +2 -1
- package/dist/engine/skill-registry/ttl-refresh.js +3 -1
- package/dist/engine/skills/skills-fetcher.js +3 -6
- package/dist/engine/skills-reconciler.js +19 -39
- package/dist/engine/spec-coverage/test-finder.js +7 -6
- package/dist/engine/spec-diff-engine.js +3 -3
- package/dist/engine/spec-generator/api-key-resolver.d.ts +1 -1
- package/dist/engine/spec-generator/api-key-resolver.js +3 -24
- package/dist/engine/spec-generators/issue-extractor.js +9 -3
- package/dist/engine/spec-migrator/drift-detector.js +5 -13
- package/dist/engine/spec-migrator/filesystem-import.js +14 -10
- package/dist/engine/spec-migrator/planu-canonical-policy.js +10 -1
- package/dist/engine/spec-migrator/strict-planu-cleanup.js +24 -25
- package/dist/engine/spec-registry/adapter.d.ts +0 -5
- package/dist/engine/spec-registry/adapter.js +45 -46
- package/dist/engine/spec-registry/client.js +2 -0
- package/dist/engine/spec-source-sync.js +3 -2
- package/dist/engine/spec-templates/custom-loader.js +2 -3
- package/dist/engine/spec-templates/templates-domain-specific.js +8 -5
- package/dist/engine/spec-templates/templates-perf-integration.js +2 -3
- package/dist/engine/stack-auditor/manifest-reader.js +0 -2
- package/dist/engine/staleness/stale-implementing.js +7 -7
- package/dist/engine/tdd-scaffold-generator.js +24 -11
- package/dist/engine/teammate-router/green-phase-verifier.js +2 -1
- package/dist/engine/teammate-router/red-phase-verifier.js +2 -1
- package/dist/engine/technology-registry.d.ts +11 -0
- package/dist/engine/technology-registry.js +142 -0
- package/dist/engine/telemetry/error-reporter.d.ts +1 -2
- package/dist/engine/telemetry/error-reporter.js +11 -18
- package/dist/engine/telemetry/health-checker.js +5 -14
- package/dist/engine/telemetry/index.d.ts +0 -1
- package/dist/engine/telemetry/index.js +0 -1
- package/dist/engine/telemetry/stance.js +3 -2
- package/dist/engine/telemetry/telemetry-client.d.ts +1 -5
- package/dist/engine/telemetry/telemetry-client.js +45 -29
- package/dist/engine/telemetry/telemetry-store.d.ts +3 -3
- package/dist/engine/telemetry/telemetry-store.js +30 -23
- package/dist/engine/test-framework-detector/detectors.js +8 -8
- package/dist/engine/test-framework-detector/strategy.js +8 -9
- package/dist/engine/test-generators/agent-test-templates.js +2 -3
- package/dist/engine/test-generators/contract-test-generator.d.ts +1 -1
- package/dist/engine/test-generators/contract-test-generator.js +9 -202
- package/dist/engine/test-generators/platform-test-templates-b.js +2 -3
- package/dist/engine/test-generators/platform-test-templates.js +2 -5
- package/dist/engine/test-mocks-generator.js +4 -3
- package/dist/engine/test-plan-generator.js +30 -12
- package/dist/engine/test-scaffold-generator/advanced-scaffold.js +4 -5
- package/dist/engine/test-scaffold-generator/unit-scaffold.js +5 -6
- package/dist/engine/timing/budget.d.ts +6 -17
- package/dist/engine/timing/budget.js +80 -64
- package/dist/engine/tool-groups/group-manager.js +3 -3
- package/dist/engine/universal-rules/installer.js +1 -1
- package/dist/engine/universal-rules/rules/planu-modes.js +2 -0
- package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -0
- package/dist/engine/update-notifier.js +8 -5
- package/dist/engine/validation/approved-spec-portability.d.ts +12 -0
- package/dist/engine/validation/approved-spec-portability.js +107 -0
- package/dist/engine/validation/durable-validation.d.ts +36 -0
- package/dist/engine/validation/durable-validation.js +335 -0
- package/dist/engine/validation/validation-freshness.d.ts +36 -0
- package/dist/engine/validation/validation-freshness.js +427 -0
- package/dist/engine/validation/validation-receipt-codec.d.ts +13 -0
- package/dist/engine/validation/validation-receipt-codec.js +182 -0
- package/dist/engine/validation/validation-receipt.d.ts +59 -0
- package/dist/engine/validation/validation-receipt.js +282 -0
- package/dist/engine/validation/validation-source-policy.d.ts +4 -0
- package/dist/engine/validation/validation-source-policy.js +16 -0
- package/dist/engine/validation/validation-submission.d.ts +36 -0
- package/dist/engine/validation/validation-submission.js +128 -0
- package/dist/engine/validation-evidence-ledger.js +41 -0
- package/dist/engine/validation-impact-planner.js +25 -9
- package/dist/engine/validator/spec-compliance-runner.d.ts +1 -1
- package/dist/engine/validator/spec-compliance-runner.js +17 -8
- package/dist/engine/validator/validation-report-writer.js +1 -1
- package/dist/engine/validator.js +2 -1
- package/dist/engine/verify-integrations/index.js +1 -1
- package/dist/engine/version-resolver.js +5 -6
- package/dist/engine/web-fetcher/stack-advisor.js +156 -92
- package/dist/engine/web-fetcher/stack-detector.js +114 -54
- package/dist/engine/workspace-manager.js +3 -2
- package/dist/errors/classified-degradation.d.ts +3 -0
- package/dist/errors/classified-degradation.js +10 -0
- package/dist/errors/degradation-sink.d.ts +3 -0
- package/dist/errors/degradation-sink.js +5 -0
- package/dist/errors/error-taxonomy.d.ts +12 -0
- package/dist/errors/error-taxonomy.js +62 -0
- package/dist/hosts/claude-code/ux/mcp-prompts.js +10 -4
- package/dist/hosts/claude-code/ux/mcp-resources.js +4 -2
- package/dist/hosts/codex/config-scaffold.js +4 -3
- package/dist/hosts/gemini/config-scaffold.js +2 -1
- package/dist/hosts/gemini/multimodal-spec-flow.js +7 -4
- package/dist/index.js +21 -6
- package/dist/resources/patterns.js +3 -1
- package/dist/resources/specs.js +3 -1
- package/dist/resources/templates.js +3 -1
- package/dist/security/adapters/environment.d.ts +12 -0
- package/dist/security/adapters/environment.js +25 -0
- package/dist/security/adapters/linux-secret-service.d.ts +8 -0
- package/dist/security/adapters/linux-secret-service.js +60 -0
- package/dist/security/adapters/macos-keychain.d.ts +18 -0
- package/dist/security/adapters/macos-keychain.js +90 -0
- package/dist/security/adapters/windows-credential-manager.d.ts +8 -0
- package/dist/security/adapters/windows-credential-manager.js +58 -0
- package/dist/security/redactor.d.ts +5 -0
- package/dist/security/redactor.js +58 -0
- package/dist/security/secret-field.d.ts +5 -0
- package/dist/security/secret-field.js +17 -0
- package/dist/security/secret-migration.d.ts +3 -0
- package/dist/security/secret-migration.js +123 -0
- package/dist/security/secret-provider.d.ts +23 -0
- package/dist/security/secret-provider.js +145 -0
- package/dist/security/secure-json.d.ts +3 -0
- package/dist/security/secure-json.js +29 -0
- package/dist/storage/api-surfaces-store.js +2 -2
- package/dist/storage/approval-operation-lock.d.ts +1 -1
- package/dist/storage/approval-operation-lock.js +5 -3
- package/dist/storage/audit-trail-store.d.ts +1 -1
- package/dist/storage/audit-trail-store.js +48 -62
- package/dist/storage/autopilot-log-store.js +12 -5
- package/dist/storage/base-store.d.ts +8 -8
- package/dist/storage/base-store.js +57 -20
- package/dist/storage/checkpoint-store.js +5 -2
- package/dist/storage/comments-store.js +2 -2
- package/dist/storage/compliance-audit-store.js +5 -2
- package/dist/storage/compliance-gate-config-store.js +7 -4
- package/dist/storage/compliance-store.js +2 -2
- package/dist/storage/context-profile-store.js +2 -2
- package/dist/storage/crash-shield-store.js +8 -4
- package/dist/storage/feedback-store.js +10 -6
- package/dist/storage/figma-store.js +8 -4
- package/dist/storage/file-mutex.js +9 -1
- package/dist/storage/gaps-log.js +7 -4
- package/dist/storage/global-projects-store.js +4 -2
- package/dist/storage/ideas-store.js +2 -2
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/knowledge-store/knowledge.js +27 -33
- package/dist/storage/lessons-store.js +2 -2
- package/dist/storage/license-store.js +13 -41
- package/dist/storage/migrations/canonical-storage.d.ts +15 -0
- package/dist/storage/migrations/canonical-storage.js +599 -0
- package/dist/storage/oauth-store.js +36 -8
- package/dist/storage/path-resolver.js +16 -3
- package/dist/storage/pr-store.js +2 -2
- package/dist/storage/project-drift-store.js +20 -8
- package/dist/storage/project-identity.d.ts +32 -0
- package/dist/storage/project-identity.js +194 -0
- package/dist/storage/project-resolver.js +14 -7
- package/dist/storage/release-notes-store.js +2 -6
- package/dist/storage/runtime-db.d.ts +186 -0
- package/dist/storage/runtime-db.js +1054 -0
- package/dist/storage/schema-registry.d.ts +5 -0
- package/dist/storage/schema-registry.js +74 -0
- package/dist/storage/sentry-store.js +20 -9
- package/dist/storage/session-state-store.js +12 -5
- package/dist/storage/session-store.js +12 -4
- package/dist/storage/skill-registry-storage.d.ts +1 -1
- package/dist/storage/skill-registry-storage.js +13 -11
- package/dist/storage/slack-store.js +10 -5
- package/dist/storage/spec-store.js +31 -24
- package/dist/storage/status-store/file-lock.js +31 -9
- package/dist/storage/status-store/self-healing.js +10 -5
- package/dist/storage/status-store/version-sync.js +8 -6
- package/dist/storage/steering-store.js +2 -2
- package/dist/storage/storage-bundle.d.ts +5 -0
- package/dist/storage/storage-bundle.js +117 -0
- package/dist/storage/storage-catalog-validation.d.ts +3 -0
- package/dist/storage/storage-catalog-validation.js +20 -0
- package/dist/storage/storage-catalog.d.ts +25 -0
- package/dist/storage/storage-catalog.js +390 -0
- package/dist/storage/storage-layout.d.ts +24 -0
- package/dist/storage/storage-layout.js +101 -0
- package/dist/storage/storybook-store.js +2 -2
- package/dist/storage/supabase-store.js +24 -6
- package/dist/storage/tdd-policy-store.js +8 -6
- package/dist/storage/tech-debt-store.js +3 -3
- package/dist/storage/technology-selection-store.d.ts +1 -1
- package/dist/storage/technology-selection-store.js +6 -3
- package/dist/storage/token-cache-store.js +3 -3
- package/dist/storage/token-ledger-store.js +13 -8
- package/dist/storage/transition-log.js +7 -4
- package/dist/storage/trash-store.js +15 -6
- package/dist/storage/vector-store/migrator.js +7 -2
- package/dist/storage/vector-store/sqlite-adapter.js +4 -1
- package/dist/storage/webhook-server-store.js +2 -2
- package/dist/tools/api-spec-generator-handler.js +3 -2
- package/dist/tools/auto-update-handler.d.ts +1 -1
- package/dist/tools/auto-update-handler.js +1 -1
- package/dist/tools/browser-validate-handler.js +2 -1
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +8 -5
- package/dist/tools/challenge-spec/scenarios-desktop.js +8 -3
- package/dist/tools/challenge-spec/scenarios-failure.js +7 -2
- package/dist/tools/challenge-spec/security-challenge-scenarios.js +3 -3
- package/dist/tools/clarify-requirements/multiple-choice.js +53 -41
- package/dist/tools/comments-handler.js +2 -3
- package/dist/tools/compliance-test-handler.js +2 -2
- package/dist/tools/configure-telemetry.js +11 -11
- package/dist/tools/create-spec/auto-pipeline.js +13 -1
- package/dist/tools/create-spec/autopilot-analyzer.d.ts +1 -1
- package/dist/tools/create-spec/autopilot-analyzer.js +2 -4
- package/dist/tools/create-spec/mcp-tool-contract.d.ts +10 -4
- package/dist/tools/create-spec/mcp-tool-contract.js +7 -36
- package/dist/tools/create-spec/post-creation.d.ts +2 -1
- package/dist/tools/create-spec/post-creation.js +56 -54
- package/dist/tools/create-spec/relevance-scorer.d.ts +1 -1
- package/dist/tools/create-spec/relevance-scorer.js +17 -1
- package/dist/tools/create-spec/spec-builder.js +2 -12
- package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +14 -0
- package/dist/tools/create-spec/spec-created-outbox-consumer.js +176 -0
- package/dist/tools/create-spec.js +385 -520
- package/dist/tools/define-ui-contract/agent-interaction-contract.js +2 -4
- package/dist/tools/define-ui-contract-desktop/desktop-contract.js +12 -4
- package/dist/tools/define-ui-contract-desktop/native-contract.js +7 -3
- package/dist/tools/define-ui-contract-extensions.js +2 -3
- package/dist/tools/define-ui-contract-mobile.js +5 -9
- package/dist/tools/define-ui-contract-web/component-tree.js +4 -3
- package/dist/tools/define-ui-contract.js +7 -4
- package/dist/tools/deploy/deploy-spec.js +2 -4
- package/dist/tools/deploy/deploy-status.js +2 -4
- package/dist/tools/design-schema/nosql-category-schemas.js +2 -3
- package/dist/tools/design-schema-sql/migrations.js +3 -2
- package/dist/tools/design-schema-sql/tables.js +4 -1
- package/dist/tools/design-schema.js +4 -3
- package/dist/tools/feedback-handler.js +2 -4
- package/dist/tools/gc-data-projects.js +5 -5
- package/dist/tools/generate-execution-plan.js +3 -4
- package/dist/tools/generate-sub-agent.js +2 -1
- package/dist/tools/generate-tests/generators/a11y-tests-generator.js +5 -4
- package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator/js-templates.js +9 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator.js +8 -4
- package/dist/tools/generate-tests/generators/database/detectors.js +9 -3
- package/dist/tools/generate-tests/generators/database/index.js +2 -4
- package/dist/tools/generate-tests/generators/event-test-generator.js +5 -4
- package/dist/tools/generate-tests/generators/game-tests-generator.js +2 -1
- package/dist/tools/generate-tests/generators/graphql-test-generator.js +11 -5
- package/dist/tools/generate-tests/generators/grpc-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/llm-security-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/local-first-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/mcp-tests-generator.js +11 -9
- package/dist/tools/generate-tests/generators/microservices/index.js +2 -3
- package/dist/tools/generate-tests/generators/otel-test-generator.js +6 -3
- package/dist/tools/generate-tests/generators/security/detectors.js +2 -5
- package/dist/tools/generate-tests/generators/security/index.js +2 -4
- package/dist/tools/generate-tests/generators/supply-chain-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/visual-regression-generator.js +14 -17
- package/dist/tools/generate-tests/generators/websocket-test-generator.js +2 -3
- package/dist/tools/generate-tests/test-helpers.js +11 -12
- package/dist/tools/generate-tests-content.js +4 -3
- package/dist/tools/generate-tests.js +7 -4
- package/dist/tools/git/git-helpers.d.ts +0 -2
- package/dist/tools/git/git-helpers.js +7 -7
- package/dist/tools/github-pr-handler.js +10 -3
- package/dist/tools/heal-spec-docs.js +6 -53
- package/dist/tools/hook-generator-handler.js +6 -6
- package/dist/tools/init-constitution/platform-principles.js +4 -2
- package/dist/tools/init-project/agents-md-writer.js +14 -5
- package/dist/tools/init-project/claude-md-generator.js +19 -12
- package/dist/tools/init-project/handler.js +165 -73
- package/dist/tools/init-project/host-assets-writer.d.ts +1 -1
- package/dist/tools/init-project/host-assets-writer.js +4 -2
- package/dist/tools/init-project/lifecycle-helpers.js +3 -5
- package/dist/tools/init-project/lint-scaffolder.js +6 -2
- package/dist/tools/init-project/migration-runner.d.ts +10 -1
- package/dist/tools/init-project/migration-runner.js +68 -3
- package/dist/tools/init-project/per-client-files-writer.js +14 -4
- package/dist/tools/init-project/rules-generator.js +10 -2
- package/dist/tools/init-project/scaffold-writer.d.ts +1 -1
- package/dist/tools/init-project/scaffold-writer.js +17 -15
- package/dist/tools/jobs/handlers.d.ts +15 -0
- package/dist/tools/jobs/handlers.js +126 -0
- package/dist/tools/list-specs.js +35 -34
- package/dist/tools/manage-plugins-handler.js +17 -9
- package/dist/tools/migrate-tech/advanced-handlers.js +3 -2
- package/dist/tools/migrate-tech/build-tool-handlers.js +3 -2
- package/dist/tools/migrate-tech/core-handlers.js +5 -2
- package/dist/tools/migrate-tech/data-handlers.js +6 -3
- package/dist/tools/migrate-tech-advanced/rollback-handlers.js +3 -2
- package/dist/tools/migrate-tech-advanced/service-handlers.js +5 -2
- package/dist/tools/oauth-handler.js +7 -1
- package/dist/tools/register-sdd-tools.d.ts +1 -1
- package/dist/tools/register-sdd-tools.js +5 -0
- package/dist/tools/register-spec-tools/core-spec-tools.js +31 -0
- package/dist/tools/registry/auth.js +13 -5
- package/dist/tools/registry/publish.js +7 -4
- package/dist/tools/resolve-project-path.d.ts +2 -2
- package/dist/tools/resolve-project-path.js +7 -7
- package/dist/tools/reverse-engineer/analyzer.js +14 -14
- package/dist/tools/rollback-release.js +3 -2
- package/dist/tools/safe-handler.js +295 -171
- package/dist/tools/schema-generator-handler.js +2 -1
- package/dist/tools/schemas/output-schemas.d.ts +88 -82
- package/dist/tools/schemas/output-schemas.js +12 -94
- package/dist/tools/schemas/plugins-schemas.js +0 -2
- package/dist/tools/schemas/registry.js +0 -2
- package/dist/tools/schemas/skill-registry-schemas.js +0 -2
- package/dist/tools/schemas/validate-output-schema.d.ts +256 -0
- package/dist/tools/schemas/validate-output-schema.js +212 -0
- package/dist/tools/sentry-handler.js +6 -1
- package/dist/tools/skill-bootstrap-handler.js +7 -4
- package/dist/tools/status-handler.js +4 -0
- package/dist/tools/storage-bundle-handler.d.ts +9 -0
- package/dist/tools/storage-bundle-handler.js +29 -0
- package/dist/tools/storage-paths-handler.d.ts +9 -0
- package/dist/tools/storage-paths-handler.js +17 -0
- package/dist/tools/suggest-mcp-server.js +11 -5
- package/dist/tools/suggest-mcps.js +29 -9
- package/dist/tools/suggest-tooling/advanced-testing-catalog.js +4 -5
- package/dist/tools/suggest-tooling/build-tool-catalog.js +2 -1
- package/dist/tools/suggest-tooling/css-framework-catalog.js +13 -7
- package/dist/tools/suggest-tooling/framework-catalog.js +3 -5
- package/dist/tools/suggest-tooling/frontend-perf-catalog.js +2 -6
- package/dist/tools/suggest-tooling/handler.js +10 -4
- package/dist/tools/suggest-tooling/hypermedia-catalog.js +11 -3
- package/dist/tools/suggest-tooling/linting-catalog.js +4 -7
- package/dist/tools/suggest-tooling/llm-security-catalog.js +2 -1
- package/dist/tools/suggest-tooling/local-first-catalog.js +7 -5
- package/dist/tools/suggest-tooling/observability-catalog.js +3 -4
- package/dist/tools/suggest-tooling/otel-catalog.js +4 -1
- package/dist/tools/suggest-tooling/resilience-catalog.js +16 -5
- package/dist/tools/suggest-tooling/skills-catalog.js +10 -9
- package/dist/tools/suggest-tooling/supply-chain-catalog.js +2 -3
- package/dist/tools/supabase-handler.js +2 -1
- package/dist/tools/token-intelligence-handler.js +2 -2
- package/dist/tools/token-recording.js +2 -2
- package/dist/tools/token-savings-handler.js +2 -2
- package/dist/tools/tool-registry/core-tools.js +131 -0
- package/dist/tools/tool-registry/group-infra.js +10 -12
- package/dist/tools/tool-registry/group-quality-compliance.js +5 -12
- package/dist/tools/update-status/approval-gates.d.ts +13 -0
- package/dist/tools/update-status/approval-gates.js +81 -0
- package/dist/tools/update-status/batch.js +4 -2
- package/dist/tools/update-status/dod-gates.d.ts +6 -24
- package/dist/tools/update-status/dod-gates.js +60 -135
- package/dist/tools/update-status/done-receipt-verifier.d.ts +15 -0
- package/dist/tools/update-status/done-receipt-verifier.js +145 -0
- package/dist/tools/update-status/evidence-gate.js +154 -2
- package/dist/tools/update-status/file-sync.js +23 -12
- package/dist/tools/update-status/gate-harness.d.ts +7 -0
- package/dist/tools/update-status/gate-harness.js +8 -0
- package/dist/tools/update-status/index.js +228 -325
- package/dist/tools/update-status/qa-gate.d.ts +1 -1
- package/dist/tools/update-status/qa-gate.js +2 -2
- package/dist/tools/update-status/side-effects.js +30 -37
- package/dist/tools/update-status/transition-guard.d.ts +4 -2
- package/dist/tools/update-status/transition-guard.js +57 -10
- package/dist/tools/update-status-convention-gate.js +24 -23
- package/dist/tools/update-status-reconcile.js +2 -2
- package/dist/tools/validate-api-contract-handler.js +3 -3
- package/dist/tools/validate-lint.js +20 -13
- package/dist/tools/validate.d.ts +3 -1
- package/dist/tools/validate.js +213 -5
- package/dist/transports/http-transport.js +84 -61
- package/dist/transports/middleware/with-telemetry.js +3 -2
- package/dist/types/abortable-process.d.ts +2 -0
- package/dist/types/advanced-framework.js +0 -2
- package/dist/types/atomic-upgrade.d.ts +71 -0
- package/dist/types/atomic-upgrade.js +2 -0
- package/dist/types/ci.js +0 -2
- package/dist/types/core-bridge.d.ts +78 -1
- package/dist/types/crash-shield-framework-rules.d.ts +24 -0
- package/dist/types/crash-shield-framework-rules.js +2 -0
- package/dist/types/data-gc.d.ts +16 -0
- package/dist/types/deploy.js +0 -2
- package/dist/types/durable-job.d.ts +78 -0
- package/dist/types/durable-job.js +2 -0
- package/dist/types/durable-validation.d.ts +60 -0
- package/dist/types/durable-validation.js +2 -0
- package/dist/types/estimation.d.ts +2 -0
- package/dist/types/evidence-gates.d.ts +9 -1
- package/dist/types/execution.d.ts +43 -0
- package/dist/types/handoff-artifacts.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/infrastructure.js +0 -2
- package/dist/types/lifecycle.js +0 -2
- package/dist/types/migration/canonical-storage.d.ts +37 -0
- package/dist/types/migration/canonical-storage.js +2 -0
- package/dist/types/migration/index.d.ts +1 -1
- package/dist/types/native-worker.d.ts +48 -0
- package/dist/types/native-worker.js +2 -0
- package/dist/types/network-policy.d.ts +12 -0
- package/dist/types/network-policy.js +2 -0
- package/dist/types/oauth.js +0 -2
- package/dist/types/observability.d.ts +32 -0
- package/dist/types/outbox-worker.d.ts +35 -0
- package/dist/types/outbox-worker.js +11 -0
- package/dist/types/permissions-config.d.ts +0 -27
- package/dist/types/permissions-config.js +0 -2
- package/dist/types/plugin-install.d.ts +0 -11
- package/dist/types/plugin-install.js +0 -2
- package/dist/types/portal.d.ts +1 -0
- package/dist/types/product-public.d.ts +75 -0
- package/dist/types/product-public.js +2 -0
- package/dist/types/project/inputs.d.ts +2 -0
- package/dist/types/project/mfe-detection.js +0 -2
- package/dist/types/project/platform-mobile.js +0 -2
- package/dist/types/project/platform-specialty.js +0 -2
- package/dist/types/project-knowledge-graph.d.ts +7 -0
- package/dist/types/runtime-database.d.ts +10 -0
- package/dist/types/runtime-database.js +2 -0
- package/dist/types/runtime-policy.d.ts +40 -0
- package/dist/types/runtime-policy.js +2 -0
- package/dist/types/safety.d.ts +4 -5
- package/dist/types/schema-registry.d.ts +12 -0
- package/dist/types/schema-registry.js +2 -0
- package/dist/types/security.d.ts +52 -0
- package/dist/types/skill-registry.js +0 -2
- package/dist/types/spec/inputs.d.ts +2 -0
- package/dist/types/spec-lock-v2.d.ts +13 -7
- package/dist/types/spec-lock-v2.js +1 -1
- package/dist/types/spec-registry.js +0 -2
- package/dist/types/storage-bundle.d.ts +13 -0
- package/dist/types/storage-bundle.js +2 -0
- package/dist/types/storage-catalog.d.ts +18 -0
- package/dist/types/storage-catalog.js +2 -0
- package/dist/types/team-planner.js +0 -2
- package/dist/types/technology-registry.d.ts +35 -0
- package/dist/types/technology-registry.js +2 -0
- package/dist/types/technology-symbols.generated.d.ts +117 -0
- package/dist/types/technology-symbols.generated.js +2 -0
- package/dist/types/telemetry.d.ts +3 -3
- package/dist/types/transport.d.ts +2 -0
- package/dist/types/validate-worker.d.ts +44 -0
- package/dist/types/validate-worker.js +2 -0
- package/dist/types/validation-evidence.d.ts +1 -1
- package/dist/types/validation-receipt.d.ts +104 -0
- package/dist/types/validation-receipt.js +2 -0
- package/package.json +31 -20
- package/planu-native.json +1 -1
- package/planu-plugin.json +1 -1
- package/dist/engine/telemetry/geo-resolver.d.ts +0 -9
- package/dist/engine/telemetry/geo-resolver.js +0 -43
- package/dist/storage/data-dir-discovery.d.ts +0 -31
- package/dist/storage/data-dir-discovery.js +0 -140
- package/dist/storage/migrations/cwd-to-absolute.d.ts +0 -25
- package/dist/storage/migrations/cwd-to-absolute.js +0 -281
- package/dist/tools/create-spec/adapters/prior-decisions-hint.d.ts +0 -14
- package/dist/tools/create-spec/adapters/prior-decisions-hint.js +0 -30
- package/dist/tools/init-project/ancestor-data-detector.d.ts +0 -22
- package/dist/tools/init-project/ancestor-data-detector.js +0 -81
- package/dist/tools/update-status/force-done-audit.d.ts +0 -2
- package/dist/tools/update-status/force-done-audit.js +0 -23
- package/dist/types/migration/cwd-to-absolute.d.ts +0 -8
- 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
|
|
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>(
|
|
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(
|
|
23
|
-
const normalizedProjectPath =
|
|
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
|
-
*
|
|
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 {
|
|
4
|
+
import { globalDataDir } from './base-store.js';
|
|
5
5
|
/** Path to the global audit trail JSONL file. */
|
|
6
|
-
|
|
7
|
-
|
|
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(
|
|
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
|
-
*
|
|
19
|
+
* Fails closed: callers must observe and handle an audit persistence failure.
|
|
19
20
|
*/
|
|
20
21
|
export function appendEntry(entry) {
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
94
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
//
|
|
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:
|
|
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
|
|
54
|
-
*
|
|
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:
|
|
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 {
|
|
5
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
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:
|
|
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
|
|
127
|
-
*
|
|
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 (
|
|
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
|
|
137
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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((
|
|
200
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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), []);
|