otacon 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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +88 -0
  3. package/dist/cli/client.js +188 -0
  4. package/dist/cli/client.js.map +1 -0
  5. package/dist/cli/commands/answer.js +63 -0
  6. package/dist/cli/commands/answer.js.map +1 -0
  7. package/dist/cli/commands/ask.js +117 -0
  8. package/dist/cli/commands/ask.js.map +1 -0
  9. package/dist/cli/commands/clean.js +48 -0
  10. package/dist/cli/commands/clean.js.map +1 -0
  11. package/dist/cli/commands/doctor.js +86 -0
  12. package/dist/cli/commands/doctor.js.map +1 -0
  13. package/dist/cli/commands/expose.js +104 -0
  14. package/dist/cli/commands/expose.js.map +1 -0
  15. package/dist/cli/commands/implement-done.js +53 -0
  16. package/dist/cli/commands/implement-done.js.map +1 -0
  17. package/dist/cli/commands/install.js +113 -0
  18. package/dist/cli/commands/install.js.map +1 -0
  19. package/dist/cli/commands/open.js +37 -0
  20. package/dist/cli/commands/open.js.map +1 -0
  21. package/dist/cli/commands/progress.js +45 -0
  22. package/dist/cli/commands/progress.js.map +1 -0
  23. package/dist/cli/commands/start.js +66 -0
  24. package/dist/cli/commands/start.js.map +1 -0
  25. package/dist/cli/commands/status.js +44 -0
  26. package/dist/cli/commands/status.js.map +1 -0
  27. package/dist/cli/commands/submit.js +64 -0
  28. package/dist/cli/commands/submit.js.map +1 -0
  29. package/dist/cli/commands/wait.js +66 -0
  30. package/dist/cli/commands/wait.js.map +1 -0
  31. package/dist/cli/install/assets.js +285 -0
  32. package/dist/cli/install/assets.js.map +1 -0
  33. package/dist/cli/install/locations.js +92 -0
  34. package/dist/cli/install/locations.js.map +1 -0
  35. package/dist/cli/install/tailscale.js +39 -0
  36. package/dist/cli/install/tailscale.js.map +1 -0
  37. package/dist/cli/main.js +73 -0
  38. package/dist/cli/main.js.map +1 -0
  39. package/dist/cli/output.js +39 -0
  40. package/dist/cli/output.js.map +1 -0
  41. package/dist/cli/session.js +77 -0
  42. package/dist/cli/session.js.map +1 -0
  43. package/dist/daemon/activity.js +56 -0
  44. package/dist/daemon/activity.js.map +1 -0
  45. package/dist/daemon/anchor.js +143 -0
  46. package/dist/daemon/anchor.js.map +1 -0
  47. package/dist/daemon/app.js +1081 -0
  48. package/dist/daemon/app.js.map +1 -0
  49. package/dist/daemon/approve.js +71 -0
  50. package/dist/daemon/approve.js.map +1 -0
  51. package/dist/daemon/desktop-notify.js +69 -0
  52. package/dist/daemon/desktop-notify.js.map +1 -0
  53. package/dist/daemon/diff.js +187 -0
  54. package/dist/daemon/diff.js.map +1 -0
  55. package/dist/daemon/linter/index.js +19 -0
  56. package/dist/daemon/linter/index.js.map +1 -0
  57. package/dist/daemon/linter/parse.js +350 -0
  58. package/dist/daemon/linter/parse.js.map +1 -0
  59. package/dist/daemon/linter/rules.js +359 -0
  60. package/dist/daemon/linter/rules.js.map +1 -0
  61. package/dist/daemon/main.js +48 -0
  62. package/dist/daemon/main.js.map +1 -0
  63. package/dist/daemon/notify.js +23 -0
  64. package/dist/daemon/notify.js.map +1 -0
  65. package/dist/daemon/presence.js +37 -0
  66. package/dist/daemon/presence.js.map +1 -0
  67. package/dist/daemon/queue.js +160 -0
  68. package/dist/daemon/queue.js.map +1 -0
  69. package/dist/daemon/store.js +393 -0
  70. package/dist/daemon/store.js.map +1 -0
  71. package/dist/daemon/threads.js +153 -0
  72. package/dist/daemon/threads.js.map +1 -0
  73. package/dist/daemon/transcript.js +89 -0
  74. package/dist/daemon/transcript.js.map +1 -0
  75. package/dist/daemon/ui.js +175 -0
  76. package/dist/daemon/ui.js.map +1 -0
  77. package/dist/shared/config.js +93 -0
  78. package/dist/shared/config.js.map +1 -0
  79. package/dist/shared/gwt.js +69 -0
  80. package/dist/shared/gwt.js.map +1 -0
  81. package/dist/shared/paths.js +67 -0
  82. package/dist/shared/paths.js.map +1 -0
  83. package/dist/shared/question-spec.js +44 -0
  84. package/dist/shared/question-spec.js.map +1 -0
  85. package/dist/shared/types.js +35 -0
  86. package/dist/shared/types.js.map +1 -0
  87. package/dist/shared/version.js +5 -0
  88. package/dist/shared/version.js.map +1 -0
  89. package/dist/ui/assets/arc-HhPfdCPZ.js +1 -0
  90. package/dist/ui/assets/architecture-7EHR7CIX-BPLblcyi.js +1 -0
  91. package/dist/ui/assets/architectureDiagram-3BPJPVTR-D2PIxGOb.js +36 -0
  92. package/dist/ui/assets/array-BifhSqXX.js +1 -0
  93. package/dist/ui/assets/blockDiagram-GPEHLZMM-DQ3Dn17h.js +132 -0
  94. package/dist/ui/assets/c4Diagram-AAUBKEIU-DxITrQgS.js +10 -0
  95. package/dist/ui/assets/channel-ipcU8ZNI.js +1 -0
  96. package/dist/ui/assets/chunk-2J33WTMH-Du1JoPx5.js +1 -0
  97. package/dist/ui/assets/chunk-3OPIFGDE-Dn7x2Yqf.js +62 -0
  98. package/dist/ui/assets/chunk-4BX2VUAB-DVnrE-4n.js +1 -0
  99. package/dist/ui/assets/chunk-55IACEB6-BAhFAimA.js +1 -0
  100. package/dist/ui/assets/chunk-5ZQYHXKU-0hEZptem.js +2 -0
  101. package/dist/ui/assets/chunk-727SXJPM-C1FN_cI3.js +206 -0
  102. package/dist/ui/assets/chunk-AQP2D5EJ-A656OBd4.js +231 -0
  103. package/dist/ui/assets/chunk-BSJP7CBP-D8oMbjm8.js +1 -0
  104. package/dist/ui/assets/chunk-CSCIHK7Q-DjIL8GLi.js +122 -0
  105. package/dist/ui/assets/chunk-FMBD7UC4-Otblfqvz.js +15 -0
  106. package/dist/ui/assets/chunk-KSCS5N6A-BOjTvm3H.js +10 -0
  107. package/dist/ui/assets/chunk-L5ZTLDWV-CaTLaw6L.js +1 -0
  108. package/dist/ui/assets/chunk-LZXEDZCA-Dq5p7qrD.js +2 -0
  109. package/dist/ui/assets/chunk-ND2GUHAM-jZ_NNnWi.js +1 -0
  110. package/dist/ui/assets/chunk-NNHCCRGN-DlpIbxXb.js +159 -0
  111. package/dist/ui/assets/chunk-NZK2D7GU-U_7l_sCh.js +1 -0
  112. package/dist/ui/assets/chunk-O5CBEL6O-MewqqNB7.js +70 -0
  113. package/dist/ui/assets/chunk-QZHKN3VN-DzGPH44B.js +1 -0
  114. package/dist/ui/assets/chunk-WU5MYG2G-DyEIVjoo.js +1 -0
  115. package/dist/ui/assets/chunk-XPW4576I-D5ArxNEF.js +32 -0
  116. package/dist/ui/assets/classDiagram-4FO5ZUOK-Byg2Hl9D.js +1 -0
  117. package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-Byg2Hl9D.js +1 -0
  118. package/dist/ui/assets/cose-bilkent-S5V4N54A-PFXzf7WV.js +1 -0
  119. package/dist/ui/assets/cytoscape.esm-h6BdjjI9.js +321 -0
  120. package/dist/ui/assets/dagre-BM42HDAG-xrCfjZuZ.js +4 -0
  121. package/dist/ui/assets/dagre-Bx709z4p.js +1 -0
  122. package/dist/ui/assets/defaultLocale-C8Fc0cco.js +1 -0
  123. package/dist/ui/assets/diagram-2AECGRRQ-BFf-cyKY.js +43 -0
  124. package/dist/ui/assets/diagram-5GNKFQAL-kNPV4NfV.js +10 -0
  125. package/dist/ui/assets/diagram-KO2AKTUF-ByC1IUwG.js +3 -0
  126. package/dist/ui/assets/diagram-LMA3HP47-DZIJMPK0.js +24 -0
  127. package/dist/ui/assets/diagram-OG6HWLK6-CSDED9A-.js +24 -0
  128. package/dist/ui/assets/dist-YwjsDswi.js +1 -0
  129. package/dist/ui/assets/erDiagram-TEJ5UH35-yuzvjE6J.js +85 -0
  130. package/dist/ui/assets/eventmodeling-FCH6USID-CZR4eNG-.js +1 -0
  131. package/dist/ui/assets/flowDiagram-I6XJVG4X-ApPtVyYM.js +162 -0
  132. package/dist/ui/assets/ganttDiagram-6RSMTGT7-BeMLXtAr.js +292 -0
  133. package/dist/ui/assets/gitGraph-WXDBUCRP-JmTTBa7j.js +1 -0
  134. package/dist/ui/assets/gitGraphDiagram-PVQCEYII-Cjjnjs71.js +106 -0
  135. package/dist/ui/assets/graphlib-B8gBHxth.js +1 -0
  136. package/dist/ui/assets/index-BFQVRcSI.js +11 -0
  137. package/dist/ui/assets/index-Bj_kTrwP.css +1 -0
  138. package/dist/ui/assets/info-J43DQDTF-8vZ3gome.js +1 -0
  139. package/dist/ui/assets/infoDiagram-5YYISTIA-CnMk1cA-.js +2 -0
  140. package/dist/ui/assets/init-D6jRqBbL.js +1 -0
  141. package/dist/ui/assets/ishikawaDiagram-YF4QCWOH-Bl8z6huD.js +70 -0
  142. package/dist/ui/assets/journeyDiagram-JHISSGLW-DYIVfMpS.js +139 -0
  143. package/dist/ui/assets/kanban-definition-UN3LZRKU-BnR0ZzOz.js +89 -0
  144. package/dist/ui/assets/katex-Vhh-h91d.js +257 -0
  145. package/dist/ui/assets/line-DcBdQit6.js +1 -0
  146. package/dist/ui/assets/linear-HKjRHFAO.js +1 -0
  147. package/dist/ui/assets/mermaid-parser.core-DkYXrPlA.js +4 -0
  148. package/dist/ui/assets/mermaid.core-BmkfCI3b.js +9 -0
  149. package/dist/ui/assets/mindmap-definition-RKZ34NQL-sIAd4nDi.js +96 -0
  150. package/dist/ui/assets/ordinal-hYBb2elL.js +1 -0
  151. package/dist/ui/assets/otacon-DPXGiaVj.svg +11 -0
  152. package/dist/ui/assets/packet-YPE3B663-BxbxcfXN.js +1 -0
  153. package/dist/ui/assets/path-BWPyau1x.js +1 -0
  154. package/dist/ui/assets/pie-LRSECV5Y-BJxazjNs.js +1 -0
  155. package/dist/ui/assets/pieDiagram-4H26LBE5-BiOhc9GR.js +30 -0
  156. package/dist/ui/assets/plan-view-CH6NzUDb.js +74 -0
  157. package/dist/ui/assets/purify.es-CDvCXckx.js +3 -0
  158. package/dist/ui/assets/quadrantDiagram-W4KKPZXB-CVyHbWgo.js +7 -0
  159. package/dist/ui/assets/radar-GUYGQ44K-D9ohbnbV.js +1 -0
  160. package/dist/ui/assets/requirementDiagram-4Y6WPE33-Ba24_hqc.js +84 -0
  161. package/dist/ui/assets/rough.esm-CSKSodPl.js +1 -0
  162. package/dist/ui/assets/sankeyDiagram-5OEKKPKP-CxD4wiPL.js +40 -0
  163. package/dist/ui/assets/sequenceDiagram-3UESZ5HK-7qA7lD61.js +162 -0
  164. package/dist/ui/assets/src-IM8AE8MK.js +1 -0
  165. package/dist/ui/assets/stateDiagram-AJRCARHV-DNElRCuH.js +1 -0
  166. package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-D6qTYpY3.js +1 -0
  167. package/dist/ui/assets/timeline-definition-PNZ67QCA-ChYC4Grd.js +120 -0
  168. package/dist/ui/assets/treeView-BLDUP644-Il0KnMi_.js +1 -0
  169. package/dist/ui/assets/treemap-LRROVOQU-CIiKcdRo.js +1 -0
  170. package/dist/ui/assets/vennDiagram-CIIHVFJN-Ulhkum9i.js +34 -0
  171. package/dist/ui/assets/wardley-L42UT6IY-BNd4ljz7.js +1 -0
  172. package/dist/ui/assets/wardleyDiagram-YWT4CUSO-BicXxh84.js +78 -0
  173. package/dist/ui/assets/xychartDiagram-2RQKCTM6-Duf-m_th.js +7 -0
  174. package/dist/ui/index.html +20 -0
  175. package/package.json +66 -0
