nimai-core 0.4.9 → 0.5.1

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.
@@ -0,0 +1,63 @@
1
+ # Spec: [title]
2
+
3
+ ## Deliverable
4
+ *What exists when this is done. Name the artifact, not the activity.*
5
+
6
+ - Artifact:
7
+ - Format:
8
+ - Quality bar (measurable — a number, a passing command, a checkable property):
9
+
10
+ ## Scope
11
+ **In scope:**
12
+ -
13
+
14
+ **Out of scope (will not be built — be explicit, this is what prevents drift):**
15
+ -
16
+
17
+ ## Task Decomposition
18
+ *Each sub-task completable in under 2 hours, with its own binary acceptance criteria. State dependencies between sub-tasks explicitly.*
19
+
20
+ | # | Sub-task | Depends on | Acceptance criteria | How it is checked |
21
+ |---|---|---|---|---|
22
+ | 1 | | — | | |
23
+
24
+ ## Mechanism Decisions
25
+ *One block per core choice. A builder must never have to pick an approach mid-build.*
26
+
27
+ **Decision: [short name]**
28
+ - Chosen: [exactly one approach]
29
+ - Rejected: [the alternatives considered]
30
+ - Why: [one sentence]
31
+
32
+ ## Architecture Lock
33
+ *Resolve every line. "TBD" and blanks mean the spec is not ready. Write "none" where a field genuinely does not apply, with a reason.*
34
+
35
+ - Persistence layer:
36
+ - File/object storage:
37
+ - External services + env vars:
38
+ - API/trigger flow:
39
+ - Entity states and transitions:
40
+ - Auth:
41
+
42
+ ## Change Surface
43
+ *Every existing file this work touches, classified. The builder may not touch anything outside this table.*
44
+ *Greenfield project? Replace the table with the single line: "Greenfield — no existing code to change."*
45
+
46
+ | Path | Verb (DELETE / REWRITE / EDIT / KEEP) | Why |
47
+ |---|---|---|
48
+ | | | |
49
+
50
+ ## Edge Cases and Failure Modes
51
+ *What will the builder hit mid-execution that the sections above do not answer? An empty list here is a red flag, not a green one.*
52
+
53
+ -
54
+ -
55
+
56
+ ## Spec Convergence
57
+ *Non-zero counts mean this spec is not ready. Fix the spec, not the numbers.*
58
+
59
+ open_questions: 0
60
+ ambiguities_remaining: 0
61
+ ready_for_build: yes
62
+
63
+ <!-- nimai-spec tier=full -->
@@ -0,0 +1,39 @@
1
+ # Spec: [title]
2
+
3
+ ## Deliverable
4
+ *What exists when this is done. Name the artifact, not the activity.*
5
+
6
+ - Artifact:
7
+ - Format:
8
+ - Quality bar (measurable — a number, a passing command, a checkable property):
9
+
10
+ ## Scope
11
+ **In scope:**
12
+ -
13
+
14
+ **Out of scope (will not be built — be explicit, this is what prevents drift):**
15
+ -
16
+
17
+ ## Acceptance Criteria
18
+ *Binary and checkable. Leave every box unchecked — they are checked by the reviewer, not the author.*
19
+
20
+ Done when ALL of these are true:
21
+ - [ ]
22
+ - [ ]
23
+
24
+ ## Mechanism Decisions
25
+ *One block per core choice. A builder must never have to pick an approach mid-build.*
26
+
27
+ **Decision: [short name]**
28
+ - Chosen: [exactly one approach]
29
+ - Rejected: [the alternatives considered]
30
+ - Why: [one sentence]
31
+
32
+ ## Spec Convergence
33
+ *Non-zero counts mean this spec is not ready. Fix the spec, not the numbers.*
34
+
35
+ open_questions: 0
36
+ ambiguities_remaining: 0
37
+ ready_for_build: yes
38
+
39
+ <!-- nimai-spec tier=lite -->
package/dist/index.d.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  export * from './types';
2
2
  export * from './template';
3
3
  export * from './lint';
4
- export * from './context';
5
4
  export * from './prompts';
6
- export * from './clarification';
7
5
  export * from './discovery';
8
6
  export * from './verdict';
9
7
  export * from './forge-root';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -17,9 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./types"), exports);
18
18
  __exportStar(require("./template"), exports);
19
19
  __exportStar(require("./lint"), exports);
20
- __exportStar(require("./context"), exports);
21
20
  __exportStar(require("./prompts"), exports);
22
- __exportStar(require("./clarification"), exports);
23
21
  __exportStar(require("./discovery"), exports);
24
22
  __exportStar(require("./verdict"), exports);
25
23
  __exportStar(require("./forge-root"), exports);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,6CAA2B;AAC3B,yCAAuB;AACvB,4CAA0B;AAC1B,4CAA0B;AAC1B,kDAAgC;AAChC,8CAA4B;AAC5B,4CAA0B;AAC1B,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,6CAA2B;AAC3B,yCAAuB;AACvB,4CAA0B;AAC1B,8CAA4B;AAC5B,4CAA0B;AAC1B,+CAA6B"}
