@planu/cli 1.9.0 → 1.11.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 +5 -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/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/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/index.js +10 -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/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/spec-store.d.ts +2 -0
- package/dist/storage/spec-store.d.ts.map +1 -1
- package/dist/storage/spec-store.js +17 -1
- package/dist/storage/spec-store.js.map +1 -1
- 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/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/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-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-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/types/analysis.d.ts +30 -0
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/docs.d.ts +43 -0
- package/dist/types/docs.d.ts.map +1 -1
- 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/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/package.json +1 -1
- package/src/config/license-plans.json +5 -0
|
@@ -155,6 +155,7 @@
|
|
|
155
155
|
"diff_spec_versions",
|
|
156
156
|
"discover_mcps",
|
|
157
157
|
"discover_registry",
|
|
158
|
+
"distribution_readiness",
|
|
158
159
|
"ecosystem_status",
|
|
159
160
|
"elicit_requirements",
|
|
160
161
|
"estimate_ai_cost",
|
|
@@ -182,11 +183,14 @@
|
|
|
182
183
|
"generate_diagram",
|
|
183
184
|
"generate_docs_site",
|
|
184
185
|
"generate_ide_config",
|
|
186
|
+
"generate_cost_estimate",
|
|
187
|
+
"generate_deployment_diagram",
|
|
185
188
|
"generate_infrastructure",
|
|
186
189
|
"generate_orchestration_plan",
|
|
187
190
|
"generate_orchestration_script",
|
|
188
191
|
"generate_planu_ci",
|
|
189
192
|
"generate_proposal",
|
|
193
|
+
"generate_runbook",
|
|
190
194
|
"generate_rules",
|
|
191
195
|
"generate_skill",
|
|
192
196
|
"generate_spec_from_api",
|
|
@@ -196,6 +200,7 @@
|
|
|
196
200
|
"hook_status",
|
|
197
201
|
"import_spec",
|
|
198
202
|
"inject_criteria",
|
|
203
|
+
"inject_quality_gates",
|
|
199
204
|
"integrate_pm",
|
|
200
205
|
"jira_status",
|
|
201
206
|
"knowledge_gap_detector",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ComplianceEvidencePackage } from '../../types/index.js';
|
|
2
|
+
import type { ComplianceFramework } from './framework-catalog.js';
|
|
3
|
+
interface SpecInput {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
status: string;
|
|
8
|
+
approvedAt?: string;
|
|
9
|
+
updatedAt?: string;
|
|
10
|
+
}
|
|
11
|
+
interface AuditEventInput {
|
|
12
|
+
timestamp: string;
|
|
13
|
+
action: string;
|
|
14
|
+
specId: string;
|
|
15
|
+
actor?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildEvidencePackage(framework: ComplianceFramework, projectId: string, specs: SpecInput[], auditEvents: AuditEventInput[]): ComplianceEvidencePackage;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=evidence-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-builder.d.ts","sourceRoot":"","sources":["../../../src/engine/compliance/evidence-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,mBAAmB,EAC9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,EAAE,EAClB,WAAW,EAAE,eAAe,EAAE,GAC7B,yBAAyB,CAmC3B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Planu — Compliance evidence package builder (SPEC-402)
|
|
2
|
+
import { analyzeComplianceGaps } from './gap-analyzer.js';
|
|
3
|
+
export function buildEvidencePackage(framework, projectId, specs, auditEvents) {
|
|
4
|
+
const gapAnalysis = analyzeComplianceGaps(framework, specs);
|
|
5
|
+
const doneSpecs = specs.filter((s) => s.status === 'done');
|
|
6
|
+
const approvalEvents = auditEvents.filter((e) => e.action === 'status:approved');
|
|
7
|
+
const controlMatrix = gapAnalysis.coverage.map((c) => ({
|
|
8
|
+
controlId: c.controlId,
|
|
9
|
+
controlName: c.controlName,
|
|
10
|
+
status: c.status,
|
|
11
|
+
specIds: c.coveringSpecIds,
|
|
12
|
+
evidence: c.coveringSpecIds.length > 0
|
|
13
|
+
? `Covered by ${c.coveringSpecIds.length} spec(s): ${c.coveringSpecIds.join(', ')}`
|
|
14
|
+
: 'No specs found for this control',
|
|
15
|
+
}));
|
|
16
|
+
return {
|
|
17
|
+
framework,
|
|
18
|
+
projectId,
|
|
19
|
+
generatedAt: new Date().toISOString(),
|
|
20
|
+
summary: {
|
|
21
|
+
totalSpecs: specs.length,
|
|
22
|
+
doneSpecs: doneSpecs.length,
|
|
23
|
+
approvalEvents: approvalEvents.length,
|
|
24
|
+
complianceScore: gapAnalysis.score,
|
|
25
|
+
},
|
|
26
|
+
controlMatrix,
|
|
27
|
+
changeManagementEvidence: approvalEvents.slice(-20).map((e) => ({
|
|
28
|
+
timestamp: e.timestamp,
|
|
29
|
+
specId: e.specId,
|
|
30
|
+
actor: e.actor ?? 'unknown',
|
|
31
|
+
action: e.action,
|
|
32
|
+
})),
|
|
33
|
+
gaps: gapAnalysis.recommendations,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=evidence-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-builder.js","sourceRoot":"","sources":["../../../src/engine/compliance/evidence-builder.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAIzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAoB1D,MAAM,UAAU,oBAAoB,CAClC,SAA8B,EAC9B,SAAiB,EACjB,KAAkB,EAClB,WAA8B;IAE9B,MAAM,WAAW,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC3D,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC;IAEjF,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,CAAC,CAAC,eAAe;QAC1B,QAAQ,EACN,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;YAC1B,CAAC,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,MAAM,aAAa,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACnF,CAAC,CAAC,iCAAiC;KACxC,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,SAAS;QACT,SAAS;QACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE;YACP,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,cAAc,EAAE,cAAc,CAAC,MAAM;YACrC,eAAe,EAAE,WAAW,CAAC,KAAK;SACnC;QACD,aAAa;QACb,wBAAwB,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;YAC3B,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC;QACH,IAAI,EAAE,WAAW,CAAC,eAAe;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EnterpriseComplianceFramework } from '../../types/index.js';
|
|
2
|
+
/** Local alias for the enterprise compliance framework union type. */
|
|
3
|
+
export type ComplianceFramework = EnterpriseComplianceFramework;
|
|
4
|
+
export interface ComplianceControl {
|
|
5
|
+
id: string;
|
|
6
|
+
framework: ComplianceFramework;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
specPatterns: string[];
|
|
10
|
+
requiredCriteria: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare const COMPLIANCE_CATALOG: ComplianceControl[];
|
|
13
|
+
export declare function getControlsForFramework(framework: ComplianceFramework): ComplianceControl[];
|
|
14
|
+
export declare function findMatchingControls(framework: ComplianceFramework, specTitle: string, specDescription: string): ComplianceControl[];
|
|
15
|
+
//# sourceMappingURL=framework-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-catalog.d.ts","sourceRoot":"","sources":["../../../src/engine/compliance/framework-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAE1E,sEAAsE;AAEtE,MAAM,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AAGhE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,mBAAmB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,EA6HjD,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,mBAAmB,GAAG,iBAAiB,EAAE,CAE3F;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,mBAAmB,EAC9B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,iBAAiB,EAAE,CAKrB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Planu — Compliance framework catalog (SPEC-402)
|
|
2
|
+
export const COMPLIANCE_CATALOG = [
|
|
3
|
+
// SOC2 Type II controls
|
|
4
|
+
{
|
|
5
|
+
id: 'SOC2-CC6.1',
|
|
6
|
+
framework: 'soc2-type2',
|
|
7
|
+
name: 'Logical Access Controls',
|
|
8
|
+
description: 'The entity implements logical access security software, infrastructure, and architectures',
|
|
9
|
+
specPatterns: ['auth', 'login', 'access control', 'rbac', 'permission', 'role'],
|
|
10
|
+
requiredCriteria: [
|
|
11
|
+
'Role-based access control implemented',
|
|
12
|
+
'Principle of least privilege enforced',
|
|
13
|
+
'Access logs maintained',
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'SOC2-CC6.2',
|
|
18
|
+
framework: 'soc2-type2',
|
|
19
|
+
name: 'User Registration & Authorization',
|
|
20
|
+
description: 'Prior to issuing system credentials, entity registers authorized users',
|
|
21
|
+
specPatterns: ['user registration', 'signup', 'onboarding', 'invite'],
|
|
22
|
+
requiredCriteria: [
|
|
23
|
+
'Email verification required',
|
|
24
|
+
'Account approval workflow defined',
|
|
25
|
+
'Deactivation process documented',
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'SOC2-CC6.6',
|
|
30
|
+
framework: 'soc2-type2',
|
|
31
|
+
name: 'Logical Access Restrictions',
|
|
32
|
+
description: 'The entity implements controls to prevent or detect unauthorized access',
|
|
33
|
+
specPatterns: ['authentication', 'mfa', 'multi-factor', 'password', 'session'],
|
|
34
|
+
requiredCriteria: [
|
|
35
|
+
'MFA available for all users',
|
|
36
|
+
'Session timeout configured',
|
|
37
|
+
'Password complexity requirements enforced',
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'SOC2-CC7.1',
|
|
42
|
+
framework: 'soc2-type2',
|
|
43
|
+
name: 'System Monitoring',
|
|
44
|
+
description: 'The entity uses detection and monitoring procedures',
|
|
45
|
+
specPatterns: ['monitoring', 'logging', 'alerting', 'observability', 'metrics'],
|
|
46
|
+
requiredCriteria: [
|
|
47
|
+
'All system events logged',
|
|
48
|
+
'Alerting configured for anomalies',
|
|
49
|
+
'Log retention ≥90 days',
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'SOC2-CC8.1',
|
|
54
|
+
framework: 'soc2-type2',
|
|
55
|
+
name: 'Change Management',
|
|
56
|
+
description: 'The entity authorizes, designs, develops or acquires system changes',
|
|
57
|
+
specPatterns: ['deployment', 'release', 'change', 'migration', 'upgrade'],
|
|
58
|
+
requiredCriteria: [
|
|
59
|
+
'Change reviewed and approved before deployment',
|
|
60
|
+
'Rollback plan documented',
|
|
61
|
+
'Testing required before production',
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
// GDPR controls
|
|
65
|
+
{
|
|
66
|
+
id: 'GDPR-Art5',
|
|
67
|
+
framework: 'gdpr',
|
|
68
|
+
name: 'Data Processing Principles',
|
|
69
|
+
description: 'Personal data shall be processed lawfully, fairly and transparently',
|
|
70
|
+
specPatterns: ['user data', 'personal data', 'pii', 'privacy', 'profile'],
|
|
71
|
+
requiredCriteria: [
|
|
72
|
+
'Legal basis for data processing documented',
|
|
73
|
+
'Data minimization applied',
|
|
74
|
+
'Retention period defined',
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'GDPR-Art17',
|
|
79
|
+
framework: 'gdpr',
|
|
80
|
+
name: 'Right to Erasure',
|
|
81
|
+
description: 'Data subjects have the right to obtain erasure of personal data',
|
|
82
|
+
specPatterns: ['delete account', 'data deletion', 'erasure', 'forget me', 'gdpr'],
|
|
83
|
+
requiredCriteria: [
|
|
84
|
+
'Account deletion removes all PII',
|
|
85
|
+
'Deletion confirmed within 30 days',
|
|
86
|
+
'Cascading deletion across all data stores',
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'GDPR-Art32',
|
|
91
|
+
framework: 'gdpr',
|
|
92
|
+
name: 'Security of Processing',
|
|
93
|
+
description: 'Appropriate technical and organisational measures to ensure data security',
|
|
94
|
+
specPatterns: ['encryption', 'security', 'data protection'],
|
|
95
|
+
requiredCriteria: [
|
|
96
|
+
'PII encrypted at rest',
|
|
97
|
+
'PII encrypted in transit (TLS 1.2+)',
|
|
98
|
+
'Access to PII logged and audited',
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
// HIPAA controls
|
|
102
|
+
{
|
|
103
|
+
id: 'HIPAA-164.312a',
|
|
104
|
+
framework: 'hipaa',
|
|
105
|
+
name: 'Access Control',
|
|
106
|
+
description: 'Implement technical policies and procedures for accessing ePHI',
|
|
107
|
+
specPatterns: ['patient', 'health', 'phi', 'medical', 'clinical', 'hipaa'],
|
|
108
|
+
requiredCriteria: [
|
|
109
|
+
'Unique user ID required',
|
|
110
|
+
'Automatic logoff after inactivity',
|
|
111
|
+
'PHI access logged with user ID and timestamp',
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: 'HIPAA-164.312b',
|
|
116
|
+
framework: 'hipaa',
|
|
117
|
+
name: 'Audit Controls',
|
|
118
|
+
description: 'Implement hardware, software, and procedural mechanisms to record access to ePHI',
|
|
119
|
+
specPatterns: ['audit', 'logging', 'access log', 'hipaa'],
|
|
120
|
+
requiredCriteria: [
|
|
121
|
+
'All PHI access events recorded',
|
|
122
|
+
'Audit logs tamper-evident',
|
|
123
|
+
'Log retention ≥6 years',
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
export function getControlsForFramework(framework) {
|
|
128
|
+
return COMPLIANCE_CATALOG.filter((c) => c.framework === framework);
|
|
129
|
+
}
|
|
130
|
+
export function findMatchingControls(framework, specTitle, specDescription) {
|
|
131
|
+
const text = (specTitle + ' ' + specDescription).toLowerCase();
|
|
132
|
+
return COMPLIANCE_CATALOG.filter((c) => c.framework === framework).filter((c) => c.specPatterns.some((p) => text.includes(p)));
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=framework-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-catalog.js","sourceRoot":"","sources":["../../../src/engine/compliance/framework-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ComplianceGapResult } from '../../types/index.js';
|
|
2
|
+
import { type ComplianceFramework } from './framework-catalog.js';
|
|
3
|
+
interface SpecInput {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
status: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function analyzeComplianceGaps(framework: ComplianceFramework, specs: SpecInput[]): ComplianceGapResult;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=gap-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gap-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/compliance/gap-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,wBAAwB,CAAC;AAGhC,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,SAAS,EAAE,GACjB,mBAAmB,CAyCrB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Planu — Compliance gap analyzer (SPEC-402)
|
|
2
|
+
import { getControlsForFramework, findMatchingControls, } from './framework-catalog.js';
|
|
3
|
+
export function analyzeComplianceGaps(framework, specs) {
|
|
4
|
+
const controls = getControlsForFramework(framework);
|
|
5
|
+
const coverageMap = [];
|
|
6
|
+
for (const control of controls) {
|
|
7
|
+
const matchingSpecs = specs.filter((s) => {
|
|
8
|
+
const matches = findMatchingControls(framework, s.title, s.description ?? '');
|
|
9
|
+
return matches.some((m) => m.id === control.id);
|
|
10
|
+
});
|
|
11
|
+
const status = matchingSpecs.length === 0
|
|
12
|
+
? 'missing'
|
|
13
|
+
: matchingSpecs.some((s) => s.status === 'done')
|
|
14
|
+
? 'passing'
|
|
15
|
+
: 'partial';
|
|
16
|
+
coverageMap.push({
|
|
17
|
+
controlId: control.id,
|
|
18
|
+
controlName: control.name,
|
|
19
|
+
status,
|
|
20
|
+
coveringSpecIds: matchingSpecs.map((s) => s.id),
|
|
21
|
+
requiredCriteria: control.requiredCriteria,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const passing = coverageMap.filter((c) => c.status === 'passing').length;
|
|
25
|
+
const score = controls.length === 0 ? 100 : Math.round((passing / controls.length) * 100);
|
|
26
|
+
return {
|
|
27
|
+
framework,
|
|
28
|
+
score,
|
|
29
|
+
totalControls: controls.length,
|
|
30
|
+
passing,
|
|
31
|
+
partial: coverageMap.filter((c) => c.status === 'partial').length,
|
|
32
|
+
missing: coverageMap.filter((c) => c.status === 'missing').length,
|
|
33
|
+
coverage: coverageMap,
|
|
34
|
+
recommendations: coverageMap
|
|
35
|
+
.filter((c) => c.status === 'missing')
|
|
36
|
+
.map((c) => `Create spec addressing: ${c.controlName} (${c.controlId})`),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=gap-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gap-analyzer.js","sourceRoot":"","sources":["../../../src/engine/compliance/gap-analyzer.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAG7C,OAAO,EAEL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAUhC,MAAM,UAAU,qBAAqB,CACnC,SAA8B,EAC9B,KAAkB;IAElB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC9E,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GACV,aAAa,CAAC,MAAM,KAAK,CAAC;YACxB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;gBAC9C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS,CAAC;QAElB,WAAW,CAAC,IAAI,CAAC;YACf,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,MAAM;YACN,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAE1F,OAAO;QACL,SAAS;QACT,KAAK;QACL,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,OAAO;QACP,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QACjE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QACjE,QAAQ,EAAE,WAAW;QACrB,eAAe,EAAE,WAAW;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;aACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC;KAC3E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CloudProvider, InfraResourceType, ResourceCostEntry, DistributionCostEstimate } from '../../types/index.js';
|
|
2
|
+
export type { CloudProvider };
|
|
3
|
+
export type ResourceType = InfraResourceType;
|
|
4
|
+
export type ResourceCost = ResourceCostEntry;
|
|
5
|
+
export type CostEstimate = DistributionCostEstimate;
|
|
6
|
+
export declare function estimateCost(provider: CloudProvider, resources: ResourceType[]): CostEstimate;
|
|
7
|
+
export declare function detectProvider(stack?: string, framework?: string): CloudProvider;
|
|
8
|
+
//# sourceMappingURL=cost-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.d.ts","sourceRoot":"","sources":["../../../src/engine/distribution/cost-estimator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAqEpD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,YAAY,CA8B7F;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAmBhF"}
|
|
@@ -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"}
|