@@ -0,0 +1,350 @@
1
+ import { parseGwt } from "../../shared/gwt.js";
2
+ const FIELD_LABELS = {
3
+ Goal: "goal",
4
+ Files: "files",
5
+ Verification: "verification",
6
+ "Out of scope": "outOfScope",
7
+ };
8
+ // Accepts "Goal:", "**Goal**:", and "**Goal:**" (DECISIONS.md "Plan grammar").
9
+ const FIELD_RE = /^(?:\*\*)?(Goal|Files|Verification|Out of scope)(?:\*\*)?:(?:\*\*)?\s*(.*)$/;
10
+ const PHASE_RE = /^### Phase (\d+) [—-] (.+?)\s*$/;
11
+ const HEADING_RE = /^(#{2,4})\s+(.+?)\s*$/;
12
+ // Capture the info string too — a `gwt` fence is a behavioral-assertion block,
13
+ // not a budgeted/visual fence (DESIGN.md §4). Group 1 stays the delimiter.
14
+ const FENCE_RE = /^\s*(`{3,}|~{3,})\s*(.*)$/;
15
+ const LIST_ITEM_RE = /^[-*+]\s+/;
16
+ // A blockquote line, and the callout marker that must be its first line — the
17
+ // same closed type set the renderer styles (src/ui/plan/callout.tsx). A known
18
+ // callout's lines are budget-exempt and count as one visual; a plain
19
+ // blockquote (or an unknown `[!type]`) stays ordinary budgeted prose.
20
+ const QUOTE_RE = /^\s*>/;
21
+ const CALLOUT_RE = /^\s*>\s*\[!(?:risk|note|decision|assumption)\]\s*$/i;
22
+ // The lead-diagram escape hatch (DESIGN.md §4): an HTML-comment directive that
23
+ // suppresses the L7 nudge when a chart isn't meaningful. Like a callout marker
24
+ // it is chrome, not prose, so a section's read path exempts it from the budget.
25
+ const LEAD_OPT_OUT_RE = /^\s*<!--\s*no-lead-diagram\b.*?-->\s*$/i;
26
+ // A GFM table: a header row (has a pipe) immediately followed by a delimiter
27
+ // row (pipes plus only `-:` and spaces, with at least one `-`). The renderer
28
+ // styles such tables as decision matrices; the parser exempts their lines from
29
+ // the line budget and counts the table as one visual, like a callout.
30
+ const TABLE_ROW_RE = /\|/;
31
+ function isTableDelimiter(line) {
32
+ const trimmed = line.trim();
33
+ return trimmed.includes("-") && trimmed.includes("|") && /^[|\s:-]+$/.test(trimmed);
34
+ }
35
+ const FRONTMATTER_KEY_RE = /^([A-Za-z_][A-Za-z0-9_-]*):\s*(.*)$/;
36
+ export function slugify(title) {
37
+ return title
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9]+/g, "-")
40
+ .replace(/^-+|-+$/g, "");
41
+ }
42
+ export function parsePlan(content) {
43
+ const lines = content.split("\n");
44
+ const parseErrors = [];
45
+ const sections = [];
46
+ let frontmatter = null;
47
+ let frontmatterEndLine = 0;
48
+ let start = 0;
49
+ if (lines[0]?.trim() === "---") {
50
+ const close = lines.findIndex((l, i) => i > 0 && l.trim() === "---");
51
+ if (close === -1) {
52
+ parseErrors.push({
53
+ rule: "L1",
54
+ code: "E_FRONTMATTER_UNCLOSED",
55
+ severity: "error",
56
+ line: 1,
57
+ message: "Frontmatter opened on line 1 is never closed",
58
+ });
59
+ start = 1;
60
+ }
61
+ else {
62
+ frontmatter = {};
63
+ for (let i = 1; i < close; i++) {
64
+ const m = FRONTMATTER_KEY_RE.exec(lines[i] ?? "");
65
+ if (m) {
66
+ frontmatter[m[1]] = (m[2] ?? "").trim().replace(/^["']|["']$/g, "");
67
+ }
68
+ }
69
+ frontmatterEndLine = close + 1;
70
+ start = close + 1;
71
+ }
72
+ }
73
+ let section = null;
74
+ let phase = null;
75
+ let field = null;
76
+ /** Name of the active phase field — gwt placement keys off it. */
77
+ let fieldName = null;
78
+ let item = null;
79
+ let fence = null;
80
+ let fenceOpenLine = 0;
81
+ // When the open fence is a ```gwt block, collect its body here instead of
82
+ // counting it as a read-path fence; finalized onto its container at the close.
83
+ // `gwtTarget` is the array (a phase's or a stray section's) the finished block
84
+ // lands in — fixed at open time so it survives even if structure closes mid-fence.
85
+ let gwtBody = null;
86
+ let gwtStartLine = 0;
87
+ let gwtField = null;
88
+ let gwtTarget = null;
89
+ // Open blockquote run: a callout (budget-exempt, counts as one visual) or a
90
+ // plain quote (ordinary budgeted prose). Reset by any structural boundary.
91
+ let quote = null;
92
+ // Open GFM table run (a decision matrix): budget-exempt, counts as one
93
+ // visual. Reset by any structural boundary.
94
+ let inTable = false;
95
+ let inDetails = false;
96
+ let openDetails = null;
97
+ let detailsLastContent = 0;
98
+ const closeItem = () => {
99
+ item = null;
100
+ };
101
+ const closeField = () => {
102
+ field = null;
103
+ fieldName = null;
104
+ closeItem();
105
+ };
106
+ const closeDetails = () => {
107
+ if (openDetails) {
108
+ openDetails.lineCount = Math.max(0, detailsLastContent - openDetails.startLine);
109
+ }
110
+ openDetails = null;
111
+ inDetails = false;
112
+ };
113
+ const closePhase = () => {
114
+ closeDetails();
115
+ closeField();
116
+ phase = null;
117
+ };
118
+ const closeSection = (endLine) => {
119
+ closePhase();
120
+ if (section)
121
+ section.endLine = endLine;
122
+ section = null;
123
+ };
124
+ for (let idx = start; idx < lines.length; idx++) {
125
+ const line = lines[idx] ?? "";
126
+ const lineNo = idx + 1;
127
+ const blank = line.trim() === "";
128
+ if (fence) {
129
+ if (inDetails && !blank)
130
+ detailsLastContent = lineNo;
131
+ if (line.trimStart().startsWith(fence)) {
132
+ fence = null;
133
+ if (gwtBody !== null && gwtTarget) {
134
+ gwtTarget.push({
135
+ startLine: gwtStartLine,
136
+ field: gwtField,
137
+ scenarios: parseGwt(gwtBody.join("\n")).scenarios,
138
+ });
139
+ }
140
+ gwtBody = null;
141
+ gwtTarget = null;
142
+ }
143
+ else if (gwtBody !== null) {
144
+ gwtBody.push(line);
145
+ }
146
+ continue;
147
+ }
148
+ const fenceMatch = FENCE_RE.exec(line);
149
+ if (fenceMatch) {
150
+ fence = fenceMatch[1];
151
+ fenceOpenLine = lineNo;
152
+ const lang = (fenceMatch[2] ?? "").trim().toLowerCase().split(/\s+/)[0];
153
+ const isGwt = lang === "gwt";
154
+ quote = null;
155
+ inTable = false;
156
+ closeItem();
157
+ if (inDetails)
158
+ detailsLastContent = lineNo;
159
+ else if (isGwt && (phase || section)) {
160
+ // A gwt block is the read path's behavioral-assertion checklist, exempt
161
+ // from the one-fence cap; its body is buffered and validated separately.
162
+ // It belongs in a phase's Verification, but we also capture a stray block
163
+ // in a non-phase section (field null) so the linter rejects it as
164
+ // misplaced — otherwise it would slip through as a budgeted fence while
165
+ // the UI still renders it as scenario cards (producer/consumer drift).
166
+ gwtBody = [];
167
+ gwtStartLine = lineNo;
168
+ gwtField = phase ? fieldName : null;
169
+ gwtTarget = phase ? phase.gwtBlocks : section.gwtBlocks;
170
+ }
171
+ else if (phase)
172
+ phase.fenceCount++;
173
+ else if (section) {
174
+ section.fenceCount++;
175
+ // A mermaid fence in a section read path is a candidate lead diagram
176
+ // (L7 reads Summary's count); it still spends the one-fence allowance.
177
+ if (lang === "mermaid")
178
+ section.diagramCount++;
179
+ }
180
+ continue;
181
+ }
182
+ const heading = HEADING_RE.exec(line);
183
+ if (heading) {
184
+ quote = null; // a heading ends any open blockquote run
185
+ inTable = false;
186
+ const level = heading[1].length;
187
+ const title = heading[2];
188
+ if (level === 2) {
189
+ closeSection(lineNo - 1);
190
+ section = {
191
+ id: slugify(title),
192
+ title,
193
+ startLine: lineNo,
194
+ endLine: lines.length,
195
+ budgetedLineCount: 0,
196
+ fenceCount: 0,
197
+ visualCount: 0,
198
+ diagramCount: 0,
199
+ leadDiagramOptOut: false,
200
+ gwtBlocks: [],
201
+ listItems: [],
202
+ };
203
+ sections.push(section);
204
+ continue;
205
+ }
206
+ if (level === 3 && section?.id === "phases") {
207
+ closeDetails();
208
+ closeField();
209
+ const m = PHASE_RE.exec(line);
210
+ phase = {
211
+ n: m ? Number(m[1]) : -1,
212
+ name: m ? m[2] : "",
213
+ startLine: lineNo,
214
+ headingValid: m !== null,
215
+ rawHeading: line,
216
+ fields: {},
217
+ detailsCount: 0,
218
+ strayH4s: [],
219
+ fenceCount: 0,
220
+ visualCount: 0,
221
+ gwtBlocks: [],
222
+ };
223
+ (section.phases ??= []).push(phase);
224
+ continue;
225
+ }
226
+ if (level === 4 && phase) {
227
+ closeDetails();
228
+ closeField();
229
+ if (title === "Details") {
230
+ phase.detailsCount++;
231
+ openDetails = { startLine: lineNo, lineCount: 0 };
232
+ detailsLastContent = lineNo;
233
+ if (phase.detailsCount === 1)
234
+ phase.details = openDetails;
235
+ inDetails = true;
236
+ }
237
+ else {
238
+ phase.strayH4s.push(lineNo);
239
+ }
240
+ continue;
241
+ }
242
+ // Any other heading (H3 outside Phases, H4 outside a phase) is content.
243
+ }
244
+ if (inDetails) {
245
+ if (!blank)
246
+ detailsLastContent = lineNo;
247
+ continue;
248
+ }
249
+ // Blockquote runs (outside Details). A known callout is exempt from the
250
+ // line budget and counts as one visual; a plain blockquote stays budgeted
251
+ // prose, exactly as before this primitive existed.
252
+ if (quote) {
253
+ if (QUOTE_RE.test(line)) {
254
+ if (!quote.callout && !phase && section)
255
+ section.budgetedLineCount++;
256
+ continue;
257
+ }
258
+ quote = null; // a non-quote line ends the run; fall through to handle it
259
+ }
260
+ if (QUOTE_RE.test(line)) {
261
+ const callout = CALLOUT_RE.test(line);
262
+ quote = { callout };
263
+ closeItem();
264
+ if (callout) {
265
+ if (phase)
266
+ phase.visualCount++;
267
+ else if (section)
268
+ section.visualCount++;
269
+ }
270
+ else if (!phase && section) {
271
+ section.budgetedLineCount++;
272
+ }
273
+ continue;
274
+ }
275
+ // GFM table runs (outside Details): budget-exempt, one visual each. A table
276
+ // starts where a pipe-bearing line is followed by a delimiter row.
277
+ if (inTable) {
278
+ if (TABLE_ROW_RE.test(line))
279
+ continue;
280
+ inTable = false; // a non-row line ends the table; fall through
281
+ }
282
+ if (TABLE_ROW_RE.test(line) && isTableDelimiter(lines[idx + 1] ?? "")) {
283
+ inTable = true;
284
+ closeItem();
285
+ if (phase)
286
+ phase.visualCount++;
287
+ else if (section)
288
+ section.visualCount++;
289
+ continue;
290
+ }
291
+ // The lead-diagram escape hatch (DESIGN.md §4): in a section's read path it
292
+ // records the opt-out and, being chrome, is exempt from the line budget —
293
+ // so declining a diagram never costs a Summary content line.
294
+ if (section && !phase && LEAD_OPT_OUT_RE.test(line)) {
295
+ section.leadDiagramOptOut = true;
296
+ closeItem();
297
+ continue;
298
+ }
299
+ if (phase) {
300
+ const fm = FIELD_RE.exec(line);
301
+ if (fm) {
302
+ closeField();
303
+ fieldName = FIELD_LABELS[fm[1]];
304
+ field = { startLine: lineNo, budgetedLineCount: 1, listItemCount: 0 };
305
+ phase.fields[fieldName] = field;
306
+ continue;
307
+ }
308
+ }
309
+ if (blank) {
310
+ closeItem();
311
+ continue;
312
+ }
313
+ if (LIST_ITEM_RE.test(line)) {
314
+ closeItem();
315
+ if (field) {
316
+ field.listItemCount++;
317
+ field.budgetedLineCount++;
318
+ }
319
+ else if (!phase && section) {
320
+ item = { startLine: lineNo, lineCount: 1, text: line };
321
+ section.listItems.push(item);
322
+ section.budgetedLineCount++;
323
+ }
324
+ continue;
325
+ }
326
+ if (field) {
327
+ field.budgetedLineCount++;
328
+ }
329
+ else if (item && section) {
330
+ item.lineCount++;
331
+ item.text += `\n${line}`;
332
+ section.budgetedLineCount++;
333
+ }
334
+ else if (!phase && section) {
335
+ section.budgetedLineCount++;
336
+ }
337
+ }
338
+ if (fence) {
339
+ parseErrors.push({
340
+ rule: "L1",
341
+ code: "E_UNCLOSED_FENCE",
342
+ severity: "error",
343
+ line: fenceOpenLine,
344
+ message: `Code fence opened on line ${fenceOpenLine} is never closed`,
345
+ });
346
+ }
347
+ closeSection(lines.length);
348
+ return { frontmatter, frontmatterEndLine, sections, parseErrors };
349
+ }
350
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/daemon/linter/parse.ts"],"names":[],"mappings":"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"}