@jamesaphoenix/tx-core 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -360
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/doc-service-impl.d.ts +2 -2
- package/dist/internal/doc-service-impl.d.ts.map +1 -1
- package/dist/internal/doc-service-impl.js +340 -268
- package/dist/internal/doc-service-impl.js.map +1 -1
- package/dist/internal/spec-trace-service-impl.d.ts +7 -0
- package/dist/internal/spec-trace-service-impl.d.ts.map +1 -1
- package/dist/internal/spec-trace-service-impl.js +25 -0
- package/dist/internal/spec-trace-service-impl.js.map +1 -1
- package/dist/internal/sync/service-impl.d.ts.map +1 -1
- package/dist/internal/sync/service-impl.js +20 -1
- package/dist/internal/sync/service-impl.js.map +1 -1
- package/dist/mappers/task.js +4 -4
- package/dist/mappers/task.js.map +1 -1
- package/dist/migrations-embedded.d.ts.map +1 -1
- package/dist/migrations-embedded.js +11 -1
- package/dist/migrations-embedded.js.map +1 -1
- package/dist/repo/claim-repo.d.ts +6 -0
- package/dist/repo/claim-repo.d.ts.map +1 -1
- package/dist/repo/claim-repo.js +51 -0
- package/dist/repo/claim-repo.js.map +1 -1
- package/dist/repo/task-repo/read.d.ts.map +1 -1
- package/dist/repo/task-repo/read.js +6 -5
- package/dist/repo/task-repo/read.js.map +1 -1
- package/dist/schemas/sync.d.ts +10 -10
- package/dist/schemas/sync.d.ts.map +1 -1
- package/dist/services/claim-service.d.ts +5 -0
- package/dist/services/claim-service.d.ts.map +1 -1
- package/dist/services/claim-service.js +3 -0
- package/dist/services/claim-service.js.map +1 -1
- package/dist/services/ready-service.d.ts.map +1 -1
- package/dist/services/ready-service.js +48 -7
- package/dist/services/ready-service.js.map +1 -1
- package/dist/services/swarm-verification.d.ts +1 -1
- package/dist/services/swarm-verification.js +1 -1
- package/dist/services/task-service/internals.d.ts +18 -1
- package/dist/services/task-service/internals.d.ts.map +1 -1
- package/dist/services/task-service/internals.js +61 -2
- package/dist/services/task-service/internals.js.map +1 -1
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +12 -5
- package/dist/services/task-service.js.map +1 -1
- package/dist/sync/claude-task-writer.js +1 -1
- package/dist/sync/claude-task-writer.js.map +1 -1
- package/dist/utils/doc-renderer.d.ts.map +1 -1
- package/dist/utils/doc-renderer.js +306 -61
- package/dist/utils/doc-renderer.js.map +1 -1
- package/dist/utils/ears-validator.d.ts.map +1 -1
- package/dist/utils/ears-validator.js +128 -14
- package/dist/utils/ears-validator.js.map +1 -1
- package/dist/utils/md-doc-parser.d.ts +15 -0
- package/dist/utils/md-doc-parser.d.ts.map +1 -0
- package/dist/utils/md-doc-parser.js +275 -0
- package/dist/utils/md-doc-parser.js.map +1 -0
- package/dist/utils/toml-config.d.ts +34 -0
- package/dist/utils/toml-config.d.ts.map +1 -1
- package/dist/utils/toml-config.js +177 -6
- package/dist/utils/toml-config.js.map +1 -1
- package/migrations/001_initial.sql +2 -1
- package/migrations/039_needs_review_status.sql +108 -0
- package/migrations/040_cycles.sql +33 -0
- package/package.json +1 -1
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { EARS_PATTERNS } from "@jamesaphoenix/tx-types";
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
1
|
+
import { EARS_PATTERNS, MD_EARS_PRIORITIES, MD_EARS_REQUIREMENT_KINDS, } from "@jamesaphoenix/tx-types";
|
|
2
|
+
const LEGACY_EARS_ID_PATTERN = /^EARS-[A-Z0-9]+-\d{3}$/;
|
|
3
|
+
const MARKDOWN_EARS_ID_PATTERN = /^REQ-[A-Z0-9-]+$/;
|
|
4
|
+
const LEGACY_EARS_PRIORITIES = ["must", "should", "could", "wont"];
|
|
5
|
+
const validLegacyPatternSet = new Set(EARS_PATTERNS);
|
|
6
|
+
const validLegacyPrioritySet = new Set(LEGACY_EARS_PRIORITIES);
|
|
7
|
+
const validMarkdownKindSet = new Set(MD_EARS_REQUIREMENT_KINDS);
|
|
8
|
+
const validMarkdownPrioritySet = new Set(MD_EARS_PRIORITIES);
|
|
6
9
|
const asRecord = (value) => {
|
|
7
10
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
8
11
|
return null;
|
|
@@ -27,6 +30,20 @@ const requiredPatternField = (pattern) => {
|
|
|
27
30
|
return null;
|
|
28
31
|
}
|
|
29
32
|
};
|
|
33
|
+
const requiredMarkdownClause = (kind) => {
|
|
34
|
+
switch (kind) {
|
|
35
|
+
case "event-driven":
|
|
36
|
+
return "when";
|
|
37
|
+
case "state-driven":
|
|
38
|
+
return "while";
|
|
39
|
+
case "unwanted":
|
|
40
|
+
return "if";
|
|
41
|
+
case "optional":
|
|
42
|
+
return "where";
|
|
43
|
+
default:
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
30
47
|
export const validateEarsRequirements = (requirements) => {
|
|
31
48
|
const errors = [];
|
|
32
49
|
const seenIds = new Set();
|
|
@@ -43,10 +60,14 @@ export const validateEarsRequirements = (requirements) => {
|
|
|
43
60
|
return;
|
|
44
61
|
}
|
|
45
62
|
const id = pickString(req, "id");
|
|
63
|
+
const statementRaw = req.statement;
|
|
64
|
+
const statement = typeof statementRaw === "string" ? statementRaw.trim() : null;
|
|
65
|
+
const kind = pickString(req, "kind");
|
|
46
66
|
const pattern = pickString(req, "pattern");
|
|
47
67
|
const system = pickString(req, "system");
|
|
48
68
|
const response = pickString(req, "response");
|
|
49
69
|
const priority = pickString(req, "priority");
|
|
70
|
+
const isMarkdownFormat = kind !== null || (id !== null && id.startsWith("REQ-"));
|
|
50
71
|
if (!id) {
|
|
51
72
|
errors.push({
|
|
52
73
|
index,
|
|
@@ -57,13 +78,17 @@ export const validateEarsRequirements = (requirements) => {
|
|
|
57
78
|
});
|
|
58
79
|
}
|
|
59
80
|
else {
|
|
60
|
-
|
|
81
|
+
const idPattern = isMarkdownFormat ? MARKDOWN_EARS_ID_PATTERN : LEGACY_EARS_ID_PATTERN;
|
|
82
|
+
const idFormatMessage = isMarkdownFormat
|
|
83
|
+
? "Field 'id' must match REQ-<SCOPE>-<NNN> (e.g. REQ-DOCS-001)."
|
|
84
|
+
: "Field 'id' must match EARS-<SYSTEM>-NNN (e.g. EARS-FL-001).";
|
|
85
|
+
if (!idPattern.test(id)) {
|
|
61
86
|
errors.push({
|
|
62
87
|
index,
|
|
63
88
|
id,
|
|
64
89
|
field: "id",
|
|
65
90
|
code: "invalid_format",
|
|
66
|
-
message:
|
|
91
|
+
message: idFormatMessage,
|
|
67
92
|
});
|
|
68
93
|
}
|
|
69
94
|
if (seenIds.has(id)) {
|
|
@@ -79,6 +104,97 @@ export const validateEarsRequirements = (requirements) => {
|
|
|
79
104
|
seenIds.add(id);
|
|
80
105
|
}
|
|
81
106
|
}
|
|
107
|
+
if (isMarkdownFormat) {
|
|
108
|
+
if (!kind) {
|
|
109
|
+
errors.push({
|
|
110
|
+
index,
|
|
111
|
+
id,
|
|
112
|
+
field: "kind",
|
|
113
|
+
code: "missing_required",
|
|
114
|
+
message: "Field 'kind' is required.",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
else if (!validMarkdownKindSet.has(kind)) {
|
|
118
|
+
errors.push({
|
|
119
|
+
index,
|
|
120
|
+
id,
|
|
121
|
+
field: "kind",
|
|
122
|
+
code: "invalid_value",
|
|
123
|
+
message: `Invalid EARS kind '${kind}'. Valid kinds: ${MD_EARS_REQUIREMENT_KINDS.join(", ")}.`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (!statement) {
|
|
127
|
+
errors.push({
|
|
128
|
+
index,
|
|
129
|
+
id,
|
|
130
|
+
field: "statement",
|
|
131
|
+
code: "missing_required",
|
|
132
|
+
message: "Field 'statement' is required.",
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (!priority) {
|
|
136
|
+
errors.push({
|
|
137
|
+
index,
|
|
138
|
+
id,
|
|
139
|
+
field: "priority",
|
|
140
|
+
code: "missing_required",
|
|
141
|
+
message: "Field 'priority' is required.",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else if (!validMarkdownPrioritySet.has(priority)) {
|
|
145
|
+
errors.push({
|
|
146
|
+
index,
|
|
147
|
+
id,
|
|
148
|
+
field: "priority",
|
|
149
|
+
code: "invalid_value",
|
|
150
|
+
message: `Invalid priority '${priority}'. Valid priorities: ${MD_EARS_PRIORITIES.join(", ")}.`,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (kind && validMarkdownKindSet.has(kind)) {
|
|
154
|
+
const clauseField = requiredMarkdownClause(kind);
|
|
155
|
+
if (clauseField) {
|
|
156
|
+
const clauseValue = pickString(req, clauseField);
|
|
157
|
+
if (!clauseValue) {
|
|
158
|
+
errors.push({
|
|
159
|
+
index,
|
|
160
|
+
id,
|
|
161
|
+
field: clauseField,
|
|
162
|
+
code: "missing_required",
|
|
163
|
+
message: `Kind '${kind}' requires field '${clauseField}'.`,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (kind === "complex") {
|
|
168
|
+
const hasClause = Boolean(pickString(req, "when")) ||
|
|
169
|
+
Boolean(pickString(req, "while")) ||
|
|
170
|
+
Boolean(pickString(req, "if")) ||
|
|
171
|
+
Boolean(pickString(req, "where"));
|
|
172
|
+
if (!hasClause) {
|
|
173
|
+
errors.push({
|
|
174
|
+
index,
|
|
175
|
+
id,
|
|
176
|
+
field: "kind",
|
|
177
|
+
code: "missing_required",
|
|
178
|
+
message: "Kind 'complex' requires at least one clause: when, while, if, or where.",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const isLegacyStatementFormat = typeof statementRaw === "string";
|
|
186
|
+
if (isLegacyStatementFormat) {
|
|
187
|
+
if (!statement) {
|
|
188
|
+
errors.push({
|
|
189
|
+
index,
|
|
190
|
+
id,
|
|
191
|
+
field: "statement",
|
|
192
|
+
code: "missing_required",
|
|
193
|
+
message: "Field 'statement' is required.",
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
82
198
|
if (!pattern) {
|
|
83
199
|
errors.push({
|
|
84
200
|
index,
|
|
@@ -88,7 +204,7 @@ export const validateEarsRequirements = (requirements) => {
|
|
|
88
204
|
message: "Field 'pattern' is required.",
|
|
89
205
|
});
|
|
90
206
|
}
|
|
91
|
-
else if (!
|
|
207
|
+
else if (!validLegacyPatternSet.has(pattern)) {
|
|
92
208
|
errors.push({
|
|
93
209
|
index,
|
|
94
210
|
id,
|
|
@@ -115,16 +231,16 @@ export const validateEarsRequirements = (requirements) => {
|
|
|
115
231
|
message: "Field 'response' is required.",
|
|
116
232
|
});
|
|
117
233
|
}
|
|
118
|
-
if (priority && !
|
|
234
|
+
if (priority && !validLegacyPrioritySet.has(priority)) {
|
|
119
235
|
errors.push({
|
|
120
236
|
index,
|
|
121
237
|
id,
|
|
122
238
|
field: "priority",
|
|
123
239
|
code: "invalid_value",
|
|
124
|
-
message: `Invalid priority '${priority}'. Valid priorities: ${
|
|
240
|
+
message: `Invalid priority '${priority}'. Valid priorities: ${LEGACY_EARS_PRIORITIES.join(", ")}.`,
|
|
125
241
|
});
|
|
126
242
|
}
|
|
127
|
-
if (pattern &&
|
|
243
|
+
if (pattern && validLegacyPatternSet.has(pattern)) {
|
|
128
244
|
const requiredField = requiredPatternField(pattern);
|
|
129
245
|
if (requiredField) {
|
|
130
246
|
const requiredValue = pickString(req, requiredField);
|
|
@@ -160,9 +276,7 @@ export const validateEarsRequirements = (requirements) => {
|
|
|
160
276
|
export const formatEarsValidationErrors = (errors) => {
|
|
161
277
|
return errors
|
|
162
278
|
.map((error) => {
|
|
163
|
-
const location = error.id
|
|
164
|
-
? `${error.id}`
|
|
165
|
-
: `entry #${error.index + 1}`;
|
|
279
|
+
const location = error.id ? `${error.id}` : `entry #${error.index + 1}`;
|
|
166
280
|
return `${location} (${error.field}): ${error.message}`;
|
|
167
281
|
})
|
|
168
282
|
.join("; ");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ears-validator.js","sourceRoot":"","sources":["../../src/utils/ears-validator.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ears-validator.js","sourceRoot":"","sources":["../../src/utils/ears-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Effect, Either } from "effect";
|
|
2
|
+
import { type MdParsedDoc } from "@jamesaphoenix/tx-types";
|
|
3
|
+
type ParseEither<A> = Either.Either<A, MdDocParseError>;
|
|
4
|
+
declare const MdDocParseError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
5
|
+
readonly _tag: "MdDocParseError";
|
|
6
|
+
} & Readonly<A>;
|
|
7
|
+
export declare class MdDocParseError extends MdDocParseError_base<{
|
|
8
|
+
readonly reason: string;
|
|
9
|
+
}> {
|
|
10
|
+
get message(): string;
|
|
11
|
+
}
|
|
12
|
+
export declare const parseMdDocSync: (content: string) => ParseEither<MdParsedDoc>;
|
|
13
|
+
export declare const parseMdDoc: (content: string) => Effect.Effect<MdParsedDoc, MdDocParseError>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=md-doc-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md-doc-parser.d.ts","sourceRoot":"","sources":["../../src/utils/md-doc-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAErD,OAAO,EAcL,KAAK,WAAW,EAEjB,MAAM,yBAAyB,CAAA;AAiBhC,KAAK,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;;;;AAEvD,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;AAqUD,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,WAAW,CAAC,WAAW,CAyDvE,CAAA;AAED,eAAO,MAAM,UAAU,GACrB,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,CAK5C,CAAA"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { Data, Effect, Either, Schema } from "effect";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
import { MD_REQUIRED_SECTIONS_BY_SPEC_TYPE, MdAcceptanceCriterionSchema, MdEmbeddedBlocksSchema, MdEarsRequirementSchema, MdFailureModeSchema, MdFrontmatterSchema, MdInterfaceSchema, MdInvariantSchema, MdParsedDocSchema, MdSectionSchema, MdVerificationSchema, } from "@jamesaphoenix/tx-types";
|
|
4
|
+
import { formatEarsValidationErrors, validateEarsRequirements } from "./ears-validator.js";
|
|
5
|
+
const EMBEDDED_BLOCK_SCHEMAS = {
|
|
6
|
+
ears_requirements: Schema.Array(MdEarsRequirementSchema),
|
|
7
|
+
invariants: Schema.Array(MdInvariantSchema),
|
|
8
|
+
verification: Schema.Array(MdVerificationSchema),
|
|
9
|
+
interfaces: Schema.Array(MdInterfaceSchema),
|
|
10
|
+
failure_modes: Schema.Array(MdFailureModeSchema),
|
|
11
|
+
acceptance_criteria: Schema.Array(MdAcceptanceCriterionSchema),
|
|
12
|
+
};
|
|
13
|
+
const EMBEDDED_BLOCK_KEYS = new Set(Object.keys(EMBEDDED_BLOCK_SCHEMAS));
|
|
14
|
+
export class MdDocParseError extends Data.TaggedError("MdDocParseError") {
|
|
15
|
+
get message() {
|
|
16
|
+
return this.reason;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const asRecord = (value) => {
|
|
20
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
const formatDecodeError = (error) => {
|
|
26
|
+
if (typeof error === "object" && error !== null && "message" in error) {
|
|
27
|
+
const message = error.message;
|
|
28
|
+
if (typeof message === "string") {
|
|
29
|
+
return message;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return String(error);
|
|
33
|
+
};
|
|
34
|
+
const decodeUnknown = (schema, input, context) => {
|
|
35
|
+
try {
|
|
36
|
+
return Either.right(Schema.decodeUnknownSync(schema)(input));
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return Either.left(new MdDocParseError({ reason: `${context}: ${formatDecodeError(error)}` }));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const splitFrontmatter = (content) => {
|
|
43
|
+
const cleaned = content.startsWith("\uFEFF") ? content.slice(1) : content;
|
|
44
|
+
const hasFrontmatterOpen = cleaned.startsWith("---\n") || cleaned.startsWith("---\r\n");
|
|
45
|
+
if (!hasFrontmatterOpen) {
|
|
46
|
+
return Either.left(new MdDocParseError({ reason: "Document must start with YAML frontmatter delimiter '---'." }));
|
|
47
|
+
}
|
|
48
|
+
const openLength = cleaned.startsWith("---\r\n") ? 5 : 4;
|
|
49
|
+
const rest = cleaned.slice(openLength);
|
|
50
|
+
const lines = rest.split(/\r?\n/);
|
|
51
|
+
const closingIndex = lines.findIndex((line) => line.trimEnd() === "---");
|
|
52
|
+
if (closingIndex === -1) {
|
|
53
|
+
return Either.left(new MdDocParseError({ reason: "Frontmatter opening delimiter found, but closing '---' delimiter is missing." }));
|
|
54
|
+
}
|
|
55
|
+
const frontmatter = lines.slice(0, closingIndex).join("\n");
|
|
56
|
+
const body = lines.slice(closingIndex + 1).join("\n");
|
|
57
|
+
return Either.right({ frontmatter, body });
|
|
58
|
+
};
|
|
59
|
+
const parseYamlRecord = (yamlContent, context) => {
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = parseYaml(yamlContent);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return Either.left(new MdDocParseError({ reason: `${context}: YAML parse error: ${String(error)}` }));
|
|
66
|
+
}
|
|
67
|
+
const record = asRecord(parsed);
|
|
68
|
+
if (!record) {
|
|
69
|
+
return Either.left(new MdDocParseError({ reason: `${context}: expected YAML object at top level.` }));
|
|
70
|
+
}
|
|
71
|
+
return Either.right(record);
|
|
72
|
+
};
|
|
73
|
+
const extractYamlBlocks = (body) => {
|
|
74
|
+
const lines = body.split(/\r?\n/);
|
|
75
|
+
const blocks = [];
|
|
76
|
+
let inFence = false;
|
|
77
|
+
let isYamlFence = false;
|
|
78
|
+
let fenceBuffer = [];
|
|
79
|
+
for (const line of lines) {
|
|
80
|
+
const fenceMatch = line.match(/^\s*```([^\s`]*)?\s*$/);
|
|
81
|
+
if (!inFence) {
|
|
82
|
+
if (fenceMatch) {
|
|
83
|
+
inFence = true;
|
|
84
|
+
const language = (fenceMatch[1] ?? "").toLowerCase();
|
|
85
|
+
isYamlFence = language === "yaml" || language === "yml";
|
|
86
|
+
fenceBuffer = [];
|
|
87
|
+
}
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (fenceMatch) {
|
|
91
|
+
if (isYamlFence) {
|
|
92
|
+
blocks.push(fenceBuffer.join("\n"));
|
|
93
|
+
}
|
|
94
|
+
inFence = false;
|
|
95
|
+
isYamlFence = false;
|
|
96
|
+
fenceBuffer = [];
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (isYamlFence) {
|
|
100
|
+
fenceBuffer.push(line);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (inFence && isYamlFence) {
|
|
104
|
+
return Either.left(new MdDocParseError({ reason: "Unclosed fenced YAML block detected." }));
|
|
105
|
+
}
|
|
106
|
+
return Either.right(blocks);
|
|
107
|
+
};
|
|
108
|
+
const mergeEmbeddedBlock = (accumulator, key, entries) => {
|
|
109
|
+
const existing = accumulator[key] ?? [];
|
|
110
|
+
accumulator[key] = [...existing, ...entries];
|
|
111
|
+
};
|
|
112
|
+
const decodeEmbeddedBlockEntries = (key, value) => {
|
|
113
|
+
switch (key) {
|
|
114
|
+
case "ears_requirements":
|
|
115
|
+
return decodeUnknown(Schema.Array(MdEarsRequirementSchema), value, "Embedded block 'ears_requirements' validation failed");
|
|
116
|
+
case "invariants":
|
|
117
|
+
return decodeUnknown(Schema.Array(MdInvariantSchema), value, "Embedded block 'invariants' validation failed");
|
|
118
|
+
case "verification":
|
|
119
|
+
return decodeUnknown(Schema.Array(MdVerificationSchema), value, "Embedded block 'verification' validation failed");
|
|
120
|
+
case "interfaces":
|
|
121
|
+
return decodeUnknown(Schema.Array(MdInterfaceSchema), value, "Embedded block 'interfaces' validation failed");
|
|
122
|
+
case "failure_modes":
|
|
123
|
+
return decodeUnknown(Schema.Array(MdFailureModeSchema), value, "Embedded block 'failure_modes' validation failed");
|
|
124
|
+
case "acceptance_criteria":
|
|
125
|
+
return decodeUnknown(Schema.Array(MdAcceptanceCriterionSchema), value, "Embedded block 'acceptance_criteria' validation failed");
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const parseEmbeddedBlocks = (body) => {
|
|
129
|
+
const yamlBlocksResult = extractYamlBlocks(body);
|
|
130
|
+
if (Either.isLeft(yamlBlocksResult)) {
|
|
131
|
+
return Either.left(yamlBlocksResult.left);
|
|
132
|
+
}
|
|
133
|
+
const mergedBlocks = {};
|
|
134
|
+
for (const rawBlock of yamlBlocksResult.right) {
|
|
135
|
+
const parsedBlockResult = parseYamlRecord(rawBlock, "Embedded YAML block");
|
|
136
|
+
if (Either.isLeft(parsedBlockResult)) {
|
|
137
|
+
return Either.left(parsedBlockResult.left);
|
|
138
|
+
}
|
|
139
|
+
for (const [key, value] of Object.entries(parsedBlockResult.right)) {
|
|
140
|
+
if (!EMBEDDED_BLOCK_KEYS.has(key)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const typedKey = key;
|
|
144
|
+
const decodedEntriesResult = decodeEmbeddedBlockEntries(typedKey, value);
|
|
145
|
+
if (Either.isLeft(decodedEntriesResult)) {
|
|
146
|
+
return Either.left(decodedEntriesResult.left);
|
|
147
|
+
}
|
|
148
|
+
if (typedKey === "ears_requirements") {
|
|
149
|
+
const earsValidationErrors = validateEarsRequirements(decodedEntriesResult.right);
|
|
150
|
+
if (earsValidationErrors.length > 0) {
|
|
151
|
+
return Either.left(new MdDocParseError({
|
|
152
|
+
reason: `Embedded block 'ears_requirements' semantic validation failed: ${formatEarsValidationErrors(earsValidationErrors)}`,
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
mergeEmbeddedBlock(mergedBlocks, typedKey, decodedEntriesResult.right);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return decodeUnknown(MdEmbeddedBlocksSchema, mergedBlocks, "Embedded blocks validation failed");
|
|
160
|
+
};
|
|
161
|
+
const extractSections = (body) => {
|
|
162
|
+
const lines = body.split(/\r?\n/);
|
|
163
|
+
const sections = [];
|
|
164
|
+
let inFence = false;
|
|
165
|
+
let currentHeading = null;
|
|
166
|
+
let sectionBodyLines = [];
|
|
167
|
+
const flushSection = () => {
|
|
168
|
+
if (currentHeading === null) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
sections.push({
|
|
172
|
+
heading: currentHeading,
|
|
173
|
+
body: sectionBodyLines.join("\n").trim(),
|
|
174
|
+
});
|
|
175
|
+
currentHeading = null;
|
|
176
|
+
sectionBodyLines = [];
|
|
177
|
+
};
|
|
178
|
+
for (const line of lines) {
|
|
179
|
+
if (/^\s*```/.test(line)) {
|
|
180
|
+
inFence = !inFence;
|
|
181
|
+
if (currentHeading !== null) {
|
|
182
|
+
sectionBodyLines.push(line);
|
|
183
|
+
}
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (!inFence) {
|
|
187
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+?)\s*$/);
|
|
188
|
+
if (headingMatch) {
|
|
189
|
+
flushSection();
|
|
190
|
+
currentHeading = headingMatch[2].replace(/\s+#+\s*$/, "").trim();
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (currentHeading !== null) {
|
|
195
|
+
sectionBodyLines.push(line);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
flushSection();
|
|
199
|
+
return decodeUnknown(Schema.Array(MdSectionSchema), sections, "Section extraction validation failed");
|
|
200
|
+
};
|
|
201
|
+
const normalizeHeading = (heading) => heading.trim().toLowerCase();
|
|
202
|
+
const validateRequiredSections = (frontmatter, sections) => {
|
|
203
|
+
const requiredSections = MD_REQUIRED_SECTIONS_BY_SPEC_TYPE[frontmatter.spec_type];
|
|
204
|
+
const present = new Set(sections.map((section) => normalizeHeading(section.heading)));
|
|
205
|
+
const missing = requiredSections.filter((requiredHeading) => !present.has(normalizeHeading(requiredHeading)));
|
|
206
|
+
if (missing.length > 0) {
|
|
207
|
+
return Either.left(new MdDocParseError({
|
|
208
|
+
reason: `Missing required section(s) for spec_type '${frontmatter.spec_type}': ${missing.join(", ")}`,
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
return Either.right(undefined);
|
|
212
|
+
};
|
|
213
|
+
const parseFrontmatterByKind = (rawFrontmatter) => {
|
|
214
|
+
const kind = rawFrontmatter.kind;
|
|
215
|
+
if (kind === "spec") {
|
|
216
|
+
const decodedFrontmatter = decodeUnknown(MdFrontmatterSchema, rawFrontmatter, "Frontmatter validation failed");
|
|
217
|
+
if (Either.isLeft(decodedFrontmatter)) {
|
|
218
|
+
return Either.left(decodedFrontmatter.left);
|
|
219
|
+
}
|
|
220
|
+
return Either.right({ kind: "spec", frontmatter: decodedFrontmatter.right });
|
|
221
|
+
}
|
|
222
|
+
if (kind === "task") {
|
|
223
|
+
return Either.right({ kind: "task", frontmatter: rawFrontmatter });
|
|
224
|
+
}
|
|
225
|
+
return Either.left(new MdDocParseError({
|
|
226
|
+
reason: "Frontmatter 'kind' must be either 'spec' or 'task'.",
|
|
227
|
+
}));
|
|
228
|
+
};
|
|
229
|
+
export const parseMdDocSync = (content) => {
|
|
230
|
+
const frontmatterSplit = splitFrontmatter(content);
|
|
231
|
+
if (Either.isLeft(frontmatterSplit)) {
|
|
232
|
+
return Either.left(frontmatterSplit.left);
|
|
233
|
+
}
|
|
234
|
+
const rawFrontmatterResult = parseYamlRecord(frontmatterSplit.right.frontmatter, "Frontmatter");
|
|
235
|
+
if (Either.isLeft(rawFrontmatterResult)) {
|
|
236
|
+
return Either.left(rawFrontmatterResult.left);
|
|
237
|
+
}
|
|
238
|
+
const parsedFrontmatterResult = parseFrontmatterByKind(rawFrontmatterResult.right);
|
|
239
|
+
if (Either.isLeft(parsedFrontmatterResult)) {
|
|
240
|
+
return Either.left(parsedFrontmatterResult.left);
|
|
241
|
+
}
|
|
242
|
+
const sectionsResult = extractSections(frontmatterSplit.right.body);
|
|
243
|
+
if (Either.isLeft(sectionsResult)) {
|
|
244
|
+
return Either.left(sectionsResult.left);
|
|
245
|
+
}
|
|
246
|
+
const blocksResult = parseEmbeddedBlocks(frontmatterSplit.right.body);
|
|
247
|
+
if (Either.isLeft(blocksResult)) {
|
|
248
|
+
return Either.left(blocksResult.left);
|
|
249
|
+
}
|
|
250
|
+
if (parsedFrontmatterResult.right.kind === "spec") {
|
|
251
|
+
const sectionValidation = validateRequiredSections(parsedFrontmatterResult.right.frontmatter, sectionsResult.right);
|
|
252
|
+
if (Either.isLeft(sectionValidation)) {
|
|
253
|
+
return Either.left(sectionValidation.left);
|
|
254
|
+
}
|
|
255
|
+
return decodeUnknown(MdParsedDocSchema, {
|
|
256
|
+
kind: "spec",
|
|
257
|
+
frontmatter: parsedFrontmatterResult.right.frontmatter,
|
|
258
|
+
sections: sectionsResult.right,
|
|
259
|
+
blocks: blocksResult.right,
|
|
260
|
+
}, "Parsed spec document validation failed");
|
|
261
|
+
}
|
|
262
|
+
return decodeUnknown(MdParsedDocSchema, {
|
|
263
|
+
kind: "task",
|
|
264
|
+
frontmatter: parsedFrontmatterResult.right.frontmatter,
|
|
265
|
+
sections: sectionsResult.right,
|
|
266
|
+
blocks: blocksResult.right,
|
|
267
|
+
}, "Parsed task document validation failed");
|
|
268
|
+
};
|
|
269
|
+
export const parseMdDoc = (content) => {
|
|
270
|
+
const parsed = parseMdDocSync(content);
|
|
271
|
+
return Either.isLeft(parsed)
|
|
272
|
+
? Effect.fail(parsed.left)
|
|
273
|
+
: Effect.succeed(parsed.right);
|
|
274
|
+
};
|
|
275
|
+
//# sourceMappingURL=md-doc-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md-doc-parser.js","sourceRoot":"","sources":["../../src/utils/md-doc-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
export type DashboardDefaultTaskAssigmentType = "human" | "agent";
|
|
2
|
+
export type DashboardDefaultTaskView = "list" | "kanban";
|
|
3
|
+
export type DashboardCycleStartDay = "sunday" | "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday";
|
|
4
|
+
export type DashboardCyclesConfig = {
|
|
5
|
+
cycleLengthDays: number;
|
|
6
|
+
cycleStartDay: DashboardCycleStartDay;
|
|
7
|
+
carryStatuses: string[];
|
|
8
|
+
};
|
|
2
9
|
export type GuardMode = "advisory" | "enforce";
|
|
3
10
|
export type TxConfig = {
|
|
4
11
|
docs: {
|
|
@@ -17,6 +24,8 @@ export type TxConfig = {
|
|
|
17
24
|
};
|
|
18
25
|
dashboard: {
|
|
19
26
|
defaultTaskAssigmentType: DashboardDefaultTaskAssigmentType;
|
|
27
|
+
defaultTaskView: DashboardDefaultTaskView;
|
|
28
|
+
cycles: DashboardCyclesConfig;
|
|
20
29
|
};
|
|
21
30
|
pins: {
|
|
22
31
|
targetFiles: string[];
|
|
@@ -40,6 +49,10 @@ export type TxConfig = {
|
|
|
40
49
|
};
|
|
41
50
|
};
|
|
42
51
|
export declare const DASHBOARD_DEFAULT_TASK_ASSIGMENT_KEY = "default_task_assigment_type";
|
|
52
|
+
export declare const DASHBOARD_DEFAULT_TASK_VIEW_KEY = "default_task_view";
|
|
53
|
+
export declare const DASHBOARD_CYCLE_LENGTH_DAYS_KEY = "cycle_length_days";
|
|
54
|
+
export declare const DASHBOARD_CYCLE_START_DAY_KEY = "cycle_start_day";
|
|
55
|
+
export declare const DASHBOARD_CARRY_STATUSES_KEY = "carry_statuses";
|
|
43
56
|
/**
|
|
44
57
|
* Read .tx/config.toml and return parsed config.
|
|
45
58
|
* Falls back to defaults if file doesn't exist or is invalid.
|
|
@@ -50,6 +63,27 @@ export declare const readTxConfig: (cwd?: string) => TxConfig;
|
|
|
50
63
|
* Preserves unrelated sections and comments.
|
|
51
64
|
*/
|
|
52
65
|
export declare const writeDashboardDefaultTaskAssigmentType: (value: DashboardDefaultTaskAssigmentType, cwd?: string) => TxConfig;
|
|
66
|
+
/**
|
|
67
|
+
* Patch the dashboard default task view in .tx/config.toml.
|
|
68
|
+
* Preserves unrelated sections and comments.
|
|
69
|
+
*/
|
|
70
|
+
export declare const writeDashboardDefaultTaskView: (value: DashboardDefaultTaskView, cwd?: string) => TxConfig;
|
|
71
|
+
/**
|
|
72
|
+
* Read dashboard cycle settings from .tx/config.toml.
|
|
73
|
+
*/
|
|
74
|
+
export declare const readDashboardCyclesConfig: (cwd?: string) => DashboardCyclesConfig;
|
|
75
|
+
/**
|
|
76
|
+
* Patch dashboard cycle length in .tx/config.toml.
|
|
77
|
+
*/
|
|
78
|
+
export declare const writeDashboardCycleLengthDays: (value: number, cwd?: string) => TxConfig;
|
|
79
|
+
/**
|
|
80
|
+
* Patch dashboard cycle start day in .tx/config.toml.
|
|
81
|
+
*/
|
|
82
|
+
export declare const writeDashboardCycleStartDay: (value: DashboardCycleStartDay, cwd?: string) => TxConfig;
|
|
83
|
+
/**
|
|
84
|
+
* Patch dashboard cycle carry statuses in .tx/config.toml.
|
|
85
|
+
*/
|
|
86
|
+
export declare const writeDashboardCarryStatuses: (value: readonly string[], cwd?: string) => TxConfig;
|
|
53
87
|
/**
|
|
54
88
|
* Scaffold .tx/config.toml with annotated defaults.
|
|
55
89
|
* No-op if the file already exists (preserves user edits).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toml-config.d.ts","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iCAAiC,GAAG,OAAO,GAAG,OAAO,CAAA;AACjE,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;AAE9C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACtB,IAAI,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAChC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9B,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACpE,SAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"toml-config.d.ts","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"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"}
|