@cordiacode/core 0.1.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 (50) hide show
  1. package/LICENSE +201 -0
  2. package/dist/compiler/compiler.d.ts +28 -0
  3. package/dist/compiler/compiler.d.ts.map +1 -0
  4. package/dist/compiler/compiler.js +83 -0
  5. package/dist/compiler/compiler.js.map +1 -0
  6. package/dist/compiler/index.d.ts +2 -0
  7. package/dist/compiler/index.d.ts.map +1 -0
  8. package/dist/compiler/index.js +2 -0
  9. package/dist/compiler/index.js.map +1 -0
  10. package/dist/errors.d.ts +27 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +24 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +15 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +15 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/lexer/index.d.ts +3 -0
  19. package/dist/lexer/index.d.ts.map +1 -0
  20. package/dist/lexer/index.js +3 -0
  21. package/dist/lexer/index.js.map +1 -0
  22. package/dist/lexer/lexer.d.ts +22 -0
  23. package/dist/lexer/lexer.d.ts.map +1 -0
  24. package/dist/lexer/lexer.js +170 -0
  25. package/dist/lexer/lexer.js.map +1 -0
  26. package/dist/lexer/token.d.ts +78 -0
  27. package/dist/lexer/token.d.ts.map +1 -0
  28. package/dist/lexer/token.js +68 -0
  29. package/dist/lexer/token.js.map +1 -0
  30. package/dist/parser/ast.d.ts +59 -0
  31. package/dist/parser/ast.d.ts.map +1 -0
  32. package/dist/parser/ast.js +32 -0
  33. package/dist/parser/ast.js.map +1 -0
  34. package/dist/parser/index.d.ts +3 -0
  35. package/dist/parser/index.d.ts.map +1 -0
  36. package/dist/parser/index.js +3 -0
  37. package/dist/parser/index.js.map +1 -0
  38. package/dist/parser/parser.d.ts +30 -0
  39. package/dist/parser/parser.d.ts.map +1 -0
  40. package/dist/parser/parser.js +164 -0
  41. package/dist/parser/parser.js.map +1 -0
  42. package/dist/validator/index.d.ts +2 -0
  43. package/dist/validator/index.d.ts.map +1 -0
  44. package/dist/validator/index.js +2 -0
  45. package/dist/validator/index.js.map +1 -0
  46. package/dist/validator/validator.d.ts +41 -0
  47. package/dist/validator/validator.d.ts.map +1 -0
  48. package/dist/validator/validator.js +138 -0
  49. package/dist/validator/validator.js.map +1 -0
  50. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/lexer/lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Token kinds and the line-prefix table for VibeSpec.