@@ -1 +1 @@
1
- {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAiB,MAAM,SAAS,CAAC;AAsGnD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAQtD;AAsBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAmFxD"}
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAiB,MAAM,SAAS,CAAC;AA6GnD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAQtD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAkDxD"}
package/dist/lint.js CHANGED
@@ -36,329 +36,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.lintSpec = lintSpec;
37
37
  exports.lintContent = lintContent;
38
38
  const fs = __importStar(require("fs"));
39
+ const template_1 = require("./template");
39
40
  // Matches unfilled placeholder fields: ___ (3 or more underscores)
40
- const BLANK_FIELD_RE = /_{3,}/;
41
+ const BLANK_PLACEHOLDER_RE = /_{3,}/;
41
42
  // Matches [NEEDS HUMAN INPUT...] flags
42
43
  const NHFI_RE = /\[NEEDS HUMAN INPUT/i;
43
- // Matches pre-checked list items: "- [x] ..." or "* [x] ..."
44
- const PRE_CHECKED_AC_RE = /^[-*]\s+\[x\]/im;
45
- // Matches the nimai-spec marker (with or without date)
46
- const NIMAI_MARKER_RE = /<!--\s*nimai-spec[\s:]/;
47
- // Unresolved mechanism detection — two-tier:
48
- // Pattern A (high confidence, flagged anywhere): parenthetical "(e.g., X or Y)"
49
- const UNRESOLVED_PAREN_RE = /\(e\.g\.,?\s+[^)\n]+\bor\b[^)\n]*\)/i;
50
- // Pattern B (context-sensitive, only inside critical sections):
51
- // "e.g., X or Y" / "such as X or Y" / "for example X or Y"
52
- // "could/might use/implement X or Y"
53
- const UNRESOLVED_INLINE_RE = /(?:(?:e\.g\.|such as|for example)\s+\w[^\n.;]*\bor\b|\b(?:could|might)\s+(?:use|implement|be\s+(?:used|implemented?))\s+\w[^\n.;]*\bor\b)/i;
54
- // Headings that introduce critical sections where a single mechanism must be chosen.
55
- // No trailing \b so that plurals/suffixes like "Constraints", "Implementation", "Tasks" all match.
56
- const CRITICAL_SECTION_RE = /\b(?:deliverable|scope|constraints?|must|sub-?tasks?|tasks?|implement\w*|pipeline|mechanism|architect\w*|approach)/i;
57
- const HEADING_LINE_RE = /^#{1,6}\s+(.+)/;
58
- const UNRESOLVED_ARCH_VALUE_RE = /(?:_{3,}|\bTBD\b)/i;
59
- /** Return 1-based line numbers where unresolved mechanism patterns are found. */
60
- function detectUnresolvedMechanisms(lines) {
61
- const matches = [];
62
- let inCritical = false;
63
- for (let i = 0; i < lines.length; i++) {
64
- const headingMatch = lines[i].match(HEADING_LINE_RE);
65
- if (headingMatch) {
66
- inCritical = CRITICAL_SECTION_RE.test(headingMatch[1]);
67
- continue;
68
- }
69
- // Pattern A: parenthetical "(e.g., X or Y)" — high enough confidence to flag anywhere
70
- if (UNRESOLVED_PAREN_RE.test(lines[i])) {
71
- matches.push(i + 1);
72
- continue;
73
- }
74
- // Pattern B: inline options — only inside critical sections to avoid prose false-positives
75
- if (inCritical && UNRESOLVED_INLINE_RE.test(lines[i])) {
76
- matches.push(i + 1);
77
- }
78
- }
79
- return matches;
80
- }
81
- // Required top-level sections (by heading text, case-insensitive)
82
- const REQUIRED_SECTIONS = [
83
- 'pre-flight',
84
- 'specification layer',
85
- 'intent layer',
86
- 'context layer',
87
- 'prompt layer',
88
- 'governance & validation',
44
+ // Matches the nimai-spec marker (with or without tier attribute)
45
+ const NIMAI_MARKER_RE = /<!--\s*nimai-spec(?:\s+tier=(lite|full))?\s*-->/;
46
+ // ─── Required sections per tier ─────────────────────────────────────────────
47
+ // Headings are matched literally against these exact strings.
48
+ const LITE_REQUIRED_SECTIONS = [
49
+ 'Deliverable',
50
+ 'Scope',
51
+ 'Acceptance Criteria',
52
+ 'Mechanism Decisions',
53
+ 'Spec Convergence',
89
54
  ];
90
- // Advisory: architecture quality signals (anti-spaghetti rules)
91
- // Each rule looks for at least one keyword/heading indicating the concept is addressed.
92
- // Rules marked hardFailTiers become hard failures (not advisory) when the spec's risk tier
93
- // matches AND (if codingOnly=true) the spec is a coding/tooling/server spec.
94
- const ADVISORY_RULES = [
95
- {
96
- type: 'missing_module_boundary',
97
- keywords: ['module boundary', 'package boundary', 'layer boundary', 'separation of concerns', 'packages/core', 'packages/mcp', 'packages/cli', 'app/models', 'app/state', 'app/db'],
98
- message: 'No module boundary definition found — document package/layer boundaries and which layers may not import each other',
99
- hardFailTiers: ['medium', 'high'],
100
- codingOnly: true,
101
- },
102
- {
103
- type: 'missing_interface_contract',
104
- keywords: ['interface contract', 'api contract', 'tool schema', 'modeladapter', 'input schema', 'output shape', 'zod'],
105
- message: 'No interface contract found — consider documenting API/tool schemas or interfaces',
106
- },
107
- {
108
- type: 'missing_non_goals',
109
- keywords: ['non-goal', 'non-goals', 'must-not', 'scope — out', 'out of scope', 'deferred', 'excluded'],
110
- message: 'No non-goals or out-of-scope section found — document what this spec explicitly excludes',
111
- hardFailTiers: ['medium', 'high'],
112
- },
113
- {
114
- type: 'missing_change_surface',
115
- keywords: ['change surface', 'breaking change', 'migration', 'backward compat', 'semver', 'versioning', 'deprecat'],
116
- message: 'No change surface documentation found — document compatibility expectations and what this spec must not break',
117
- hardFailTiers: ['medium', 'high'],
118
- },
119
- {
120
- type: 'missing_dependency_direction',
121
- keywords: ['dependency direction', 'may not import', 'must not import', 'import from', 'no cross-layer', 'dependency rule', 'import rule'],
122
- message: 'No dependency direction rules found — document which modules/layers may import which (prevents circular and cross-layer dependencies)',
123
- hardFailTiers: ['medium', 'high'],
124
- codingOnly: true,
125
- skipAdvisoryForTiers: ['low', 'unknown'],
126
- },
55
+ const FULL_REQUIRED_SECTIONS = [
56
+ ...LITE_REQUIRED_SECTIONS,
57
+ 'Task Decomposition',
58
+ 'Architecture Lock',
59
+ 'Change Surface',
60
+ 'Edge Cases and Failure Modes',
127
61
  ];
128
- function lintSpec(filePath) {
129
- let content;
130
- try {
131
- content = fs.readFileSync(filePath, 'utf-8');
132
- }
133
- catch (err) {
134
- throw new Error(`Cannot read spec at "${filePath}": ${err.message}`);
135
- }
136
- return lintContent(content);
137
- }
138
- /** Detect risk tier from checked checkbox in spec content */
139
- function detectRiskTier(content) {
140
- if (/\[x\]\s*high/i.test(content))
141
- return 'high';
142
- if (/\[x\]\s*medium/i.test(content))
143
- return 'medium';
144
- if (/\[x\]\s*low/i.test(content))
145
- return 'low';
146
- return 'unknown';
147
- }
148
- /** Detect if this is a coding/tooling/server spec (vs docs/research/strategy) */
149
- function isCodingSpec(content) {
150
- const lower = content.toLowerCase();
151
- return (lower.includes('if coding') ||
152
- lower.includes('language / framework') ||
153
- lower.includes('language/framework') ||
154
- lower.includes('test coverage expectation') ||
155
- lower.includes('performance targets'));
156
- }
157
- function lintContent(content) {
158
- const issues = [];
159
- const lines = content.split('\n');
160
- for (let i = 0; i < lines.length; i++) {
161
- const line = lines[i];
162
- const lineNum = i + 1;
163
- if (BLANK_FIELD_RE.test(line)) {
164
- issues.push(issue(lineNum, 'blank_field', `Unfilled placeholder on line ${lineNum}`));
165
- }
166
- if (NHFI_RE.test(line)) {
167
- issues.push(issue(lineNum, 'needs_human_input', `Unresolved [NEEDS HUMAN INPUT] flag on line ${lineNum}`));
168
- }
169
- }
170
- // Pre-checked acceptance criteria — hard fail: ACs must be unchecked in a draft spec
171
- if (PRE_CHECKED_AC_RE.test(content)) {
172
- const matchLines = lines.reduce((acc, l, i) => {
173
- if (/^[-*]\s+\[x\]/i.test(l))
174
- acc.push(i + 1);
175
- return acc;
176
- }, []);
177
- for (const lineNum of matchLines) {
178
- issues.push(issue(lineNum, 'pre_checked_ac', `Pre-checked list item on line ${lineNum} — acceptance criteria must be unchecked ([ ]) in a draft spec`));
179
- }
180
- }
181
- const lower = content.toLowerCase();
182
- for (const section of REQUIRED_SECTIONS) {
183
- if (!lower.includes(section)) {
184
- issues.push(issue(0, 'missing_section', `Required section missing: "${section}"`));
185
- }
186
- }
187
- // Missing nimai-spec marker — advisory: spec was not created or registered by nimai
188
- if (!NIMAI_MARKER_RE.test(content)) {
189
- issues.push(advisoryIssue(0, 'missing_marker', 'No <!-- nimai-spec --> marker found — add it so nimai can discover this spec automatically (nimai new stamps it)'));
190
- }
191
- // Unresolved mechanism — spec offers options instead of committing to one path.
192
- // Hard-fail for medium/high risk specs; advisory for low/unknown.
193
- const riskTier = detectRiskTier(content);
194
- const coding = isCodingSpec(content);
195
- const unresolvedMatches = detectUnresolvedMechanisms(lines);
196
- for (const lineNum of unresolvedMatches) {
197
- const isHard = riskTier === 'medium' || riskTier === 'high';
198
- const msg = `Unresolved mechanism on line ${lineNum} — spec must commit to a single implementation path, not offer options (e.g. "e.g., X or Y")`;
199
- issues.push(isHard
200
- ? issue(lineNum, 'unresolved_mechanism', msg)
201
- : advisoryIssue(lineNum, 'unresolved_mechanism', msg));
202
- }
203
- // Mechanism Decision section — deterministic contract lock
204
- issues.push(...mechanismDecisionIssues(content, lines, riskTier));
205
- // Spec Convergence section — GO gate: zero open questions, zero ambiguities
206
- issues.push(...convergenceIssues(content, lines, riskTier));
207
- // Architecture Lock section — process-level architecture completeness gate
208
- issues.push(...architectureLockIssues(lines, riskTier, coding));
209
- // Edge Cases and Failure Modes — adversarial gap check (Option 3)
210
- issues.push(...edgeCasesIssues(lines, riskTier));
211
- for (const rule of ADVISORY_RULES) {
212
- const found = rule.keywords.some(kw => lower.includes(kw.toLowerCase()));
213
- if (!found) {
214
- const shouldHardFail = rule.hardFailTiers !== undefined &&
215
- rule.hardFailTiers.includes(riskTier) &&
216
- (!rule.codingOnly || coding);
217
- if (shouldHardFail) {
218
- issues.push(issue(0, rule.type, `${rule.message} [required for ${riskTier}-risk${rule.codingOnly ? ' coding' : ''} specs]`));
219
- }
220
- else if (!rule.skipAdvisoryForTiers?.includes(riskTier)) {
221
- issues.push(advisoryIssue(0, rule.type, rule.message));
222
- }
223
- }
224
- }
225
- return issues;
226
- }
227
- /**
228
- * Validate the Architecture Lock section contract.
229
- * - For medium/high coding specs: missing section or unresolved field is hard fail.
230
- * - For low/unknown/non-coding specs: advisory only.
231
- * - Unresolved values include blank, placeholder underscores, or "TBD".
232
- */
233
- function architectureLockIssues(lines, riskTier, coding) {
234
- const result = [];
235
- const requiresHardFail = coding && (riskTier === 'medium' || riskTier === 'high');
236
- const startIdx = lines.findIndex(l => /^#{1,3}\s+.*architecture\s*lock/i.test(l));
237
- if (startIdx === -1) {
238
- const msg = 'No "Architecture Lock" section found — add "## 1.6 Architecture Lock" with all required architecture fields before builder handoff';
239
- result.push(requiresHardFail ? issue(0, 'missing_architecture_lock', msg) : advisoryIssue(0, 'missing_architecture_lock', msg));
240
- return result;
241
- }
242
- const headingLevel = (lines[startIdx].match(/^(#{1,6})/) ?? ['', '#'])[1].length;
243
- let endIdx = lines.length;
244
- for (let i = startIdx + 1; i < lines.length; i++) {
245
- const m = lines[i].match(/^(#{1,6})\s+/);
246
- if (m && m[1].length <= headingLevel) {
247
- endIdx = i;
248
- break;
249
- }
250
- }
251
- const sectionLines = lines.slice(startIdx, endIdx);
252
- const REQUIRED_FIELDS = [
253
- { label: 'Persistence layer', keys: ['persistence layer:'] },
254
- { label: 'File/object storage', keys: ['file/object storage:', 'file / object storage:'] },
255
- { label: 'External model/service + env var', keys: ['external model/service + env var:', 'external model / service + env var:'] },
256
- { label: 'API trigger flow', keys: ['api trigger flow:'] },
257
- { label: 'Entity status state machine', keys: ['entity status state machine:'] },
258
- { label: 'Auth implementation', keys: ['auth implementation:'] },
259
- ];
260
- for (const field of REQUIRED_FIELDS) {
261
- const localIdx = sectionLines.findIndex((line) => {
262
- const lower = line.trim().toLowerCase();
263
- return field.keys.some((k) => lower.startsWith(k));
264
- });
265
- if (localIdx === -1) {
266
- const msg = `Architecture Lock is missing required field "${field.label}:"`;
267
- result.push(requiresHardFail ? issue(startIdx + 1, 'missing_architecture_lock', msg) : advisoryIssue(startIdx + 1, 'missing_architecture_lock', msg));
268
- continue;
269
- }
270
- const absLine = startIdx + localIdx + 1;
271
- const value = sectionLines[localIdx].slice(sectionLines[localIdx].indexOf(':') + 1).trim();
272
- if (!value || UNRESOLVED_ARCH_VALUE_RE.test(value)) {
273
- const msg = `Architecture Lock field "${field.label}" on line ${absLine} is unresolved (blank/placeholder/TBD)`;
274
- result.push(requiresHardFail ? issue(absLine, 'missing_architecture_lock', msg) : advisoryIssue(absLine, 'missing_architecture_lock', msg));
275
- }
276
- }
277
- return result;
278
- }
279
62
  /**
280
- * Validate the Mechanism Decision section contract.
281
- * - If absent on a medium/high spec: hard-fail. Advisory on low/unknown.
282
- * - If present: all four required fields must be non-blank; "Chosen approach" must not contain
283
- * option language. Validation is scoped to the section, not the whole file.
63
+ * The pre_checked_ac rule fires only on "- [x]" items inside the
64
+ * Acceptance Criteria and Task Decomposition sections not globally.
284
65
  */
285
- function mechanismDecisionIssues(content, lines, riskTier) {
66
+ function findPreCheckedAcsInScope(lines) {
286
67
  const result = [];
287
- const sectionStartIdx = lines.findIndex(l => /^#{1,3}\s+.*mechanism\s*decision/i.test(l));
288
- if (sectionStartIdx === -1) {
289
- const msg = 'No "Mechanism Decision" section found — add one with "Chosen approach:", "Rejected alternatives:", "Why rejected:", "Impact on ACs:" for each core mechanism (prevents builder drift in multi-agent workflows)';
290
- const isHard = riskTier === 'medium' || riskTier === 'high';
291
- result.push(isHard ? issue(0, 'missing_mechanism_decision', msg) : advisoryIssue(0, 'missing_mechanism_decision', msg));
292
- return result;
293
- }
294
- // Determine section end: next heading at same or higher level (fewer #s), or EOF
295
- const headingLevel = (lines[sectionStartIdx].match(/^(#{1,6})/) ?? ['', '#'])[1].length;
296
- let sectionEndIdx = lines.length;
297
- for (let i = sectionStartIdx + 1; i < lines.length; i++) {
298
- const m = lines[i].match(/^(#{1,6})\s+/);
299
- if (m && m[1].length <= headingLevel) {
300
- sectionEndIdx = i;
301
- break;
302
- }
303
- }
304
- const sectionLines = lines.slice(sectionStartIdx, sectionEndIdx);
305
- // All four required fields must be present and non-blank (N/A is accepted)
306
- const REQUIRED_FIELDS = [
307
- { key: 'chosen approach:', label: 'Chosen approach' },
308
- { key: 'rejected alternatives:', label: 'Rejected alternatives' },
309
- { key: 'why rejected:', label: 'Why rejected' },
310
- { key: 'impact on acs:', label: 'Impact on ACs' },
311
- ];
312
- for (const { key, label } of REQUIRED_FIELDS) {
313
- const lineIdx = sectionLines.findIndex(l => l.trim().toLowerCase().startsWith(key));
314
- if (lineIdx === -1) {
315
- result.push(issue(sectionStartIdx + 1, 'ambiguous_chosen_approach', `Mechanism Decision section is missing required field "${label}:" — add it for every core mechanism`));
68
+ const scopeSections = new Set(['Acceptance Criteria', 'Task Decomposition']);
69
+ let inScope = false;
70
+ for (let i = 0; i < lines.length; i++) {
71
+ const headingMatch = lines[i].match(/^#{1,6}\s+(.+)$/);
72
+ if (headingMatch) {
73
+ inScope = scopeSections.has(headingMatch[1].trim());
316
74
  continue;
317
75
  }
318
- const absLine = sectionStartIdx + lineIdx + 1;
319
- const colonPos = sectionLines[lineIdx].indexOf(':');
320
- const value = sectionLines[lineIdx].slice(colonPos + 1).trim();
321
- if (!value || /_{3,}/.test(value)) {
322
- result.push(issue(absLine, 'ambiguous_chosen_approach', `"${label}" on line ${absLine} is blank — fill it in or write "N/A" with justification`));
323
- }
324
- else if (key === 'chosen approach:' &&
325
- /\b(?:or|could|might)\b|\be\.g\.|\bsuch as\b|\bfor example\b/i.test(value)) {
326
- result.push(issue(absLine, 'ambiguous_chosen_approach', `"Chosen approach" on line ${absLine} contains option language ("or/could/might/e.g./such as/for example") — must commit to one mechanism, not offer choices`));
76
+ if (inScope && /^[-*]\s+\[x\]/i.test(lines[i])) {
77
+ result.push(i + 1);
327
78
  }
328
79
  }
329
80
  return result;
330
81
  }
331
82
  /**
332
- * Enforce the Edge Cases and Failure Modes section.
333
- * Requires the spec author to do adversarial thinking before handing off.
334
- * - Absent on medium/high risk: hard-fail.
335
- * - Absent on low/unknown: advisory.
336
- * Content completeness (blank fields) is caught separately by the blank_field rule.
337
- */
338
- function edgeCasesIssues(lines, riskTier) {
339
- const found = lines.some(l => /^#{1,3}\s+.*(?:edge\s*cases|failure\s*modes)/i.test(l));
340
- if (found)
341
- return [];
342
- const msg = 'No "Edge Cases and Failure Modes" section found — add one to red-team the spec before builder handoff (scope creep, hallucinated completion, intent drift, domain-specific edge cases)';
343
- const isHard = riskTier === 'medium' || riskTier === 'high';
344
- return [isHard ? issue(0, 'missing_edge_cases', msg) : advisoryIssue(0, 'missing_edge_cases', msg)];
345
- }
346
- /**
347
- * Validate the Spec Convergence section — the formal GO declaration.
348
- * - If absent on a medium/high spec: hard-fail. Advisory on low/unknown.
349
- * - If present: open_questions and ambiguities_remaining must both be "0".
350
- * ready_for_build: "no" is always a hard-fail (explicit NO_GO declaration).
83
+ * Check the Spec Convergence section.
84
+ * - Absent: hard fail (unresolved_convergence via missing_convergence_section mapping)
85
+ * - open_questions non-zero: hard fail
86
+ * - ambiguities_remaining non-zero: hard fail
87
+ * - ready_for_build "no": hard fail
351
88
  */
352
- function convergenceIssues(content, lines, riskTier) {
89
+ function convergenceIssues(lines) {
353
90
  const result = [];
354
- const sectionStartIdx = lines.findIndex(l => /^#{1,3}\s+.*spec\s*convergence/i.test(l));
91
+ const sectionStartIdx = lines.findIndex(l => /^#{1,6}\s+Spec Convergence\s*$/.test(l));
355
92
  if (sectionStartIdx === -1) {
356
- const msg = 'No "Spec Convergence" section found — add one with "open_questions: 0", "ambiguities_remaining: 0", and "ready_for_build: yes" to declare the spec is agent-ready';
357
- const isHard = riskTier === 'medium' || riskTier === 'high';
358
- result.push(isHard ? issue(0, 'missing_convergence_section', msg) : advisoryIssue(0, 'missing_convergence_section', msg));
359
- return result;
93
+ return [issue(0, 'missing_convergence_section', 'No "Spec Convergence" section found — add one with "open_questions: 0", "ambiguities_remaining: 0", and "ready_for_build: yes"')];
360
94
  }
361
- // Determine section end: next heading at same or higher level (fewer #s), or EOF
362
95
  const headingLevel = (lines[sectionStartIdx].match(/^(#{1,6})/) ?? ['', '#'])[1].length;
363
96
  let sectionEndIdx = lines.length;
364
97
  for (let i = sectionStartIdx + 1; i < lines.length; i++) {
@@ -369,7 +102,6 @@ function convergenceIssues(content, lines, riskTier) {
369
102
  }
370
103
  }
371
104
  const sectionLines = lines.slice(sectionStartIdx, sectionEndIdx);
372
- // Check required integer fields — must be present and equal "0"
373
105
  const INTEGER_FIELDS = [
374
106
  { key: 'open_questions:', label: 'open_questions' },
375
107
  { key: 'ambiguities_remaining:', label: 'ambiguities_remaining' },
@@ -377,28 +109,73 @@ function convergenceIssues(content, lines, riskTier) {
377
109
  for (const { key, label } of INTEGER_FIELDS) {
378
110
  const lineIdx = sectionLines.findIndex(l => l.trim().toLowerCase().startsWith(key));
379
111
  if (lineIdx === -1) {
380
- result.push(issue(sectionStartIdx + 1, 'unresolved_convergence', `Spec Convergence section is missing required field "${label}:" — add it and set it to 0 when all issues are resolved`));
112
+ result.push(issue(sectionStartIdx + 1, 'unresolved_convergence', `Spec Convergence section is missing required field "${label}:" — set it to 0 when resolved`));
381
113
  continue;
382
114
  }
383
115
  const absLine = sectionStartIdx + lineIdx + 1;
384
- const colonPos = sectionLines[lineIdx].indexOf(':');
385
- const value = sectionLines[lineIdx].slice(colonPos + 1).trim();
116
+ const value = sectionLines[lineIdx].slice(sectionLines[lineIdx].indexOf(':') + 1).trim();
386
117
  if (value !== '0') {
387
118
  result.push(issue(absLine, 'unresolved_convergence', `"${label}" on line ${absLine} is "${value}" — must be 0 before handoff to builder`));
388
119
  }
389
120
  }
390
- // Check ready_for_build — explicit "no" is always a hard-fail
391
121
  const rfbLineIdx = sectionLines.findIndex(l => l.trim().toLowerCase().startsWith('ready_for_build:'));
392
122
  if (rfbLineIdx !== -1) {
393
123
  const absLine = sectionStartIdx + rfbLineIdx + 1;
394
- const colonPos = sectionLines[rfbLineIdx].indexOf(':');
395
- const value = sectionLines[rfbLineIdx].slice(colonPos + 1).trim().toLowerCase();
124
+ const value = sectionLines[rfbLineIdx].slice(sectionLines[rfbLineIdx].indexOf(':') + 1).trim().toLowerCase();
396
125
  if (value === 'no') {
397
126
  result.push(issue(absLine, 'unresolved_convergence', `"ready_for_build" on line ${absLine} is "no" — spec is explicitly declared not ready for build`));
398
127
  }
399
128
  }
400
129
  return result;
401
130
  }
131
+ function lintSpec(filePath) {
132
+ let content;
133
+ try {
134
+ content = fs.readFileSync(filePath, 'utf-8');
135
+ }
136
+ catch (err) {
137
+ throw new Error(`Cannot read spec at "${filePath}": ${err.message}`);
138
+ }
139
+ return lintContent(content);
140
+ }
141
+ function lintContent(content) {
142
+ const issues = [];
143
+ const lines = content.split('\n');
144
+ // ── Rule: blank_placeholder — hard fail when a required section has ___
145
+ for (let i = 0; i < lines.length; i++) {
146
+ if (BLANK_PLACEHOLDER_RE.test(lines[i])) {
147
+ issues.push(issue(i + 1, 'blank_placeholder', `Unfilled placeholder on line ${i + 1} — fill in or remove underscore runs of 3+`));
148
+ }
149
+ if (NHFI_RE.test(lines[i])) {
150
+ // Treat NHFI as a blank_placeholder variant (hard fail)
151
+ issues.push(issue(i + 1, 'blank_placeholder', `Unresolved [NEEDS HUMAN INPUT] flag on line ${i + 1}`));
152
+ }
153
+ }
154
+ // ── Rule: missing_marker — advisory: no nimai-spec marker found
155
+ if (!NIMAI_MARKER_RE.test(content)) {
156
+ issues.push(advisoryIssue(0, 'missing_marker', 'No <!-- nimai-spec --> marker found — add it so nimai can discover this spec (use tier=lite or tier=full)'));
157
+ }
158
+ // ── Determine tier from marker (bare marker = full for legacy compat)
159
+ const tier = (0, template_1.parseTierFromMarker)(content);
160
+ const requiredSections = tier === 'lite' ? LITE_REQUIRED_SECTIONS : FULL_REQUIRED_SECTIONS;
161
+ // ── Rule: missing_required_section — tier-aware; literal heading match
162
+ const headings = lines
163
+ .filter(l => /^#{1,6}\s+/.test(l))
164
+ .map(l => l.replace(/^#{1,6}\s+/, '').trim());
165
+ for (const section of requiredSections) {
166
+ if (!headings.includes(section)) {
167
+ issues.push(issue(0, 'missing_required_section', `Required section missing for ${tier}-tier spec: "## ${section}"`));
168
+ }
169
+ }
170
+ // ── Rule: pre_checked_ac — hard fail, scoped to AC and Task Decomposition sections
171
+ const preCheckedLines = findPreCheckedAcsInScope(lines);
172
+ for (const lineNum of preCheckedLines) {
173
+ issues.push(issue(lineNum, 'pre_checked_ac', `Pre-checked item on line ${lineNum} — acceptance criteria must be unchecked ([ ]) in a draft spec`));
174
+ }
175
+ // ── Rule: unresolved_convergence — hard fail when convergence section has issues
176
+ issues.push(...convergenceIssues(lines));
177
+ return issues;
178
+ }
402
179
  function issue(line, type, message) {
403
180
  return { line, type, message };
404
181
  }
package/dist/lint.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuGA,4BAQC;AAsBD,kCAmFC;AAxND,uCAAyB;AAGzB,mEAAmE;AACnE,MAAM,cAAc,GAAG,OAAO,CAAC;AAC/B,uCAAuC;AACvC,MAAM,OAAO,GAAG,sBAAsB,CAAC;AACvC,6DAA6D;AAC7D,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAC5C,uDAAuD;AACvD,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,6CAA6C;AAC7C,kFAAkF;AAClF,MAAM,mBAAmB,GAAG,sCAAsC,CAAC;AACnE,kEAAkE;AAClE,+DAA+D;AAC/D,yCAAyC;AACzC,MAAM,oBAAoB,GAAG,4IAA4I,CAAC;AAC1K,qFAAqF;AACrF,mGAAmG;AACnG,MAAM,mBAAmB,GAAG,qHAAqH,CAAC;AAClJ,MAAM,eAAe,GAAG,gBAAgB,CAAC;AACzC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AAEtD,iFAAiF;AACjF,SAAS,0BAA0B,CAAC,KAAe;IACjD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACrD,IAAI,YAAY,EAAE,CAAC;YACjB,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QACD,sFAAsF;QACtF,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QACD,2FAA2F;QAC3F,IAAI,UAAU,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,kEAAkE;AAClE,MAAM,iBAAiB,GAAG;IACxB,YAAY;IACZ,qBAAqB;IACrB,cAAc;IACd,eAAe;IACf,cAAc;IACd,yBAAyB;CAC1B,CAAC;AAEF,gEAAgE;AAChE,wFAAwF;AACxF,2FAA2F;AAC3F,6EAA6E;AAC7E,MAAM,cAAc,GAOd;IACJ;QACE,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC;QACnL,OAAO,EAAE,oHAAoH;QAC7H,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QACjC,UAAU,EAAE,IAAI;KACjB;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,QAAQ,EAAE,CAAC,oBAAoB,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,CAAC;QACtH,OAAO,EAAE,mFAAmF;KAC7F;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;QACtG,OAAO,EAAE,0FAA0F;QACnG,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;KAClC;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,QAAQ,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC;QACnH,OAAO,EAAE,+GAA+G;QACxH,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;KAClC;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,QAAQ,EAAE,CAAC,sBAAsB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,CAAC;QAC1I,OAAO,EAAE,uIAAuI;QAChJ,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QACjC,UAAU,EAAE,IAAI;QAChB,oBAAoB,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;KACzC;CACF,CAAC;AAEF,SAAgB,QAAQ,CAAC,QAAgB;IACvC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,MAAO,GAA6B,CAAC,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,6DAA6D;AAC7D,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iFAAiF;AACjF,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO,CACL,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACpC,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC3C,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,OAAe;IACzC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAEtB,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,gCAAgC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,+CAA+C,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACtD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,gBAAgB,EACzC,iCAAiC,OAAO,gEAAgE,CAAC,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,EAAE,8BAA8B,OAAO,GAAG,CAAC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,oFAAoF;IACpF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,gBAAgB,EAC3C,kHAAkH,CAAC,CAAC,CAAC;IACzH,CAAC;IAED,gFAAgF;IAChF,kEAAkE;IAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAC5D,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC;QAC5D,MAAM,GAAG,GAAG,gCAAgC,OAAO,8FAA8F,CAAC;QAClJ,MAAM,CAAC,IAAI,CAAC,MAAM;YAChB,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,CAAC;YAC7C,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,2DAA2D;IAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElE,4EAA4E;IAC5E,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE5D,2EAA2E;IAC3E,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhE,kEAAkE;IAClE,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,cAAc,GAClB,IAAI,CAAC,aAAa,KAAK,SAAS;gBAChC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC;YAE/B,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,kBAAkB,QAAQ,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;YAC/H,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAC7B,KAAe,EACf,QAA2C,EAC3C,MAAe;IAEf,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,kCAAkC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,oIAAoI,CAAC;QACjJ,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC,CAAC;QAChI,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;YAAC,MAAM,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IAC9D,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEnD,MAAM,eAAe,GAAwC;QAC3D,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE;QAC5D,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,EAAE;QAC1F,EAAE,KAAK,EAAE,kCAAkC,EAAE,IAAI,EAAE,CAAC,mCAAmC,EAAE,qCAAqC,CAAC,EAAE;QACjI,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,mBAAmB,CAAC,EAAE;QAC1D,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,8BAA8B,CAAC,EAAE;QAChF,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,sBAAsB,CAAC,EAAE;KACjE,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,gDAAgD,KAAK,CAAC,KAAK,IAAI,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,GAAG,CAAC,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC,CAAC;YACtJ,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3F,IAAI,CAAC,KAAK,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,4BAA4B,KAAK,CAAC,KAAK,aAAa,OAAO,wCAAwC,CAAC;YAChH,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9I,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,OAAe,EACf,KAAe,EACf,QAA2C;IAE3C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1F,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,gNAAgN,CAAC;QAC7N,MAAM,MAAM,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,4BAA4B,EAAE,GAAG,CAAC,CAAC,CAAC;QACxH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iFAAiF;IACjF,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxF,IAAI,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;YAAC,aAAa,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IACrE,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAEjE,2EAA2E;IAC3E,MAAM,eAAe,GAAqC;QACxD,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE;QACrD,EAAE,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,uBAAuB,EAAE;QACjE,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE;QAC/C,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE;KAClD,CAAC;IAEF,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,eAAe,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACpF,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,EAAE,2BAA2B,EAChE,yDAAyD,KAAK,sCAAsC,CAAC,CAAC,CAAC;YACzG,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,GAAG,OAAO,GAAG,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE/D,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,2BAA2B,EACpD,IAAI,KAAK,aAAa,OAAO,0DAA0D,CAAC,CAAC,CAAC;QAC9F,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB;YACnC,8DAA8D,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,2BAA2B,EACpD,6BAA6B,OAAO,yHAAyH,CAAC,CAAC,CAAC;QACpK,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CACtB,KAAe,EACf,QAA2C;IAE3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,+CAA+C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,IAAI,KAAK;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,GAAG,GAAG,wLAAwL,CAAC;IACrM,MAAM,MAAM,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC;IAC5D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC;AACtG,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,OAAe,EACf,KAAe,EACf,QAA2C;IAE3C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAExF,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,mKAAmK,CAAC;QAChL,MAAM,MAAM,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1H,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iFAAiF;IACjF,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxF,IAAI,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;YAAC,aAAa,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IACrE,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAEjE,gEAAgE;IAChE,MAAM,cAAc,GAAqC;QACvD,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE;QACnD,EAAE,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,uBAAuB,EAAE;KAClE,CAAC;IAEF,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,cAAc,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACpF,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,EAAE,wBAAwB,EAC7D,uDAAuD,KAAK,0DAA0D,CAAC,CAAC,CAAC;YAC3H,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,GAAG,OAAO,GAAG,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,EACjD,IAAI,KAAK,aAAa,OAAO,QAAQ,KAAK,yCAAyC,CAAC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACtG,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,eAAe,GAAG,UAAU,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,EACjD,6BAA6B,OAAO,4DAA4D,CAAC,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,IAAmB,EAAE,OAAe;IAC/D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,IAAmB,EAAE,OAAe;IACvE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"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"}