@specsafe/core 0.3.6 → 0.5.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 (83) 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/index.d.ts +8 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +6 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/templates/delta-template.d.ts +18 -0
  78. package/dist/templates/delta-template.d.ts.map +1 -0
  79. package/dist/templates/delta-template.js +191 -0
  80. package/dist/templates/delta-template.js.map +1 -0
  81. package/dist/types.d.ts +1 -1
  82. package/dist/types.d.ts.map +1 -1
  83. package/package.json +1 -1
@@ -0,0 +1,22 @@
1
+ /**
2
+ * EARS Parser
3
+ * Detects and parses Easy Approach to Requirements Syntax patterns
4
+ */
5
+ import type { EARSRequirement } from './types.js';
6
+ /**
7
+ * Parse a requirement text and extract EARS structure
8
+ */
9
+ export declare function parseEARSRequirement(text: string): EARSRequirement;
10
+ /**
11
+ * Check if a requirement text contains any EARS keywords
12
+ *
13
+ * Note: This is a permissive heuristic designed to detect potential EARS patterns.
14
+ * It may produce false positives and should be used as an initial filter rather than
15
+ * a strict validator.
16
+ */
17
+ export declare function hasEARSKeywords(text: string): boolean;
18
+ /**
19
+ * Extract all "system shall" statements from a text block
20
+ */
21
+ export declare function extractRequirements(text: string): string[];
22
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/ears/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,YAAY,CAAC;AAO5D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAgDlE;AAuND;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB1D"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * EARS Parser
3
+ * Detects and parses Easy Approach to Requirements Syntax patterns
4
+ */
5
+ /**
6
+ * Common subject pattern for EARS requirements
7
+ */
8
+ const SUBJECT_PATTERN = '(?:system|application|service|software|product)';
9
+ /**
10
+ * Parse a requirement text and extract EARS structure
11
+ */
12
+ export function parseEARSRequirement(text) {
13
+ const normalized = text.trim();
14
+ // Try to match each EARS pattern in order of specificity
15
+ // 1. Complex (combination of patterns)
16
+ const complexMatch = matchComplex(normalized);
17
+ if (complexMatch) {
18
+ return complexMatch;
19
+ }
20
+ // 2. Unwanted behavior: "If [unwanted], then the system shall [action]"
21
+ const unwantedMatch = matchUnwanted(normalized);
22
+ if (unwantedMatch) {
23
+ return unwantedMatch;
24
+ }
25
+ // 3. Event-driven: "When [event], the system shall [action]"
26
+ const eventMatch = matchEvent(normalized);
27
+ if (eventMatch) {
28
+ return eventMatch;
29
+ }
30
+ // 4. State-driven: "While [state], the system shall [action]"
31
+ const stateMatch = matchState(normalized);
32
+ if (stateMatch) {
33
+ return stateMatch;
34
+ }
35
+ // 5. Optional: "Where [condition], the system shall [action]"
36
+ const optionalMatch = matchOptional(normalized);
37
+ if (optionalMatch) {
38
+ return optionalMatch;
39
+ }
40
+ // 6. Ubiquitous: "The system shall [action]"
41
+ const ubiquitousMatch = matchUbiquitous(normalized);
42
+ if (ubiquitousMatch) {
43
+ return ubiquitousMatch;
44
+ }
45
+ // Unknown pattern
46
+ return {
47
+ text: normalized,
48
+ type: 'unknown',
49
+ action: normalized,
50
+ confidence: 0
51
+ };
52
+ }
53
+ /**
54
+ * Match ubiquitous pattern: "The system shall [action]"
55
+ */
56
+ function matchUbiquitous(text) {
57
+ const patterns = [
58
+ new RegExp(`^(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
59
+ ];
60
+ for (const pattern of patterns) {
61
+ const match = text.match(pattern);
62
+ if (match) {
63
+ return {
64
+ text,
65
+ type: 'ubiquitous',
66
+ action: match[1].trim(),
67
+ confidence: 0.9
68
+ };
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * Match event-driven pattern: "When [event], the system shall [action]"
75
+ */
76
+ function matchEvent(text) {
77
+ const patterns = [
78
+ new RegExp(`^when\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
79
+ new RegExp(`^(?:upon|on)\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
80
+ ];
81
+ for (const pattern of patterns) {
82
+ const match = text.match(pattern);
83
+ if (match) {
84
+ return {
85
+ text,
86
+ type: 'event',
87
+ event: match[1].trim(),
88
+ action: match[2].trim(),
89
+ confidence: 0.95
90
+ };
91
+ }
92
+ }
93
+ return null;
94
+ }
95
+ /**
96
+ * Match state-driven pattern: "While [state], the system shall [action]"
97
+ */
98
+ function matchState(text) {
99
+ const patterns = [
100
+ new RegExp(`^while\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
101
+ new RegExp(`^(?:during|throughout)\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
102
+ new RegExp(`^as long as\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
103
+ ];
104
+ for (const pattern of patterns) {
105
+ const match = text.match(pattern);
106
+ if (match) {
107
+ return {
108
+ text,
109
+ type: 'state',
110
+ state: match[1].trim(),
111
+ action: match[2].trim(),
112
+ confidence: 0.95
113
+ };
114
+ }
115
+ }
116
+ return null;
117
+ }
118
+ /**
119
+ * Match optional pattern: "Where [condition], the system shall [action]"
120
+ */
121
+ function matchOptional(text) {
122
+ const patterns = [
123
+ new RegExp(`^where\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
124
+ new RegExp(`^in case(?:s)?\\s+(?:where\\s+)?(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
125
+ ];
126
+ for (const pattern of patterns) {
127
+ const match = text.match(pattern);
128
+ if (match) {
129
+ return {
130
+ text,
131
+ type: 'optional',
132
+ condition: match[1].trim(),
133
+ action: match[2].trim(),
134
+ confidence: 0.95
135
+ };
136
+ }
137
+ }
138
+ return null;
139
+ }
140
+ /**
141
+ * Match unwanted behavior pattern: "If [unwanted], then the system shall [action]"
142
+ */
143
+ function matchUnwanted(text) {
144
+ const patterns = [
145
+ new RegExp(`^if\\s+(.+?),\\s*then\\s+(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
146
+ new RegExp(`^(?:in the event that|should)\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
147
+ ];
148
+ for (const pattern of patterns) {
149
+ const match = text.match(pattern);
150
+ if (match) {
151
+ return {
152
+ text,
153
+ type: 'unwanted',
154
+ unwantedCondition: match[1].trim(),
155
+ action: match[2].trim(),
156
+ confidence: 0.95
157
+ };
158
+ }
159
+ }
160
+ return null;
161
+ }
162
+ /**
163
+ * Match complex pattern: combination of triggers
164
+ * Example: "When [event], while [state], the system shall [action]"
165
+ */
166
+ function matchComplex(text) {
167
+ const complexPattern = new RegExp(`^((?:when|while|where|if).+?(?:,\\s*(?:and|while|where|when)\\s+.+?)*),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i');
168
+ const match = text.match(complexPattern);
169
+ if (!match) {
170
+ return null;
171
+ }
172
+ const triggersText = match[1].trim();
173
+ const action = match[2].trim();
174
+ // Parse individual triggers
175
+ const conditions = [];
176
+ // Split by "and", "while", "where", "when", "if" (keeping the keyword)
177
+ const triggerParts = triggersText.split(/,?\s+(and|while|where|when|if)\s+/i);
178
+ let currentKeyword = '';
179
+ let lastKeywordType = null;
180
+ for (let i = 0; i < triggerParts.length; i++) {
181
+ const part = triggerParts[i].trim();
182
+ if (/^(and|while|where|when|if)$/i.test(part)) {
183
+ const keyword = part.toLowerCase();
184
+ // 'and' continues with the previous keyword type
185
+ if (keyword !== 'and') {
186
+ currentKeyword = keyword;
187
+ }
188
+ continue;
189
+ }
190
+ // First part might not have a keyword if it starts with one
191
+ if (i === 0) {
192
+ if (/^if\s+/i.test(part)) {
193
+ conditions.push({ type: 'optional', value: part.replace(/^if\s+/i, '').trim() });
194
+ lastKeywordType = 'optional';
195
+ }
196
+ else if (/^when\s+/i.test(part)) {
197
+ conditions.push({ type: 'event', value: part.replace(/^when\s+/i, '').trim() });
198
+ lastKeywordType = 'event';
199
+ }
200
+ else if (/^while\s+/i.test(part)) {
201
+ conditions.push({ type: 'state', value: part.replace(/^while\s+/i, '').trim() });
202
+ lastKeywordType = 'state';
203
+ }
204
+ else if (/^where\s+/i.test(part)) {
205
+ conditions.push({ type: 'optional', value: part.replace(/^where\s+/i, '').trim() });
206
+ lastKeywordType = 'optional';
207
+ }
208
+ }
209
+ else {
210
+ // Use the current keyword (or last type if 'and')
211
+ let conditionType = null;
212
+ if (currentKeyword === 'if') {
213
+ conditionType = 'optional';
214
+ }
215
+ else if (currentKeyword === 'when') {
216
+ conditionType = 'event';
217
+ }
218
+ else if (currentKeyword === 'while') {
219
+ conditionType = 'state';
220
+ }
221
+ else if (currentKeyword === 'where') {
222
+ conditionType = 'optional';
223
+ }
224
+ else if (currentKeyword === '' && lastKeywordType) {
225
+ // Handle 'and' by using last keyword type
226
+ conditionType = lastKeywordType;
227
+ }
228
+ if (conditionType) {
229
+ conditions.push({ type: conditionType, value: part });
230
+ lastKeywordType = conditionType;
231
+ }
232
+ }
233
+ }
234
+ // Only consider complex if we have more than one condition
235
+ if (conditions.length < 2) {
236
+ return null;
237
+ }
238
+ return {
239
+ text,
240
+ type: 'complex',
241
+ action,
242
+ conditions,
243
+ confidence: 0.85
244
+ };
245
+ }
246
+ /**
247
+ * Check if a requirement text contains any EARS keywords
248
+ *
249
+ * Note: This is a permissive heuristic designed to detect potential EARS patterns.
250
+ * It may produce false positives and should be used as an initial filter rather than
251
+ * a strict validator.
252
+ */
253
+ export function hasEARSKeywords(text) {
254
+ const keywords = /\b(when|while|where|if\s+.+\s+then|system\s+shall|shall|must|will)\b/i;
255
+ return keywords.test(text);
256
+ }
257
+ /**
258
+ * Extract all "system shall" statements from a text block
259
+ */
260
+ export function extractRequirements(text) {
261
+ const lines = text.split('\n');
262
+ const requirements = [];
263
+ for (const line of lines) {
264
+ const trimmed = line.trim();
265
+ // Look for lines that look like requirements (must have EARS action clause)
266
+ if (trimmed && /(?:shall|must|will)/i.test(trimmed) && (/(?:system|application|service)/i.test(trimmed) ||
267
+ /(?:when|while|where|if)\s+/i.test(trimmed))) {
268
+ requirements.push(trimmed.replace(/^[-*•]\s*/, '')); // Remove bullet points
269
+ }
270
+ }
271
+ return requirements;
272
+ }
273
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/ears/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * EARS Template Generator
3
+ * Creates spec templates with EARS requirement format
4
+ */
5
+ /**
6
+ * Generate an EARS-formatted spec template
7
+ */
8
+ export declare function generateEARSTemplate(id: string, name: string, author: string, priority?: 'P0' | 'P1' | 'P2'): string;
9
+ /**
10
+ * Generate EARS examples for a specific domain
11
+ */
12
+ export declare function generateEARSExamples(domain: 'web' | 'mobile' | 'api' | 'embedded'): {
13
+ ubiquitous: string[];
14
+ event: string[];
15
+ state: string[];
16
+ optional: string[];
17
+ unwanted: string[];
18
+ complex: string[];
19
+ };
20
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/ears/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,IAAI,GAAG,IAAI,GAAG,IAAW,GAClC,MAAM,CAgOR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG;IACnF,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAiIA"}