@planu/cli 1.10.0 → 1.12.0
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/dist/config/license-plans.json +32 -2
- package/dist/engine/api-compat/compatibility-checker.d.ts +4 -0
- package/dist/engine/api-compat/compatibility-checker.d.ts.map +1 -0
- package/dist/engine/api-compat/compatibility-checker.js +118 -0
- package/dist/engine/api-compat/compatibility-checker.js.map +1 -0
- package/dist/engine/checkpoint/checkpoint-manager.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint-manager.d.ts.map +1 -0
- package/dist/engine/checkpoint/checkpoint-manager.js +76 -0
- package/dist/engine/checkpoint/checkpoint-manager.js.map +1 -0
- package/dist/engine/checkpoint/policy-engine.d.ts +10 -0
- package/dist/engine/checkpoint/policy-engine.d.ts.map +1 -0
- package/dist/engine/checkpoint/policy-engine.js +87 -0
- package/dist/engine/checkpoint/policy-engine.js.map +1 -0
- package/dist/engine/compliance/auto-remediator.d.ts +9 -0
- package/dist/engine/compliance/auto-remediator.d.ts.map +1 -0
- package/dist/engine/compliance/auto-remediator.js +118 -0
- package/dist/engine/compliance/auto-remediator.js.map +1 -0
- package/dist/engine/compliance/evidence-builder.d.ts +19 -0
- package/dist/engine/compliance/evidence-builder.d.ts.map +1 -0
- package/dist/engine/compliance/evidence-builder.js +36 -0
- package/dist/engine/compliance/evidence-builder.js.map +1 -0
- package/dist/engine/compliance/framework-catalog.d.ts +15 -0
- package/dist/engine/compliance/framework-catalog.d.ts.map +1 -0
- package/dist/engine/compliance/framework-catalog.js +134 -0
- package/dist/engine/compliance/framework-catalog.js.map +1 -0
- package/dist/engine/compliance/gap-analyzer.d.ts +11 -0
- package/dist/engine/compliance/gap-analyzer.d.ts.map +1 -0
- package/dist/engine/compliance/gap-analyzer.js +39 -0
- package/dist/engine/compliance/gap-analyzer.js.map +1 -0
- package/dist/engine/context-profile/profile-catalog.d.ts +5 -0
- package/dist/engine/context-profile/profile-catalog.d.ts.map +1 -0
- package/dist/engine/context-profile/profile-catalog.js +145 -0
- package/dist/engine/context-profile/profile-catalog.js.map +1 -0
- package/dist/engine/critical-path/path-analyzer.d.ts +3 -0
- package/dist/engine/critical-path/path-analyzer.d.ts.map +1 -0
- package/dist/engine/critical-path/path-analyzer.js +145 -0
- package/dist/engine/critical-path/path-analyzer.js.map +1 -0
- package/dist/engine/distribution/cost-estimator.d.ts +8 -0
- package/dist/engine/distribution/cost-estimator.d.ts.map +1 -0
- package/dist/engine/distribution/cost-estimator.js +113 -0
- package/dist/engine/distribution/cost-estimator.js.map +1 -0
- package/dist/engine/distribution/diagram-generator.d.ts +12 -0
- package/dist/engine/distribution/diagram-generator.d.ts.map +1 -0
- package/dist/engine/distribution/diagram-generator.js +59 -0
- package/dist/engine/distribution/diagram-generator.js.map +1 -0
- package/dist/engine/distribution/readiness-analyzer.d.ts +4 -0
- package/dist/engine/distribution/readiness-analyzer.d.ts.map +1 -0
- package/dist/engine/distribution/readiness-analyzer.js +61 -0
- package/dist/engine/distribution/readiness-analyzer.js.map +1 -0
- package/dist/engine/distribution/runbook-generator.d.ts +7 -0
- package/dist/engine/distribution/runbook-generator.d.ts.map +1 -0
- package/dist/engine/distribution/runbook-generator.js +42 -0
- package/dist/engine/distribution/runbook-generator.js.map +1 -0
- package/dist/engine/drift/violation-resolver.d.ts +9 -0
- package/dist/engine/drift/violation-resolver.d.ts.map +1 -0
- package/dist/engine/drift/violation-resolver.js +128 -0
- package/dist/engine/drift/violation-resolver.js.map +1 -0
- package/dist/engine/ears/criterion-scorer.d.ts +7 -0
- package/dist/engine/ears/criterion-scorer.d.ts.map +1 -0
- package/dist/engine/ears/criterion-scorer.js +87 -0
- package/dist/engine/ears/criterion-scorer.js.map +1 -0
- package/dist/engine/ears/pattern-matcher.d.ts +5 -0
- package/dist/engine/ears/pattern-matcher.d.ts.map +1 -0
- package/dist/engine/ears/pattern-matcher.js +48 -0
- package/dist/engine/ears/pattern-matcher.js.map +1 -0
- package/dist/engine/ears/rewriter.d.ts +7 -0
- package/dist/engine/ears/rewriter.d.ts.map +1 -0
- package/dist/engine/ears/rewriter.js +45 -0
- package/dist/engine/ears/rewriter.js.map +1 -0
- package/dist/engine/ears/spec-linter.d.ts +7 -0
- package/dist/engine/ears/spec-linter.d.ts.map +1 -0
- package/dist/engine/ears/spec-linter.js +127 -0
- package/dist/engine/ears/spec-linter.js.map +1 -0
- package/dist/engine/health/auto-fixer.d.ts +7 -0
- package/dist/engine/health/auto-fixer.d.ts.map +1 -0
- package/dist/engine/health/auto-fixer.js +130 -0
- package/dist/engine/health/auto-fixer.js.map +1 -0
- package/dist/engine/mcp-catalog/catalog-advisor.d.ts +3 -0
- package/dist/engine/mcp-catalog/catalog-advisor.d.ts.map +1 -0
- package/dist/engine/mcp-catalog/catalog-advisor.js +180 -0
- package/dist/engine/mcp-catalog/catalog-advisor.js.map +1 -0
- package/dist/engine/mcp-hub/adapter-registry.d.ts +23 -0
- package/dist/engine/mcp-hub/adapter-registry.d.ts.map +1 -0
- package/dist/engine/mcp-hub/adapter-registry.js +19 -0
- package/dist/engine/mcp-hub/adapter-registry.js.map +1 -0
- package/dist/engine/mcp-hub/adapters/github-adapter.d.ts +4 -0
- package/dist/engine/mcp-hub/adapters/github-adapter.d.ts.map +1 -0
- package/dist/engine/mcp-hub/adapters/github-adapter.js +44 -0
- package/dist/engine/mcp-hub/adapters/github-adapter.js.map +1 -0
- package/dist/engine/mcp-hub/adapters/supabase-adapter.d.ts +4 -0
- package/dist/engine/mcp-hub/adapters/supabase-adapter.d.ts.map +1 -0
- package/dist/engine/mcp-hub/adapters/supabase-adapter.js +41 -0
- package/dist/engine/mcp-hub/adapters/supabase-adapter.js.map +1 -0
- package/dist/engine/mcp-hub/event-router.d.ts +19 -0
- package/dist/engine/mcp-hub/event-router.d.ts.map +1 -0
- package/dist/engine/mcp-hub/event-router.js +47 -0
- package/dist/engine/mcp-hub/event-router.js.map +1 -0
- package/dist/engine/productivity/calibration-engine.d.ts +17 -0
- package/dist/engine/productivity/calibration-engine.d.ts.map +1 -0
- package/dist/engine/productivity/calibration-engine.js +49 -0
- package/dist/engine/productivity/calibration-engine.js.map +1 -0
- package/dist/engine/productivity/time-tracker.d.ts +6 -0
- package/dist/engine/productivity/time-tracker.d.ts.map +1 -0
- package/dist/engine/productivity/time-tracker.js +28 -0
- package/dist/engine/productivity/time-tracker.js.map +1 -0
- package/dist/engine/productivity/vibe-tax-calculator.d.ts +14 -0
- package/dist/engine/productivity/vibe-tax-calculator.d.ts.map +1 -0
- package/dist/engine/productivity/vibe-tax-calculator.js +63 -0
- package/dist/engine/productivity/vibe-tax-calculator.js.map +1 -0
- package/dist/engine/quality-gates/gate-catalog.d.ts +6 -0
- package/dist/engine/quality-gates/gate-catalog.d.ts.map +1 -0
- package/dist/engine/quality-gates/gate-catalog.js +351 -0
- package/dist/engine/quality-gates/gate-catalog.js.map +1 -0
- package/dist/engine/quality-gates/gate-evaluator.d.ts +3 -0
- package/dist/engine/quality-gates/gate-evaluator.d.ts.map +1 -0
- package/dist/engine/quality-gates/gate-evaluator.js +25 -0
- package/dist/engine/quality-gates/gate-evaluator.js.map +1 -0
- package/dist/engine/quality-gates/gate-injector.d.ts +20 -0
- package/dist/engine/quality-gates/gate-injector.d.ts.map +1 -0
- package/dist/engine/quality-gates/gate-injector.js +75 -0
- package/dist/engine/quality-gates/gate-injector.js.map +1 -0
- package/dist/engine/similar-problems/similarity-finder.d.ts +3 -0
- package/dist/engine/similar-problems/similarity-finder.d.ts.map +1 -0
- package/dist/engine/similar-problems/similarity-finder.js +144 -0
- package/dist/engine/similar-problems/similarity-finder.js.map +1 -0
- package/dist/engine/sync/asana-puller.d.ts +9 -0
- package/dist/engine/sync/asana-puller.d.ts.map +1 -0
- package/dist/engine/sync/asana-puller.js +91 -0
- package/dist/engine/sync/asana-puller.js.map +1 -0
- package/dist/engine/sync/conflict-resolver.d.ts +17 -0
- package/dist/engine/sync/conflict-resolver.d.ts.map +1 -0
- package/dist/engine/sync/conflict-resolver.js +58 -0
- package/dist/engine/sync/conflict-resolver.js.map +1 -0
- package/dist/engine/sync/monday-puller.d.ts +9 -0
- package/dist/engine/sync/monday-puller.d.ts.map +1 -0
- package/dist/engine/sync/monday-puller.js +110 -0
- package/dist/engine/sync/monday-puller.js.map +1 -0
- package/dist/engine/sync/notion-puller.d.ts +15 -0
- package/dist/engine/sync/notion-puller.d.ts.map +1 -0
- package/dist/engine/sync/notion-puller.js +101 -0
- package/dist/engine/sync/notion-puller.js.map +1 -0
- package/dist/engine/verifier/code-scanner.d.ts +8 -0
- package/dist/engine/verifier/code-scanner.d.ts.map +1 -0
- package/dist/engine/verifier/code-scanner.js +73 -0
- package/dist/engine/verifier/code-scanner.js.map +1 -0
- package/dist/engine/verifier/compliance-scorer.d.ts +17 -0
- package/dist/engine/verifier/compliance-scorer.d.ts.map +1 -0
- package/dist/engine/verifier/compliance-scorer.js +131 -0
- package/dist/engine/verifier/compliance-scorer.js.map +1 -0
- package/dist/engine/verifier/criterion-matcher.d.ts +15 -0
- package/dist/engine/verifier/criterion-matcher.d.ts.map +1 -0
- package/dist/engine/verifier/criterion-matcher.js +210 -0
- package/dist/engine/verifier/criterion-matcher.js.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/compliance-audit-store.d.ts +12 -0
- package/dist/storage/compliance-audit-store.d.ts.map +1 -0
- package/dist/storage/compliance-audit-store.js +40 -0
- package/dist/storage/compliance-audit-store.js.map +1 -0
- package/dist/storage/compliance-score-store.d.ts +16 -0
- package/dist/storage/compliance-score-store.d.ts.map +1 -0
- package/dist/storage/compliance-score-store.js +30 -0
- package/dist/storage/compliance-score-store.js.map +1 -0
- package/dist/storage/context-profile-store.d.ts +14 -0
- package/dist/storage/context-profile-store.d.ts.map +1 -0
- package/dist/storage/context-profile-store.js +34 -0
- package/dist/storage/context-profile-store.js.map +1 -0
- package/dist/storage/mcp-hub-store.d.ts +9 -0
- package/dist/storage/mcp-hub-store.d.ts.map +1 -0
- package/dist/storage/mcp-hub-store.js +28 -0
- package/dist/storage/mcp-hub-store.js.map +1 -0
- package/dist/storage/time-tracking-store.d.ts +6 -0
- package/dist/storage/time-tracking-store.d.ts.map +1 -0
- package/dist/storage/time-tracking-store.js +34 -0
- package/dist/storage/time-tracking-store.js.map +1 -0
- package/dist/storage/workflow-checkpoint-store.d.ts +16 -0
- package/dist/storage/workflow-checkpoint-store.d.ts.map +1 -0
- package/dist/storage/workflow-checkpoint-store.js +71 -0
- package/dist/storage/workflow-checkpoint-store.js.map +1 -0
- package/dist/tools/checkpoint/approve-checkpoint-handler.d.ts +3 -0
- package/dist/tools/checkpoint/approve-checkpoint-handler.d.ts.map +1 -0
- package/dist/tools/checkpoint/approve-checkpoint-handler.js +32 -0
- package/dist/tools/checkpoint/approve-checkpoint-handler.js.map +1 -0
- package/dist/tools/checkpoint/configure-policy-handler.d.ts +3 -0
- package/dist/tools/checkpoint/configure-policy-handler.d.ts.map +1 -0
- package/dist/tools/checkpoint/configure-policy-handler.js +60 -0
- package/dist/tools/checkpoint/configure-policy-handler.js.map +1 -0
- package/dist/tools/checkpoint/list-checkpoints-handler.d.ts +3 -0
- package/dist/tools/checkpoint/list-checkpoints-handler.d.ts.map +1 -0
- package/dist/tools/checkpoint/list-checkpoints-handler.js +25 -0
- package/dist/tools/checkpoint/list-checkpoints-handler.js.map +1 -0
- package/dist/tools/checkpoint/reject-checkpoint-handler.d.ts +3 -0
- package/dist/tools/checkpoint/reject-checkpoint-handler.d.ts.map +1 -0
- package/dist/tools/checkpoint/reject-checkpoint-handler.js +32 -0
- package/dist/tools/checkpoint/reject-checkpoint-handler.js.map +1 -0
- package/dist/tools/checkpoint/require-checkpoint-handler.d.ts +3 -0
- package/dist/tools/checkpoint/require-checkpoint-handler.d.ts.map +1 -0
- package/dist/tools/checkpoint/require-checkpoint-handler.js +44 -0
- package/dist/tools/checkpoint/require-checkpoint-handler.js.map +1 -0
- package/dist/tools/compliance-gap-handler.d.ts +5 -0
- package/dist/tools/compliance-gap-handler.d.ts.map +1 -0
- package/dist/tools/compliance-gap-handler.js +64 -0
- package/dist/tools/compliance-gap-handler.js.map +1 -0
- package/dist/tools/distribution-readiness-handler.d.ts +3 -0
- package/dist/tools/distribution-readiness-handler.d.ts.map +1 -0
- package/dist/tools/distribution-readiness-handler.js +24 -0
- package/dist/tools/distribution-readiness-handler.js.map +1 -0
- package/dist/tools/generate-cost-estimate-handler.d.ts +3 -0
- package/dist/tools/generate-cost-estimate-handler.d.ts.map +1 -0
- package/dist/tools/generate-cost-estimate-handler.js +29 -0
- package/dist/tools/generate-cost-estimate-handler.js.map +1 -0
- package/dist/tools/generate-deployment-diagram-handler.d.ts +3 -0
- package/dist/tools/generate-deployment-diagram-handler.d.ts.map +1 -0
- package/dist/tools/generate-deployment-diagram-handler.js +26 -0
- package/dist/tools/generate-deployment-diagram-handler.js.map +1 -0
- package/dist/tools/generate-runbook-handler.d.ts +3 -0
- package/dist/tools/generate-runbook-handler.d.ts.map +1 -0
- package/dist/tools/generate-runbook-handler.js +18 -0
- package/dist/tools/generate-runbook-handler.js.map +1 -0
- package/dist/tools/inject-quality-gates-handler.d.ts +7 -0
- package/dist/tools/inject-quality-gates-handler.d.ts.map +1 -0
- package/dist/tools/inject-quality-gates-handler.js +59 -0
- package/dist/tools/inject-quality-gates-handler.js.map +1 -0
- package/dist/tools/mcp-hub-handler.d.ts +7 -0
- package/dist/tools/mcp-hub-handler.d.ts.map +1 -0
- package/dist/tools/mcp-hub-handler.js +73 -0
- package/dist/tools/mcp-hub-handler.js.map +1 -0
- package/dist/tools/productivity-report-handler.d.ts +4 -0
- package/dist/tools/productivity-report-handler.d.ts.map +1 -0
- package/dist/tools/productivity-report-handler.js +98 -0
- package/dist/tools/productivity-report-handler.js.map +1 -0
- package/dist/tools/pull-sync-handler.d.ts +25 -0
- package/dist/tools/pull-sync-handler.d.ts.map +1 -0
- package/dist/tools/pull-sync-handler.js +161 -0
- package/dist/tools/pull-sync-handler.js.map +1 -0
- package/dist/tools/register-auto-remediation.d.ts +3 -0
- package/dist/tools/register-auto-remediation.d.ts.map +1 -0
- package/dist/tools/register-auto-remediation.js +174 -0
- package/dist/tools/register-auto-remediation.js.map +1 -0
- package/dist/tools/register-checkpoints.d.ts +3 -0
- package/dist/tools/register-checkpoints.d.ts.map +1 -0
- package/dist/tools/register-checkpoints.js +134 -0
- package/dist/tools/register-checkpoints.js.map +1 -0
- package/dist/tools/register-context-profile.d.ts +3 -0
- package/dist/tools/register-context-profile.d.ts.map +1 -0
- package/dist/tools/register-context-profile.js +106 -0
- package/dist/tools/register-context-profile.js.map +1 -0
- package/dist/tools/register-distribution.d.ts +3 -0
- package/dist/tools/register-distribution.d.ts.map +1 -0
- package/dist/tools/register-distribution.js +103 -0
- package/dist/tools/register-distribution.js.map +1 -0
- package/dist/tools/register-ears.d.ts +3 -0
- package/dist/tools/register-ears.d.ts.map +1 -0
- package/dist/tools/register-ears.js +148 -0
- package/dist/tools/register-ears.js.map +1 -0
- package/dist/tools/register-enterprise-compliance.d.ts +3 -0
- package/dist/tools/register-enterprise-compliance.d.ts.map +1 -0
- package/dist/tools/register-enterprise-compliance.js +30 -0
- package/dist/tools/register-enterprise-compliance.js.map +1 -0
- package/dist/tools/register-mcp-hub.d.ts +3 -0
- package/dist/tools/register-mcp-hub.d.ts.map +1 -0
- package/dist/tools/register-mcp-hub.js +47 -0
- package/dist/tools/register-mcp-hub.js.map +1 -0
- package/dist/tools/register-productivity.d.ts +3 -0
- package/dist/tools/register-productivity.d.ts.map +1 -0
- package/dist/tools/register-productivity.js +25 -0
- package/dist/tools/register-productivity.js.map +1 -0
- package/dist/tools/register-pull-sync.d.ts +3 -0
- package/dist/tools/register-pull-sync.d.ts.map +1 -0
- package/dist/tools/register-pull-sync.js +71 -0
- package/dist/tools/register-pull-sync.js.map +1 -0
- package/dist/tools/register-quality-gates.d.ts +3 -0
- package/dist/tools/register-quality-gates.d.ts.map +1 -0
- package/dist/tools/register-quality-gates.js +47 -0
- package/dist/tools/register-quality-gates.js.map +1 -0
- package/dist/tools/register-spec405-tools.d.ts +7 -0
- package/dist/tools/register-spec405-tools.d.ts.map +1 -0
- package/dist/tools/register-spec405-tools.js +194 -0
- package/dist/tools/register-spec405-tools.js.map +1 -0
- package/dist/tools/register-verifier.d.ts +3 -0
- package/dist/tools/register-verifier.d.ts.map +1 -0
- package/dist/tools/register-verifier.js +141 -0
- package/dist/tools/register-verifier.js.map +1 -0
- package/dist/types/analysis.d.ts +128 -0
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/context-profile.d.ts +22 -0
- package/dist/types/context-profile.d.ts.map +1 -0
- package/dist/types/context-profile.js +2 -0
- package/dist/types/context-profile.js.map +1 -0
- package/dist/types/docs.d.ts +43 -0
- package/dist/types/docs.d.ts.map +1 -1
- package/dist/types/ears.d.ts +34 -0
- package/dist/types/ears.d.ts.map +1 -0
- package/dist/types/ears.js +3 -0
- package/dist/types/ears.js.map +1 -0
- package/dist/types/env.d.ts +23 -0
- package/dist/types/env.d.ts.map +1 -1
- package/dist/types/estimation.d.ts +30 -0
- package/dist/types/estimation.d.ts.map +1 -1
- package/dist/types/health.d.ts +40 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/health.js +3 -0
- package/dist/types/health.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/notion-asana-monday.d.ts +38 -0
- package/dist/types/notion-asana-monday.d.ts.map +1 -1
- package/dist/types/orchestration/index.d.ts +1 -0
- package/dist/types/orchestration/index.d.ts.map +1 -1
- package/dist/types/orchestration/mcp-hub.d.ts +29 -0
- package/dist/types/orchestration/mcp-hub.d.ts.map +1 -0
- package/dist/types/orchestration/mcp-hub.js +3 -0
- package/dist/types/orchestration/mcp-hub.js.map +1 -0
- package/dist/types/orchestration.d.ts +1 -1
- package/dist/types/orchestration.d.ts.map +1 -1
- package/dist/types/workflow-checkpoint.d.ts +66 -0
- package/dist/types/workflow-checkpoint.d.ts.map +1 -0
- package/dist/types/workflow-checkpoint.js +4 -0
- package/dist/types/workflow-checkpoint.js.map +1 -0
- package/package.json +1 -1
- package/src/config/license-plans.json +32 -2
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Monthly cost table (approximate 2026 prices)
|
|
2
|
+
const COST_TABLE = {
|
|
3
|
+
aws: {
|
|
4
|
+
compute: { tier: 'ECS Fargate (0.5 vCPU, 1GB)', monthlyUsd: 15, notes: '~720 hours/month' },
|
|
5
|
+
database: {
|
|
6
|
+
tier: 'RDS PostgreSQL t3.micro',
|
|
7
|
+
monthlyUsd: 25,
|
|
8
|
+
notes: 'Single-AZ, 20GB storage',
|
|
9
|
+
},
|
|
10
|
+
cache: { tier: 'ElastiCache t3.micro', monthlyUsd: 18, notes: 'Single node' },
|
|
11
|
+
cdn: { tier: 'CloudFront', monthlyUsd: 5, notes: '10GB transfer included' },
|
|
12
|
+
storage: { tier: 'S3 Standard', monthlyUsd: 3, notes: '100GB storage' },
|
|
13
|
+
monitoring: { tier: 'CloudWatch', monthlyUsd: 10, notes: 'Basic metrics + logs' },
|
|
14
|
+
},
|
|
15
|
+
gcp: {
|
|
16
|
+
compute: { tier: 'Cloud Run (min 1 instance)', monthlyUsd: 12, notes: '1 vCPU, 512MB' },
|
|
17
|
+
database: { tier: 'Cloud SQL PostgreSQL', monthlyUsd: 30, notes: 'db-f1-micro, 10GB' },
|
|
18
|
+
cache: { tier: 'Memorystore Redis', monthlyUsd: 20, notes: '1GB basic tier' },
|
|
19
|
+
cdn: { tier: 'Cloud CDN', monthlyUsd: 4, notes: '10GB egress included' },
|
|
20
|
+
storage: { tier: 'Cloud Storage', monthlyUsd: 2, notes: '100GB standard' },
|
|
21
|
+
monitoring: { tier: 'Cloud Monitoring', monthlyUsd: 8, notes: 'Basic ops suite' },
|
|
22
|
+
},
|
|
23
|
+
railway: {
|
|
24
|
+
compute: { tier: 'Railway Hobby', monthlyUsd: 5, notes: 'Included in hobby plan' },
|
|
25
|
+
database: { tier: 'Railway PostgreSQL', monthlyUsd: 5, notes: '1GB included' },
|
|
26
|
+
cache: { tier: 'Railway Redis', monthlyUsd: 5, notes: 'Shared instance' },
|
|
27
|
+
cdn: { tier: 'N/A', monthlyUsd: 0, notes: 'Not offered' },
|
|
28
|
+
storage: { tier: 'Volume', monthlyUsd: 2, notes: '1GB volume' },
|
|
29
|
+
monitoring: { tier: 'Built-in metrics', monthlyUsd: 0, notes: 'Included' },
|
|
30
|
+
},
|
|
31
|
+
vercel: {
|
|
32
|
+
compute: {
|
|
33
|
+
tier: 'Vercel Pro Functions',
|
|
34
|
+
monthlyUsd: 20,
|
|
35
|
+
notes: 'Fluid compute, included in Pro',
|
|
36
|
+
},
|
|
37
|
+
database: {
|
|
38
|
+
tier: 'Vercel Marketplace DB',
|
|
39
|
+
monthlyUsd: 15,
|
|
40
|
+
notes: 'Neon/PlanetScale starter',
|
|
41
|
+
},
|
|
42
|
+
cache: { tier: 'Vercel KV (Upstash)', monthlyUsd: 5, notes: '100MB included' },
|
|
43
|
+
cdn: { tier: 'Vercel Edge Network', monthlyUsd: 0, notes: 'Included in Pro' },
|
|
44
|
+
storage: { tier: 'Vercel Blob', monthlyUsd: 5, notes: '5GB included' },
|
|
45
|
+
monitoring: { tier: 'Vercel Analytics', monthlyUsd: 10, notes: 'Web Analytics Pro' },
|
|
46
|
+
},
|
|
47
|
+
fly: {
|
|
48
|
+
compute: { tier: 'Fly.io shared-cpu-1x', monthlyUsd: 3, notes: '256MB RAM' },
|
|
49
|
+
database: { tier: 'Fly Postgres', monthlyUsd: 5, notes: 'Single node' },
|
|
50
|
+
cache: { tier: 'Fly Redis (Upstash)', monthlyUsd: 5, notes: '10K commands/day free' },
|
|
51
|
+
cdn: { tier: 'N/A', monthlyUsd: 0, notes: 'Not offered' },
|
|
52
|
+
storage: { tier: 'Fly Volumes', monthlyUsd: 2, notes: '1GB volume' },
|
|
53
|
+
monitoring: { tier: 'Fly Metrics', monthlyUsd: 0, notes: 'Included' },
|
|
54
|
+
},
|
|
55
|
+
generic: {
|
|
56
|
+
compute: { tier: 'VPS equivalent', monthlyUsd: 10, notes: 'Generic estimate' },
|
|
57
|
+
database: { tier: 'Managed DB', monthlyUsd: 20, notes: 'Generic estimate' },
|
|
58
|
+
cache: { tier: 'Redis managed', monthlyUsd: 15, notes: 'Generic estimate' },
|
|
59
|
+
cdn: { tier: 'CDN basic', monthlyUsd: 5, notes: 'Generic estimate' },
|
|
60
|
+
storage: { tier: 'Object storage', monthlyUsd: 3, notes: 'Generic estimate' },
|
|
61
|
+
monitoring: { tier: 'Monitoring basic', monthlyUsd: 8, notes: 'Generic estimate' },
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
export function estimateCost(provider, resources) {
|
|
65
|
+
const table = COST_TABLE[provider];
|
|
66
|
+
const resourceCosts = resources
|
|
67
|
+
.map((r) => {
|
|
68
|
+
const entry = table[r];
|
|
69
|
+
if (!entry) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
resource: r,
|
|
74
|
+
provider,
|
|
75
|
+
tier: entry.tier,
|
|
76
|
+
monthlyUsd: entry.monthlyUsd,
|
|
77
|
+
notes: entry.notes,
|
|
78
|
+
};
|
|
79
|
+
})
|
|
80
|
+
.filter((r) => r !== null);
|
|
81
|
+
const total = resourceCosts.reduce((sum, r) => sum + r.monthlyUsd, 0);
|
|
82
|
+
const breakdown = resourceCosts
|
|
83
|
+
.map((r) => ` ${r.resource}: $${r.monthlyUsd}/mo (${r.tier})`)
|
|
84
|
+
.join('\n');
|
|
85
|
+
return {
|
|
86
|
+
provider,
|
|
87
|
+
resources: resourceCosts,
|
|
88
|
+
totalMonthlyUsd: total,
|
|
89
|
+
totalYearlyUsd: total * 12,
|
|
90
|
+
breakdown: `Provider: ${provider}\n${breakdown}\n Total: $${total}/month ($${total * 12}/year)`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function detectProvider(stack, framework) {
|
|
94
|
+
const s = (stack ?? '').toLowerCase();
|
|
95
|
+
const f = (framework ?? '').toLowerCase();
|
|
96
|
+
if (s.includes('vercel') || f.includes('next') || f.includes('vercel')) {
|
|
97
|
+
return 'vercel';
|
|
98
|
+
}
|
|
99
|
+
if (s.includes('railway')) {
|
|
100
|
+
return 'railway';
|
|
101
|
+
}
|
|
102
|
+
if (s.includes('fly')) {
|
|
103
|
+
return 'fly';
|
|
104
|
+
}
|
|
105
|
+
if (s.includes('gcp') || s.includes('google')) {
|
|
106
|
+
return 'gcp';
|
|
107
|
+
}
|
|
108
|
+
if (s.includes('aws') || s.includes('amazon')) {
|
|
109
|
+
return 'aws';
|
|
110
|
+
}
|
|
111
|
+
return 'generic';
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=cost-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.js","sourceRoot":"","sources":["../../../src/engine/distribution/cost-estimator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DiagramSpec {
|
|
2
|
+
services: {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
}[];
|
|
6
|
+
databases: string[];
|
|
7
|
+
caches: string[];
|
|
8
|
+
external: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function generateC4Diagram(input: DiagramSpec): string;
|
|
11
|
+
export declare function specTodiagramInput(specTitles: string[], stack?: string): DiagramSpec;
|
|
12
|
+
//# sourceMappingURL=diagram-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/distribution/diagram-generator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAoC5D;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CA4BpF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function generateC4Diagram(input) {
|
|
2
|
+
const lines = ['```mermaid', 'graph TB'];
|
|
3
|
+
if (input.services.length > 0) {
|
|
4
|
+
lines.push(' subgraph Services');
|
|
5
|
+
for (const s of input.services) {
|
|
6
|
+
lines.push(` ${s.name.replace(/\s+/g, '_')}["${s.name}\n[${s.type}]"]`);
|
|
7
|
+
}
|
|
8
|
+
lines.push(' end');
|
|
9
|
+
}
|
|
10
|
+
if (input.databases.length > 0) {
|
|
11
|
+
lines.push(' subgraph Data');
|
|
12
|
+
for (const db of input.databases) {
|
|
13
|
+
lines.push(` ${db.replace(/\s+/g, '_')}[("${db}")]`);
|
|
14
|
+
}
|
|
15
|
+
lines.push(' end');
|
|
16
|
+
}
|
|
17
|
+
if (input.caches.length > 0) {
|
|
18
|
+
for (const cache of input.caches) {
|
|
19
|
+
lines.push(` ${cache.replace(/\s+/g, '_')}(("${cache}"))`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (input.external.length > 0) {
|
|
23
|
+
lines.push(' subgraph External');
|
|
24
|
+
for (const ext of input.external) {
|
|
25
|
+
lines.push(` ${ext.replace(/\s+/g, '_')}["${ext}"]:::external`);
|
|
26
|
+
}
|
|
27
|
+
lines.push(' end');
|
|
28
|
+
}
|
|
29
|
+
lines.push(' classDef external fill:#f9f,stroke:#333,stroke-dasharray: 5 5');
|
|
30
|
+
lines.push('```');
|
|
31
|
+
return lines.join('\n');
|
|
32
|
+
}
|
|
33
|
+
export function specTodiagramInput(specTitles, stack) {
|
|
34
|
+
const services = [{ name: 'API Server', type: 'Service' }];
|
|
35
|
+
const databases = [];
|
|
36
|
+
const caches = [];
|
|
37
|
+
const external = [];
|
|
38
|
+
const allText = specTitles.join(' ').toLowerCase();
|
|
39
|
+
if (allText.includes('postgres') || allText.includes('database') || allText.includes('sql')) {
|
|
40
|
+
databases.push('PostgreSQL');
|
|
41
|
+
}
|
|
42
|
+
if (allText.includes('redis') || allText.includes('cache')) {
|
|
43
|
+
caches.push('Redis Cache');
|
|
44
|
+
}
|
|
45
|
+
if (allText.includes('auth') || allText.includes('oauth')) {
|
|
46
|
+
external.push('Auth Provider');
|
|
47
|
+
}
|
|
48
|
+
if (allText.includes('email') || allText.includes('notification')) {
|
|
49
|
+
external.push('Email Service');
|
|
50
|
+
}
|
|
51
|
+
if (allText.includes('payment') || allText.includes('billing') || allText.includes('stripe')) {
|
|
52
|
+
external.push('Payment Gateway');
|
|
53
|
+
}
|
|
54
|
+
if ((stack ?? '').toLowerCase().includes('next') || allText.includes('frontend')) {
|
|
55
|
+
services.push({ name: 'Frontend', type: 'Web App' });
|
|
56
|
+
}
|
|
57
|
+
return { services, databases, caches, external };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=diagram-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-generator.js","sourceRoot":"","sources":["../../../src/engine/distribution/diagram-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DistributionReadiness } from '../../types/index.js';
|
|
2
|
+
export type DistributionReadinessResult = DistributionReadiness;
|
|
3
|
+
export declare function analyzeDistributionReadiness(specTitles: string[]): DistributionReadinessResult;
|
|
4
|
+
//# sourceMappingURL=readiness-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/distribution/readiness-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlE,MAAM,MAAM,2BAA2B,GAAG,qBAAqB,CAAC;AA6ChE,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,2BAA2B,CAqB9F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const CRITICAL_SPEC_PATTERNS = [
|
|
2
|
+
{
|
|
3
|
+
key: 'auth',
|
|
4
|
+
patterns: ['auth', 'login', 'jwt', 'oauth', 'session', 'token'],
|
|
5
|
+
label: 'Authentication',
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
key: 'error',
|
|
9
|
+
patterns: ['error handling', 'error boundary', 'exception'],
|
|
10
|
+
label: 'Error Handling',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
key: 'rate-limit',
|
|
14
|
+
patterns: ['rate limit', 'throttle', 'quota'],
|
|
15
|
+
label: 'Rate Limiting',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: 'monitoring',
|
|
19
|
+
patterns: ['monitoring', 'observability', 'logging', 'metrics', 'otel'],
|
|
20
|
+
label: 'Observability/Monitoring',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
key: 'backup',
|
|
24
|
+
patterns: ['backup', 'restore', 'disaster recovery', 'data retention'],
|
|
25
|
+
label: 'Backup & Recovery',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
key: 'cost',
|
|
29
|
+
patterns: ['cost', 'budget', 'billing', 'spending'],
|
|
30
|
+
label: 'Cost Management',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
key: 'security',
|
|
34
|
+
patterns: ['security', 'vulnerability', 'penetration', 'audit'],
|
|
35
|
+
label: 'Security Audit',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
key: 'ci',
|
|
39
|
+
patterns: ['ci', 'cd', 'pipeline', 'deploy', 'release'],
|
|
40
|
+
label: 'CI/CD Pipeline',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
export function analyzeDistributionReadiness(specTitles) {
|
|
44
|
+
const titlesLower = specTitles.map((t) => t.toLowerCase());
|
|
45
|
+
const present = [];
|
|
46
|
+
const missing = [];
|
|
47
|
+
for (const critical of CRITICAL_SPEC_PATTERNS) {
|
|
48
|
+
const found = critical.patterns.some((p) => titlesLower.some((t) => t.includes(p)));
|
|
49
|
+
if (found) {
|
|
50
|
+
present.push(critical.label);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
missing.push(critical.label);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const score = Math.round((present.length / CRITICAL_SPEC_PATTERNS.length) * 100);
|
|
57
|
+
const level = score >= 80 ? 'ready' : score >= 50 ? 'partial' : 'not-ready';
|
|
58
|
+
const recommendations = missing.map((m) => `Create a spec for: ${m}`);
|
|
59
|
+
return { score, level, present, missing, recommendations };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=readiness-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness-analyzer.js","sourceRoot":"","sources":["../../../src/engine/distribution/readiness-analyzer.ts"],"names":[],"mappings":"AAMA,MAAM,sBAAsB,GAAG;IAC7B;QACE,GAAG,EAAE,MAAM;QACX,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;QAC/D,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,CAAC;QAC3D,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC;QAC7C,KAAK,EAAE,eAAe;KACvB;IACD;QACE,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;QACvE,KAAK,EAAE,0BAA0B;KAClC;IACD;QACE,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;QACtE,KAAK,EAAE,mBAAmB;KAC3B;IACD;QACE,GAAG,EAAE,MAAM;QACX,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;QACnD,KAAK,EAAE,iBAAiB;KACzB;IACD;QACE,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,CAAC,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC;QAC/D,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC;QACvD,KAAK,EAAE,gBAAgB;KACxB;CACF,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,UAAoB;IAC/D,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IACjF,MAAM,KAAK,GACT,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;IAEhE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAEtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runbook-generator.d.ts","sourceRoot":"","sources":["../../../src/engine/distribution/runbook-generator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAwC3D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function generateRunbook(input) {
|
|
2
|
+
const { projectName, provider, services } = input;
|
|
3
|
+
const date = new Date().toISOString().split('T')[0];
|
|
4
|
+
return `# Operational Runbook — ${projectName}
|
|
5
|
+
Generated: ${date} | Provider: ${provider}
|
|
6
|
+
|
|
7
|
+
## 1. Pre-Deployment Checklist
|
|
8
|
+
- [ ] All tests passing in CI
|
|
9
|
+
- [ ] Environment variables configured in ${provider} dashboard
|
|
10
|
+
- [ ] Database migrations reviewed and tested on staging
|
|
11
|
+
- [ ] Rollback plan documented (see section 3)
|
|
12
|
+
- [ ] On-call engineer notified
|
|
13
|
+
|
|
14
|
+
## 2. Deployment Steps
|
|
15
|
+
${services.map((s, i) => `${i + 1}. Deploy ${s} to ${provider}`).join('\n')}
|
|
16
|
+
${services.length + 1}. Run health check endpoints
|
|
17
|
+
${services.length + 2}. Verify monitoring dashboards show green
|
|
18
|
+
|
|
19
|
+
## 3. Rollback Procedure
|
|
20
|
+
1. Identify the last stable deployment tag
|
|
21
|
+
2. Trigger rollback in ${provider} dashboard → select previous deployment
|
|
22
|
+
3. Verify rollback successful via health check
|
|
23
|
+
4. Notify team in incident channel
|
|
24
|
+
|
|
25
|
+
## 4. Health Checks
|
|
26
|
+
${services.map((s) => `- GET /${s.toLowerCase().replace(/\s+/g, '-')}/health → 200 OK`).join('\n')}
|
|
27
|
+
|
|
28
|
+
## 5. Alerting Thresholds
|
|
29
|
+
| Metric | Warning | Critical |
|
|
30
|
+
|--------|---------|----------|
|
|
31
|
+
| Error rate | >1% | >5% |
|
|
32
|
+
| P99 latency | >500ms | >2000ms |
|
|
33
|
+
| CPU usage | >70% | >90% |
|
|
34
|
+
| Memory | >80% | >95% |
|
|
35
|
+
|
|
36
|
+
## 6. Incident Response
|
|
37
|
+
- P1 (production down): Page on-call immediately, start incident bridge
|
|
38
|
+
- P2 (degraded): Notify team, investigate within 30 minutes
|
|
39
|
+
- P3 (minor): Track in issue tracker, fix in next sprint
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=runbook-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runbook-generator.js","sourceRoot":"","sources":["../../../src/engine/distribution/runbook-generator.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,eAAe,CAAC,KAAmB;IACjD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,2BAA2B,WAAW;aAClC,IAAI,gBAAgB,QAAQ;;;;4CAIG,QAAQ;;;;;;EAMlD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EACzE,QAAQ,CAAC,MAAM,GAAG,CAAC;EACnB,QAAQ,CAAC,MAAM,GAAG,CAAC;;;;yBAII,QAAQ;;;;;EAK/B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;CAcjG,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DriftResolutionResult } from '../../types/health.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves drift violations semi-automatically by inspecting cached drift
|
|
4
|
+
* entries and taking action based on the spec's current status.
|
|
5
|
+
*
|
|
6
|
+
* When dryRun=true, returns the planned resolutions without writing any files.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveDriftViolations(projectPath: string, projectId: string, dryRun?: boolean): Promise<DriftResolutionResult>;
|
|
9
|
+
//# sourceMappingURL=violation-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-resolver.d.ts","sourceRoot":"","sources":["../../../src/engine/drift/violation-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAiB,MAAM,uBAAuB,CAAC;AAwFlF;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,UAAQ,GACb,OAAO,CAAC,qBAAqB,CAAC,CA+DhC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// engine/drift/violation-resolver.ts — Semi-automatic drift violation resolution (SPEC-408)
|
|
2
|
+
import { mkdir, writeFile, access } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { specStore } from '../../storage/index.js';
|
|
5
|
+
import { DriftCacheStore } from '../../storage/drift-cache-store.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
async function specDirExists(specDir) {
|
|
10
|
+
try {
|
|
11
|
+
await access(specDir);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function createFollowUpSpec(projectPath, parentSpecId, reason, dryRun) {
|
|
19
|
+
const timestamp = Date.now();
|
|
20
|
+
const specId = `SPEC-followup-${parentSpecId.toLowerCase()}-${timestamp}`;
|
|
21
|
+
if (!dryRun) {
|
|
22
|
+
const specDir = join(projectPath, 'planu', 'specs', specId);
|
|
23
|
+
await mkdir(specDir, { recursive: true });
|
|
24
|
+
const now = new Date().toISOString();
|
|
25
|
+
const specContent = [
|
|
26
|
+
'---',
|
|
27
|
+
`id: ${specId}`,
|
|
28
|
+
`title: "Follow-up: ${parentSpecId} drift resolution"`,
|
|
29
|
+
`status: draft`,
|
|
30
|
+
`tags: [drift, follow-up, auto-generated]`,
|
|
31
|
+
`createdAt: ${now}`,
|
|
32
|
+
'---',
|
|
33
|
+
'',
|
|
34
|
+
`# Follow-up for ${parentSpecId}`,
|
|
35
|
+
'',
|
|
36
|
+
reason,
|
|
37
|
+
'',
|
|
38
|
+
'## Acceptance Criteria',
|
|
39
|
+
'',
|
|
40
|
+
`- [ ] Review all criteria from ${parentSpecId} against current implementation`,
|
|
41
|
+
'- [ ] Update spec or implementation to re-align',
|
|
42
|
+
'- [ ] Run detect_drift to confirm score returns to 0',
|
|
43
|
+
'',
|
|
44
|
+
].join('\n');
|
|
45
|
+
await writeFile(join(specDir, 'spec.md'), specContent, 'utf-8');
|
|
46
|
+
await writeFile(join(specDir, 'progress.md'), `# ${specId} — Progress\n\nstatus: draft\n`, 'utf-8');
|
|
47
|
+
}
|
|
48
|
+
return specId;
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Violation handlers per status
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
function buildDoneButDivergedResolution(specId) {
|
|
54
|
+
return {
|
|
55
|
+
specId,
|
|
56
|
+
action: 'follow-up-spec-queued',
|
|
57
|
+
description: 'Spec is done but code has diverged — follow-up spec created to track delta',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function buildInProgressAheadResolution(specId) {
|
|
61
|
+
return {
|
|
62
|
+
specId,
|
|
63
|
+
action: 'spec-note-added',
|
|
64
|
+
description: 'Spec is in-progress and code is ahead — criteria note added to flag untracked work',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Public API
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
/**
|
|
71
|
+
* Resolves drift violations semi-automatically by inspecting cached drift
|
|
72
|
+
* entries and taking action based on the spec's current status.
|
|
73
|
+
*
|
|
74
|
+
* When dryRun=true, returns the planned resolutions without writing any files.
|
|
75
|
+
*/
|
|
76
|
+
export async function resolveDriftViolations(projectPath, projectId, dryRun = false) {
|
|
77
|
+
const cacheStore = new DriftCacheStore(projectId);
|
|
78
|
+
const cacheData = await cacheStore.load();
|
|
79
|
+
const cachedEntries = Object.values(cacheData.entries);
|
|
80
|
+
const specs = await specStore.listSpecs(projectId);
|
|
81
|
+
const specMap = new Map(specs.map((s) => [s.id, s]));
|
|
82
|
+
const resolved = [];
|
|
83
|
+
const followUpSpecsCreated = [];
|
|
84
|
+
const manualReview = [];
|
|
85
|
+
for (const entry of cachedEntries) {
|
|
86
|
+
const spec = specMap.get(entry.specId);
|
|
87
|
+
if (!spec) {
|
|
88
|
+
manualReview.push(`${entry.specId}: spec no longer exists — remove orphaned drift cache`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (spec.status === 'done') {
|
|
92
|
+
// Code diverged from a completed spec — create follow-up
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
94
|
+
const reason = `Drift detected (score: ${entry.driftScore.toFixed(2)}) in files: ${(entry.driftedFiles ?? []).join(', ') || 'unknown'}`;
|
|
95
|
+
const followUpId = await createFollowUpSpec(projectPath, spec.id, reason, dryRun);
|
|
96
|
+
followUpSpecsCreated.push(followUpId);
|
|
97
|
+
resolved.push(buildDoneButDivergedResolution(spec.id));
|
|
98
|
+
}
|
|
99
|
+
else if (spec.status === 'implementing') {
|
|
100
|
+
// In-progress spec with code ahead — annotate but don't block
|
|
101
|
+
resolved.push(buildInProgressAheadResolution(spec.id));
|
|
102
|
+
}
|
|
103
|
+
else if (spec.status === 'draft') {
|
|
104
|
+
// Draft spec but code already exists — flag for human review
|
|
105
|
+
manualReview.push(`${spec.id}: spec is in draft status but drift detected — review if implementation started`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
manualReview.push(`${spec.id}: drift detected (status: ${spec.status}) — manual review needed`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (cachedEntries.length === 0) {
|
|
112
|
+
// Check all implementing/done specs without cached drift entries
|
|
113
|
+
const activeSpecs = specs.filter((s) => s.status === 'implementing' || s.status === 'done' || s.status === 'draft');
|
|
114
|
+
for (const spec of activeSpecs) {
|
|
115
|
+
const specDir = join(projectPath, 'planu', 'specs', spec.id);
|
|
116
|
+
const hasProgress = await specDirExists(join(specDir, 'progress.md'));
|
|
117
|
+
if (!hasProgress && spec.status === 'draft') {
|
|
118
|
+
manualReview.push(`${spec.id}: draft spec with no progress tracking — run auto_fix_health`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
resolved,
|
|
124
|
+
followUpSpecsCreated,
|
|
125
|
+
manualReview,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=violation-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-resolver.js","sourceRoot":"","sources":["../../../src/engine/drift/violation-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CriterionQuality } from '../../types/ears.js';
|
|
2
|
+
/**
|
|
3
|
+
* Score a single acceptance criterion using EARS and testability heuristics.
|
|
4
|
+
*/
|
|
5
|
+
export declare function scoreCriterion(text: string): CriterionQuality;
|
|
6
|
+
export declare function gradeSpec(avgScore: number): 'A' | 'B' | 'C' | 'D' | 'F';
|
|
7
|
+
//# sourceMappingURL=criterion-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criterion-scorer.d.ts","sourceRoot":"","sources":["../../../src/engine/ears/criterion-scorer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA8B5D;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAyD7D;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAcvE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// engine/ears/criterion-scorer.ts — EARS criterion scoring (SPEC-410)
|
|
2
|
+
import { detectEarsPattern, detectVaguenessFlags, isEarsCompliant } from './pattern-matcher.js';
|
|
3
|
+
import { generateRewrites } from './rewriter.js';
|
|
4
|
+
// Patterns that indicate a measurable numeric threshold
|
|
5
|
+
const NUMERIC_VALUE_REGEX = /\d+\s*(?:ms|milliseconds?|seconds?|minutes?|hours?|items?|%|percent|kb|mb|gb|px|requests?|users?|calls?|retries?)/i;
|
|
6
|
+
// Patterns for specific API routes/endpoints
|
|
7
|
+
const ENDPOINT_REGEX = /(?:\/api\/|GET\s+|POST\s+|PUT\s+|DELETE\s+|PATCH\s+)/i;
|
|
8
|
+
// Patterns for clear success conditions
|
|
9
|
+
const SUCCESS_CONDITION_REGEX = /\b(?:returns?|displays?|shows?|navigates?\s+to|renders?|saves?|stores?|loads?|creates?|sends?|emits?)\b/i;
|
|
10
|
+
// Patterns for a measurable threshold (numeric value with unit or comparison)
|
|
11
|
+
const MEASURABLE_THRESHOLD_REGEX = /\b(?:at (?:most|least)|no more than|within|fewer than|greater than|more than|\d+\s*(?:ms|seconds?|items?|%|kb|mb))\b/i;
|
|
12
|
+
// Patterns for named components/features
|
|
13
|
+
const COMPONENT_REGEX = /\b(?:[A-Z][a-zA-Z]+(?:Component|Page|Modal|Service|Store|API|Endpoint|Handler|Manager|Controller|View|Form|Button|Panel|Screen)|\w+[-_]\w+)\b/;
|
|
14
|
+
// Patterns for trigger conditions
|
|
15
|
+
const TRIGGER_REGEX = /\b(?:when|if|while|where|after|before|on(?:ce)?)\b/i;
|
|
16
|
+
// Patterns for actors
|
|
17
|
+
const ACTOR_REGEX = /\b(?:user|admin|system|operator|manager|client|server|guest|subscriber|owner)\b/i;
|
|
18
|
+
/**
|
|
19
|
+
* Score a single acceptance criterion using EARS and testability heuristics.
|
|
20
|
+
*/
|
|
21
|
+
export function scoreCriterion(text) {
|
|
22
|
+
const earsPattern = detectEarsPattern(text);
|
|
23
|
+
const earsCompliant = isEarsCompliant(text);
|
|
24
|
+
const vaguenessFlagsFound = detectVaguenessFlags(text);
|
|
25
|
+
const vaguenessDeduction = Math.min(vaguenessFlagsFound.length * 2, 10);
|
|
26
|
+
// --- Testability Score (0-10) ---
|
|
27
|
+
let testabilityScore = 0;
|
|
28
|
+
if (NUMERIC_VALUE_REGEX.test(text)) {
|
|
29
|
+
testabilityScore += 3;
|
|
30
|
+
}
|
|
31
|
+
if (earsCompliant) {
|
|
32
|
+
testabilityScore += 3;
|
|
33
|
+
}
|
|
34
|
+
if (ENDPOINT_REGEX.test(text)) {
|
|
35
|
+
testabilityScore += 2;
|
|
36
|
+
}
|
|
37
|
+
if (SUCCESS_CONDITION_REGEX.test(text)) {
|
|
38
|
+
testabilityScore += 2;
|
|
39
|
+
}
|
|
40
|
+
testabilityScore = Math.max(0, testabilityScore - vaguenessDeduction);
|
|
41
|
+
testabilityScore = Math.min(10, testabilityScore);
|
|
42
|
+
// --- Specificity Score (0-10) ---
|
|
43
|
+
let specificityScore = 0;
|
|
44
|
+
if (MEASURABLE_THRESHOLD_REGEX.test(text) || NUMERIC_VALUE_REGEX.test(text)) {
|
|
45
|
+
specificityScore += 4;
|
|
46
|
+
}
|
|
47
|
+
if (COMPONENT_REGEX.test(text)) {
|
|
48
|
+
specificityScore += 3;
|
|
49
|
+
}
|
|
50
|
+
if (TRIGGER_REGEX.test(text)) {
|
|
51
|
+
specificityScore += 2;
|
|
52
|
+
}
|
|
53
|
+
if (ACTOR_REGEX.test(text)) {
|
|
54
|
+
specificityScore += 1;
|
|
55
|
+
}
|
|
56
|
+
specificityScore = Math.max(0, specificityScore - vaguenessDeduction);
|
|
57
|
+
specificityScore = Math.min(10, specificityScore);
|
|
58
|
+
const overallScore = Math.round(((testabilityScore + specificityScore) / 2) * 10) / 10;
|
|
59
|
+
// Generate rewrite suggestions only when score is below threshold
|
|
60
|
+
const rewriteSuggestions = overallScore < 7 ? generateRewrites(text, earsPattern) : [];
|
|
61
|
+
return {
|
|
62
|
+
text,
|
|
63
|
+
testabilityScore,
|
|
64
|
+
specificityScore,
|
|
65
|
+
earsPattern,
|
|
66
|
+
earsCompliant,
|
|
67
|
+
vaguenessFlagsFound,
|
|
68
|
+
overallScore,
|
|
69
|
+
rewriteSuggestions,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function gradeSpec(avgScore) {
|
|
73
|
+
if (avgScore >= 9) {
|
|
74
|
+
return 'A';
|
|
75
|
+
}
|
|
76
|
+
if (avgScore >= 7) {
|
|
77
|
+
return 'B';
|
|
78
|
+
}
|
|
79
|
+
if (avgScore >= 5) {
|
|
80
|
+
return 'C';
|
|
81
|
+
}
|
|
82
|
+
if (avgScore >= 3) {
|
|
83
|
+
return 'D';
|
|
84
|
+
}
|
|
85
|
+
return 'F';
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=criterion-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criterion-scorer.js","sourceRoot":"","sources":["../../../src/engine/ears/criterion-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EarsPattern } from '../../types/ears.js';
|
|
2
|
+
export declare function detectEarsPattern(criterion: string): EarsPattern;
|
|
3
|
+
export declare function detectVaguenessFlags(criterion: string): string[];
|
|
4
|
+
export declare function isEarsCompliant(criterion: string): boolean;
|
|
5
|
+
//# sourceMappingURL=pattern-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-matcher.d.ts","sourceRoot":"","sources":["../../../src/engine/ears/pattern-matcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA+BvD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAOhE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE1D"}
|