@specsafe/core 0.4.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.
Files changed (157) hide show
  1. package/dist/agents/adapters/base.d.ts +44 -0
  2. package/dist/agents/adapters/base.d.ts.map +1 -0
  3. package/dist/agents/adapters/base.js +164 -0
  4. package/dist/agents/adapters/base.js.map +1 -0
  5. package/dist/agents/adapters/claude-code.d.ts +14 -0
  6. package/dist/agents/adapters/claude-code.d.ts.map +1 -0
  7. package/dist/agents/adapters/claude-code.js +120 -0
  8. package/dist/agents/adapters/claude-code.js.map +1 -0
  9. package/dist/agents/adapters/copilot.d.ts +13 -0
  10. package/dist/agents/adapters/copilot.d.ts.map +1 -0
  11. package/dist/agents/adapters/copilot.js +115 -0
  12. package/dist/agents/adapters/copilot.js.map +1 -0
  13. package/dist/agents/adapters/cursor.d.ts +13 -0
  14. package/dist/agents/adapters/cursor.d.ts.map +1 -0
  15. package/dist/agents/adapters/cursor.js +105 -0
  16. package/dist/agents/adapters/cursor.js.map +1 -0
  17. package/dist/agents/adapters/gemini-cli.d.ts +13 -0
  18. package/dist/agents/adapters/gemini-cli.d.ts.map +1 -0
  19. package/dist/agents/adapters/gemini-cli.js +79 -0
  20. package/dist/agents/adapters/gemini-cli.js.map +1 -0
  21. package/dist/agents/adapters/index.d.ts +16 -0
  22. package/dist/agents/adapters/index.d.ts.map +1 -0
  23. package/dist/agents/adapters/index.js +47 -0
  24. package/dist/agents/adapters/index.js.map +1 -0
  25. package/dist/agents/adapters/opencode.d.ts +13 -0
  26. package/dist/agents/adapters/opencode.d.ts.map +1 -0
  27. package/dist/agents/adapters/opencode.js +67 -0
  28. package/dist/agents/adapters/opencode.js.map +1 -0
  29. package/dist/agents/index.d.ts +8 -0
  30. package/dist/agents/index.d.ts.map +1 -0
  31. package/dist/agents/index.js +9 -0
  32. package/dist/agents/index.js.map +1 -0
  33. package/dist/agents/registry.d.ts +70 -0
  34. package/dist/agents/registry.d.ts.map +1 -0
  35. package/dist/agents/registry.js +194 -0
  36. package/dist/agents/registry.js.map +1 -0
  37. package/dist/agents/types.d.ts +71 -0
  38. package/dist/agents/types.d.ts.map +1 -0
  39. package/dist/agents/types.js +6 -0
  40. package/dist/agents/types.js.map +1 -0
  41. package/dist/delta/merger.d.ts +36 -0
  42. package/dist/delta/merger.d.ts.map +1 -0
  43. package/dist/delta/merger.js +264 -0
  44. package/dist/delta/merger.js.map +1 -0
  45. package/dist/delta/parser.d.ts +27 -0
  46. package/dist/delta/parser.d.ts.map +1 -0
  47. package/dist/delta/parser.js +196 -0
  48. package/dist/delta/parser.js.map +1 -0
  49. package/dist/delta/types.d.ts +39 -0
  50. package/dist/delta/types.d.ts.map +1 -0
  51. package/dist/delta/types.js +6 -0
  52. package/dist/delta/types.js.map +1 -0
  53. package/dist/ears/index.d.ts +11 -0
  54. package/dist/ears/index.d.ts.map +1 -0
  55. package/dist/ears/index.js +11 -0
  56. package/dist/ears/index.js.map +1 -0
  57. package/dist/ears/parser.d.ts +22 -0
  58. package/dist/ears/parser.d.ts.map +1 -0
  59. package/dist/ears/parser.js +273 -0
  60. package/dist/ears/parser.js.map +1 -0
  61. package/dist/ears/template.d.ts +20 -0
  62. package/dist/ears/template.d.ts.map +1 -0
  63. package/dist/ears/template.js +364 -0
  64. package/dist/ears/template.js.map +1 -0
  65. package/dist/ears/types.d.ts +58 -0
  66. package/dist/ears/types.d.ts.map +1 -0
  67. package/dist/ears/types.js +6 -0
  68. package/dist/ears/types.js.map +1 -0
  69. package/dist/ears/validator.d.ts +37 -0
  70. package/dist/ears/validator.d.ts.map +1 -0
  71. package/dist/ears/validator.js +234 -0
  72. package/dist/ears/validator.js.map +1 -0
  73. package/dist/elicitation/engine.d.ts +75 -0
  74. package/dist/elicitation/engine.d.ts.map +1 -0
  75. package/dist/elicitation/engine.js +174 -0
  76. package/dist/elicitation/engine.js.map +1 -0
  77. package/dist/elicitation/flows.d.ts +18 -0
  78. package/dist/elicitation/flows.d.ts.map +1 -0
  79. package/dist/elicitation/flows.js +331 -0
  80. package/dist/elicitation/flows.js.map +1 -0
  81. package/dist/elicitation/generator.d.ts +20 -0
  82. package/dist/elicitation/generator.d.ts.map +1 -0
  83. package/dist/elicitation/generator.js +260 -0
  84. package/dist/elicitation/generator.js.map +1 -0
  85. package/dist/elicitation/index.d.ts +27 -0
  86. package/dist/elicitation/index.d.ts.map +1 -0
  87. package/dist/elicitation/index.js +29 -0
  88. package/dist/elicitation/index.js.map +1 -0
  89. package/dist/elicitation/types.d.ts +69 -0
  90. package/dist/elicitation/types.d.ts.map +1 -0
  91. package/dist/elicitation/types.js +6 -0
  92. package/dist/elicitation/types.js.map +1 -0
  93. package/dist/extensions/builtins/complexity.d.ts +7 -0
  94. package/dist/extensions/builtins/complexity.d.ts.map +1 -0
  95. package/dist/extensions/builtins/complexity.js +97 -0
  96. package/dist/extensions/builtins/complexity.js.map +1 -0
  97. package/dist/extensions/builtins/owasp.d.ts +7 -0
  98. package/dist/extensions/builtins/owasp.d.ts.map +1 -0
  99. package/dist/extensions/builtins/owasp.js +76 -0
  100. package/dist/extensions/builtins/owasp.js.map +1 -0
  101. package/dist/extensions/index.d.ts +54 -0
  102. package/dist/extensions/index.d.ts.map +1 -0
  103. package/dist/extensions/index.js +72 -0
  104. package/dist/extensions/index.js.map +1 -0
  105. package/dist/extensions/loader.d.ts +28 -0
  106. package/dist/extensions/loader.d.ts.map +1 -0
  107. package/dist/extensions/loader.js +62 -0
  108. package/dist/extensions/loader.js.map +1 -0
  109. package/dist/extensions/registry.d.ts +74 -0
  110. package/dist/extensions/registry.d.ts.map +1 -0
  111. package/dist/extensions/registry.js +159 -0
  112. package/dist/extensions/registry.js.map +1 -0
  113. package/dist/extensions/types.d.ts +70 -0
  114. package/dist/extensions/types.d.ts.map +1 -0
  115. package/dist/extensions/types.js +2 -0
  116. package/dist/extensions/types.js.map +1 -0
  117. package/dist/governance/builtins.d.ts +7 -0
  118. package/dist/governance/builtins.d.ts.map +1 -0
  119. package/dist/governance/builtins.js +105 -0
  120. package/dist/governance/builtins.js.map +1 -0
  121. package/dist/governance/constitution.d.ts +23 -0
  122. package/dist/governance/constitution.d.ts.map +1 -0
  123. package/dist/governance/constitution.js +245 -0
  124. package/dist/governance/constitution.js.map +1 -0
  125. package/dist/governance/index.d.ts +3 -0
  126. package/dist/governance/index.d.ts.map +1 -0
  127. package/dist/governance/index.js +2 -0
  128. package/dist/governance/index.js.map +1 -0
  129. package/dist/governance/template.d.ts +12 -0
  130. package/dist/governance/template.d.ts.map +1 -0
  131. package/dist/governance/template.js +84 -0
  132. package/dist/governance/template.js.map +1 -0
  133. package/dist/governance/types.d.ts +64 -0
  134. package/dist/governance/types.d.ts.map +1 -0
  135. package/dist/governance/types.js +2 -0
  136. package/dist/governance/types.js.map +1 -0
  137. package/dist/index.d.ts +23 -18
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +17 -18
  140. package/dist/index.js.map +1 -1
  141. package/dist/templates/checklist.d.ts +7 -0
  142. package/dist/templates/checklist.d.ts.map +1 -0
  143. package/dist/templates/checklist.js +131 -0
  144. package/dist/templates/checklist.js.map +1 -0
  145. package/dist/templates/delta-template.d.ts +18 -0
  146. package/dist/templates/delta-template.d.ts.map +1 -0
  147. package/dist/templates/delta-template.js +191 -0
  148. package/dist/templates/delta-template.js.map +1 -0
  149. package/dist/templates/engine.d.ts +20 -0
  150. package/dist/templates/engine.d.ts.map +1 -0
  151. package/dist/templates/engine.js +187 -0
  152. package/dist/templates/engine.js.map +1 -0
  153. package/dist/templates/types.d.ts +67 -0
  154. package/dist/templates/types.d.ts.map +1 -0
  155. package/dist/templates/types.js +5 -0
  156. package/dist/templates/types.js.map +1 -0
  157. package/package.json +1 -1
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Delta Spec Template
3
+ * Template for creating delta specs (brownfield changes)
4
+ */
5
+ /**
6
+ * Generate a delta spec template
7
+ * @param deltaId - Delta spec identifier
8
+ * @param baseSpecId - Base spec this delta applies to
9
+ * @param author - Author name
10
+ * @param date - Optional date for testability (defaults to today)
11
+ */
12
+ export function generateDeltaTemplate(deltaId, baseSpecId, author, date) {
13
+ const createdDate = date || new Date().toISOString().split('T')[0];
14
+ return `# Delta Spec: ${deltaId}
15
+
16
+ **Base Spec:** ${baseSpecId}
17
+ **Created:** ${createdDate}
18
+ **Author:** ${author}
19
+ **Description:** Brief description of changes
20
+
21
+ ---
22
+
23
+ ## Change Summary
24
+
25
+ What is changing and why?
26
+
27
+ ---
28
+
29
+ ## ADDED Requirements
30
+
31
+ New requirements being added to the spec.
32
+
33
+ ### FR-NEW-1
34
+ **Priority:** P1
35
+
36
+ [Requirement text here]
37
+
38
+ **Scenarios:**
39
+ - Given [context]
40
+ - When [action]
41
+ - Then [outcome]
42
+
43
+ ---
44
+
45
+ ## MODIFIED Requirements
46
+
47
+ Existing requirements being changed.
48
+
49
+ ### FR-EXISTING-1
50
+ **Priority:** P0
51
+
52
+ [New requirement text] ← (was [old requirement text])
53
+
54
+ **Scenarios:**
55
+ - [Updated scenarios]
56
+
57
+ ---
58
+
59
+ ## REMOVED Requirements
60
+
61
+ Requirements being removed (just list IDs).
62
+
63
+ - FR-OLD-1
64
+ - FR-OLD-2
65
+
66
+ ---
67
+
68
+ ## Impact Analysis
69
+
70
+ ### Affected Components
71
+ - Component 1
72
+ - Component 2
73
+
74
+ ### Breaking Changes
75
+ - [ ] Yes
76
+ - [x] No
77
+
78
+ ### Migration Required
79
+ - [ ] Yes
80
+ - [x] No
81
+
82
+ If yes, describe migration path:
83
+
84
+ ---
85
+
86
+ ## Testing Strategy
87
+
88
+ ### Tests to Add
89
+ -
90
+
91
+ ### Tests to Update
92
+ -
93
+
94
+ ### Tests to Remove
95
+ -
96
+
97
+ ---
98
+
99
+ ## Notes
100
+
101
+ Additional context, links, or references.
102
+
103
+ ---
104
+
105
+ *Generated by SpecSafe Delta System*
106
+ `;
107
+ }
108
+ /**
109
+ * Generate a README file explaining the delta spec format
110
+ * @returns Markdown content for delta spec documentation
111
+ */
112
+ export function generateDeltaReadme() {
113
+ return `# Delta Specs
114
+
115
+ Delta specs describe **incremental changes** to existing specs (brownfield projects).
116
+
117
+ ## Format
118
+
119
+ Delta specs use three sections:
120
+
121
+ ### ADDED Requirements
122
+ New requirements being added. Each requirement includes:
123
+ - **ID**: Unique requirement ID (e.g., FR-NEW-1)
124
+ - **Priority**: P0, P1, or P2
125
+ - **Text**: Requirement description
126
+ - **Scenarios**: Given/When/Then scenarios
127
+
128
+ ### MODIFIED Requirements
129
+ Existing requirements being changed. Use the notation:
130
+ \`\`\`
131
+ [New text] ← (was [old text])
132
+ \`\`\`
133
+
134
+ ### REMOVED Requirements
135
+ Requirements being removed. Just list the IDs:
136
+ \`\`\`
137
+ - FR-OLD-1
138
+ - FR-OLD-2
139
+ \`\`\`
140
+
141
+ ## Workflow
142
+
143
+ 1. **Create Delta**: \`specsafe delta <spec-id>\`
144
+ - Opens a template for the delta spec
145
+ - Edit to describe changes
146
+
147
+ 2. **Preview Changes**: \`specsafe diff <spec-id>\`
148
+ - Shows what would change
149
+ - Identifies conflicts
150
+
151
+ 3. **Apply Delta**: \`specsafe apply <spec-id>\`
152
+ - Merges changes into base spec
153
+ - Creates backup before applying
154
+
155
+ ## Best Practices
156
+
157
+ - Keep deltas focused (one feature/fix at a time)
158
+ - Include clear change justification
159
+ - Document breaking changes
160
+ - Update tests alongside requirements
161
+ - Review conflicts before applying
162
+
163
+ ## Example
164
+
165
+ \`\`\`markdown
166
+ ## ADDED Requirements
167
+
168
+ ### FR-AUTH-3
169
+ **Priority:** P0
170
+
171
+ Users must be able to reset their password via email verification.
172
+
173
+ **Scenarios:**
174
+ - Given user is on login page
175
+ - When user clicks "Forgot Password"
176
+ - Then system sends reset link to registered email
177
+
178
+ ## MODIFIED Requirements
179
+
180
+ ### FR-AUTH-1
181
+ **Priority:** P0
182
+
183
+ Users must authenticate using email and password with 2FA enabled ← (was Users must authenticate using email and password)
184
+
185
+ ## REMOVED Requirements
186
+
187
+ - FR-AUTH-OLD-1
188
+ \`\`\`
189
+ `;
190
+ }
191
+ //# sourceMappingURL=delta-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-template.js","sourceRoot":"","sources":["../../src/templates/delta-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAe,EACf,UAAkB,EAClB,MAAc,EACd,IAAa;IAEb,MAAM,WAAW,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,OAAO,iBAAiB,OAAO;;iBAEhB,UAAU;eACZ,WAAW;cACZ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFnB,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4ER,CAAC;AACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Template Engine v2
3
+ */
4
+ import type { Constraint, RenderOptions, ValidationResult } from './types.js';
5
+ export declare class TemplateEngine {
6
+ renderTemplate(template: string, options?: RenderOptions): string;
7
+ private processIncludes;
8
+ private processConditionals;
9
+ private processVariables;
10
+ private removeDirectives;
11
+ parseConstraints(template: string): Constraint[];
12
+ validateAgainstConstraints(spec: string, constraints: Constraint[]): ValidationResult;
13
+ private validateConstraint;
14
+ private countRequirements;
15
+ private hasSection;
16
+ private escapeRegExp;
17
+ private extractSection;
18
+ private extractAllSections;
19
+ }
20
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/templates/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;AAEjG,qBAAa,cAAc;IACzB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM;IAyBrE,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,gBAAgB;IAKxB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IA0BhD,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,gBAAgB;IAyBrF,OAAO,CAAC,kBAAkB;IA+D1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,kBAAkB;CAW3B"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Template Engine v2
3
+ */
4
+ export class TemplateEngine {
5
+ renderTemplate(template, options = {}) {
6
+ const { variables = {}, partials = {}, preserveConstraints = false, preserveChecklists = false } = options;
7
+ let result = template;
8
+ // Process includes
9
+ result = this.processIncludes(result, partials);
10
+ // Process conditionals
11
+ result = this.processConditionals(result, variables);
12
+ // Process variables
13
+ result = this.processVariables(result, variables);
14
+ // Remove directives
15
+ if (!preserveConstraints) {
16
+ result = this.removeDirectives(result, 'constraint');
17
+ }
18
+ if (!preserveChecklists) {
19
+ result = this.removeDirectives(result, 'checklist');
20
+ }
21
+ return result;
22
+ }
23
+ processIncludes(template, partials) {
24
+ const includeRegex = /\{\{>\s*([a-zA-Z0-9_-]+)\s*\}\}/g;
25
+ return template.replace(includeRegex, (match, partialName) => {
26
+ const partial = partials[partialName];
27
+ if (!partial) {
28
+ console.warn(`Warning: Partial "${partialName}" not found`);
29
+ return match;
30
+ }
31
+ return partial;
32
+ });
33
+ }
34
+ processConditionals(template, variables) {
35
+ const conditionalRegex = /\{\{#if\s+([a-zA-Z0-9_]+)\s*\}\}([\s\S]*?)\{\{\/if\}\}/g;
36
+ return template.replace(conditionalRegex, (match, varName, content) => {
37
+ return variables[varName] ? content : '';
38
+ });
39
+ }
40
+ processVariables(template, variables) {
41
+ const variableRegex = /\{\{([a-zA-Z0-9_]+)\}\}/g;
42
+ return template.replace(variableRegex, (match, varName) => {
43
+ const value = variables[varName];
44
+ if (value === undefined || value === null) {
45
+ console.warn(`Warning: Variable "${varName}" not found`);
46
+ return match;
47
+ }
48
+ return String(value);
49
+ });
50
+ }
51
+ removeDirectives(template, directiveType) {
52
+ const directiveRegex = new RegExp(`<!--\\s*@${directiveType}:.*?-->\\n?`, 'g');
53
+ return template.replace(directiveRegex, '');
54
+ }
55
+ parseConstraints(template) {
56
+ const constraints = [];
57
+ const lines = template.split('\n');
58
+ const constraintRegex = /<!--\s*@constraint:\s*([a-z-]+)(?:\s+(.+?))?\s*-->/;
59
+ lines.forEach((line, index) => {
60
+ const match = line.match(constraintRegex);
61
+ if (match) {
62
+ const [, type, param] = match;
63
+ let parsedParam = '';
64
+ if (param) {
65
+ parsedParam = /^\d+$/.test(param.trim())
66
+ ? parseInt(param.trim(), 10)
67
+ : param.trim().replace(/^["']|["']$/g, '');
68
+ }
69
+ constraints.push({
70
+ type: type,
71
+ param: parsedParam,
72
+ line: index + 1,
73
+ });
74
+ }
75
+ });
76
+ return constraints;
77
+ }
78
+ validateAgainstConstraints(spec, constraints) {
79
+ const passed = [];
80
+ const failed = [];
81
+ for (const constraint of constraints) {
82
+ const result = this.validateConstraint(spec, constraint);
83
+ if (result.valid) {
84
+ passed.push(constraint);
85
+ }
86
+ else {
87
+ failed.push({
88
+ constraint,
89
+ reason: result.reason,
90
+ actualValue: result.actualValue,
91
+ });
92
+ }
93
+ }
94
+ const valid = failed.length === 0;
95
+ const summary = valid
96
+ ? `✓ All ${constraints.length} constraint(s) passed`
97
+ : `✗ ${failed.length} of ${constraints.length} constraint(s) failed`;
98
+ return { valid, passed, failed, summary };
99
+ }
100
+ validateConstraint(spec, constraint) {
101
+ switch (constraint.type) {
102
+ case 'max-requirements': {
103
+ const count = this.countRequirements(spec);
104
+ const max = constraint.param;
105
+ if (count > max) {
106
+ return { valid: false, reason: `Too many requirements: found ${count}, max allowed is ${max}`, actualValue: count };
107
+ }
108
+ return { valid: true };
109
+ }
110
+ case 'min-requirements': {
111
+ const count = this.countRequirements(spec);
112
+ const min = constraint.param;
113
+ if (count < min) {
114
+ return { valid: false, reason: `Too few requirements: found ${count}, minimum required is ${min}`, actualValue: count };
115
+ }
116
+ return { valid: true };
117
+ }
118
+ case 'require-section': {
119
+ const sectionName = constraint.param;
120
+ const hasSection = this.hasSection(spec, sectionName);
121
+ if (!hasSection) {
122
+ return { valid: false, reason: `Required section "${sectionName}" not found` };
123
+ }
124
+ return { valid: true };
125
+ }
126
+ case 'require-priority': {
127
+ const hasPriority = /\*\*Priority:\*\*\s*(P0|P1|P2)/i.test(spec);
128
+ if (!hasPriority) {
129
+ return { valid: false, reason: 'No priority markers (P0, P1, P2) found in requirements' };
130
+ }
131
+ return { valid: true };
132
+ }
133
+ case 'require-scenarios': {
134
+ const hasScenarios = /(Given|When|Then)/i.test(spec);
135
+ if (!hasScenarios) {
136
+ return { valid: false, reason: 'No Given/When/Then scenarios found' };
137
+ }
138
+ return { valid: true };
139
+ }
140
+ case 'max-section-length': {
141
+ const maxLength = constraint.param;
142
+ const sections = this.extractAllSections(spec);
143
+ for (const [sectionName, content] of Object.entries(sections)) {
144
+ const length = content.length;
145
+ if (length > maxLength) {
146
+ return { valid: false, reason: `Section "${sectionName}" exceeds max length: ${length} > ${maxLength}`, actualValue: length };
147
+ }
148
+ }
149
+ return { valid: true };
150
+ }
151
+ default:
152
+ console.warn(`Warning: Unknown constraint type "${constraint.type}"`);
153
+ return { valid: false, reason: `Unknown constraint type: ${constraint.type}` };
154
+ }
155
+ }
156
+ countRequirements(spec) {
157
+ const reqRegex = /^###\s+(FR|NFR|SEC|PERF)-[A-Z0-9-]+/gm;
158
+ const matches = spec.match(reqRegex);
159
+ return matches ? matches.length : 0;
160
+ }
161
+ hasSection(spec, sectionName) {
162
+ const escapedName = this.escapeRegExp(sectionName);
163
+ const sectionRegex = new RegExp(`^#{1,3}\\s+${escapedName}\\s*$`, 'im');
164
+ return sectionRegex.test(spec);
165
+ }
166
+ escapeRegExp(str) {
167
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
168
+ }
169
+ extractSection(spec, sectionName) {
170
+ const escapedName = this.escapeRegExp(sectionName);
171
+ const sectionRegex = new RegExp(`^#{1,3}\\s+${escapedName}\\s*$(.+?)(?=^#{1,3}\\s+|$)`, 'ims');
172
+ const match = spec.match(sectionRegex);
173
+ return match ? match[1].trim() : null;
174
+ }
175
+ extractAllSections(spec) {
176
+ const sections = {};
177
+ const sectionRegex = /^(#{1,3})\s+(.+?)$\n([\s\S]*?)(?=^#{1,3}\s+|$)/gim;
178
+ let match;
179
+ while ((match = sectionRegex.exec(spec)) !== null) {
180
+ const sectionName = match[2].trim();
181
+ const content = match[3].trim();
182
+ sections[sectionName] = content;
183
+ }
184
+ return sections;
185
+ }
186
+ }
187
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/templates/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Template System v2 Types
3
+ */
4
+ export interface TemplateVariable {
5
+ name: string;
6
+ value: string | number | boolean;
7
+ }
8
+ export interface RenderOptions {
9
+ variables?: Record<string, string | number | boolean>;
10
+ partials?: Record<string, string>;
11
+ preserveConstraints?: boolean;
12
+ preserveChecklists?: boolean;
13
+ }
14
+ export type ConstraintType = 'max-requirements' | 'min-requirements' | 'require-section' | 'max-section-length' | 'require-priority' | 'require-scenarios' | 'custom';
15
+ export interface Constraint {
16
+ type: ConstraintType;
17
+ param: string | number;
18
+ description?: string;
19
+ line?: number;
20
+ }
21
+ export interface ValidationResult {
22
+ valid: boolean;
23
+ passed: Constraint[];
24
+ failed: ConstraintFailure[];
25
+ summary: string;
26
+ }
27
+ export interface ConstraintFailure {
28
+ constraint: Constraint;
29
+ reason: string;
30
+ actualValue?: string | number;
31
+ }
32
+ export interface ChecklistItem {
33
+ id: string;
34
+ description: string;
35
+ required: boolean;
36
+ category?: string;
37
+ }
38
+ export interface Checklist {
39
+ id: string;
40
+ name: string;
41
+ items: ChecklistItem[];
42
+ line?: number;
43
+ }
44
+ export interface ChecklistResult {
45
+ checklist: Checklist;
46
+ passed: ChecklistItem[];
47
+ failed: ChecklistItemFailure[];
48
+ skipped: ChecklistItem[];
49
+ valid: boolean;
50
+ score: number;
51
+ }
52
+ export interface ChecklistItemFailure {
53
+ item: ChecklistItem;
54
+ reason: string;
55
+ }
56
+ export interface Template {
57
+ id: string;
58
+ name: string;
59
+ description: string;
60
+ content: string;
61
+ constraints: Constraint[];
62
+ checklists: Checklist[];
63
+ version?: string;
64
+ author?: string;
65
+ tags?: string[];
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/templates/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Template System v2 Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/templates/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specsafe/core",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Core types and workflow engine for SpecSafe",
5
5
  "type": "module",
6
6
  "engines": {