@rasensio/aidlc 1.21.0 → 1.22.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 (46) hide show
  1. package/dist/commands/roadmap.d.ts.map +1 -1
  2. package/dist/commands/roadmap.js +19 -1
  3. package/dist/commands/roadmap.js.map +1 -1
  4. package/dist/roadmap/paths.d.ts +21 -0
  5. package/dist/roadmap/paths.d.ts.map +1 -1
  6. package/dist/roadmap/paths.js +17 -1
  7. package/dist/roadmap/paths.js.map +1 -1
  8. package/dist/roadmap/sync/body.d.ts +109 -23
  9. package/dist/roadmap/sync/body.d.ts.map +1 -1
  10. package/dist/roadmap/sync/body.js +260 -23
  11. package/dist/roadmap/sync/body.js.map +1 -1
  12. package/dist/roadmap/sync/collect.d.ts +9 -0
  13. package/dist/roadmap/sync/collect.d.ts.map +1 -1
  14. package/dist/roadmap/sync/collect.js +48 -3
  15. package/dist/roadmap/sync/collect.js.map +1 -1
  16. package/dist/roadmap/sync/execute.d.ts.map +1 -1
  17. package/dist/roadmap/sync/execute.js +12 -2
  18. package/dist/roadmap/sync/execute.js.map +1 -1
  19. package/dist/roadmap/sync/gh.d.ts +10 -0
  20. package/dist/roadmap/sync/gh.d.ts.map +1 -1
  21. package/dist/roadmap/sync/gh.js +24 -0
  22. package/dist/roadmap/sync/gh.js.map +1 -1
  23. package/dist/roadmap/sync/markdown.d.ts +79 -0
  24. package/dist/roadmap/sync/markdown.d.ts.map +1 -0
  25. package/dist/roadmap/sync/markdown.js +165 -0
  26. package/dist/roadmap/sync/markdown.js.map +1 -0
  27. package/dist/roadmap/sync/marker.d.ts +10 -1
  28. package/dist/roadmap/sync/marker.d.ts.map +1 -1
  29. package/dist/roadmap/sync/marker.js +16 -1
  30. package/dist/roadmap/sync/marker.js.map +1 -1
  31. package/dist/roadmap/sync/plan.d.ts +7 -0
  32. package/dist/roadmap/sync/plan.d.ts.map +1 -1
  33. package/dist/roadmap/sync/plan.js +22 -4
  34. package/dist/roadmap/sync/plan.js.map +1 -1
  35. package/dist/roadmap/sync/render.d.ts.map +1 -1
  36. package/dist/roadmap/sync/render.js +2 -0
  37. package/dist/roadmap/sync/render.js.map +1 -1
  38. package/dist/roadmap/sync/sanitize.d.ts +56 -0
  39. package/dist/roadmap/sync/sanitize.d.ts.map +1 -0
  40. package/dist/roadmap/sync/sanitize.js +140 -0
  41. package/dist/roadmap/sync/sanitize.js.map +1 -0
  42. package/dist/roadmap/sync/types.d.ts +30 -2
  43. package/dist/roadmap/sync/types.d.ts.map +1 -1
  44. package/dist/roadmap/sync/types.js +9 -2
  45. package/dist/roadmap/sync/types.js.map +1 -1
  46. package/package.json +2 -2
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Make one item's prose safe to publish, and make its references clickable.
3
+ *
4
+ * The body used to carry no item prose at all, and the reason was three real hazards. Two
5
+ * of them are properties of GitHub's renderer and one is a property of this feature's own
6
+ * marker scanner:
7
+ *
8
+ * - **Marker injection.** The item↔issue link is an HTML comment. An item that quotes one
9
+ * would stamp a second marker onto a different issue, and `indexByMarker` then refuses
10
+ * the whole run as ambiguous — or, before that guard existed, retitled the wrong issue.
11
+ * - **Notification side effects.** `@name` and `#123` notify people and cross-link issues
12
+ * the instant they are published. A sync is not a reason for somebody's inbox to move.
13
+ * - **Field limits.** GitHub caps a body at 65,536 characters, so the prose needs a budget
14
+ * (that half lives in `body.ts`).
15
+ *
16
+ * The rejected alternative was to publish nothing and make the reader follow a link, which
17
+ * is what shipped in v1.21.0 and what this instance exists to undo: a body carrying no
18
+ * item-specific words is a redirect, and thirty of them on a board are thirty copies of one
19
+ * paragraph.
20
+ *
21
+ * **Everything here is code-aware, and that is the whole design.** Measured over this
22
+ * project's 76 items on 2026-09-07, 40 of the 41 hazard spans are inside a fence or an
23
+ * inline code span — `@clack/prompts`, `actions/checkout@v4`, colour hexes like `#0891b2`
24
+ * — and exactly one is in prose. A rule that ignored code would corrupt forty spans in
25
+ * order to defuse one. See `markdown.ts`.
26
+ *
27
+ * Requirements: richer-issue-bodies/AC-9, richer-issue-bodies/AC-10,
28
+ * richer-issue-bodies/AC-11, richer-issue-bodies/AC-12, richer-issue-bodies/AC-29
29
+ *
30
+ * @module
31
+ */
32
+ import { codeMask, inlineCodeSpans, mapProse } from './markdown.js';
33
+ /** An item id, as the roadmap skill mints them. */
34
+ const ITEM_ID_RE = /item-\d{8}-[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g;
35
+ /**
36
+ * An HTML comment, terminated or not.
37
+ *
38
+ * The unterminated alternative matters: GitHub's renderer swallows everything after a bare
39
+ * `<!--` to the end of the document, so leaving one in would blank the rest of the body.
40
+ * Dropping it is both safer and closer to what a reader would have seen anyway.
41
+ */
42
+ const HTML_COMMENT_RE = /<!--[\s\S]*?-->|<!--[\s\S]*$/g;
43
+ /** A mention GitHub would linkify. Requires a letter or digit after the `@`. */
44
+ const MENTION_RE = /@[A-Za-z0-9][-A-Za-z0-9]*/g;
45
+ /** An issue or pull-request cross-reference GitHub would link and notify. */
46
+ const ISSUE_REF_RE = /#[0-9]+/g;
47
+ /**
48
+ * Sanitize and enrich an item body for publication.
49
+ *
50
+ * Four rules, and the **order is load-bearing**, because two of them insert text a later
51
+ * rule must not re-examine:
52
+ *
53
+ * 1. Item references become links. This runs first because it is the only rule that
54
+ * deliberately rewrites a code span, and because the link it emits contains no `@`, `#`
55
+ * or `<!--` for rules 2–4 to find.
56
+ * 2. Prose HTML comments are removed — the marker-injection defence, and lossless, since a
57
+ * comment renders as nothing.
58
+ * 3. Prose mentions are wrapped in backticks.
59
+ * 4. Prose issue references are wrapped in backticks.
60
+ *
61
+ * Rules 2–4 run through `mapProse`, so code is untouched by construction rather than by a
62
+ * filter that could be got wrong.
63
+ */
64
+ export function sanitizeItemBody(body, ctx) {
65
+ const linked = linkItemReferences(body, ctx);
66
+ return mapProse(linked, defuseProse);
67
+ }
68
+ /**
69
+ * Apply rules 2–4 to one prose run.
70
+ *
71
+ * Comments go first: a marker *is* a comment, so removing comments is what closes the
72
+ * injection hazard, and doing it before the backtick rules means a `@name` inside a
73
+ * comment is deleted rather than wrapped.
74
+ */
75
+ function defuseProse(prose) {
76
+ return prose
77
+ .replace(HTML_COMMENT_RE, '')
78
+ .replace(MENTION_RE, (m) => `\`${m}\``)
79
+ .replace(ISSUE_REF_RE, (m) => `\`${m}\``);
80
+ }
81
+ /**
82
+ * Turn item references into links, in code spans and in prose alike.
83
+ *
84
+ * All 32 references in the real corpus are inline code spans whose **entire** content is
85
+ * the id (`` `item-20260902-review-gate-vs-tasks-review` ``) — measured, and the reason
86
+ * the first draft of this rule was retired by Amendment 1: a prose-only rule would never
87
+ * have fired once.
88
+ *
89
+ * The rewrite is deliberately narrow. Only a span whose whole content is a known id is
90
+ * touched, and the replacement re-wraps the same content in the same number of backticks
91
+ * inside a link, so a multi-backtick span stays valid. An id with no entry in `itemPaths`
92
+ * is left byte-identical, because an unresolvable link is worse than no link.
93
+ */
94
+ function linkItemReferences(body, ctx) {
95
+ const { itemPaths, fileUrl } = ctx;
96
+ if (fileUrl === null || itemPaths.size === 0)
97
+ return body;
98
+ const edits = [];
99
+ // Code spans whose entire content is a known id.
100
+ const spans = inlineCodeSpans(body);
101
+ for (const span of spans) {
102
+ const relPath = itemPaths.get(span.content);
103
+ if (relPath === undefined)
104
+ continue;
105
+ const ticks = '`'.repeat(span.ticks);
106
+ edits.push({
107
+ start: span.start,
108
+ end: span.end,
109
+ text: `[${ticks}${span.content}${ticks}](${fileUrl(relPath)})`,
110
+ });
111
+ }
112
+ // Bare ids in prose. The mask — not `spans` — decides what counts as prose here:
113
+ // `inlineCodeSpans` deliberately omits spans inside fenced blocks, so testing against it
114
+ // alone would rewrite an id sitting in a code sample and corrupt the block.
115
+ const mask = codeMask(body);
116
+ ITEM_ID_RE.lastIndex = 0;
117
+ let match;
118
+ while ((match = ITEM_ID_RE.exec(body)) !== null) {
119
+ if (mask[match.index] === 1)
120
+ continue;
121
+ const relPath = itemPaths.get(match[0]);
122
+ if (relPath === undefined)
123
+ continue;
124
+ edits.push({
125
+ start: match.index,
126
+ end: match.index + match[0].length,
127
+ text: `[\`${match[0]}\`](${fileUrl(relPath)})`,
128
+ });
129
+ }
130
+ if (edits.length === 0)
131
+ return body;
132
+ // Right to left, so earlier offsets stay valid as later text is spliced in.
133
+ edits.sort((a, b) => b.start - a.start);
134
+ let out = body;
135
+ for (const edit of edits) {
136
+ out = out.slice(0, edit.start) + edit.text + out.slice(edit.end);
137
+ }
138
+ return out;
139
+ }
140
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/roadmap/sync/sanitize.ts"],"names":[],"mappings":"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"}
@@ -26,8 +26,8 @@ import type { RoadmapStatus } from '../paths.js';
26
26
  * criteria unachievable — "the second plan contains only X or Y" cannot be checked
27
27
  * against a list nobody wrote down.
28
28
  */
29
- export type Outcome = 'create' | 'update-title' | 'update-labels' | 'close' | 'unchanged' | 'skip' | 'state-divergent' | 'ineligible-with-issue' | 'orphan-missing' | 'label-without-marker';
30
- /** The four outcomes that write. Everything else is a report. */
29
+ export type Outcome = 'create' | 'update-title' | 'update-labels' | 'update-body' | 'close' | 'unchanged' | 'skip' | 'state-divergent' | 'ineligible-with-issue' | 'orphan-missing' | 'label-without-marker';
30
+ /** The five outcomes that write. Everything else is a report. */
31
31
  export declare const WRITE_OUTCOMES: readonly Outcome[];
32
32
  /**
33
33
  * Outcomes that suppress every write for their item (design DE-18).
@@ -42,6 +42,22 @@ export declare const TERMINAL_REPORTS: readonly Outcome[];
42
42
  export declare const WRITE_ORDER: readonly Outcome[];
43
43
  /** True when this outcome performs a `gh` write. */
44
44
  export declare function isWrite(outcome: Outcome): boolean;
45
+ /**
46
+ * The frontmatter facts a reader with no checkout cannot otherwise see.
47
+ *
48
+ * Every field is nullable and `null` means *not recorded*. It is never coerced to an
49
+ * empty string or a guess: an item with no `author` is a normal item, and rendering
50
+ * `not recorded` tells a reader something true, where a blank tells them nothing and an
51
+ * invented value tells them something false.
52
+ */
53
+ export interface ItemFacts {
54
+ createdAt: string | null;
55
+ author: string | null;
56
+ source: string | null;
57
+ promotedTo: string | null;
58
+ /** Item ids, in file order. Empty when the key is absent or holds no usable ids. */
59
+ dependsOn: readonly string[];
60
+ }
45
61
  /** An item that can be projected: parseable, with an id. */
46
62
  export interface ProjectableItem {
47
63
  id: string;
@@ -51,6 +67,9 @@ export interface ProjectableItem {
51
67
  filename: string;
52
68
  /** Repo-relative path, for the issue body. */
53
69
  relPath: string;
70
+ /** Everything below the frontmatter, verbatim. Projected after sanitization. */
71
+ body: string;
72
+ facts: ItemFacts;
54
73
  }
55
74
  /**
56
75
  * Why an item cannot be projected.
@@ -93,6 +112,15 @@ export interface PlanLine {
93
112
  detail: string | null;
94
113
  addLabels: readonly string[];
95
114
  removeLabels: readonly string[];
115
+ /**
116
+ * The exact bytes to send, on `create` and `update-body`; null on every other outcome.
117
+ *
118
+ * Decided in the pure planner rather than in `execute.ts` (design DD-6). The merge that
119
+ * produces it has four branches and has to preserve a human's additions, which is
120
+ * exactly the kind of logic that should not live in the one module capable of
121
+ * irreversible writes — and here it is testable with no `gh` at all.
122
+ */
123
+ newBody: string | null;
96
124
  }
97
125
  export interface Plan {
98
126
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/roadmap/sync/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GACf,QAAQ,GACR,cAAc,GACd,eAAe,GACf,OAAO,GACP,WAAW,GACX,MAAM,GACN,iBAAiB,GACjB,uBAAuB,GACvB,gBAAgB,GAChB,sBAAsB,CAAC;AAE3B,iEAAiE;AACjE,eAAO,MAAM,cAAc,EAAE,SAAS,OAAO,EAK5C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,OAAO,EAAiD,CAAC;AAEjG,uFAAuF;AACvF,eAAO,MAAM,WAAW,EAAE,SAAS,OAAO,EAAyD,CAAC;AAEpG,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEjD;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,kBAAkB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0BAA0B;AAC1B,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uEAAuE;IACvE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,IAAI;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,qDAAqD;IACrD,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/roadmap/sync/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GACf,QAAQ,GACR,cAAc,GACd,eAAe,GACf,aAAa,GACb,OAAO,GACP,WAAW,GACX,MAAM,GACN,iBAAiB,GACjB,uBAAuB,GACvB,gBAAgB,GAChB,sBAAsB,CAAC;AAE3B,iEAAiE;AACjE,eAAO,MAAM,cAAc,EAAE,SAAS,OAAO,EAM5C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,OAAO,EAAiD,CAAC;AAEjG,uFAAuF;AACvF,eAAO,MAAM,WAAW,EAAE,SAAS,OAAO,EAMzC,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEjD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oFAAoF;IACpF,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,kBAAkB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0BAA0B;AAC1B,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uEAAuE;IACvE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC;;;;;;;OAOG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,IAAI;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,qDAAqD;IACrD,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -18,11 +18,12 @@
18
18
  *
19
19
  * @module
20
20
  */
21
- /** The four outcomes that write. Everything else is a report. */
21
+ /** The five outcomes that write. Everything else is a report. */
22
22
  export const WRITE_OUTCOMES = [
23
23
  'create',
24
24
  'update-title',
25
25
  'update-labels',
26
+ 'update-body',
26
27
  'close',
27
28
  ];
28
29
  /**
@@ -35,7 +36,13 @@ export const WRITE_OUTCOMES = [
35
36
  */
36
37
  export const TERMINAL_REPORTS = ['state-divergent', 'ineligible-with-issue'];
37
38
  /** Execution order within one item: edit while the issue is still open, then close. */
38
- export const WRITE_ORDER = ['create', 'update-title', 'update-labels', 'close'];
39
+ export const WRITE_ORDER = [
40
+ 'create',
41
+ 'update-title',
42
+ 'update-labels',
43
+ 'update-body',
44
+ 'close',
45
+ ];
39
46
  /** True when this outcome performs a `gh` write. */
40
47
  export function isWrite(outcome) {
41
48
  return WRITE_OUTCOMES.includes(outcome);
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/roadmap/sync/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAuBH,iEAAiE;AACjE,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,QAAQ;IACR,cAAc;IACd,eAAe;IACf,OAAO;CACR,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAuB,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;AAEjG,uFAAuF;AACvF,MAAM,CAAC,MAAM,WAAW,GAAuB,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AAEpG,oDAAoD;AACpD,MAAM,UAAU,OAAO,CAAC,OAAgB;IACtC,OAAO,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/roadmap/sync/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAwBH,iEAAiE;AACjE,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,QAAQ;IACR,cAAc;IACd,eAAe;IACf,aAAa;IACb,OAAO;CACR,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAuB,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;AAEjG,uFAAuF;AACvF,MAAM,CAAC,MAAM,WAAW,GAAuB;IAC7C,QAAQ;IACR,cAAc;IACd,eAAe;IACf,aAAa;IACb,OAAO;CACR,CAAC;AAEF,oDAAoD;AACpD,MAAM,UAAU,OAAO,CAAC,OAAgB;IACtC,OAAO,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rasensio/aidlc",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "AI Development Lifecycle Framework — structured lifecycle guidance for AI coding agents across platforms",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",
@@ -24,7 +24,7 @@
24
24
  "commander": "15.0.0",
25
25
  "picomatch": "4.0.5",
26
26
  "yaml": "2.9.0",
27
- "@rasensio/aidlc-content": "1.21.0"
27
+ "@rasensio/aidlc-content": "1.22.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "22.15.32",