@specsafe/core 0.5.0 → 0.6.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/elicitation/engine.d.ts +75 -0
- package/dist/elicitation/engine.d.ts.map +1 -0
- package/dist/elicitation/engine.js +174 -0
- package/dist/elicitation/engine.js.map +1 -0
- package/dist/elicitation/flows.d.ts +18 -0
- package/dist/elicitation/flows.d.ts.map +1 -0
- package/dist/elicitation/flows.js +331 -0
- package/dist/elicitation/flows.js.map +1 -0
- package/dist/elicitation/generator.d.ts +20 -0
- package/dist/elicitation/generator.d.ts.map +1 -0
- package/dist/elicitation/generator.js +260 -0
- package/dist/elicitation/generator.js.map +1 -0
- package/dist/elicitation/index.d.ts +27 -0
- package/dist/elicitation/index.d.ts.map +1 -0
- package/dist/elicitation/index.js +29 -0
- package/dist/elicitation/index.js.map +1 -0
- package/dist/elicitation/types.d.ts +69 -0
- package/dist/elicitation/types.d.ts.map +1 -0
- package/dist/elicitation/types.js +6 -0
- package/dist/elicitation/types.js.map +1 -0
- package/dist/extensions/builtins/complexity.d.ts +7 -0
- package/dist/extensions/builtins/complexity.d.ts.map +1 -0
- package/dist/extensions/builtins/complexity.js +97 -0
- package/dist/extensions/builtins/complexity.js.map +1 -0
- package/dist/extensions/builtins/owasp.d.ts +7 -0
- package/dist/extensions/builtins/owasp.d.ts.map +1 -0
- package/dist/extensions/builtins/owasp.js +76 -0
- package/dist/extensions/builtins/owasp.js.map +1 -0
- package/dist/extensions/index.d.ts +54 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +72 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +28 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +62 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/registry.d.ts +74 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +159 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/types.d.ts +70 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +2 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/governance/builtins.d.ts +7 -0
- package/dist/governance/builtins.d.ts.map +1 -0
- package/dist/governance/builtins.js +105 -0
- package/dist/governance/builtins.js.map +1 -0
- package/dist/governance/constitution.d.ts +23 -0
- package/dist/governance/constitution.d.ts.map +1 -0
- package/dist/governance/constitution.js +245 -0
- package/dist/governance/constitution.js.map +1 -0
- package/dist/governance/index.d.ts +3 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +2 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/template.d.ts +12 -0
- package/dist/governance/template.d.ts.map +1 -0
- package/dist/governance/template.js +84 -0
- package/dist/governance/template.js.map +1 -0
- package/dist/governance/types.d.ts +64 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/governance/types.js +2 -0
- package/dist/governance/types.js.map +1 -0
- package/dist/index.d.ts +15 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -18
- package/dist/index.js.map +1 -1
- package/dist/templates/checklist.d.ts +7 -0
- package/dist/templates/checklist.d.ts.map +1 -0
- package/dist/templates/checklist.js +131 -0
- package/dist/templates/checklist.js.map +1 -0
- package/dist/templates/engine.d.ts +20 -0
- package/dist/templates/engine.d.ts.map +1 -0
- package/dist/templates/engine.js +187 -0
- package/dist/templates/engine.js.map +1 -0
- package/dist/templates/types.d.ts +67 -0
- package/dist/templates/types.d.ts.map +1 -0
- package/dist/templates/types.js +5 -0
- package/dist/templates/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { validateRequirements } from '../ears/validator.js';
|
|
2
|
+
export const BUILTIN_PRINCIPLES = [
|
|
3
|
+
{ id: 'tdd-mandatory', name: 'TDD Mandatory', description: 'All specs must have test scenarios defined for each requirement', severity: 'error', immutable: true, metadata: { rationale: 'Test-driven development ensures testability and clear acceptance criteria', tags: ['testing', 'tdd', 'quality'] } },
|
|
4
|
+
{ id: 'security-review-required', name: 'Security Review Required', description: 'Specs must include a security considerations section', severity: 'warning', immutable: true, metadata: { rationale: 'Security should be considered from the specification phase', tags: ['security', 'compliance'] } },
|
|
5
|
+
{ id: 'max-spec-complexity', name: 'Maximum Spec Complexity', description: 'Spec must not exceed complexity threshold (max 10 requirements)', severity: 'warning', immutable: false, metadata: { rationale: 'Complex specs are harder to implement and test; break them down', tags: ['complexity', 'maintainability'] } },
|
|
6
|
+
{ id: 'require-acceptance-criteria', name: 'Require Acceptance Criteria', description: 'All requirements must have clearly defined acceptance criteria', severity: 'error', immutable: true, metadata: { rationale: 'Acceptance criteria define "done" and enable effective testing', tags: ['testing', 'requirements'] } },
|
|
7
|
+
{ id: 'no-spec-without-review', name: 'No Spec Without Review', description: 'Spec must have a reviewer assigned before moving to test phase', severity: 'warning', immutable: false, metadata: { rationale: 'Peer review catches issues early and improves spec quality', tags: ['review', 'quality'] } },
|
|
8
|
+
{ id: 'require-ears-format', name: 'Require EARS Format', description: 'Requirements must follow EARS (Easy Approach to Requirements Syntax) patterns', severity: 'warning', immutable: false, metadata: { rationale: 'EARS patterns improve requirement clarity and testability', tags: ['requirements', 'ears', 'standards'] } },
|
|
9
|
+
];
|
|
10
|
+
function checkViolation(spec, principle, condition, message, suggestion) {
|
|
11
|
+
return condition ? { principle, message, severity: principle.severity, spec, context: { suggestion } } : null;
|
|
12
|
+
}
|
|
13
|
+
export const BUILTIN_GATES = [
|
|
14
|
+
{
|
|
15
|
+
id: 'spec-phase-gate',
|
|
16
|
+
name: 'Spec Phase Gate',
|
|
17
|
+
phase: 'spec',
|
|
18
|
+
description: 'Validates specs before moving to test phase',
|
|
19
|
+
principles: ['tdd-mandatory', 'require-acceptance-criteria', 'max-spec-complexity', 'require-ears-format'],
|
|
20
|
+
check: (spec, principles) => {
|
|
21
|
+
const violations = [];
|
|
22
|
+
for (const p of principles) {
|
|
23
|
+
if (p.id === 'tdd-mandatory') {
|
|
24
|
+
const bad = spec.requirements.filter(r => !r.scenarios || r.scenarios.length === 0);
|
|
25
|
+
if (bad.length > 0) {
|
|
26
|
+
const v = checkViolation(spec, p, true, `Requirements without test scenarios: ${bad.map(r => r.id).join(', ')}`, 'Add at least one test scenario (Given/When/Then) for each requirement');
|
|
27
|
+
if (v)
|
|
28
|
+
violations.push(v);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (p.id === 'require-acceptance-criteria') {
|
|
32
|
+
// Check for meaningful requirement text (minimum 20 characters)
|
|
33
|
+
const bad = spec.requirements.filter(r => !r.text || r.text.trim().length < 20);
|
|
34
|
+
if (bad.length > 0) {
|
|
35
|
+
const v = checkViolation(spec, p, true, `Requirements with insufficient acceptance criteria: ${bad.map(r => r.id).join(', ')}`, 'Provide detailed acceptance criteria text (minimum 20 characters) describing what constitutes "done"');
|
|
36
|
+
if (v)
|
|
37
|
+
violations.push(v);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (p.id === 'max-spec-complexity') {
|
|
41
|
+
const v = checkViolation(spec, p, spec.requirements.length > 10, `Spec has ${spec.requirements.length} requirements (max: 10)`, 'Consider breaking this spec into multiple smaller specs');
|
|
42
|
+
if (v)
|
|
43
|
+
violations.push(v);
|
|
44
|
+
}
|
|
45
|
+
if (p.id === 'require-ears-format') {
|
|
46
|
+
const result = validateRequirements(spec);
|
|
47
|
+
const v = checkViolation(spec, p, result.score < 70, `EARS compliance score: ${result.score}% (min: 70%)`, result.recommendation);
|
|
48
|
+
if (v)
|
|
49
|
+
violations.push(v);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const errors = violations.filter(v => v.severity === 'error');
|
|
53
|
+
return {
|
|
54
|
+
passed: errors.length === 0,
|
|
55
|
+
violations,
|
|
56
|
+
gate: BUILTIN_GATES[0],
|
|
57
|
+
timestamp: new Date(),
|
|
58
|
+
summary: errors.length === 0 ? `✓ Spec phase gate passed` : `✗ Spec phase gate failed: ${errors.length} error(s), ${violations.length - errors.length} warning(s)`,
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'test-phase-gate',
|
|
64
|
+
name: 'Test Phase Gate',
|
|
65
|
+
phase: 'test',
|
|
66
|
+
description: 'Validates before moving to code phase',
|
|
67
|
+
principles: ['no-spec-without-review', 'security-review-required'],
|
|
68
|
+
check: (spec, principles) => {
|
|
69
|
+
const violations = [];
|
|
70
|
+
for (const p of principles) {
|
|
71
|
+
if (p.id === 'no-spec-without-review') {
|
|
72
|
+
const hasReviewer = spec.metadata && 'reviewer' in spec.metadata && spec.metadata.reviewer;
|
|
73
|
+
const v = checkViolation(spec, p, !hasReviewer, 'No reviewer assigned to this spec', 'Add a reviewer field to spec metadata before moving to test phase');
|
|
74
|
+
if (v)
|
|
75
|
+
violations.push(v);
|
|
76
|
+
}
|
|
77
|
+
if (p.id === 'security-review-required') {
|
|
78
|
+
const descLower = spec.description.toLowerCase();
|
|
79
|
+
const hasPositive = ['## security', '# security', 'security considerations:', 'authentication:', 'authorization:', 'access control', 'encryption', 'security requirements'].some(term => descLower.includes(term));
|
|
80
|
+
const v = checkViolation(spec, p, !hasPositive, 'Spec lacks security considerations section', 'Add a section describing security considerations, auth requirements, and data protection');
|
|
81
|
+
if (v)
|
|
82
|
+
violations.push(v);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const errors = violations.filter(v => v.severity === 'error');
|
|
86
|
+
return {
|
|
87
|
+
passed: errors.length === 0,
|
|
88
|
+
violations,
|
|
89
|
+
gate: BUILTIN_GATES[1],
|
|
90
|
+
timestamp: new Date(),
|
|
91
|
+
summary: errors.length === 0 ? `✓ Test phase gate passed` : `✗ Test phase gate failed: ${errors.length} error(s), ${violations.length - errors.length} warning(s)`,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
export function getBuiltinPrinciple(id) {
|
|
97
|
+
return BUILTIN_PRINCIPLES.find(p => p.id === id);
|
|
98
|
+
}
|
|
99
|
+
export function getBuiltinGate(id) {
|
|
100
|
+
return BUILTIN_GATES.find(g => g.id === id);
|
|
101
|
+
}
|
|
102
|
+
export function getGatesForPhase(phase) {
|
|
103
|
+
return BUILTIN_GATES.filter(g => g.phase === phase);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/governance/builtins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Constitution, Principle, Gate, GateResult, ConstitutionLoadOptions, ValidationOptions } from './types.js';
|
|
2
|
+
import type { Spec } from '../types.js';
|
|
3
|
+
export declare class ConstitutionManager {
|
|
4
|
+
private constitution;
|
|
5
|
+
private projectDir;
|
|
6
|
+
constructor(projectDir?: string);
|
|
7
|
+
load(options?: ConstitutionLoadOptions): Promise<Constitution>;
|
|
8
|
+
private loadFromMarkdown;
|
|
9
|
+
private loadFromConfig;
|
|
10
|
+
private createDefault;
|
|
11
|
+
private mergeBuiltins;
|
|
12
|
+
private validateConstitution;
|
|
13
|
+
addPrinciple(principle: Principle): void;
|
|
14
|
+
removePrinciple(id: string): void;
|
|
15
|
+
listPrinciples(): Principle[];
|
|
16
|
+
getPrinciple(id: string): Principle | undefined;
|
|
17
|
+
validate(spec: Spec, options?: ValidationOptions): Promise<GateResult[]>;
|
|
18
|
+
getConstitution(): Constitution | null;
|
|
19
|
+
hasPrinciple(id: string): boolean;
|
|
20
|
+
getGatesForPhase(phase: string): Gate[];
|
|
21
|
+
save(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=constitution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution.d.ts","sourceRoot":"","sources":["../../src/governance/constitution.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACxH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAAsB;IAIxC,IAAI,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,YAAY,CAAC;YA0B1D,gBAAgB;YAqChB,cAAc;IAwB5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;IAc5B,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOxC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASjC,cAAc,IAAI,SAAS,EAAE;IAK7B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAKzC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAyBlF,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIjC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE;IAKjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAkE5B"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { BUILTIN_PRINCIPLES, BUILTIN_GATES } from './builtins.js';
|
|
5
|
+
export class ConstitutionManager {
|
|
6
|
+
constitution = null;
|
|
7
|
+
projectDir;
|
|
8
|
+
constructor(projectDir = process.cwd()) {
|
|
9
|
+
this.projectDir = projectDir;
|
|
10
|
+
}
|
|
11
|
+
async load(options = {}) {
|
|
12
|
+
const { includeBuiltins = true, validate = true } = options;
|
|
13
|
+
const constitutionMdPath = join(this.projectDir, '.specsafe', 'constitution.md');
|
|
14
|
+
if (existsSync(constitutionMdPath)) {
|
|
15
|
+
this.constitution = await this.loadFromMarkdown(constitutionMdPath);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const configPath = join(this.projectDir, 'specsafe.config.json');
|
|
19
|
+
if (existsSync(configPath)) {
|
|
20
|
+
this.constitution = await this.loadFromConfig(configPath);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
this.constitution = this.createDefault();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (includeBuiltins) {
|
|
27
|
+
this.mergeBuiltins();
|
|
28
|
+
}
|
|
29
|
+
if (validate) {
|
|
30
|
+
this.validateConstitution();
|
|
31
|
+
}
|
|
32
|
+
return this.constitution;
|
|
33
|
+
}
|
|
34
|
+
async loadFromMarkdown(path) {
|
|
35
|
+
const content = await readFile(path, 'utf-8');
|
|
36
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
37
|
+
if (!frontmatterMatch) {
|
|
38
|
+
throw new Error('Constitution markdown must have YAML frontmatter');
|
|
39
|
+
}
|
|
40
|
+
const frontmatter = frontmatterMatch[1];
|
|
41
|
+
const principles = [];
|
|
42
|
+
// Split on '- id:' but preserve it by including it in the match
|
|
43
|
+
const principleBlocks = frontmatter.split(/(?=\n- id:)/);
|
|
44
|
+
for (const block of principleBlocks) {
|
|
45
|
+
if (!block.trim() || !block.includes('- id:'))
|
|
46
|
+
continue;
|
|
47
|
+
const lines = block.split('\n');
|
|
48
|
+
const principle = {};
|
|
49
|
+
for (const line of lines) {
|
|
50
|
+
const trimmed = line.trim();
|
|
51
|
+
if (trimmed.startsWith('- id:'))
|
|
52
|
+
principle.id = trimmed.substring(5).trim();
|
|
53
|
+
else if (trimmed.startsWith('id:'))
|
|
54
|
+
principle.id = trimmed.substring(3).trim();
|
|
55
|
+
else if (trimmed.startsWith('name:'))
|
|
56
|
+
principle.name = trimmed.substring(5).trim();
|
|
57
|
+
else if (trimmed.startsWith('description:'))
|
|
58
|
+
principle.description = trimmed.substring(12).trim();
|
|
59
|
+
else if (trimmed.startsWith('severity:'))
|
|
60
|
+
principle.severity = trimmed.substring(9).trim();
|
|
61
|
+
else if (trimmed.startsWith('immutable:'))
|
|
62
|
+
principle.immutable = trimmed.substring(10).trim() === 'true';
|
|
63
|
+
}
|
|
64
|
+
if (principle.id && principle.name && principle.description) {
|
|
65
|
+
principles.push({ id: principle.id, name: principle.name, description: principle.description, severity: principle.severity || 'warning', immutable: principle.immutable ?? false });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { principles, gates: [], metadata: { projectName: 'unknown', version: '1.0.0', createdAt: new Date(), updatedAt: new Date() } };
|
|
69
|
+
}
|
|
70
|
+
async loadFromConfig(path) {
|
|
71
|
+
const content = await readFile(path, 'utf-8');
|
|
72
|
+
const config = JSON.parse(content);
|
|
73
|
+
const constitution = config.constitution || this.createDefault();
|
|
74
|
+
if (constitution.metadata) {
|
|
75
|
+
if (constitution.metadata.createdAt)
|
|
76
|
+
constitution.metadata.createdAt = new Date(constitution.metadata.createdAt);
|
|
77
|
+
if (constitution.metadata.updatedAt)
|
|
78
|
+
constitution.metadata.updatedAt = new Date(constitution.metadata.updatedAt);
|
|
79
|
+
}
|
|
80
|
+
// Reconstruct gates from JSON - plain objects lack the check function
|
|
81
|
+
// Replace with matching builtin gates or remove invalid ones
|
|
82
|
+
if (constitution.gates && Array.isArray(constitution.gates)) {
|
|
83
|
+
constitution.gates = constitution.gates
|
|
84
|
+
.map((gate) => {
|
|
85
|
+
const builtinGate = BUILTIN_GATES.find(bg => bg.id === gate.id);
|
|
86
|
+
return builtinGate || null;
|
|
87
|
+
})
|
|
88
|
+
.filter((gate) => gate !== null);
|
|
89
|
+
}
|
|
90
|
+
return constitution;
|
|
91
|
+
}
|
|
92
|
+
createDefault() {
|
|
93
|
+
return { principles: [], gates: [], metadata: { projectName: 'unknown', version: '1.0.0', createdAt: new Date(), updatedAt: new Date(), description: 'Project governance constitution' } };
|
|
94
|
+
}
|
|
95
|
+
mergeBuiltins() {
|
|
96
|
+
if (!this.constitution)
|
|
97
|
+
return;
|
|
98
|
+
for (const builtinPrinciple of BUILTIN_PRINCIPLES) {
|
|
99
|
+
const exists = this.constitution.principles.some(p => p.id === builtinPrinciple.id);
|
|
100
|
+
if (!exists)
|
|
101
|
+
this.constitution.principles.push(builtinPrinciple);
|
|
102
|
+
}
|
|
103
|
+
for (const builtinGate of BUILTIN_GATES) {
|
|
104
|
+
const exists = this.constitution.gates.some(g => g.id === builtinGate.id);
|
|
105
|
+
if (!exists)
|
|
106
|
+
this.constitution.gates.push(builtinGate);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
validateConstitution() {
|
|
110
|
+
if (!this.constitution)
|
|
111
|
+
throw new Error('No constitution loaded');
|
|
112
|
+
const principleIds = new Set();
|
|
113
|
+
for (const principle of this.constitution.principles) {
|
|
114
|
+
if (principleIds.has(principle.id))
|
|
115
|
+
throw new Error(`Duplicate principle ID: ${principle.id}`);
|
|
116
|
+
principleIds.add(principle.id);
|
|
117
|
+
}
|
|
118
|
+
const gateIds = new Set();
|
|
119
|
+
for (const gate of this.constitution.gates) {
|
|
120
|
+
if (gateIds.has(gate.id))
|
|
121
|
+
throw new Error(`Duplicate gate ID: ${gate.id}`);
|
|
122
|
+
gateIds.add(gate.id);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
addPrinciple(principle) {
|
|
126
|
+
if (!this.constitution)
|
|
127
|
+
throw new Error('No constitution loaded');
|
|
128
|
+
if (this.constitution.principles.some(p => p.id === principle.id))
|
|
129
|
+
throw new Error(`Principle with ID "${principle.id}" already exists`);
|
|
130
|
+
this.constitution.principles.push(principle);
|
|
131
|
+
this.constitution.metadata.updatedAt = new Date();
|
|
132
|
+
}
|
|
133
|
+
removePrinciple(id) {
|
|
134
|
+
if (!this.constitution)
|
|
135
|
+
throw new Error('No constitution loaded');
|
|
136
|
+
const principle = this.constitution.principles.find(p => p.id === id);
|
|
137
|
+
if (!principle)
|
|
138
|
+
throw new Error(`Principle with ID "${id}" not found`);
|
|
139
|
+
if (principle.immutable)
|
|
140
|
+
throw new Error(`Principle "${id}" is immutable and cannot be removed`);
|
|
141
|
+
this.constitution.principles = this.constitution.principles.filter(p => p.id !== id);
|
|
142
|
+
this.constitution.metadata.updatedAt = new Date();
|
|
143
|
+
}
|
|
144
|
+
listPrinciples() {
|
|
145
|
+
if (!this.constitution)
|
|
146
|
+
throw new Error('No constitution loaded');
|
|
147
|
+
return [...this.constitution.principles];
|
|
148
|
+
}
|
|
149
|
+
getPrinciple(id) {
|
|
150
|
+
if (!this.constitution)
|
|
151
|
+
throw new Error('No constitution loaded');
|
|
152
|
+
return this.constitution.principles.find(p => p.id === id);
|
|
153
|
+
}
|
|
154
|
+
async validate(spec, options = {}) {
|
|
155
|
+
if (!this.constitution)
|
|
156
|
+
throw new Error('No constitution loaded. Call load() first.');
|
|
157
|
+
const { phase = spec.stage, failFast = false, includeWarnings = true } = options;
|
|
158
|
+
const results = [];
|
|
159
|
+
const applicableGates = this.constitution.gates.filter(g => g.phase === phase);
|
|
160
|
+
for (const gate of applicableGates) {
|
|
161
|
+
const gatePrinciples = gate.principles.map(id => this.constitution.principles.find(p => p.id === id)).filter((p) => p !== undefined);
|
|
162
|
+
const result = await Promise.resolve(gate.check(spec, gatePrinciples));
|
|
163
|
+
results.push(result);
|
|
164
|
+
if (failFast && !result.passed) {
|
|
165
|
+
const hasErrors = result.violations.some(v => v.severity === 'error');
|
|
166
|
+
if (hasErrors)
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (!includeWarnings) {
|
|
171
|
+
for (const result of results) {
|
|
172
|
+
result.violations = result.violations.filter(v => v.severity === 'error');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return results;
|
|
176
|
+
}
|
|
177
|
+
getConstitution() {
|
|
178
|
+
return this.constitution;
|
|
179
|
+
}
|
|
180
|
+
hasPrinciple(id) {
|
|
181
|
+
return this.constitution?.principles.some(p => p.id === id) ?? false;
|
|
182
|
+
}
|
|
183
|
+
getGatesForPhase(phase) {
|
|
184
|
+
if (!this.constitution)
|
|
185
|
+
return [];
|
|
186
|
+
return this.constitution.gates.filter(g => g.phase === phase);
|
|
187
|
+
}
|
|
188
|
+
async save() {
|
|
189
|
+
if (!this.constitution)
|
|
190
|
+
throw new Error('No constitution loaded');
|
|
191
|
+
const { writeFile, mkdir } = await import('fs/promises');
|
|
192
|
+
const specsafeDir = join(this.projectDir, '.specsafe');
|
|
193
|
+
const constitutionPath = join(specsafeDir, 'constitution.md');
|
|
194
|
+
await mkdir(specsafeDir, { recursive: true });
|
|
195
|
+
// Only save custom principles (exclude built-ins)
|
|
196
|
+
const customPrinciples = this.constitution.principles.filter(p => !BUILTIN_PRINCIPLES.some(bp => bp.id === p.id));
|
|
197
|
+
const now = new Date().toISOString();
|
|
198
|
+
const quoteValue = (val) => JSON.stringify(val);
|
|
199
|
+
let content = `---
|
|
200
|
+
# SpecSafe Project Constitution
|
|
201
|
+
projectName: ${quoteValue(this.constitution.metadata.projectName)}
|
|
202
|
+
author: ${quoteValue(this.constitution.metadata.author || 'Unknown')}
|
|
203
|
+
version: ${quoteValue(this.constitution.metadata.version)}
|
|
204
|
+
createdAt: ${this.constitution.metadata.createdAt.toISOString()}
|
|
205
|
+
updatedAt: ${now}
|
|
206
|
+
|
|
207
|
+
principles:
|
|
208
|
+
`;
|
|
209
|
+
for (const principle of customPrinciples) {
|
|
210
|
+
content += `- id: ${principle.id}\n`;
|
|
211
|
+
content += ` name: ${quoteValue(principle.name)}\n`;
|
|
212
|
+
content += ` description: ${quoteValue(principle.description)}\n`;
|
|
213
|
+
content += ` severity: ${principle.severity}\n`;
|
|
214
|
+
content += ` immutable: ${principle.immutable}\n`;
|
|
215
|
+
if (principle.metadata?.rationale) {
|
|
216
|
+
content += ` rationale: ${quoteValue(principle.metadata.rationale)}\n`;
|
|
217
|
+
}
|
|
218
|
+
content += `\n`;
|
|
219
|
+
}
|
|
220
|
+
content += `---
|
|
221
|
+
|
|
222
|
+
# Project Constitution: ${this.constitution.metadata.projectName}
|
|
223
|
+
|
|
224
|
+
${this.constitution.metadata.description || 'Project governance constitution'}
|
|
225
|
+
|
|
226
|
+
## Custom Principles
|
|
227
|
+
|
|
228
|
+
`;
|
|
229
|
+
for (const principle of customPrinciples) {
|
|
230
|
+
const lockEmoji = principle.immutable ? '🔒' : '🔓';
|
|
231
|
+
const severityEmoji = principle.severity === 'error' ? '🚫' : '⚠️';
|
|
232
|
+
content += `### ${lockEmoji} ${principle.name}\n\n`;
|
|
233
|
+
content += `**ID:** \`${principle.id}\` \n`;
|
|
234
|
+
content += `**Severity:** ${severityEmoji} ${principle.severity.toUpperCase()} \n`;
|
|
235
|
+
content += `**Immutable:** ${principle.immutable ? 'Yes' : 'No'} \n\n`;
|
|
236
|
+
content += `${principle.description}\n\n`;
|
|
237
|
+
if (principle.metadata?.rationale) {
|
|
238
|
+
content += `**Rationale:** ${principle.metadata.rationale}\n\n`;
|
|
239
|
+
}
|
|
240
|
+
content += `---\n\n`;
|
|
241
|
+
}
|
|
242
|
+
await writeFile(constitutionPath, content);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=constitution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution.js","sourceRoot":"","sources":["../../src/governance/constitution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { Constitution, Principle, PrincipleSeverity, Gate, GatePhase, GateResult, Violation, ConstitutionLoadOptions, ValidationOptions } from './types.js';
|
|
2
|
+
export { BUILTIN_PRINCIPLES, BUILTIN_GATES, getBuiltinPrinciple, getBuiltinGate, getGatesForPhase } from './builtins.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/governance/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjK,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/governance/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface GenerateConstitutionOptions {
|
|
2
|
+
projectName?: string;
|
|
3
|
+
author?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
includePrinciples?: string[];
|
|
6
|
+
includeAllBuiltins?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateConstitution(options?: GenerateConstitutionOptions): string;
|
|
9
|
+
export declare function generateMinimalConstitution(projectName?: string): string;
|
|
10
|
+
export declare function generateStrictConstitution(projectName?: string): string;
|
|
11
|
+
export declare function generateConstitutionReadme(): string;
|
|
12
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/governance/template.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,MAAM,CAiEtF;AAED,wBAAgB,2BAA2B,CAAC,WAAW,GAAE,MAAqB,GAAG,MAAM,CAEtF;AAED,wBAAgB,0BAA0B,CAAC,WAAW,GAAE,MAAqB,GAAG,MAAM,CAErF;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAkBnD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { BUILTIN_PRINCIPLES } from './builtins.js';
|
|
2
|
+
export function generateConstitution(options = {}) {
|
|
3
|
+
const { projectName = 'My Project', author = 'Unknown', description = 'Project governance constitution', includePrinciples = [], includeAllBuiltins = true } = options;
|
|
4
|
+
let principles = includeAllBuiltins ? BUILTIN_PRINCIPLES : BUILTIN_PRINCIPLES.filter(p => includePrinciples.includes(p.id));
|
|
5
|
+
if (!includeAllBuiltins && includePrinciples.length === 0) {
|
|
6
|
+
const recommended = ['tdd-mandatory', 'require-acceptance-criteria', 'require-ears-format'];
|
|
7
|
+
principles = BUILTIN_PRINCIPLES.filter(p => recommended.includes(p.id));
|
|
8
|
+
}
|
|
9
|
+
const now = new Date().toISOString();
|
|
10
|
+
// Helper to safely quote YAML string values
|
|
11
|
+
const quoteValue = (val) => JSON.stringify(val);
|
|
12
|
+
let content = `---
|
|
13
|
+
# SpecSafe Project Constitution
|
|
14
|
+
projectName: ${quoteValue(projectName)}
|
|
15
|
+
author: ${quoteValue(author)}
|
|
16
|
+
version: "1.0.0"
|
|
17
|
+
createdAt: ${now}
|
|
18
|
+
updatedAt: ${now}
|
|
19
|
+
|
|
20
|
+
principles:
|
|
21
|
+
`;
|
|
22
|
+
for (const principle of principles) {
|
|
23
|
+
content += `- id: ${principle.id}\n`;
|
|
24
|
+
content += ` name: ${quoteValue(principle.name)}\n`;
|
|
25
|
+
content += ` description: ${quoteValue(principle.description)}\n`;
|
|
26
|
+
content += ` severity: ${principle.severity}\n`;
|
|
27
|
+
content += ` immutable: ${principle.immutable}\n`;
|
|
28
|
+
if (principle.metadata?.rationale) {
|
|
29
|
+
content += ` rationale: ${quoteValue(principle.metadata.rationale)}\n`;
|
|
30
|
+
}
|
|
31
|
+
content += `\n`;
|
|
32
|
+
}
|
|
33
|
+
content += `---
|
|
34
|
+
|
|
35
|
+
# Project Constitution: ${projectName}
|
|
36
|
+
|
|
37
|
+
${description}
|
|
38
|
+
|
|
39
|
+
## Principles
|
|
40
|
+
|
|
41
|
+
`;
|
|
42
|
+
for (const principle of principles) {
|
|
43
|
+
const lockEmoji = principle.immutable ? '🔒' : '🔓';
|
|
44
|
+
const severityEmoji = principle.severity === 'error' ? '🚫' : '⚠️';
|
|
45
|
+
content += `### ${lockEmoji} ${principle.name}\n\n**ID:** \`${principle.id}\` \n**Severity:** ${severityEmoji} ${principle.severity.toUpperCase()} \n**Immutable:** ${principle.immutable ? 'Yes' : 'No'} \n\n${principle.description}\n\n`;
|
|
46
|
+
if (principle.metadata?.rationale)
|
|
47
|
+
content += `**Rationale:** ${principle.metadata.rationale}\n\n`;
|
|
48
|
+
content += `---\n\n`;
|
|
49
|
+
}
|
|
50
|
+
content += `## Usage
|
|
51
|
+
|
|
52
|
+
\`\`\`bash
|
|
53
|
+
specsafe constitution check <spec-id>
|
|
54
|
+
specsafe constitution list
|
|
55
|
+
\`\`\`
|
|
56
|
+
`;
|
|
57
|
+
return content;
|
|
58
|
+
}
|
|
59
|
+
export function generateMinimalConstitution(projectName = 'My Project') {
|
|
60
|
+
return generateConstitution({ projectName, includeAllBuiltins: false, includePrinciples: ['tdd-mandatory', 'require-acceptance-criteria'] });
|
|
61
|
+
}
|
|
62
|
+
export function generateStrictConstitution(projectName = 'My Project') {
|
|
63
|
+
return generateConstitution({ projectName, includeAllBuiltins: true });
|
|
64
|
+
}
|
|
65
|
+
export function generateConstitutionReadme() {
|
|
66
|
+
return `# Constitutional Governance
|
|
67
|
+
|
|
68
|
+
SpecSafe uses Constitutional Governance to enforce immutable project principles through quality gates.
|
|
69
|
+
|
|
70
|
+
## Features
|
|
71
|
+
|
|
72
|
+
- 🔒 Immutable principles that cannot be removed
|
|
73
|
+
- 🚦 Quality gates at workflow transitions
|
|
74
|
+
- ⚖️ Error/Warning severity levels
|
|
75
|
+
|
|
76
|
+
## Getting Started
|
|
77
|
+
|
|
78
|
+
\`\`\`bash
|
|
79
|
+
specsafe constitution init
|
|
80
|
+
specsafe constitution check <spec-id>
|
|
81
|
+
\`\`\`
|
|
82
|
+
`;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/governance/template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Spec } from '../types.js';
|
|
2
|
+
export type PrincipleSeverity = 'error' | 'warning';
|
|
3
|
+
export type GatePhase = 'spec' | 'test' | 'code' | 'qa' | 'complete';
|
|
4
|
+
export interface Principle {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
severity: PrincipleSeverity;
|
|
9
|
+
immutable: boolean;
|
|
10
|
+
metadata?: {
|
|
11
|
+
author?: string;
|
|
12
|
+
createdAt?: Date;
|
|
13
|
+
rationale?: string;
|
|
14
|
+
tags?: string[];
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface Gate {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
phase: GatePhase;
|
|
21
|
+
principles: string[];
|
|
22
|
+
check: (spec: Spec, principles: Principle[]) => Promise<GateResult> | GateResult;
|
|
23
|
+
description?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface Violation {
|
|
26
|
+
principle: Principle;
|
|
27
|
+
message: string;
|
|
28
|
+
severity: PrincipleSeverity;
|
|
29
|
+
spec: Spec;
|
|
30
|
+
context?: {
|
|
31
|
+
file?: string;
|
|
32
|
+
line?: number;
|
|
33
|
+
suggestion?: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface GateResult {
|
|
37
|
+
passed: boolean;
|
|
38
|
+
violations: Violation[];
|
|
39
|
+
gate: Gate;
|
|
40
|
+
timestamp: Date;
|
|
41
|
+
summary?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface Constitution {
|
|
44
|
+
principles: Principle[];
|
|
45
|
+
gates: Gate[];
|
|
46
|
+
metadata: {
|
|
47
|
+
projectName: string;
|
|
48
|
+
version: string;
|
|
49
|
+
createdAt: Date;
|
|
50
|
+
updatedAt: Date;
|
|
51
|
+
author?: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface ConstitutionLoadOptions {
|
|
56
|
+
includeBuiltins?: boolean;
|
|
57
|
+
validate?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface ValidationOptions {
|
|
60
|
+
phase?: GatePhase;
|
|
61
|
+
failFast?: boolean;
|
|
62
|
+
includeWarnings?: boolean;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/governance/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;AACpD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KAAE,CAAC;CACxF;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;KAAE,CAAC;CAClE;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;KAAE,CAAC;CAC9H;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/governance/types.ts"],"names":[],"mappings":""}
|