3
+ *
4
+ * VibeSpec is line-oriented: the lexer emits (mostly) one token per logical
5
+ * line, classified by the line's leading symbol. The two multi-line constructs
6
+ * — context blocks and milestone blocks — are represented by paired
7
+ * open/close/text tokens so the parser (Phase 3) can assemble them.
8
+ *
9
+ * See `spec/grammar.md` §1 (symbol table) and §2 (lexical structure).
10
+ */
11
+ /** All token kinds produced by the lexer. */
12
+ export declare const TokenType: {
13
+ readonly Goal: "Goal";
14
+ readonly ContextOpen: "ContextOpen";
15
+ readonly ContextText: "ContextText";
16
+ readonly ContextClose: "ContextClose";
17
+ readonly Inspiration: "Inspiration";
18
+ readonly Stack: "Stack";
19
+ readonly Agent: "Agent";
20
+ readonly Feature: "Feature";
21
+ readonly Exclusion: "Exclusion";
22
+ readonly Requirement: "Requirement";
23
+ readonly Priority: "Priority";
24
+ readonly Rule: "Rule";
25
+ readonly File: "File";
26
+ readonly Test: "Test";
27
+ readonly Success: "Success";
28
+ readonly Deliverable: "Deliverable";
29
+ readonly MilestoneHeader: "MilestoneHeader";
30
+ readonly MilestoneBodyOpen: "MilestoneBodyOpen";
31
+ readonly MilestoneBodyClose: "MilestoneBodyClose";
32
+ readonly Question: "Question";
33
+ readonly DebugTask: "DebugTask";
34
+ readonly EOF: "EOF";
35
+ };
36
+ /** Union of all token kind string values. */
37
+ export type TokenType = (typeof TokenType)[keyof typeof TokenType];
38
+ /** A lexed token with its source position (1-based line/column). */
39
+ export interface Token {
40
+ /** The token kind. */
41
+ type: TokenType;
42
+ /**
43
+ * The token's payload after symbol stripping and trimming. For container
44
+ * forms (`<…>`, `[…]`, `(…)`) the delimiters are removed. For `ContextText`
45
+ * the original line is preserved verbatim. CSV/`->` splitting is the parser's
46
+ * job, not the lexer's.
47
+ */
48
+ value: string;
49
+ /** 1-based line number of the token's start. */
50
+ line: number;
51
+ /** 1-based column number of the token's start (first non-whitespace char). */
52
+ column: number;
53
+ /** The original, untrimmed source line the token came from. */
54
+ raw: string;
55
+ }
56
+ /**
57
+ * Single-character line prefixes that map directly to a token kind. Multi-char
58
+ * prefixes (`=>`, `>>`) and the container forms (`[]`, `<>`, `()`, `{}`) are
59
+ * handled explicitly in the lexer because of matching precedence.
60
+ */
61
+ export declare const SINGLE_CHAR_PREFIX: Readonly<Record<string, TokenType>>;
62
+ /** Machine-readable lexer error codes. */
63
+ export declare const LexErrorCode: {
64
+ readonly UnknownPrefix: "CORDIA_LEX_UNKNOWN_PREFIX";
65
+ readonly UnterminatedGoal: "CORDIA_LEX_UNTERMINATED_GOAL";
66
+ readonly UnterminatedStack: "CORDIA_LEX_UNTERMINATED_STACK";
67
+ readonly UnterminatedDebugTask: "CORDIA_LEX_UNTERMINATED_DEBUG_TASK";
68
+ readonly ContextBraceNotAlone: "CORDIA_LEX_CONTEXT_BRACE_NOT_ALONE";
69
+ readonly UnexpectedCloseBrace: "CORDIA_LEX_UNEXPECTED_CLOSE_BRACE";
70
+ readonly UnterminatedContext: "CORDIA_LEX_UNTERMINATED_CONTEXT";
71
+ readonly MilestoneMissingName: "CORDIA_LEX_MILESTONE_MISSING_NAME";
72
+ readonly MilestoneMissingBody: "CORDIA_LEX_MILESTONE_MISSING_BODY";
73
+ readonly MilestoneBadLine: "CORDIA_LEX_MILESTONE_BAD_LINE";
74
+ readonly UnterminatedMilestone: "CORDIA_LEX_UNTERMINATED_MILESTONE";
75
+ };
76
+ /** Union of all lexer error code string values. */
77
+ export type LexErrorCode = (typeof LexErrorCode)[keyof typeof LexErrorCode];
78
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/lexer/token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;CA4BZ,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,oEAAoE;AACpE,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAYlE,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,YAAY;;;;;;;;;;;;CAYf,CAAC;AAEX,mDAAmD;AACnD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Token kinds and the line-prefix table for VibeSpec.
3
+ *
4
+ * VibeSpec is line-oriented: the lexer emits (mostly) one token per logical
5
+ * line, classified by the line's leading symbol. The two multi-line constructs
6
+ * — context blocks and milestone blocks — are represented by paired
7
+ * open/close/text tokens so the parser (Phase 3) can assemble them.
8
+ *
9
+ * See `spec/grammar.md` §1 (symbol table) and §2 (lexical structure).
10
+ */
11
+ /** All token kinds produced by the lexer. */
12
+ export const TokenType = {
13
+ Goal: 'Goal',
14
+ ContextOpen: 'ContextOpen',
15
+ ContextText: 'ContextText',
16
+ ContextClose: 'ContextClose',
17
+ Inspiration: 'Inspiration',
18
+ Stack: 'Stack',
19
+ Agent: 'Agent',
20
+ Feature: 'Feature',
21
+ Exclusion: 'Exclusion',
22
+ Requirement: 'Requirement',
23
+ Priority: 'Priority',
24
+ Rule: 'Rule',
25
+ File: 'File',
26
+ Test: 'Test',
27
+ Success: 'Success',
28
+ Deliverable: 'Deliverable',
29
+ MilestoneHeader: 'MilestoneHeader',
30
+ MilestoneBodyOpen: 'MilestoneBodyOpen',
31
+ MilestoneBodyClose: 'MilestoneBodyClose',
32
+ Question: 'Question',
33
+ DebugTask: 'DebugTask',
34
+ EOF: 'EOF',
35
+ };
36
+ /**
37
+ * Single-character line prefixes that map directly to a token kind. Multi-char
38
+ * prefixes (`=>`, `>>`) and the container forms (`[]`, `<>`, `()`, `{}`) are
39
+ * handled explicitly in the lexer because of matching precedence.
40
+ */
41
+ export const SINGLE_CHAR_PREFIX = {
42
+ '~': TokenType.Inspiration,
43
+ $: TokenType.Agent,
44
+ '+': TokenType.Feature,
45
+ '-': TokenType.Exclusion,
46
+ '!': TokenType.Requirement,
47
+ '^': TokenType.Priority,
48
+ '&': TokenType.Rule,
49
+ '#': TokenType.File,
50
+ '%': TokenType.Test,
51
+ '=': TokenType.Success,
52
+ '?': TokenType.Question,
53
+ };
54
+ /** Machine-readable lexer error codes. */
55
+ export const LexErrorCode = {
56
+ UnknownPrefix: 'CORDIA_LEX_UNKNOWN_PREFIX',
57
+ UnterminatedGoal: 'CORDIA_LEX_UNTERMINATED_GOAL',
58
+ UnterminatedStack: 'CORDIA_LEX_UNTERMINATED_STACK',
59
+ UnterminatedDebugTask: 'CORDIA_LEX_UNTERMINATED_DEBUG_TASK',
60
+ ContextBraceNotAlone: 'CORDIA_LEX_CONTEXT_BRACE_NOT_ALONE',
61
+ UnexpectedCloseBrace: 'CORDIA_LEX_UNEXPECTED_CLOSE_BRACE',
62
+ UnterminatedContext: 'CORDIA_LEX_UNTERMINATED_CONTEXT',
63
+ MilestoneMissingName: 'CORDIA_LEX_MILESTONE_MISSING_NAME',
64
+ MilestoneMissingBody: 'CORDIA_LEX_MILESTONE_MISSING_BODY',
65
+ MilestoneBadLine: 'CORDIA_LEX_MILESTONE_BAD_LINE',
66
+ UnterminatedMilestone: 'CORDIA_LEX_UNTERMINATED_MILESTONE',
67
+ };
68
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/lexer/token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,MAAM;IAEZ,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,cAAc;IAE5B,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,aAAa;IAE1B,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IAExC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IAEtB,GAAG,EAAE,KAAK;CACF,CAAC;AAwBX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAwC;IACrE,GAAG,EAAE,SAAS,CAAC,WAAW;IAC1B,CAAC,EAAE,SAAS,CAAC,KAAK;IAClB,GAAG,EAAE,SAAS,CAAC,OAAO;IACtB,GAAG,EAAE,SAAS,CAAC,SAAS;IACxB,GAAG,EAAE,SAAS,CAAC,WAAW;IAC1B,GAAG,EAAE,SAAS,CAAC,QAAQ;IACvB,GAAG,EAAE,SAAS,CAAC,IAAI;IACnB,GAAG,EAAE,SAAS,CAAC,IAAI;IACnB,GAAG,EAAE,SAAS,CAAC,IAAI;IACnB,GAAG,EAAE,SAAS,CAAC,OAAO;IACtB,GAAG,EAAE,SAAS,CAAC,QAAQ;CACxB,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa,EAAE,2BAA2B;IAC1C,gBAAgB,EAAE,8BAA8B;IAChD,iBAAiB,EAAE,+BAA+B;IAClD,qBAAqB,EAAE,oCAAoC;IAC3D,oBAAoB,EAAE,oCAAoC;IAC1D,oBAAoB,EAAE,mCAAmC;IACzD,mBAAmB,EAAE,iCAAiC;IACtD,oBAAoB,EAAE,mCAAmC;IACzD,oBAAoB,EAAE,mCAAmC;IACzD,gBAAgB,EAAE,+BAA+B;IACjD,qBAAqB,EAAE,mCAAmC;CAClD,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * The VibeSpec Abstract Syntax Tree.
3
+ *
4
+ * The parser (Phase 3) turns the lexer's token stream into a {@link SpecAst}.
5
+ * The AST is intentionally **pre-validation**: it collects everything the source
6
+ * declared (e.g. all goals, even if there must be exactly one) and carries
7
+ * source positions on every node so the validator (Phase 4) can emit
8
+ * line-numbered diagnostics. The compiler (Phase 5) consumes a validated AST.
9
+ */
10
+ /** A node that knows where it came from (1-based line/column). */
11
+ export interface Positioned {
12
+ line: number;
13
+ column: number;
14
+ }
15
+ /** A single string-valued construct (feature, rule, goal, …). */
16
+ export interface ValueNode extends Positioned {
17
+ value: string;
18
+ }
19
+ /**
20
+ * A `% input -> expected` test. `value` is the raw payload; `input`/`expected`
21
+ * are the split halves (first `->`, each trimmed). When the source has no `->`,
22
+ * `input` holds the whole payload and `expected` is empty — the validator
23
+ * rejects that case.
24
+ */
25
+ export interface TestNode extends Positioned {
26
+ value: string;
27
+ input: string;
28
+ expected: string;
29
+ /** Whether a `->` separator was present in the source. */
30
+ hasArrow: boolean;
31
+ }
32
+ /** A `>> Name { + … }` milestone and its ordered feature list. */
33
+ export interface MilestoneNode extends Positioned {
34
+ name: string;
35
+ features: ValueNode[];
36
+ }
37
+ /** The full parsed spec. Every field is a list; cardinality is the validator's job. */
38
+ export interface SpecAst {
39
+ goals: ValueNode[];
40
+ context: ValueNode[];
41
+ inspirations: ValueNode[];
42
+ stack: ValueNode[];
43
+ agents: ValueNode[];
44
+ features: ValueNode[];
45
+ exclusions: ValueNode[];
46
+ requirements: ValueNode[];
47
+ priorities: ValueNode[];
48
+ rules: ValueNode[];
49
+ files: ValueNode[];
50
+ tests: TestNode[];
51
+ successCriteria: ValueNode[];
52
+ deliverables: ValueNode[];
53
+ milestones: MilestoneNode[];
54
+ questions: ValueNode[];
55
+ debugTasks: ValueNode[];
56
+ }
57
+ /** Create an empty {@link SpecAst} with all lists initialized. */
58
+ export declare function emptySpecAst(): SpecAst;
59
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/parser/ast.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iEAAiE;AACjE,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,uFAAuF;AACvF,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,kEAAkE;AAClE,wBAAgB,YAAY,IAAI,OAAO,CAoBtC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The VibeSpec Abstract Syntax Tree.
3
+ *
4
+ * The parser (Phase 3) turns the lexer's token stream into a {@link SpecAst}.
5
+ * The AST is intentionally **pre-validation**: it collects everything the source
6
+ * declared (e.g. all goals, even if there must be exactly one) and carries
7
+ * source positions on every node so the validator (Phase 4) can emit
8
+ * line-numbered diagnostics. The compiler (Phase 5) consumes a validated AST.
9
+ */
10
+ /** Create an empty {@link SpecAst} with all lists initialized. */
11
+ export function emptySpecAst() {
12
+ return {
13
+ goals: [],
14
+ context: [],
15
+ inspirations: [],
16
+ stack: [],
17
+ agents: [],
18
+ features: [],
19
+ exclusions: [],
20
+ requirements: [],
21
+ priorities: [],
22
+ rules: [],
23
+ files: [],
24
+ tests: [],
25
+ successCriteria: [],
26
+ deliverables: [],
27
+ milestones: [],
28
+ questions: [],
29
+ debugTasks: [],
30
+ };
31
+ }
32
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/parser/ast.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsDH,kEAAkE;AAClE,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;QACd,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,eAAe,EAAE,EAAE;QACnB,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './ast.js';
2
+ export * from './parser.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './ast.js';
2
+ export * from './parser.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { CordiaError } from '../errors.js';
2
+ import { type Token } from '../lexer/index.js';
3
+ import { type SpecAst } from './ast.js';
4
+ /** Machine-readable parser error codes. */
5
+ export declare const ParseErrorCode: {
6
+ readonly EmptyStackItem: "CORDIA_PARSE_EMPTY_STACK_ITEM";
7
+ readonly UnexpectedToken: "CORDIA_PARSE_UNEXPECTED_TOKEN";
8
+ };
9
+ /** Union of all parser error code string values. */
10
+ export type ParseErrorCode = (typeof ParseErrorCode)[keyof typeof ParseErrorCode];
11
+ /** The result of parsing: the AST plus any diagnostics gathered along the way. */
12
+ export interface ParseResult {
13
+ spec: SpecAst;
14
+ errors: CordiaError[];
15
+ }
16
+ /**
17
+ * Parse a lexed token stream into a {@link SpecAst}.
18
+ *
19
+ * Because the lexer has already grouped the multi-line constructs into
20
+ * open/text/close token sequences, the parser is a straightforward recursive
21
+ * descent over the stream: most tokens map 1:1 to a node, while context blocks
22
+ * and milestone bodies are assembled from their bracketing tokens.
23
+ */
24
+ export declare function parseTokens(tokens: Token[]): ParseResult;
25
+ /**
26
+ * Lex and parse VibeSpec source in one call. Lexer and parser diagnostics are
27
+ * concatenated (lexer errors first).
28
+ */
29
+ export declare function parse(source: string): ParseResult;
30
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,KAAK,EAAuB,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAEL,KAAK,OAAO,EAIb,MAAM,UAAU,CAAC;AAElB,2CAA2C;AAC3C,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAEX,oDAAoD;AACpD,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAElF,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AA+BD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAmHxD;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAIjD"}
@@ -0,0 +1,164 @@
1
+ import { TokenType, tokenize } from '../lexer/index.js';
2
+ import { emptySpecAst, } from './ast.js';
3
+ /** Machine-readable parser error codes. */
4
+ export const ParseErrorCode = {
5
+ EmptyStackItem: 'CORDIA_PARSE_EMPTY_STACK_ITEM',
6
+ UnexpectedToken: 'CORDIA_PARSE_UNEXPECTED_TOKEN',
7
+ };
8
+ /** Project a token onto a positioned value node. */
9
+ function valueOf(token) {
10
+ return { value: token.value, line: token.line, column: token.column };
11
+ }
12
+ /** Split a `% input -> expected` payload on its first `->`. */
13
+ function parseTest(token) {
14
+ const raw = token.value;
15
+ const idx = raw.indexOf('->');
16
+ if (idx < 0) {
17
+ return {
18
+ value: raw,
19
+ input: raw.trim(),
20
+ expected: '',
21
+ hasArrow: false,
22
+ line: token.line,
23
+ column: token.column,
24
+ };
25
+ }
26
+ return {
27
+ value: raw,
28
+ input: raw.slice(0, idx).trim(),
29
+ expected: raw.slice(idx + 2).trim(),
30
+ hasArrow: true,
31
+ line: token.line,
32
+ column: token.column,
33
+ };
34
+ }
35
+ /**
36
+ * Parse a lexed token stream into a {@link SpecAst}.
37
+ *
38
+ * Because the lexer has already grouped the multi-line constructs into
39
+ * open/text/close token sequences, the parser is a straightforward recursive
40
+ * descent over the stream: most tokens map 1:1 to a node, while context blocks
41
+ * and milestone bodies are assembled from their bracketing tokens.
42
+ */
43
+ export function parseTokens(tokens) {
44
+ const spec = emptySpecAst();
45
+ const errors = [];
46
+ let i = 0;
47
+ const fail = (code, message, token) => {
48
+ errors.push({ code, message, line: token.line, column: token.column });
49
+ };
50
+ while (i < tokens.length) {
51
+ const token = tokens[i];
52
+ if (token === undefined || token.type === TokenType.EOF)
53
+ break;
54
+ switch (token.type) {
55
+ case TokenType.Goal:
56
+ spec.goals.push(valueOf(token));
57
+ break;
58
+ case TokenType.Inspiration:
59
+ spec.inspirations.push(valueOf(token));
60
+ break;
61
+ case TokenType.Agent:
62
+ spec.agents.push(valueOf(token));
63
+ break;
64
+ case TokenType.Feature:
65
+ spec.features.push(valueOf(token));
66
+ break;
67
+ case TokenType.Exclusion:
68
+ spec.exclusions.push(valueOf(token));
69
+ break;
70
+ case TokenType.Requirement:
71
+ spec.requirements.push(valueOf(token));
72
+ break;
73
+ case TokenType.Priority:
74
+ spec.priorities.push(valueOf(token));
75
+ break;
76
+ case TokenType.Rule:
77
+ spec.rules.push(valueOf(token));
78
+ break;
79
+ case TokenType.File:
80
+ spec.files.push(valueOf(token));
81
+ break;
82
+ case TokenType.Success:
83
+ spec.successCriteria.push(valueOf(token));
84
+ break;
85
+ case TokenType.Deliverable:
86
+ spec.deliverables.push(valueOf(token));
87
+ break;
88
+ case TokenType.Question:
89
+ spec.questions.push(valueOf(token));
90
+ break;
91
+ case TokenType.DebugTask:
92
+ spec.debugTasks.push(valueOf(token));
93
+ break;
94
+ case TokenType.Test:
95
+ spec.tests.push(parseTest(token));
96
+ break;
97
+ case TokenType.Stack: {
98
+ // Split the raw `<a, b, c>` payload; empty items are a syntax error.
99
+ for (const part of token.value.split(',')) {
100
+ const value = part.trim();
101
+ if (value === '') {
102
+ fail(ParseErrorCode.EmptyStackItem, 'Empty tech-stack item', token);
103
+ continue;
104
+ }
105
+ spec.stack.push({ value, line: token.line, column: token.column });
106
+ }
107
+ break;
108
+ }
109
+ case TokenType.ContextOpen: {
110
+ // Collect verbatim text lines until the matching ContextClose.
111
+ const openLine = token.line;
112
+ const openColumn = token.column;
113
+ const lines = [];
114
+ i++;
115
+ while (i < tokens.length && tokens[i]?.type === TokenType.ContextText) {
116
+ lines.push(tokens[i]?.value ?? '');
117
+ i++;
118
+ }
119
+ // Consume the ContextClose if present (the lexer guarantees one unless EOF).
120
+ if (tokens[i]?.type === TokenType.ContextClose)
121
+ i++;
122
+ spec.context.push({ value: lines.join('\n').trim(), line: openLine, column: openColumn });
123
+ continue; // i already advanced past the block
124
+ }
125
+ case TokenType.MilestoneHeader: {
126
+ const milestone = {
127
+ name: token.value,
128
+ features: [],
129
+ line: token.line,
130
+ column: token.column,
131
+ };
132
+ i++;
133
+ if (tokens[i]?.type === TokenType.MilestoneBodyOpen)
134
+ i++;
135
+ while (i < tokens.length && tokens[i]?.type === TokenType.Feature) {
136
+ const feature = tokens[i];
137
+ if (feature !== undefined)
138
+ milestone.features.push(valueOf(feature));
139
+ i++;
140
+ }
141
+ if (tokens[i]?.type === TokenType.MilestoneBodyClose)
142
+ i++;
143
+ spec.milestones.push(milestone);
144
+ continue; // i already advanced past the block
145
+ }
146
+ default:
147
+ // The lexer should never surface a stray block-internal token here.
148
+ fail(ParseErrorCode.UnexpectedToken, `Unexpected token: ${token.type}`, token);
149
+ break;
150
+ }
151
+ i++;
152
+ }
153
+ return { spec, errors };
154
+ }
155
+ /**
156
+ * Lex and parse VibeSpec source in one call. Lexer and parser diagnostics are
157
+ * concatenated (lexer errors first).
158
+ */
159
+ export function parse(source) {
160
+ const lexed = tokenize(source);
161
+ const parsed = parseTokens(lexed.tokens);
162
+ return { spec: parsed.spec, errors: [...lexed.errors, ...parsed.errors] };
163
+ }
164
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './validator.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './validator.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { CordiaError } from '../errors.js';
2
+ import type { SpecAst } from '../parser/ast.js';
3
+ /** Machine-readable validator error codes. */
4
+ export declare const ValidationErrorCode: {
5
+ readonly MissingGoal: "CORDIA_VAL_MISSING_GOAL";
6
+ readonly MultipleGoals: "CORDIA_VAL_MULTIPLE_GOALS";
7
+ readonly EmptyValue: "CORDIA_VAL_EMPTY_VALUE";
8
+ readonly Duplicate: "CORDIA_VAL_DUPLICATE";
9
+ readonly DuplicateMilestone: "CORDIA_VAL_DUPLICATE_MILESTONE";
10
+ readonly TestMissingArrow: "CORDIA_VAL_TEST_MISSING_ARROW";
11
+ readonly TestEmptyInput: "CORDIA_VAL_TEST_EMPTY_INPUT";
12
+ readonly TestEmptyExpected: "CORDIA_VAL_TEST_EMPTY_EXPECTED";
13
+ };
14
+ /** Union of all validator error code string values. */
15
+ export type ValidationErrorCode = (typeof ValidationErrorCode)[keyof typeof ValidationErrorCode];
16
+ /** The result of validating an AST. */
17
+ export interface ValidationResult {
18
+ errors: CordiaError[];
19
+ }
20
+ /**
21
+ * Semantically validate a parsed {@link SpecAst}.
22
+ *
23
+ * Enforces the rules the grammar/schema cannot express on their own
24
+ * (`spec/ambiguities.md`): exactly one goal, no empty values, well-formed
25
+ * tests, and no duplicates in the lists where repetition is meaningless. Every
26
+ * diagnostic carries an error code and the offending node's line/column —
27
+ * "validation rejects, never guesses."
28
+ */
29
+ export declare function validate(spec: SpecAst): ValidationResult;
30
+ /** The combined front-end result: the AST plus all diagnostics. */
31
+ export interface AnalyzeResult {
32
+ spec: SpecAst;
33
+ errors: CordiaError[];
34
+ }
35
+ /**
36
+ * Lex, parse, and validate VibeSpec source in one call. Diagnostics are
37
+ * concatenated in pipeline order (lexer → parser → validator). This is the
38
+ * entry point the CLI's `bloom validate` will use.
39
+ */
40
+ export declare function analyze(source: string): AnalyzeResult;
41
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/validator/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAc,OAAO,EAAa,MAAM,kBAAkB,CAAC;AAEvE,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB;;;;;;;;;CAStB,CAAC;AAEX,uDAAuD;AACvD,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjG,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CA6GxD;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAIrD"}