@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,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Generates LLM security baseline test scaffolds.
|
|
1
|
+
import { technologyValue } from '../../../engine/technology-registry.js';
|
|
3
2
|
// Security baseline comment prepended to generated test files
|
|
4
3
|
const SECURITY_BASELINE_COMMENT = '// Security baseline — complement with formal pentest';
|
|
5
4
|
/**
|
|
@@ -200,7 +199,9 @@ export function generateLlmSecurityTestFiles(spec, testDir, language, autoGenera
|
|
|
200
199
|
const slug = spec.id.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
201
200
|
const ext = getFileExtension(language);
|
|
202
201
|
const content = generateLlmSecurityTestContent(spec.title, language);
|
|
203
|
-
const framework = language === 'python'
|
|
202
|
+
const framework = language === 'python'
|
|
203
|
+
? technologyValue('technology-pytest-2b0121')
|
|
204
|
+
: technologyValue('technology-vitest-a9127f');
|
|
204
205
|
return [
|
|
205
206
|
{
|
|
206
207
|
path: `${testDir}/security/${slug}.llm-security.${ext}`,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Generates local-first property-based tests and offline test scaffolds.
|
|
1
|
+
import { technologyValue } from '../../../engine/technology-registry.js';
|
|
3
2
|
const PBT_COMMENT = '// Property-based tests — complement with fast-check or similar library';
|
|
4
3
|
/**
|
|
5
4
|
* Returns true when the project has local-first architecture detected.
|
|
@@ -297,7 +296,9 @@ export function generateLocalFirstTestFiles(spec, testDir, language, autoGenerat
|
|
|
297
296
|
const slug = spec.id.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
298
297
|
const ext = getFileExtension(language);
|
|
299
298
|
const content = generateLocalFirstTestContent(spec.title, language);
|
|
300
|
-
const framework = language === 'python'
|
|
299
|
+
const framework = language === 'python'
|
|
300
|
+
? technologyValue('technology-pytest-2b0121')
|
|
301
|
+
: technologyValue('technology-vitest-a9127f');
|
|
301
302
|
return [
|
|
302
303
|
{
|
|
303
304
|
path: `${testDir}/local-first/${slug}.local-first.${ext}`,
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// SPEC-016b: Generates test scaffolds for MCP servers.
|
|
3
|
-
// Criterion 6: tool registration, valid call, invalid call, resource read, e2e smoke test.
|
|
1
|
+
import { technologyValue } from '../../../engine/technology-registry.js';
|
|
4
2
|
import { isMcpServerProject } from '../../../engine/detectors/mcp-server-detector.js';
|
|
5
3
|
// === Detection ===
|
|
6
4
|
export function isMcpProject(knowledge) {
|
|
@@ -69,9 +67,11 @@ export function generateMcpTestDefs(title, testDir) {
|
|
|
69
67
|
}
|
|
70
68
|
// === Test file content generators ===
|
|
71
69
|
function buildImportLine(testFramework, language) {
|
|
72
|
-
const isVitest = testFramework === 'vitest';
|
|
73
|
-
const source = isVitest
|
|
74
|
-
|
|
70
|
+
const isVitest = testFramework === technologyValue('technology-vitest-a9127f');
|
|
71
|
+
const source = isVitest
|
|
72
|
+
? technologyValue('technology-vitest-a9127f')
|
|
73
|
+
: technologyValue('technology-jest-35e99f');
|
|
74
|
+
if (language === technologyValue('technology-typescript-969545')) {
|
|
75
75
|
return `import { describe, it, expect, beforeAll, afterAll } from '${source}';`;
|
|
76
76
|
}
|
|
77
77
|
return `const { describe, it, expect, beforeAll, afterAll } = require('${source}');`;
|
|
@@ -152,8 +152,10 @@ function buildMcpUnitTestContent(title, testFramework, language) {
|
|
|
152
152
|
return lines.join('\n');
|
|
153
153
|
}
|
|
154
154
|
function buildMcpIntegrationTestContent(title, testFramework) {
|
|
155
|
-
const isVitest = testFramework === 'vitest';
|
|
156
|
-
const source = isVitest
|
|
155
|
+
const isVitest = testFramework === technologyValue('technology-vitest-a9127f');
|
|
156
|
+
const source = isVitest
|
|
157
|
+
? technologyValue('technology-vitest-a9127f')
|
|
158
|
+
: technologyValue('technology-jest-35e99f');
|
|
157
159
|
const lines = [
|
|
158
160
|
`// Integration tests for MCP server: ${title}`,
|
|
159
161
|
'// SPEC-016b: E2E initialize handshake, resource reads, concurrent calls',
|
|
@@ -218,7 +220,7 @@ function buildMcpIntegrationTestContent(title, testFramework) {
|
|
|
218
220
|
// === TestFile builders ===
|
|
219
221
|
export function generateMcpTestFiles(spec, testDir, testFramework, language) {
|
|
220
222
|
const slug = spec.id.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
221
|
-
const ext = language === 'typescript' ? 'ts' : 'js';
|
|
223
|
+
const ext = language === technologyValue('technology-typescript-969545') ? 'ts' : 'js';
|
|
222
224
|
return [
|
|
223
225
|
{
|
|
224
226
|
path: `${testDir}/unit/${slug}.mcp.test.${ext}`,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Public API for the microservices test generator. Re-exports all public symbols.
|
|
1
|
+
import { technologyValue } from '../../../../engine/technology-registry.js';
|
|
3
2
|
import { detectBroker, detectServiceMesh } from './detectors.js';
|
|
4
3
|
import { buildTsMicroservicesTest } from './ts-scaffold.js';
|
|
5
4
|
import { buildPythonMicroservicesTest } from './python-scaffold.js';
|
|
@@ -10,7 +9,7 @@ export function generateMicroservicesTestFiles(spec, testDir, framework, languag
|
|
|
10
9
|
const mesh = detectServiceMesh(knowledge);
|
|
11
10
|
const isPython = language === 'python';
|
|
12
11
|
const ext = isPython ? 'py' : testExt;
|
|
13
|
-
const fw = isPython ? 'pytest' : framework;
|
|
12
|
+
const fw = isPython ? technologyValue('technology-pytest-2b0121') : framework;
|
|
14
13
|
const content = isPython
|
|
15
14
|
? buildPythonMicroservicesTest(spec.title, broker, mesh)
|
|
16
15
|
: buildTsMicroservicesTest(spec.title, broker, mesh);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Generates instrumentation test scaffolds for projects with OpenTelemetry.
|
|
1
|
+
import { technologyValue } from '../../../engine/technology-registry.js';
|
|
3
2
|
/**
|
|
4
3
|
* Returns true when the project has OTel installed.
|
|
5
4
|
*/
|
|
@@ -259,7 +258,11 @@ export function generateOtelTestFiles(spec, testDir, language, autoGenerate) {
|
|
|
259
258
|
const slug = spec.id.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
260
259
|
const ext = getFileExtension(language);
|
|
261
260
|
const content = generateOtelTestContent(spec.title, language);
|
|
262
|
-
const framework = language === 'python'
|
|
261
|
+
const framework = language === 'python'
|
|
262
|
+
? technologyValue('technology-pytest-2b0121')
|
|
263
|
+
: language === 'go'
|
|
264
|
+
? 'go-test'
|
|
265
|
+
: technologyValue('technology-vitest-a9127f');
|
|
263
266
|
return [
|
|
264
267
|
{
|
|
265
268
|
path: `${testDir}/instrumentation/${slug}.otel.${ext}`,
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// — must enumerate framework names by design; no detection logic to migrate.
|
|
3
|
-
// security/detectors.ts — SPEC-058b Section G
|
|
4
|
-
// Signal constants and detector functions for auth, file upload, and API presence.
|
|
1
|
+
import { technologyValue } from '../../../../engine/technology-registry.js';
|
|
5
2
|
export const AUTH_SIGNALS = [
|
|
6
3
|
'jwt',
|
|
7
4
|
'oauth',
|
|
@@ -9,7 +6,7 @@ export const AUTH_SIGNALS = [
|
|
|
9
6
|
'keycloak',
|
|
10
7
|
'auth0',
|
|
11
8
|
'clerk',
|
|
12
|
-
'supabase',
|
|
9
|
+
technologyValue('technology-supabase-4d7594'),
|
|
13
10
|
'session',
|
|
14
11
|
'cookie-session',
|
|
15
12
|
'express-session',
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Public API: re-exports all security generator functions and
|
|
3
|
-
// implements generateSecurityTestFiles() as the main entry point.
|
|
1
|
+
import { technologyValue } from '../../../../engine/technology-registry.js';
|
|
4
2
|
import { detectAuth, detectFileUpload, hasPublicApi } from './detectors.js';
|
|
5
3
|
import { buildTsSecurityTest } from './ts-scaffold.js';
|
|
6
4
|
import { buildPythonSecurityTest } from './python-scaffold.js';
|
|
@@ -12,7 +10,7 @@ export function generateSecurityTestFiles(spec, testDir, framework, language, te
|
|
|
12
10
|
const publicApi = hasPublicApi(knowledge);
|
|
13
11
|
const isPython = language === 'python';
|
|
14
12
|
const ext = isPython ? 'py' : testExt;
|
|
15
|
-
const fw = isPython ? 'pytest' : framework;
|
|
13
|
+
const fw = isPython ? technologyValue('technology-pytest-2b0121') : framework;
|
|
16
14
|
const content = isPython
|
|
17
15
|
? buildPythonSecurityTest(spec.title, auth, upload, publicApi)
|
|
18
16
|
: buildTsSecurityTest(spec.title, auth, upload, publicApi);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Generates supply chain validation runbook and test definitions.
|
|
1
|
+
import { technologyValue } from '../../../engine/technology-registry.js';
|
|
3
2
|
/**
|
|
4
3
|
* Returns true when the project has supply chain gaps detected.
|
|
5
4
|
*/
|
|
@@ -139,7 +138,7 @@ function getRunbookExtension(_language) {
|
|
|
139
138
|
export function generateSupplyChainTestFiles(spec, testDir, language, autoGenerate) {
|
|
140
139
|
const slug = spec.id.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
141
140
|
const ext = getRunbookExtension(language);
|
|
142
|
-
const content = language === 'typescript' || language === 'javascript'
|
|
141
|
+
const content = language === technologyValue('technology-typescript-969545') || language === 'javascript'
|
|
143
142
|
? generateNodeRunbook(spec.title, slug)
|
|
144
143
|
: generateGenericRunbook(spec.title, slug, language);
|
|
145
144
|
return [
|
|
@@ -1,29 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
// — must enumerate framework names by design; no detection logic to migrate.
|
|
3
|
-
// tools/generate-tests/generators/visual-regression-generator.ts — SPEC-058a Section C
|
|
4
|
-
// Generates visual regression and frontend screenshot test scaffolds.
|
|
1
|
+
import { technologyValue } from '../../../engine/technology-registry.js';
|
|
5
2
|
const UI_FRAMEWORKS = [
|
|
6
|
-
'react',
|
|
7
|
-
'vue',
|
|
8
|
-
'angular',
|
|
9
|
-
'svelte',
|
|
3
|
+
technologyValue('technology-react-275976'),
|
|
4
|
+
technologyValue('technology-vue-564382'),
|
|
5
|
+
technologyValue('technology-angular-a39f89'),
|
|
6
|
+
technologyValue('technology-svelte-c190ac'),
|
|
10
7
|
'next',
|
|
11
|
-
'nextjs',
|
|
12
|
-
'next
|
|
13
|
-
'nuxt',
|
|
14
|
-
'sveltekit',
|
|
8
|
+
technologyValue('technology-nextjs-c93379'),
|
|
9
|
+
technologyValue('technology-next-js-0d857f'),
|
|
10
|
+
technologyValue('technology-nuxt-22c407'),
|
|
11
|
+
technologyValue('technology-sveltekit-eefb03'),
|
|
15
12
|
'svelte-kit',
|
|
16
13
|
'solid',
|
|
17
14
|
'solidjs',
|
|
18
15
|
'preact',
|
|
19
16
|
'qwik',
|
|
20
|
-
'remix',
|
|
17
|
+
technologyValue('technology-remix-0c5d96'),
|
|
21
18
|
'gatsby',
|
|
22
|
-
'astro',
|
|
19
|
+
technologyValue('technology-astro-23661e'),
|
|
23
20
|
];
|
|
24
21
|
const DARK_MODE_SIGNALS = [
|
|
25
|
-
'tailwind',
|
|
26
|
-
'shadcn',
|
|
22
|
+
technologyValue('technology-tailwind-44c8cf'),
|
|
23
|
+
technologyValue('technology-shadcn-d27663'),
|
|
27
24
|
'radix',
|
|
28
25
|
'mui',
|
|
29
26
|
'chakra',
|
|
@@ -290,7 +287,7 @@ function getFileExtension(language) {
|
|
|
290
287
|
*/
|
|
291
288
|
export function generateVisualRegressionTestFiles(spec, testDir, framework, language, testExt, autoGenerate) {
|
|
292
289
|
const ext = language === 'python' ? 'py' : getFileExtension(language);
|
|
293
|
-
const resolvedFramework = framework === 'cypress' ? 'cypress' : 'playwright';
|
|
290
|
+
const resolvedFramework = framework === 'cypress' ? 'cypress' : technologyValue('technology-playwright-7827e8');
|
|
294
291
|
const content = generateVisualTestContent(spec.title, spec.slug, framework, language);
|
|
295
292
|
return [
|
|
296
293
|
{
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Generates WebSocket test scaffolds: connection lifecycle, reconnection, ordering, heartbeat.
|
|
1
|
+
import { technologyValue } from '../../../engine/technology-registry.js';
|
|
3
2
|
const WS_SIGNALS = [
|
|
4
3
|
'ws',
|
|
5
4
|
'socket.io',
|
|
@@ -227,7 +226,7 @@ class Test${cls}WebSocket:
|
|
|
227
226
|
export function generateWebSocketTestFiles(spec, testDir, framework, language, testExt, autoGenerate) {
|
|
228
227
|
const isPython = language === 'python';
|
|
229
228
|
const resolvedExt = isPython ? 'py' : testExt;
|
|
230
|
-
const resolvedFramework = isPython ? 'pytest' : framework;
|
|
229
|
+
const resolvedFramework = isPython ? technologyValue('technology-pytest-2b0121') : framework;
|
|
231
230
|
const content = isPython
|
|
232
231
|
? buildPythonWebSocketTest(spec.title)
|
|
233
232
|
: buildTsWebSocketTest(spec.title);
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
// Extracted from generate-tests.ts to stay under 400-line limit
|
|
1
|
+
import { technologyValue } from '../../engine/technology-registry.js';
|
|
3
2
|
export function inferTestFramework(language, stack) {
|
|
4
|
-
if (stack.includes('vitest')) {
|
|
5
|
-
return 'vitest';
|
|
3
|
+
if (stack.includes(technologyValue('technology-vitest-a9127f'))) {
|
|
4
|
+
return technologyValue('technology-vitest-a9127f');
|
|
6
5
|
}
|
|
7
|
-
if (stack.includes('jest')) {
|
|
8
|
-
return 'jest';
|
|
6
|
+
if (stack.includes(technologyValue('technology-jest-35e99f'))) {
|
|
7
|
+
return technologyValue('technology-jest-35e99f');
|
|
9
8
|
}
|
|
10
|
-
if (stack.includes('pytest')) {
|
|
11
|
-
return 'pytest';
|
|
9
|
+
if (stack.includes(technologyValue('technology-pytest-2b0121'))) {
|
|
10
|
+
return technologyValue('technology-pytest-2b0121');
|
|
12
11
|
}
|
|
13
12
|
const defaults = {
|
|
14
|
-
typescript: 'vitest',
|
|
15
|
-
javascript: 'vitest',
|
|
16
|
-
python: 'pytest',
|
|
13
|
+
typescript: technologyValue('technology-vitest-a9127f'),
|
|
14
|
+
javascript: technologyValue('technology-vitest-a9127f'),
|
|
15
|
+
python: technologyValue('technology-pytest-2b0121'),
|
|
17
16
|
go: 'go-test',
|
|
18
17
|
rust: 'cargo-test',
|
|
19
18
|
java: 'junit',
|
|
@@ -21,7 +20,7 @@ export function inferTestFramework(language, stack) {
|
|
|
21
20
|
swift: 'xctest',
|
|
22
21
|
dart: 'flutter-test',
|
|
23
22
|
};
|
|
24
|
-
return defaults[language] ?? 'vitest';
|
|
23
|
+
return defaults[language] ?? technologyValue('technology-vitest-a9127f');
|
|
25
24
|
}
|
|
26
25
|
export function inferTestDir(language) {
|
|
27
26
|
const dirs = {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from '../engine/technology-registry.js';
|
|
1
2
|
// tools/generate-tests-content.ts — Test scaffold content generators
|
|
2
3
|
// Pure functions that return test file content strings
|
|
3
4
|
import { generateXCTestContent, generateAndroidTestContent } from './generate-tests-mobile.js';
|
|
@@ -15,7 +16,7 @@ export function generateUnitTestContent(title, _target, framework, language) {
|
|
|
15
16
|
if (language === 'kotlin' && framework.includes('junit')) {
|
|
16
17
|
return generateAndroidTestContent(title, 'unit', 'compose', 'mockk');
|
|
17
18
|
}
|
|
18
|
-
if (framework === 'pytest') {
|
|
19
|
+
if (framework === technologyValue('technology-pytest-2b0121')) {
|
|
19
20
|
return `# Unit tests for: ${title}
|
|
20
21
|
# Generated by Planu SDD MCP Server
|
|
21
22
|
|
|
@@ -85,7 +86,7 @@ describe('${title}', () => {
|
|
|
85
86
|
`;
|
|
86
87
|
}
|
|
87
88
|
export function generateIntegrationTestContent(title, framework, _language) {
|
|
88
|
-
if (framework === 'pytest') {
|
|
89
|
+
if (framework === technologyValue('technology-pytest-2b0121')) {
|
|
89
90
|
return `# Integration tests for: ${title}
|
|
90
91
|
# Generated by Planu SDD MCP Server
|
|
91
92
|
|
|
@@ -182,7 +183,7 @@ export function buildTestCommands(existingCmd, framework) {
|
|
|
182
183
|
const frameworkCmds = {
|
|
183
184
|
vitest: ['npx vitest run', 'npx vitest run --coverage'],
|
|
184
185
|
jest: ['npx jest', 'npx jest --coverage'],
|
|
185
|
-
pytest: ['pytest', 'pytest --cov'],
|
|
186
|
+
pytest: [technologyValue('technology-pytest-2b0121'), 'pytest --cov'],
|
|
186
187
|
'go-test': ['go test ./...', 'go test -cover ./...'],
|
|
187
188
|
'cargo-test': ['cargo test'],
|
|
188
189
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from '../engine/technology-registry.js';
|
|
1
2
|
// tools/generate-tests.ts — Generate test scaffold from spec
|
|
2
3
|
// Uses project knowledge + spec to create test definitions
|
|
3
4
|
import { t, ti } from '../i18n/index.js';
|
|
@@ -66,11 +67,11 @@ export async function handleGenerateTests(args) {
|
|
|
66
67
|
}
|
|
67
68
|
// E2E test file
|
|
68
69
|
if (spec.target === 'frontend' || spec.target === 'fullstack') {
|
|
69
|
-
const e2eFramework = knowledge.stack.includes('playwright')
|
|
70
|
-
? 'playwright'
|
|
70
|
+
const e2eFramework = knowledge.stack.includes(technologyValue('technology-playwright-7827e8'))
|
|
71
|
+
? technologyValue('technology-playwright-7827e8')
|
|
71
72
|
: knowledge.stack.includes('cypress')
|
|
72
73
|
? 'cypress'
|
|
73
|
-
: 'playwright';
|
|
74
|
+
: technologyValue('technology-playwright-7827e8');
|
|
74
75
|
testFiles.push({
|
|
75
76
|
path: `${testDir}/e2e/${slug}.e2e.test.${testExt}`,
|
|
76
77
|
framework: e2eFramework,
|
|
@@ -149,7 +150,9 @@ export async function handleGenerateTests(args) {
|
|
|
149
150
|
for (const file of result.testFiles) {
|
|
150
151
|
lines.push(`#### \`${file.path}\``);
|
|
151
152
|
lines.push('');
|
|
152
|
-
const ext = file.path.endsWith('.py')
|
|
153
|
+
const ext = file.path.endsWith('.py')
|
|
154
|
+
? 'python'
|
|
155
|
+
: technologyValue('technology-typescript-969545');
|
|
153
156
|
lines.push(`\`\`\`${ext}`);
|
|
154
157
|
lines.push(file.content);
|
|
155
158
|
lines.push('```');
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { execFile as execFileCb } from 'node:child_process';
|
|
2
1
|
import type { GitConfig, GitFlowType } from '../../types/index.js';
|
|
3
|
-
export declare const execFile: typeof execFileCb.__promisify__;
|
|
4
2
|
export interface GitExecutionOptions {
|
|
5
3
|
signal?: AbortSignal;
|
|
6
4
|
timeoutMs?: number;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
// tools/git/git-helpers.ts — Shared git utilities
|
|
2
|
-
import { execFile as execFileCb } from 'node:child_process';
|
|
3
|
-
import { promisify } from 'node:util';
|
|
4
1
|
import { knowledgeStore } from '../../storage/index.js';
|
|
5
|
-
|
|
2
|
+
import { runAbortableProcess } from '../../engine/abortable-process-runner.js';
|
|
6
3
|
/** Default branch prefixes by spec type. */
|
|
7
4
|
export const DEFAULT_BRANCH_PREFIXES = {
|
|
8
5
|
feature: 'feat',
|
|
@@ -19,12 +16,15 @@ export const DEFAULT_STALENESS_THRESHOLD = 50;
|
|
|
19
16
|
/** Execute a git command in the project directory. */
|
|
20
17
|
export async function git(projectPath, args, options = {}) {
|
|
21
18
|
try {
|
|
22
|
-
const result = await
|
|
19
|
+
const result = await runAbortableProcess('git', args, {
|
|
23
20
|
cwd: projectPath,
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
maxBufferBytes: 1024 * 1024 * 10,
|
|
22
|
+
timeoutMs: options.timeoutMs ?? 30_000,
|
|
26
23
|
signal: options.signal,
|
|
27
24
|
});
|
|
25
|
+
if (result.status !== 0 || result.error) {
|
|
26
|
+
throw result.error ?? new Error(result.stderr || `git exited with ${String(result.status)}`);
|
|
27
|
+
}
|
|
28
28
|
return { stdout: result.stdout, stderr: result.stderr };
|
|
29
29
|
}
|
|
30
30
|
catch (err) {
|
|
@@ -4,12 +4,19 @@ import { detectAuth } from '../engine/github/auth.js';
|
|
|
4
4
|
import { generatePRTitle, generatePRBody } from '../engine/github/pr-template.js';
|
|
5
5
|
import { findLinkedPRs } from '../engine/github/spec-linker.js';
|
|
6
6
|
import { validateSpecFormat } from '../core/spec-validator.js';
|
|
7
|
-
import { execFile as nodeExecFile } from 'node:child_process';
|
|
8
|
-
import { promisify } from 'node:util';
|
|
9
7
|
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { runAbortableProcess } from '../engine/abortable-process-runner.js';
|
|
10
9
|
/* v8 ignore next 3 -- default exec, always overridden in tests */
|
|
11
10
|
const defaultExec = async (cmd, args) => {
|
|
12
|
-
|
|
11
|
+
const result = await runAbortableProcess(cmd, args, {
|
|
12
|
+
cwd: process.cwd(),
|
|
13
|
+
timeoutMs: 30_000,
|
|
14
|
+
maxBufferBytes: 10 * 1024 * 1024,
|
|
15
|
+
});
|
|
16
|
+
if (result.status !== 0 || result.error) {
|
|
17
|
+
throw result.error ?? new Error(result.stderr || `${cmd} exited with ${String(result.status)}`);
|
|
18
|
+
}
|
|
19
|
+
return { stdout: result.stdout, stderr: result.stderr };
|
|
13
20
|
};
|
|
14
21
|
export async function handleCreatePRFromSpec(args, exec = defaultExec) {
|
|
15
22
|
const auth = await detectAuth(exec);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPEC-715: heal_spec_docs is now the SINGLE tool that performs migrations.
|
|
3
3
|
// list_specs is read-only; migrations were moved here.
|
|
4
4
|
// SPEC-724: Added dryRun, backup flags and Jaccard goal-scenario drift warning.
|
|
5
|
-
import { readFile, readdir
|
|
5
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
6
6
|
import { atomicWriteFile } from '../engine/safety/atomic-write-file.js';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { hashProjectPath } from '../storage/base-store.js';
|
|
@@ -10,6 +10,7 @@ import { refreshProjectStatus } from '../engine/autopilot/state-updater.js';
|
|
|
10
10
|
import { extractFilesFromSpecBody } from '../engine/spec-format/technical-md-populator.js';
|
|
11
11
|
import { jaccard } from '../engine/spec-format/jaccard.js';
|
|
12
12
|
import { replaceSectionInSpec } from '../engine/spec-format/replace-section.js';
|
|
13
|
+
import { executionRemove } from '../engine/execution/deadline-io.js';
|
|
13
14
|
const SPANISH_INDICATORS = [
|
|
14
15
|
'de',
|
|
15
16
|
'del',
|
|
@@ -84,66 +85,18 @@ async function writeTechnicalMd(specDir, isDone, projectPath, specBody) {
|
|
|
84
85
|
}
|
|
85
86
|
const specMdPath = join(specDir, 'spec.md');
|
|
86
87
|
if (extractedBody === null) {
|
|
87
|
-
const removedInline = await removeTechnicalSectionIfPlaceholder(specMdPath);
|
|
88
|
-
const removedLegacy = await removeLegacyTechnicalPlaceholder(join(specDir, 'technical.md'));
|
|
89
|
-
return removedInline || removedLegacy;
|
|
90
|
-
}
|
|
91
|
-
const technicalBody = extractedBody;
|
|
92
|
-
// SPEC-579: idempotency check — skip write if section already matches.
|
|
93
|
-
try {
|
|
94
|
-
const existing = await readFile(specMdPath, 'utf-8');
|
|
95
|
-
const currentTechnical = extractTechnicalBodyLocal(existing);
|
|
96
|
-
if (currentTechnical.trim() === technicalBody.trim()) {
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// spec.md missing — continue to write (replaceSectionInSpec will create the section)
|
|
102
|
-
}
|
|
103
|
-
await replaceSectionInSpec(specMdPath, 'Technical', technicalBody);
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
async function removeLegacyTechnicalPlaceholder(technicalPath) {
|
|
107
|
-
let legacy;
|
|
108
|
-
try {
|
|
109
|
-
legacy = await readFile(technicalPath, 'utf-8');
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
if (!isPlaceholderTechnical(legacy)) {
|
|
115
88
|
return false;
|
|
116
89
|
}
|
|
117
|
-
await
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
async function removeTechnicalSectionIfPlaceholder(specMdPath) {
|
|
121
|
-
let existing;
|
|
122
|
-
try {
|
|
123
|
-
existing = await readFile(specMdPath, 'utf-8');
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
const currentTechnical = extractTechnicalBodyLocal(existing);
|
|
129
|
-
if (currentTechnical === '' || !isPlaceholderTechnical(currentTechnical)) {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
const updated = removeTopLevelSection(existing, 'Technical');
|
|
133
|
-
if (updated === existing) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
await atomicWriteFile(specMdPath, updated);
|
|
90
|
+
await replaceSectionInSpec(specMdPath, 'Technical', extractedBody);
|
|
137
91
|
return true;
|
|
138
92
|
}
|
|
139
93
|
function removeTopLevelSection(content, sectionName) {
|
|
140
94
|
const normalized = content.replace(/\r\n/g, '\n');
|
|
141
95
|
const masked = normalized.replace(/(```|~~~)[\s\S]*?\1/g, (block) => block.replace(/[^\n]/g, ' '));
|
|
142
96
|
const headingRe = new RegExp(`^##\\s+${escapeRegex(sectionName)}\\b.*$`, 'm');
|
|
97
|
+
// Callers only remove sections they have just extracted from the same content.
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
143
99
|
const match = headingRe.exec(masked);
|
|
144
|
-
if (!match) {
|
|
145
|
-
return content;
|
|
146
|
-
}
|
|
147
100
|
const afterHeading = match.index + match[0].length;
|
|
148
101
|
const nextRe = /^##\s+\S/gm;
|
|
149
102
|
nextRe.lastIndex = afterHeading;
|
|
@@ -378,7 +331,7 @@ export async function handleHealSpecDocs(params) {
|
|
|
378
331
|
continue;
|
|
379
332
|
}
|
|
380
333
|
if (legacyContent !== null && isPlaceholderTechnical(legacyContent)) {
|
|
381
|
-
await
|
|
334
|
+
await executionRemove(technicalPath, { force: true });
|
|
382
335
|
healed += 1;
|
|
383
336
|
continue;
|
|
384
337
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { technologyValue } from '../engine/technology-registry.js';
|
|
2
2
|
import { detectStack } from '../engine/project-scanner/index.js';
|
|
3
3
|
import { getPrimaryAiTool } from '../engine/ai-tool-detector/index.js';
|
|
4
4
|
import { getHookSectionsForStack } from '../engine/hook-generator/stack-hook-templates.js';
|
|
@@ -12,7 +12,7 @@ async function resolveStackTokens(projectPath) {
|
|
|
12
12
|
const detected = await detectStack(projectPath);
|
|
13
13
|
const tokens = [];
|
|
14
14
|
const langMap = {
|
|
15
|
-
typescript: 'typescript',
|
|
15
|
+
typescript: technologyValue('technology-typescript-969545'),
|
|
16
16
|
javascript: 'eslint',
|
|
17
17
|
python: 'python',
|
|
18
18
|
go: 'go',
|
|
@@ -21,11 +21,11 @@ async function resolveStackTokens(projectPath) {
|
|
|
21
21
|
if (lang !== undefined) {
|
|
22
22
|
tokens.push(lang);
|
|
23
23
|
}
|
|
24
|
-
if (detected.testRunner === 'vitest') {
|
|
25
|
-
tokens.push('vitest');
|
|
24
|
+
if (detected.testRunner === technologyValue('technology-vitest-a9127f')) {
|
|
25
|
+
tokens.push(technologyValue('technology-vitest-a9127f'));
|
|
26
26
|
}
|
|
27
|
-
else if (detected.testRunner === 'jest') {
|
|
28
|
-
tokens.push('jest');
|
|
27
|
+
else if (detected.testRunner === technologyValue('technology-jest-35e99f')) {
|
|
28
|
+
tokens.push(technologyValue('technology-jest-35e99f'));
|
|
29
29
|
}
|
|
30
30
|
if (detected.linter !== null) {
|
|
31
31
|
tokens.push('eslint');
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from '../../engine/technology-registry.js';
|
|
1
2
|
export function addAgentPrinciples(knowledge, principles, nextId) {
|
|
2
3
|
const isAgentProject = knowledge.stack.some((s) => ['@anthropic-ai/sdk', '@mastra/core', 'langgraph', 'crewai'].some((sig) => s.toLowerCase().includes(sig))) || (knowledge.framework ?? '').toLowerCase().includes('agent');
|
|
3
4
|
if (!isAgentProject) {
|
|
@@ -45,9 +46,10 @@ export function addAgentPrinciples(knowledge, principles, nextId) {
|
|
|
45
46
|
});
|
|
46
47
|
}
|
|
47
48
|
export function addElectronPrinciples(knowledge, principles, nextId) {
|
|
48
|
-
const isElectronProject = knowledge.framework === 'electron' ||
|
|
49
|
+
const isElectronProject = knowledge.framework === technologyValue('technology-electron-88b1de') ||
|
|
50
|
+
knowledge.projectCategory === 'desktop';
|
|
49
51
|
const stackHasElectron = Array.isArray(knowledge.stack) &&
|
|
50
|
-
knowledge.stack.some((s) => s.toLowerCase().includes('electron'));
|
|
52
|
+
knowledge.stack.some((s) => s.toLowerCase().includes(technologyValue('technology-electron-88b1de')));
|
|
51
53
|
if (!isElectronProject || !stackHasElectron) {
|
|
52
54
|
return;
|
|
53
55
|
}
|
|
@@ -34,9 +34,16 @@ Auto-generated by \`init_project\`. Mirrors CLAUDE.md for IDEs that read AGENTS.
|
|
|
34
34
|
\`\`\`
|
|
35
35
|
facilitate("what to build") → create_spec → challenge_spec → check_readiness
|
|
36
36
|
→ update_status(review) → approve → update_status(approved) → implement
|
|
37
|
-
→ validate → update_status(done)
|
|
37
|
+
→ validate (ack) → watch_job (completed) → inspect job.result → update_status(done)
|
|
38
38
|
\`\`\`
|
|
39
39
|
|
|
40
|
+
## Durable Validation Gate
|
|
41
|
+
|
|
42
|
+
1. Call \`validate\` and capture \`operationId\`, \`projectId\`, \`workspaceId\`, and \`cursor\` from the acknowledgement
|
|
43
|
+
2. Call \`watch_job\` with those identifiers and the latest cursor until the job reaches a terminal state
|
|
44
|
+
3. Require \`completed\` and inspect \`job.result.structuredContent\`; stop on \`failed\`, \`dead-letter\`, or \`cancelled\`
|
|
45
|
+
4. Call \`update_status(done)\` only when the completed result reports \`ready: true\`, \`status: "passing"\`, and passing quality gates
|
|
46
|
+
|
|
40
47
|
## Session Start
|
|
41
48
|
|
|
42
49
|
1. Call \`planu_status\` to see active specs
|
|
@@ -45,7 +52,7 @@ facilitate("what to build") → create_spec → challenge_spec → check_readine
|
|
|
45
52
|
## Session End
|
|
46
53
|
|
|
47
54
|
- Call \`session_checkpoint\` to save context
|
|
48
|
-
- Run \`validate\`, then call \`update_status(done)\`
|
|
55
|
+
- Run \`validate\`, await the completed job with \`watch_job\`, inspect \`job.result.structuredContent\`, then call \`update_status(done)\`
|
|
49
56
|
|
|
50
57
|
## Quick Reference
|
|
51
58
|
|
|
@@ -55,6 +62,7 @@ ${toolsTable}
|
|
|
55
62
|
|
|
56
63
|
- NEVER write production code before spec is \`approved\`
|
|
57
64
|
- NEVER skip \`validate\` after implementation
|
|
65
|
+
- NEVER treat a \`validate\` acknowledgement as a passing result
|
|
58
66
|
- NEVER create design docs outside Planu specs
|
|
59
67
|
|
|
60
68
|
## Skill Discovery
|
|
@@ -70,8 +78,9 @@ Auto-generated by init_project.
|
|
|
70
78
|
|
|
71
79
|
1. Before writing any code, call facilitate() or create_spec() first.
|
|
72
80
|
2. Never write code without an approved Planu spec.
|
|
73
|
-
3. Always call validate() after implementation.
|
|
74
|
-
4.
|
|
81
|
+
3. Always call validate() after implementation; it returns a durable job acknowledgement, not pass/fail.
|
|
82
|
+
4. Call watch_job() until completed and inspect job.result.structuredContent before marking done.
|
|
83
|
+
5. Use update_status() to track progress: draft → review → approved → implementing → done.
|
|
75
84
|
|
|
76
85
|
## Session
|
|
77
86
|
|
|
@@ -82,7 +91,7 @@ Auto-generated by init_project.
|
|
|
82
91
|
|
|
83
92
|
- New feature: facilitate("what to build")
|
|
84
93
|
- Check status: planu_status
|
|
85
|
-
- Mark done: validate, then update_status(done)
|
|
94
|
+
- Mark done: validate, watch_job until completed, inspect job.result.structuredContent, then update_status(done)
|
|
86
95
|
`;
|
|
87
96
|
async function writeIfMissing(path, content) {
|
|
88
97
|
try {
|