@planu/cli 4.13.0 → 4.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +24 -24
- 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
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
import { technologyValue } from '../../engine/technology-registry.js';
|
|
1
2
|
function wrap(name, content) {
|
|
2
3
|
return `<!-- planu:${name} -->\n${content}\n<!-- planu:${name} -->`;
|
|
3
4
|
}
|
|
4
|
-
const SERVERLESS_PLATFORMS = [
|
|
5
|
+
const SERVERLESS_PLATFORMS = [
|
|
6
|
+
technologyValue('technology-vercel-9d3508'),
|
|
7
|
+
technologyValue('technology-netlify-58465a'),
|
|
8
|
+
'lambda',
|
|
9
|
+
'cloudflare-workers',
|
|
10
|
+
'deno-deploy',
|
|
11
|
+
];
|
|
5
12
|
function isServerlessPlatform(knowledge) {
|
|
6
13
|
const services = knowledge.externalServices.map((s) => s.toLowerCase());
|
|
7
14
|
const deployPlatform = (knowledge.conventions['deploy-platform'] ?? '').toLowerCase();
|
|
@@ -110,14 +117,14 @@ function buildArchitecture(knowledge) {
|
|
|
110
117
|
return wrap('architecture', `## Architecture\n${items.join('\n')}`);
|
|
111
118
|
}
|
|
112
119
|
function detectTestFramework(testCommand) {
|
|
113
|
-
if (testCommand.includes('vitest')) {
|
|
114
|
-
return '
|
|
120
|
+
if (testCommand.includes(technologyValue('technology-vitest-a9127f'))) {
|
|
121
|
+
return technologyValue('technology-vitest-7fc39e');
|
|
115
122
|
}
|
|
116
|
-
if (testCommand.includes('jest')) {
|
|
117
|
-
return '
|
|
123
|
+
if (testCommand.includes(technologyValue('technology-jest-35e99f'))) {
|
|
124
|
+
return technologyValue('technology-jest-1f30f0');
|
|
118
125
|
}
|
|
119
|
-
if (testCommand.includes('pytest')) {
|
|
120
|
-
return 'pytest';
|
|
126
|
+
if (testCommand.includes(technologyValue('technology-pytest-2b0121'))) {
|
|
127
|
+
return technologyValue('technology-pytest-2b0121');
|
|
121
128
|
}
|
|
122
129
|
if (testCommand.includes('go test')) {
|
|
123
130
|
return 'go test';
|
|
@@ -165,9 +172,9 @@ function buildCiCd(knowledge) {
|
|
|
165
172
|
return wrap('cicd', `## CI/CD\n- **Platform**: ${label}`);
|
|
166
173
|
}
|
|
167
174
|
const DEPLOY_PLATFORM_MAP = {
|
|
168
|
-
vercel: '
|
|
169
|
-
netlify: '
|
|
170
|
-
railway: '
|
|
175
|
+
vercel: technologyValue('technology-vercel-68edc7'),
|
|
176
|
+
netlify: technologyValue('technology-netlify-55c13c'),
|
|
177
|
+
railway: technologyValue('technology-railway-3e12c4'),
|
|
171
178
|
heroku: 'Heroku',
|
|
172
179
|
'aws-lambda': 'AWS Lambda',
|
|
173
180
|
'aws-ecs': 'AWS ECS',
|
|
@@ -176,8 +183,8 @@ const DEPLOY_PLATFORM_MAP = {
|
|
|
176
183
|
fly: 'Fly.io',
|
|
177
184
|
render: 'Render',
|
|
178
185
|
cloudflare: 'Cloudflare Pages/Workers',
|
|
179
|
-
docker: '
|
|
180
|
-
kubernetes: '
|
|
186
|
+
docker: technologyValue('technology-docker-e6169e'),
|
|
187
|
+
kubernetes: technologyValue('technology-kubernetes-a37d07'),
|
|
181
188
|
};
|
|
182
189
|
function buildDeployment(knowledge) {
|
|
183
190
|
const fromConventions = knowledge.conventions['deploy-platform'] ?? null;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { technologyValue } from '../../engine/technology-registry.js';
|
|
1
2
|
import { elicitOrFallback, questionsToFormSchema } from '../../engine/elicitation/elicit-helper.js';
|
|
2
3
|
import { ti } from '../../i18n/index.js';
|
|
3
4
|
import { AutopilotSummaryCollector } from '../../engine/autopilot/summary-collector.js';
|
|
4
|
-
import {
|
|
5
|
+
import { knowledgeStore, globalStore, licenseStore, technologySelectionStore, projectDataDir, } from '../../storage/index.js';
|
|
6
|
+
import { migrateCanonicalStorage } from '../../storage/migrations/canonical-storage.js';
|
|
7
|
+
import { deriveWorkspaceKey, ensureProjectIdentity } from '../../storage/project-identity.js';
|
|
8
|
+
import { resolveStorageLayout } from '../../storage/storage-layout.js';
|
|
5
9
|
import { addProject } from '../../storage/global-projects-store.js';
|
|
6
10
|
import { getCurrentTier } from '../license-gate.js';
|
|
7
11
|
import { checkLimits } from '../../engine/license-validator.js';
|
|
@@ -19,11 +23,12 @@ import { detectStackPatterns } from './stack-detector.js';
|
|
|
19
23
|
import { buildProjectConfig } from './config-builder.js';
|
|
20
24
|
import { runSpecMigrations, listProjectSpecs } from './migration-runner.js';
|
|
21
25
|
import { runScaffoldWriter } from './scaffold-writer.js';
|
|
22
|
-
import { detectAncestorDataDirs, buildAncestorDataWarning } from './ancestor-data-detector.js';
|
|
23
26
|
import { readAutoInstallFlag, orchestrateSkillInstalls, runHealthCheckWithBaseline, runConventionScanSafe, fireTelemetry, } from './lifecycle-helpers.js';
|
|
24
27
|
import { injectProactiveRules } from '../../engine/claude-md-injector/index.js';
|
|
25
28
|
import { discoverSkillsForInit } from '../../engine/skill-bootstrap/registry-fetcher.js';
|
|
26
29
|
import { join } from 'node:path';
|
|
30
|
+
import { createHash } from 'node:crypto';
|
|
31
|
+
import { homedir } from 'node:os';
|
|
27
32
|
import { mkdir, stat } from 'node:fs/promises';
|
|
28
33
|
import { generateAgentTeamsRulesIfMissing, generateWorkflowRulesIfMissing, } from './rules-generator.js';
|
|
29
34
|
import { installUniversalRules } from '../../engine/universal-rules/installer.js';
|
|
@@ -37,14 +42,27 @@ import { applyStackBasedGroupActivations } from './tool-group-activator.js';
|
|
|
37
42
|
import { checkGate } from '../../engine/clarification-gate/gate.js';
|
|
38
43
|
import { upsertToken, hashQuestions } from '../../engine/clarification-gate/token-store.js';
|
|
39
44
|
import { reconcileInteractiveQuestionHooks } from '../reconcile-interactive-question-hooks.js';
|
|
45
|
+
import { installSessionSafeguardHook } from '../reconcile-session-safeguard-hook.js';
|
|
40
46
|
import { resolveNewProjectOnboarding } from '../../engine/onboarding/new-project-resolver.js';
|
|
41
47
|
import { interactiveResult } from '../response-helpers.js';
|
|
42
48
|
/** Frontend framework groups — mutually exclusive. Two or more detected → multi-stack conflict. */
|
|
43
49
|
const FRONTEND_FRAMEWORK_GROUPS = [
|
|
44
|
-
[
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
[
|
|
51
|
+
technologyValue('technology-react-275976'),
|
|
52
|
+
'next',
|
|
53
|
+
technologyValue('technology-next-js-0d857f'),
|
|
54
|
+
technologyValue('technology-nextjs-c93379'),
|
|
55
|
+
technologyValue('technology-remix-0c5d96'),
|
|
56
|
+
'preact',
|
|
57
|
+
],
|
|
58
|
+
[
|
|
59
|
+
technologyValue('technology-vue-564382'),
|
|
60
|
+
technologyValue('technology-nuxt-22c407'),
|
|
61
|
+
'nuxt.js',
|
|
62
|
+
'nuxtjs',
|
|
63
|
+
],
|
|
64
|
+
[technologyValue('technology-angular-a39f89'), 'angularjs'],
|
|
65
|
+
[technologyValue('technology-svelte-c190ac'), technologyValue('technology-sveltekit-eefb03')],
|
|
48
66
|
['solid', 'solidstart'],
|
|
49
67
|
['qwik'],
|
|
50
68
|
['ember'],
|
|
@@ -71,16 +89,6 @@ function detectMultipleFrameworks(stack) {
|
|
|
71
89
|
}
|
|
72
90
|
// eslint-disable-next-line max-lines-per-function
|
|
73
91
|
export async function handleInitProject(params, server) {
|
|
74
|
-
// SPEC-584: Gate check — block if pending clarification token exists and no answers provided
|
|
75
|
-
const gateProjectId = hashProjectPath(params.projectPath);
|
|
76
|
-
const gateResult = await checkGate({
|
|
77
|
-
projectId: gateProjectId,
|
|
78
|
-
toolName: 'init_project',
|
|
79
|
-
clarificationAnswers: params.clarificationAnswers,
|
|
80
|
-
});
|
|
81
|
-
if (!gateResult.allow) {
|
|
82
|
-
return gateResult.error;
|
|
83
|
-
}
|
|
84
92
|
// eslint-disable-next-line max-lines-per-function, complexity
|
|
85
93
|
return trackCost(params.projectPath, 'init_project', async () => {
|
|
86
94
|
const { projectPath, mode, locale, hourlyRate, experienceLevel, userProfile, autoInstallSkills, workMode, } = params;
|
|
@@ -137,42 +145,119 @@ export async function handleInitProject(params, server) {
|
|
|
137
145
|
};
|
|
138
146
|
}
|
|
139
147
|
}
|
|
140
|
-
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
// Legacy identities were the first 16 chars (and, briefly, all 64 chars)
|
|
149
|
+
// of the raw path hash. Derive them independently of project.json so a
|
|
150
|
+
// second init can still discover pre-cutover storage.
|
|
151
|
+
const legacyFullProjectId = createHash('sha256').update(projectPath).digest('hex');
|
|
152
|
+
const legacyProjectId = legacyFullProjectId.slice(0, 16);
|
|
153
|
+
const hadProjectIdentity = await stat(join(projectPath, 'planu', 'project.json'))
|
|
154
|
+
.then((identityStat) => identityStat.isFile())
|
|
155
|
+
.catch(() => false);
|
|
156
|
+
const identity = await ensureProjectIdentity(projectPath, {
|
|
157
|
+
workspaceKey: await deriveWorkspaceKey(projectPath),
|
|
158
|
+
});
|
|
159
|
+
const logicalProjectId = identity.project.logicalProjectId;
|
|
160
|
+
const projectId = /^[0-9a-f-]{36}$/i.test(logicalProjectId)
|
|
161
|
+
? logicalProjectId.replaceAll('-', '').toLowerCase()
|
|
162
|
+
: logicalProjectId;
|
|
163
|
+
// The clarification gate is keyed by the portable identity. Creating the
|
|
164
|
+
// identity must happen first so init never falls back to a path-derived ID.
|
|
165
|
+
const gateResult = await checkGate({
|
|
166
|
+
projectId,
|
|
167
|
+
toolName: 'init_project',
|
|
168
|
+
clarificationAnswers: params.clarificationAnswers,
|
|
169
|
+
});
|
|
170
|
+
if (!gateResult.allow) {
|
|
171
|
+
return gateResult.error;
|
|
151
172
|
}
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
173
|
+
// The only accepted legacy source is derived from the explicit projectPath.
|
|
174
|
+
// There is no CWD/ancestor discovery, so launching MCP elsewhere cannot
|
|
175
|
+
// select a different state tree.
|
|
176
|
+
const destinationRoot = projectDataDir(projectId);
|
|
177
|
+
const legacyRoots = [
|
|
178
|
+
join(projectPath, 'data', 'projects', legacyProjectId),
|
|
179
|
+
join(resolveStorageLayout().projects, legacyProjectId),
|
|
180
|
+
join(resolveStorageLayout().projects, legacyFullProjectId),
|
|
181
|
+
join(homedir(), '.planu', 'data', 'projects', legacyProjectId),
|
|
182
|
+
join(homedir(), '.planu', 'data', 'projects', legacyFullProjectId),
|
|
183
|
+
].filter((root) => root !== destinationRoot);
|
|
184
|
+
const migration = await migrateCanonicalStorage({ legacyRoots, destinationRoot });
|
|
185
|
+
if (migration.status === 'error' || migration.status === 'rolled-back') {
|
|
186
|
+
return {
|
|
187
|
+
content: [
|
|
188
|
+
{ type: 'text', text: migration.reason ?? 'Canonical storage migration failed.' },
|
|
189
|
+
],
|
|
190
|
+
isError: true,
|
|
191
|
+
};
|
|
159
192
|
}
|
|
160
193
|
// Check if project is already initialized
|
|
161
194
|
const existing = await knowledgeStore.getKnowledge(projectId);
|
|
162
|
-
const isUpdate = existing !== null;
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
195
|
+
const isUpdate = hadProjectIdentity || existing !== null;
|
|
196
|
+
const authorizedMigrations = params.authorizedMigrations ?? [];
|
|
197
|
+
if (isUpdate && authorizedMigrations.length === 0) {
|
|
198
|
+
return {
|
|
199
|
+
content: [
|
|
200
|
+
{
|
|
201
|
+
type: 'text',
|
|
202
|
+
text: 'Project already initialized. Safe update completed without changing repository files.',
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
structuredContent: {
|
|
206
|
+
projectId,
|
|
207
|
+
projectPath,
|
|
208
|
+
isUpdate: true,
|
|
209
|
+
repositoryFilesChanged: [],
|
|
210
|
+
authorizedMigrations: [],
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (isUpdate) {
|
|
215
|
+
if (existing === null) {
|
|
216
|
+
return {
|
|
217
|
+
content: [
|
|
218
|
+
{
|
|
219
|
+
type: 'text',
|
|
220
|
+
text: 'Repository migration requires recovered canonical project knowledge.',
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
isError: true,
|
|
224
|
+
};
|
|
170
225
|
}
|
|
226
|
+
const migrationResult = await runSpecMigrations(projectPath, projectId, existing, {
|
|
227
|
+
repositoryMigration: 'planu-spec-format-v1',
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
content: [
|
|
231
|
+
{
|
|
232
|
+
type: 'text',
|
|
233
|
+
text: migrationResult.criticalMigrationFailures.length === 0
|
|
234
|
+
? 'Authorized planu-spec-format-v1 migration completed.'
|
|
235
|
+
: `Authorized migration completed with ${String(migrationResult.criticalMigrationFailures.length)} blocking issue(s).`,
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
structuredContent: {
|
|
239
|
+
projectId,
|
|
240
|
+
projectPath,
|
|
241
|
+
isUpdate: true,
|
|
242
|
+
authorizedMigrations,
|
|
243
|
+
repositoryFilesChanged: migrationResult.changedPaths ?? [],
|
|
244
|
+
migrationReportPath: migrationResult.migrationReportPath,
|
|
245
|
+
criticalMigrationFailures: migrationResult.criticalMigrationFailures,
|
|
246
|
+
},
|
|
247
|
+
...(migrationResult.criticalMigrationFailures.length > 0 ? { isError: true } : {}),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// The update branches returned above; only new projects reach the limit gate.
|
|
251
|
+
const tier = await getCurrentTier();
|
|
252
|
+
const projectCount = await licenseStore.countActiveProjects();
|
|
253
|
+
const limitCheck = checkLimits(tier, projectCount, 'maxProjects');
|
|
254
|
+
if (!limitCheck.allowed) {
|
|
255
|
+
return { content: [{ type: 'text', text: limitCheck.message }], isError: true };
|
|
171
256
|
}
|
|
172
257
|
// Get global config for defaults
|
|
173
258
|
const globalConfig = await globalStore.getGlobalConfig();
|
|
174
|
-
const effectiveLocale = locale ??
|
|
175
|
-
const effectiveExperience = experienceLevel ??
|
|
259
|
+
const effectiveLocale = locale ?? globalConfig.defaultLocale;
|
|
260
|
+
const effectiveExperience = experienceLevel ?? globalConfig.defaultExperienceLevel;
|
|
176
261
|
// Run full project analysis
|
|
177
262
|
const knowledge = await analyzeProject(projectPath, projectId, effectiveLocale, effectiveExperience);
|
|
178
263
|
if (approvedTechnologyContract !== null) {
|
|
@@ -219,15 +304,18 @@ export async function handleInitProject(params, server) {
|
|
|
219
304
|
interactiveQuestions: questions,
|
|
220
305
|
},
|
|
221
306
|
};
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
307
|
+
try {
|
|
308
|
+
await upsertToken({
|
|
309
|
+
toolName: 'init_project',
|
|
310
|
+
projectId,
|
|
311
|
+
questionsHash: hashQuestions(questions),
|
|
312
|
+
emittedAt: new Date().toISOString(),
|
|
313
|
+
questions,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
229
317
|
/* best-effort */
|
|
230
|
-
}
|
|
318
|
+
}
|
|
231
319
|
return earlyReturn;
|
|
232
320
|
}
|
|
233
321
|
// SPEC-026a: Compute project completeness score
|
|
@@ -271,14 +359,16 @@ export async function handleInitProject(params, server) {
|
|
|
271
359
|
const configResult = await buildProjectConfig(projectPath, projectId, knowledge, workMode);
|
|
272
360
|
const { planuConfigPath, planuConfigGenerated, whatsNew } = configResult;
|
|
273
361
|
// Run spec migrations (v0.30 -> v0.40, legacy paths, prefix normalization)
|
|
274
|
-
const { discoveryResult, migrationResult, folderMigrationResult, criticalMigrationFailures, nonCriticalWarnings: nonCriticalMigrationWarnings, migrationReportPath, } = await runSpecMigrations(projectPath, projectId, knowledge
|
|
362
|
+
const { discoveryResult, migrationResult, folderMigrationResult, criticalMigrationFailures, nonCriticalWarnings: nonCriticalMigrationWarnings, migrationReportPath, changedPaths: migrationChangedPaths = [], } = await runSpecMigrations(projectPath, projectId, knowledge, {
|
|
363
|
+
repositoryMigration: 'initialization',
|
|
364
|
+
});
|
|
275
365
|
// Auto-fetch recommended skills based on detected stack
|
|
276
366
|
const recommendedSkills = await fetchRecommendedSkills(knowledge);
|
|
277
367
|
// Auto-install or queue skills (opt-out via planu.json or input param, SPEC-185)
|
|
278
368
|
const autoInstallFromConfig = autoInstallSkills ?? (await readAutoInstallFlag(planuConfigPath));
|
|
279
369
|
const { skillsAutoInstalled, skillsPendingInstall, skillsSkipped } = await orchestrateSkillInstalls(recommendedSkills, projectPath, autoInstallFromConfig);
|
|
280
370
|
// Write scaffold files: rules, git setup, constitution, CLAUDE.md, lint, architecture rules
|
|
281
|
-
const scaffoldResult = await runScaffoldWriter(projectPath, projectId, knowledge, recommendedSkills, params.permissionsMode, params.pluginsMode);
|
|
371
|
+
const scaffoldResult = await runScaffoldWriter(projectPath, projectId, knowledge, recommendedSkills, params.permissionsMode, params.pluginsMode, autoInstallFromConfig);
|
|
282
372
|
const { platform, generatedRules, rulesWritten, additionalFilesWritten, hooksInstalled, gitFlowType, gitignoreUpdated, gitRepoDetected, constitutionInitialized, claudeMdUpdated, eslintCreated, prettierCreated, lintSuggestions, architectureRulesWritten, architectureRulesSkipped, planuWorkflowInjected, planuHooksConfigured, planuRulesWritten, gitAutoStageInjected, } = scaffoldResult;
|
|
283
373
|
// SPEC-444: Inject proactive behavior rules into project CLAUDE.md
|
|
284
374
|
const proactiveRulesInjected = await injectProactiveRules(join(projectPath, 'CLAUDE.md'), '1.22.0')
|
|
@@ -464,20 +554,19 @@ export async function handleInitProject(params, server) {
|
|
|
464
554
|
discoveredRegistrySkills,
|
|
465
555
|
branchInfo,
|
|
466
556
|
});
|
|
557
|
+
if (toolResult.structuredContent) {
|
|
558
|
+
toolResult.structuredContent.repositoryFilesChanged = migrationChangedPaths;
|
|
559
|
+
toolResult.structuredContent.authorizedMigrations = authorizedMigrations;
|
|
560
|
+
}
|
|
467
561
|
// Inject autopilotSummary into structuredContent
|
|
468
562
|
if (collector.hasEntries() && toolResult.structuredContent) {
|
|
469
563
|
toolResult.structuredContent.autopilotSummary = collector.getMessages();
|
|
470
564
|
}
|
|
471
|
-
// SPEC-584:
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
import('../reconcile-session-safeguard-hook.js')
|
|
477
|
-
.then(({ installSessionSafeguardHook }) => installSessionSafeguardHook(projectPath))
|
|
478
|
-
.catch(() => {
|
|
479
|
-
/* best-effort — never block init_project */
|
|
480
|
-
});
|
|
565
|
+
// SPEC-584/585: These installers both mutate .claude/settings.json. Await them
|
|
566
|
+
// sequentially so init_project never returns while repository writes are pending.
|
|
567
|
+
// Failures remain best-effort and must not prevent project initialization.
|
|
568
|
+
await reconcileInteractiveQuestionHooks(projectPath).catch(() => undefined);
|
|
569
|
+
await installSessionSafeguardHook(projectPath).catch(() => undefined);
|
|
481
570
|
// SPEC-595: If interactiveQuestions are present and client supports elicitation, use native UI
|
|
482
571
|
const rawEmitted = toolResult.structuredContent?.interactiveQuestions;
|
|
483
572
|
if (server !== undefined && Array.isArray(rawEmitted) && rawEmitted.length > 0) {
|
|
@@ -500,15 +589,18 @@ export async function handleInitProject(params, server) {
|
|
|
500
589
|
// SPEC-584: Persist token when emitting interactiveQuestions so gate blocks retries
|
|
501
590
|
if (Array.isArray(rawEmitted) && rawEmitted.length > 0) {
|
|
502
591
|
const emittedQuestions = rawEmitted;
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
}
|
|
592
|
+
try {
|
|
593
|
+
await upsertToken({
|
|
594
|
+
toolName: 'init_project',
|
|
595
|
+
projectId,
|
|
596
|
+
questionsHash: hashQuestions(emittedQuestions),
|
|
597
|
+
emittedAt: new Date().toISOString(),
|
|
598
|
+
questions: emittedQuestions,
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
catch {
|
|
602
|
+
/* best-effort — token persistence should not fail the response */
|
|
603
|
+
}
|
|
512
604
|
}
|
|
513
605
|
// SPEC-756: lazy version check — fire-and-forget, non-blocking
|
|
514
606
|
checkBundledVersionGap(2000)
|
|
@@ -17,5 +17,5 @@ export interface InitHostAssetsResult {
|
|
|
17
17
|
* host configs that should stay in sync too.
|
|
18
18
|
*/
|
|
19
19
|
export declare function detectInitAssetHosts(projectPath: string): Promise<InitAssetHost[]>;
|
|
20
|
-
export declare function installInitHostAssets(projectPath: string, _knowledge: ProjectKnowledge): Promise<InitHostAssetsResult>;
|
|
20
|
+
export declare function installInitHostAssets(projectPath: string, _knowledge: ProjectKnowledge, installSkills?: boolean): Promise<InitHostAssetsResult>;
|
|
21
21
|
//# sourceMappingURL=host-assets-writer.d.ts.map
|
|
@@ -153,7 +153,7 @@ async function scaffoldHostConfig(projectPath, host) {
|
|
|
153
153
|
}
|
|
154
154
|
return false;
|
|
155
155
|
}
|
|
156
|
-
export async function installInitHostAssets(projectPath, _knowledge) {
|
|
156
|
+
export async function installInitHostAssets(projectPath, _knowledge, installSkills = true) {
|
|
157
157
|
const detectedHosts = await detectInitAssetHosts(projectPath);
|
|
158
158
|
const rulesInstalled = [];
|
|
159
159
|
const skillsInstalled = [];
|
|
@@ -165,7 +165,9 @@ export async function installInitHostAssets(projectPath, _knowledge) {
|
|
|
165
165
|
continue;
|
|
166
166
|
}
|
|
167
167
|
rulesInstalled.push(...(await installRulesForHost(projectPath, host)));
|
|
168
|
-
|
|
168
|
+
if (installSkills) {
|
|
169
|
+
skillsInstalled.push(...(await installCoreSkillsForHost(projectPath, host)));
|
|
170
|
+
}
|
|
169
171
|
}
|
|
170
172
|
return { detectedHosts, rulesInstalled, skillsInstalled, opencodeConfigured };
|
|
171
173
|
}
|
|
@@ -3,7 +3,7 @@ import { autoInstallRecommendedSkills } from './skill-auto-installer.js';
|
|
|
3
3
|
import { checkProjectHealth, } from '../../engine/project-health-checker.js';
|
|
4
4
|
import { saveBaseline } from '../../storage/convention-baseline.js';
|
|
5
5
|
import { scanProject } from '../../engine/project-scanner/index.js';
|
|
6
|
-
import { isTelemetryEnabled, hasNeverBeenPrompted, markAsPrompted,
|
|
6
|
+
import { isTelemetryEnabled, hasNeverBeenPrompted, markAsPrompted, sendTelemetryEvent, } from '../../engine/telemetry/index.js';
|
|
7
7
|
import { generateProjectRules, writeRules } from '../../engine/rules-generator/index.js';
|
|
8
8
|
import { getWhatsNew } from '../../engine/whats-new.js';
|
|
9
9
|
import { PLANU_VERSION } from '../../config/version.js';
|
|
@@ -102,12 +102,11 @@ export function generateAndWriteRules(projectPath) {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
export async function fireTelemetry(knowledge) {
|
|
105
|
-
const [enabled, neverPrompted
|
|
105
|
+
const [enabled, neverPrompted] = await Promise.all([
|
|
106
106
|
isTelemetryEnabled().catch(() => false),
|
|
107
107
|
hasNeverBeenPrompted().catch(() => false),
|
|
108
|
-
getOrCreateInstallationId().catch(() => ''),
|
|
109
108
|
]);
|
|
110
|
-
if (enabled
|
|
109
|
+
if (enabled) {
|
|
111
110
|
sendTelemetryEvent({
|
|
112
111
|
event: 'init_project',
|
|
113
112
|
properties: {
|
|
@@ -118,7 +117,6 @@ export async function fireTelemetry(knowledge) {
|
|
|
118
117
|
nodeVersion: process.version,
|
|
119
118
|
specCount: knowledge.specCount ?? 0,
|
|
120
119
|
},
|
|
121
|
-
installationId,
|
|
122
120
|
});
|
|
123
121
|
}
|
|
124
122
|
if (neverPrompted) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from '../../engine/technology-registry.js';
|
|
1
2
|
import { readFile, writeFile, access } from 'node:fs/promises';
|
|
2
3
|
import { join } from 'node:path';
|
|
3
4
|
const ESLINT_CONFIG_FILES = [
|
|
@@ -72,7 +73,8 @@ function hasDevDep(packageJson, dep) {
|
|
|
72
73
|
}
|
|
73
74
|
function buildEslintConfig(framework) {
|
|
74
75
|
const isNext = framework?.toLowerCase().includes('next') ?? false;
|
|
75
|
-
const isReact = !isNext &&
|
|
76
|
+
const isReact = !isNext &&
|
|
77
|
+
(framework?.toLowerCase().includes(technologyValue('technology-react-275976')) ?? false);
|
|
76
78
|
if (isNext) {
|
|
77
79
|
return `import nextPlugin from '@next/eslint-plugin-next';
|
|
78
80
|
import tseslint from 'typescript-eslint';
|
|
@@ -143,7 +145,9 @@ export async function scaffoldLintConfig(projectPath, knowledge) {
|
|
|
143
145
|
suggestions: [],
|
|
144
146
|
};
|
|
145
147
|
const lang = knowledge.language.toLowerCase();
|
|
146
|
-
const isJsTs = lang === 'typescript' ||
|
|
148
|
+
const isJsTs = lang === technologyValue('technology-typescript-969545') ||
|
|
149
|
+
lang === 'javascript' ||
|
|
150
|
+
lang === 'unknown';
|
|
147
151
|
if (!isJsTs) {
|
|
148
152
|
// Python/Go/Rust — suggest language-specific linters, skip file generation
|
|
149
153
|
if (lang === 'python') {
|
|
@@ -11,6 +11,10 @@ export interface MigrationRunResult {
|
|
|
11
11
|
renamedCount: number;
|
|
12
12
|
errors: string[];
|
|
13
13
|
} | null;
|
|
14
|
+
filesystemImportResult: {
|
|
15
|
+
importedCount: number;
|
|
16
|
+
errors: string[];
|
|
17
|
+
} | null;
|
|
14
18
|
migrationResult: {
|
|
15
19
|
migratedCount: number;
|
|
16
20
|
errors: string[];
|
|
@@ -22,6 +26,10 @@ export interface MigrationRunResult {
|
|
|
22
26
|
criticalMigrationFailures: MigrationRunIssue[];
|
|
23
27
|
nonCriticalWarnings: MigrationRunIssue[];
|
|
24
28
|
migrationReportPath: string | null;
|
|
29
|
+
changedPaths?: string[];
|
|
30
|
+
}
|
|
31
|
+
interface SpecMigrationOptions {
|
|
32
|
+
repositoryMigration?: 'initialization' | 'planu-spec-format-v1';
|
|
25
33
|
}
|
|
26
34
|
/**
|
|
27
35
|
* Run all spec migration passes during init_project:
|
|
@@ -30,7 +38,8 @@ export interface MigrationRunResult {
|
|
|
30
38
|
* 3. Reconcile stale paths in specs.json
|
|
31
39
|
* 4. Migrate spec folders without SPEC-XXX- prefix
|
|
32
40
|
*/
|
|
33
|
-
export declare function runSpecMigrations(projectPath: string, projectId: string, knowledge: ProjectKnowledge): Promise<MigrationRunResult>;
|
|
41
|
+
export declare function runSpecMigrations(projectPath: string, projectId: string, knowledge: ProjectKnowledge, options?: SpecMigrationOptions): Promise<MigrationRunResult>;
|
|
34
42
|
/** Return all specs for the project (needed by caller for health check refs). */
|
|
35
43
|
export declare function listProjectSpecs(projectId: string): Promise<Spec[]>;
|
|
44
|
+
export {};
|
|
36
45
|
//# sourceMappingURL=migration-runner.d.ts.map
|
|
@@ -1,7 +1,48 @@
|
|
|
1
1
|
// tools/init-project/migration-runner.ts — Spec migration orchestration during init_project
|
|
2
2
|
import { specStore, knowledgeStore } from '../../storage/index.js';
|
|
3
3
|
import { projectDataDir, writeJson } from '../../storage/base-store.js';
|
|
4
|
-
import { filterLegacySpecs, migrateSpecs, filterUnprefixedSpecs, migrateSpecFolderNames, discoverAndFlattenSpecs, reconcileSpecPaths, migrateAllSpecsToLean, } from '../../engine/spec-migrator.js';
|
|
4
|
+
import { filterLegacySpecs, migrateSpecs, filterUnprefixedSpecs, migrateSpecFolderNames, discoverAndFlattenSpecs, reconcileSpecPaths, migrateAllSpecsToLean, importFilesystemSpecs, } from '../../engine/spec-migrator.js';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { lstat, readFile, readdir, readlink } from 'node:fs/promises';
|
|
7
|
+
import { join, relative } from 'node:path';
|
|
8
|
+
async function snapshotPlanuTree(projectPath) {
|
|
9
|
+
const root = join(projectPath, 'planu');
|
|
10
|
+
const snapshot = new Map();
|
|
11
|
+
const pending = [root];
|
|
12
|
+
try {
|
|
13
|
+
while (pending.length > 0) {
|
|
14
|
+
const directory = pending.pop();
|
|
15
|
+
if (directory === undefined) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const entries = await readdir(directory, { withFileTypes: true }).catch(() => []);
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
const absolute = join(directory, entry.name);
|
|
21
|
+
const path = relative(projectPath, absolute).replaceAll('\\', '/');
|
|
22
|
+
if (entry.isDirectory()) {
|
|
23
|
+
pending.push(absolute);
|
|
24
|
+
}
|
|
25
|
+
else if (entry.isSymbolicLink()) {
|
|
26
|
+
snapshot.set(path, `link:${await readlink(absolute)}`);
|
|
27
|
+
}
|
|
28
|
+
else if ((await lstat(absolute)).isFile()) {
|
|
29
|
+
snapshot.set(path, createHash('sha256')
|
|
30
|
+
.update(await readFile(absolute))
|
|
31
|
+
.digest('hex'));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Test doubles and unreadable files degrade reporting, never migration safety.
|
|
38
|
+
}
|
|
39
|
+
return snapshot;
|
|
40
|
+
}
|
|
41
|
+
function changedPaths(before, after) {
|
|
42
|
+
return [...new Set([...before.keys(), ...after.keys()])]
|
|
43
|
+
.filter((path) => before.get(path) !== after.get(path))
|
|
44
|
+
.sort();
|
|
45
|
+
}
|
|
5
46
|
function issueFromError(phase, severity, err) {
|
|
6
47
|
return {
|
|
7
48
|
phase,
|
|
@@ -19,7 +60,9 @@ function issuesFromMessages(phase, severity, messages) {
|
|
|
19
60
|
* 3. Reconcile stale paths in specs.json
|
|
20
61
|
* 4. Migrate spec folders without SPEC-XXX- prefix
|
|
21
62
|
*/
|
|
22
|
-
export async function runSpecMigrations(projectPath, projectId, knowledge) {
|
|
63
|
+
export async function runSpecMigrations(projectPath, projectId, knowledge, options = {}) {
|
|
64
|
+
const before = await snapshotPlanuTree(projectPath);
|
|
65
|
+
const authorizedUpdate = options.repositoryMigration === 'planu-spec-format-v1';
|
|
23
66
|
// Auto-discover and flatten specs in subcategory folders (v0.30 → v0.40 migration)
|
|
24
67
|
let discoveryResult = null;
|
|
25
68
|
const criticalMigrationFailures = [];
|
|
@@ -31,6 +74,16 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
|
|
|
31
74
|
catch (err) {
|
|
32
75
|
criticalMigrationFailures.push(issueFromError('discover-and-flatten-specs', 'critical', err));
|
|
33
76
|
}
|
|
77
|
+
// Rebuild missing mutable index records from the portable Git contract.
|
|
78
|
+
// This is required after a storage-root migration or a clean-machine import.
|
|
79
|
+
let filesystemImportResult = null;
|
|
80
|
+
try {
|
|
81
|
+
filesystemImportResult = await importFilesystemSpecs(projectPath, { listSpecs: specStore.listSpecs, createSpec: specStore.createSpec }, projectId);
|
|
82
|
+
criticalMigrationFailures.push(...issuesFromMessages('filesystem-spec-import', 'critical', filesystemImportResult.errors));
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
criticalMigrationFailures.push(issueFromError('filesystem-spec-import', 'critical', err));
|
|
86
|
+
}
|
|
34
87
|
// Auto-migrate legacy specs if detected (docs/sdd/specs/ → planu/specs/)
|
|
35
88
|
let allSpecs = [];
|
|
36
89
|
try {
|
|
@@ -41,7 +94,14 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
|
|
|
41
94
|
}
|
|
42
95
|
const legacySpecs = filterLegacySpecs(allSpecs);
|
|
43
96
|
let migrationResult = null;
|
|
44
|
-
if (legacySpecs.length > 0) {
|
|
97
|
+
if (legacySpecs.length > 0 && authorizedUpdate) {
|
|
98
|
+
criticalMigrationFailures.push({
|
|
99
|
+
phase: 'legacy-spec-migration',
|
|
100
|
+
severity: 'critical',
|
|
101
|
+
message: 'planu-spec-format-v1 is confined to planu/ and cannot migrate legacy docs/sdd paths.',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else if (legacySpecs.length > 0) {
|
|
45
105
|
try {
|
|
46
106
|
migrationResult = await migrateSpecs(projectPath, legacySpecs, {
|
|
47
107
|
listSpecs: specStore.listSpecs,
|
|
@@ -110,6 +170,7 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
|
|
|
110
170
|
catch (err) {
|
|
111
171
|
criticalMigrationFailures.push(issueFromError('strict-planu-cleanup', 'critical', err));
|
|
112
172
|
}
|
|
173
|
+
const repositoryFilesChanged = changedPaths(before, await snapshotPlanuTree(projectPath));
|
|
113
174
|
let migrationReportPath = null;
|
|
114
175
|
try {
|
|
115
176
|
const reportPath = `${projectDataDir(projectId)}/reports/init-migrations/latest.json`;
|
|
@@ -118,10 +179,12 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
|
|
|
118
179
|
projectId,
|
|
119
180
|
generatedAt: new Date().toISOString(),
|
|
120
181
|
discoveryResult,
|
|
182
|
+
filesystemImportResult,
|
|
121
183
|
migrationResult,
|
|
122
184
|
folderMigrationResult,
|
|
123
185
|
criticalMigrationFailures,
|
|
124
186
|
nonCriticalWarnings,
|
|
187
|
+
changedPaths: repositoryFilesChanged,
|
|
125
188
|
});
|
|
126
189
|
migrationReportPath = reportPath;
|
|
127
190
|
}
|
|
@@ -130,11 +193,13 @@ export async function runSpecMigrations(projectPath, projectId, knowledge) {
|
|
|
130
193
|
}
|
|
131
194
|
return {
|
|
132
195
|
discoveryResult,
|
|
196
|
+
filesystemImportResult,
|
|
133
197
|
migrationResult,
|
|
134
198
|
folderMigrationResult,
|
|
135
199
|
criticalMigrationFailures,
|
|
136
200
|
nonCriticalWarnings,
|
|
137
201
|
migrationReportPath,
|
|
202
|
+
changedPaths: repositoryFilesChanged,
|
|
138
203
|
};
|
|
139
204
|
}
|
|
140
205
|
/** Return all specs for the project (needed by caller for health check refs). */
|