mewkit 1.7.0 → 1.8.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 (264) hide show
  1. package/README.md +76 -0
  2. package/dist/commands/memory.js +3 -3
  3. package/dist/commands/memory.js.map +1 -1
  4. package/dist/commands/orchviz.d.ts +12 -0
  5. package/dist/commands/orchviz.d.ts.map +1 -0
  6. package/dist/commands/orchviz.js +160 -0
  7. package/dist/commands/orchviz.js.map +1 -0
  8. package/dist/commands/setup.d.ts.map +1 -1
  9. package/dist/commands/setup.js +7 -5
  10. package/dist/commands/setup.js.map +1 -1
  11. package/dist/core/skills-dependencies.js +2 -2
  12. package/dist/core/skills-dependencies.js.map +1 -1
  13. package/dist/index.js +50 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/migrate/__tests__/skill-id-utils.test.d.ts +2 -0
  16. package/dist/migrate/__tests__/skill-id-utils.test.d.ts.map +1 -0
  17. package/dist/migrate/__tests__/skill-id-utils.test.js +78 -0
  18. package/dist/migrate/__tests__/skill-id-utils.test.js.map +1 -0
  19. package/dist/migrate/discovery/skill-id-utils.d.ts +18 -0
  20. package/dist/migrate/discovery/skill-id-utils.d.ts.map +1 -0
  21. package/dist/migrate/discovery/skill-id-utils.js +45 -0
  22. package/dist/migrate/discovery/skill-id-utils.js.map +1 -0
  23. package/dist/migrate/discovery/skills-discovery.d.ts.map +1 -1
  24. package/dist/migrate/discovery/skills-discovery.js +5 -1
  25. package/dist/migrate/discovery/skills-discovery.js.map +1 -1
  26. package/dist/migrate/reconcile/portable-registry.d.ts +12 -12
  27. package/dist/migrate/types.d.ts +8 -6
  28. package/dist/migrate/types.d.ts.map +1 -1
  29. package/dist/migrate/types.js.map +1 -1
  30. package/dist/orchviz/constants.d.ts +53 -0
  31. package/dist/orchviz/constants.d.ts.map +1 -0
  32. package/dist/orchviz/constants.js +68 -0
  33. package/dist/orchviz/constants.js.map +1 -0
  34. package/dist/orchviz/fs-utils.d.ts +24 -0
  35. package/dist/orchviz/fs-utils.d.ts.map +1 -0
  36. package/dist/orchviz/fs-utils.js +49 -0
  37. package/dist/orchviz/fs-utils.js.map +1 -0
  38. package/dist/orchviz/index.d.ts +29 -0
  39. package/dist/orchviz/index.d.ts.map +1 -0
  40. package/dist/orchviz/index.js +28 -0
  41. package/dist/orchviz/index.js.map +1 -0
  42. package/dist/orchviz/log-persister.d.ts +22 -0
  43. package/dist/orchviz/log-persister.d.ts.map +1 -0
  44. package/dist/orchviz/log-persister.js +96 -0
  45. package/dist/orchviz/log-persister.js.map +1 -0
  46. package/dist/orchviz/logger.d.ts +13 -0
  47. package/dist/orchviz/logger.d.ts.map +1 -0
  48. package/dist/orchviz/logger.js +47 -0
  49. package/dist/orchviz/logger.js.map +1 -0
  50. package/dist/orchviz/open-url.d.ts +11 -0
  51. package/dist/orchviz/open-url.d.ts.map +1 -0
  52. package/dist/orchviz/open-url.js +28 -0
  53. package/dist/orchviz/open-url.js.map +1 -0
  54. package/dist/orchviz/overlay/collector.d.ts +29 -0
  55. package/dist/orchviz/overlay/collector.d.ts.map +1 -0
  56. package/dist/orchviz/overlay/collector.js +38 -0
  57. package/dist/orchviz/overlay/collector.js.map +1 -0
  58. package/dist/orchviz/overlay/gate-readers.d.ts +18 -0
  59. package/dist/orchviz/overlay/gate-readers.d.ts.map +1 -0
  60. package/dist/orchviz/overlay/gate-readers.js +111 -0
  61. package/dist/orchviz/overlay/gate-readers.js.map +1 -0
  62. package/dist/orchviz/overlay/session-state-readers.d.ts +18 -0
  63. package/dist/orchviz/overlay/session-state-readers.d.ts.map +1 -0
  64. package/dist/orchviz/overlay/session-state-readers.js +78 -0
  65. package/dist/orchviz/overlay/session-state-readers.js.map +1 -0
  66. package/dist/orchviz/parser/handle-progress.d.ts +9 -0
  67. package/dist/orchviz/parser/handle-progress.d.ts.map +1 -0
  68. package/dist/orchviz/parser/handle-progress.js +38 -0
  69. package/dist/orchviz/parser/handle-progress.js.map +1 -0
  70. package/dist/orchviz/parser/handle-text.d.ts +10 -0
  71. package/dist/orchviz/parser/handle-text.d.ts.map +1 -0
  72. package/dist/orchviz/parser/handle-text.js +38 -0
  73. package/dist/orchviz/parser/handle-text.js.map +1 -0
  74. package/dist/orchviz/parser/handle-thinking.d.ts +10 -0
  75. package/dist/orchviz/parser/handle-thinking.d.ts.map +1 -0
  76. package/dist/orchviz/parser/handle-thinking.js +35 -0
  77. package/dist/orchviz/parser/handle-thinking.js.map +1 -0
  78. package/dist/orchviz/parser/handle-tool-result.d.ts +10 -0
  79. package/dist/orchviz/parser/handle-tool-result.d.ts.map +1 -0
  80. package/dist/orchviz/parser/handle-tool-result.js +62 -0
  81. package/dist/orchviz/parser/handle-tool-result.js.map +1 -0
  82. package/dist/orchviz/parser/handle-tool-use.d.ts +11 -0
  83. package/dist/orchviz/parser/handle-tool-use.d.ts.map +1 -0
  84. package/dist/orchviz/parser/handle-tool-use.js +38 -0
  85. package/dist/orchviz/parser/handle-tool-use.js.map +1 -0
  86. package/dist/orchviz/parser/index.d.ts +38 -0
  87. package/dist/orchviz/parser/index.d.ts.map +1 -0
  88. package/dist/orchviz/parser/index.js +139 -0
  89. package/dist/orchviz/parser/index.js.map +1 -0
  90. package/dist/orchviz/parser/label-helpers.d.ts +9 -0
  91. package/dist/orchviz/parser/label-helpers.d.ts.map +1 -0
  92. package/dist/orchviz/parser/label-helpers.js +44 -0
  93. package/dist/orchviz/parser/label-helpers.js.map +1 -0
  94. package/dist/orchviz/parser/strip-ansi.d.ts +6 -0
  95. package/dist/orchviz/parser/strip-ansi.d.ts.map +1 -0
  96. package/dist/orchviz/parser/strip-ansi.js +14 -0
  97. package/dist/orchviz/parser/strip-ansi.js.map +1 -0
  98. package/dist/orchviz/parser/utils.d.ts +20 -0
  99. package/dist/orchviz/parser/utils.d.ts.map +1 -0
  100. package/dist/orchviz/parser/utils.js +56 -0
  101. package/dist/orchviz/parser/utils.js.map +1 -0
  102. package/dist/orchviz/permission-detection.d.ts +18 -0
  103. package/dist/orchviz/permission-detection.d.ts.map +1 -0
  104. package/dist/orchviz/permission-detection.js +50 -0
  105. package/dist/orchviz/permission-detection.js.map +1 -0
  106. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts +15 -0
  107. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts.map +1 -0
  108. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js +165 -0
  109. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js.map +1 -0
  110. package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts +11 -0
  111. package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts.map +1 -0
  112. package/dist/orchviz/plan/__tests__/atomic-write.test.js +89 -0
  113. package/dist/orchviz/plan/__tests__/atomic-write.test.js.map +1 -0
  114. package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts +10 -0
  115. package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts.map +1 -0
  116. package/dist/orchviz/plan/__tests__/end-to-end.test.js +132 -0
  117. package/dist/orchviz/plan/__tests__/end-to-end.test.js.map +1 -0
  118. package/dist/orchviz/plan/__tests__/etag.test.d.ts +11 -0
  119. package/dist/orchviz/plan/__tests__/etag.test.d.ts.map +1 -0
  120. package/dist/orchviz/plan/__tests__/etag.test.js +92 -0
  121. package/dist/orchviz/plan/__tests__/etag.test.js.map +1 -0
  122. package/dist/orchviz/plan/__tests__/list-plans.test.d.ts +14 -0
  123. package/dist/orchviz/plan/__tests__/list-plans.test.d.ts.map +1 -0
  124. package/dist/orchviz/plan/__tests__/list-plans.test.js +154 -0
  125. package/dist/orchviz/plan/__tests__/list-plans.test.js.map +1 -0
  126. package/dist/orchviz/plan/apply-todo-toggle.d.ts +29 -0
  127. package/dist/orchviz/plan/apply-todo-toggle.d.ts.map +1 -0
  128. package/dist/orchviz/plan/apply-todo-toggle.js +129 -0
  129. package/dist/orchviz/plan/apply-todo-toggle.js.map +1 -0
  130. package/dist/orchviz/plan/atomic-write.d.ts +25 -0
  131. package/dist/orchviz/plan/atomic-write.d.ts.map +1 -0
  132. package/dist/orchviz/plan/atomic-write.js +85 -0
  133. package/dist/orchviz/plan/atomic-write.js.map +1 -0
  134. package/dist/orchviz/plan/collector.d.ts +49 -0
  135. package/dist/orchviz/plan/collector.d.ts.map +1 -0
  136. package/dist/orchviz/plan/collector.js +173 -0
  137. package/dist/orchviz/plan/collector.js.map +1 -0
  138. package/dist/orchviz/plan/etag.d.ts +24 -0
  139. package/dist/orchviz/plan/etag.d.ts.map +1 -0
  140. package/dist/orchviz/plan/etag.js +58 -0
  141. package/dist/orchviz/plan/etag.js.map +1 -0
  142. package/dist/orchviz/plan/find-active-plan.d.ts +9 -0
  143. package/dist/orchviz/plan/find-active-plan.d.ts.map +1 -0
  144. package/dist/orchviz/plan/find-active-plan.js +90 -0
  145. package/dist/orchviz/plan/find-active-plan.js.map +1 -0
  146. package/dist/orchviz/plan/index.d.ts +23 -0
  147. package/dist/orchviz/plan/index.d.ts.map +1 -0
  148. package/dist/orchviz/plan/index.js +91 -0
  149. package/dist/orchviz/plan/index.js.map +1 -0
  150. package/dist/orchviz/plan/list-plans.d.ts +19 -0
  151. package/dist/orchviz/plan/list-plans.d.ts.map +1 -0
  152. package/dist/orchviz/plan/list-plans.js +148 -0
  153. package/dist/orchviz/plan/list-plans.js.map +1 -0
  154. package/dist/orchviz/plan/parse-phase-file.d.ts +13 -0
  155. package/dist/orchviz/plan/parse-phase-file.d.ts.map +1 -0
  156. package/dist/orchviz/plan/parse-phase-file.js +136 -0
  157. package/dist/orchviz/plan/parse-phase-file.js.map +1 -0
  158. package/dist/orchviz/plan/parse-plan-file.d.ts +19 -0
  159. package/dist/orchviz/plan/parse-plan-file.d.ts.map +1 -0
  160. package/dist/orchviz/plan/parse-plan-file.js +62 -0
  161. package/dist/orchviz/plan/parse-plan-file.js.map +1 -0
  162. package/dist/orchviz/plan/plan-constants.d.ts +17 -0
  163. package/dist/orchviz/plan/plan-constants.d.ts.map +1 -0
  164. package/dist/orchviz/plan/plan-constants.js +19 -0
  165. package/dist/orchviz/plan/plan-constants.js.map +1 -0
  166. package/dist/orchviz/plan/types.d.ts +46 -0
  167. package/dist/orchviz/plan/types.d.ts.map +1 -0
  168. package/dist/orchviz/plan/types.js +6 -0
  169. package/dist/orchviz/plan/types.js.map +1 -0
  170. package/dist/orchviz/protocol.d.ts +116 -0
  171. package/dist/orchviz/protocol.d.ts.map +1 -0
  172. package/dist/orchviz/protocol.js +23 -0
  173. package/dist/orchviz/protocol.js.map +1 -0
  174. package/dist/orchviz/redact.d.ts +10 -0
  175. package/dist/orchviz/redact.d.ts.map +1 -0
  176. package/dist/orchviz/redact.js +38 -0
  177. package/dist/orchviz/redact.js.map +1 -0
  178. package/dist/orchviz/sanitize.d.ts +11 -0
  179. package/dist/orchviz/sanitize.d.ts.map +1 -0
  180. package/dist/orchviz/sanitize.js +38 -0
  181. package/dist/orchviz/sanitize.js.map +1 -0
  182. package/dist/orchviz/server/__tests__/security-smoke.test.d.ts +13 -0
  183. package/dist/orchviz/server/__tests__/security-smoke.test.d.ts.map +1 -0
  184. package/dist/orchviz/server/__tests__/security-smoke.test.js +207 -0
  185. package/dist/orchviz/server/__tests__/security-smoke.test.js.map +1 -0
  186. package/dist/orchviz/server/__tests__/write-handlers.test.d.ts +24 -0
  187. package/dist/orchviz/server/__tests__/write-handlers.test.d.ts.map +1 -0
  188. package/dist/orchviz/server/__tests__/write-handlers.test.js +347 -0
  189. package/dist/orchviz/server/__tests__/write-handlers.test.js.map +1 -0
  190. package/dist/orchviz/server/api-handlers.d.ts +55 -0
  191. package/dist/orchviz/server/api-handlers.d.ts.map +1 -0
  192. package/dist/orchviz/server/api-handlers.js +112 -0
  193. package/dist/orchviz/server/api-handlers.js.map +1 -0
  194. package/dist/orchviz/server/index.d.ts +36 -0
  195. package/dist/orchviz/server/index.d.ts.map +1 -0
  196. package/dist/orchviz/server/index.js +147 -0
  197. package/dist/orchviz/server/index.js.map +1 -0
  198. package/dist/orchviz/server/sse-handler.d.ts +25 -0
  199. package/dist/orchviz/server/sse-handler.d.ts.map +1 -0
  200. package/dist/orchviz/server/sse-handler.js +128 -0
  201. package/dist/orchviz/server/sse-handler.js.map +1 -0
  202. package/dist/orchviz/server/static-handler.d.ts +9 -0
  203. package/dist/orchviz/server/static-handler.d.ts.map +1 -0
  204. package/dist/orchviz/server/static-handler.js +76 -0
  205. package/dist/orchviz/server/static-handler.js.map +1 -0
  206. package/dist/orchviz/server/write-handlers.d.ts +20 -0
  207. package/dist/orchviz/server/write-handlers.d.ts.map +1 -0
  208. package/dist/orchviz/server/write-handlers.js +167 -0
  209. package/dist/orchviz/server/write-handlers.js.map +1 -0
  210. package/dist/orchviz/server/write-utils.d.ts +59 -0
  211. package/dist/orchviz/server/write-utils.d.ts.map +1 -0
  212. package/dist/orchviz/server/write-utils.js +161 -0
  213. package/dist/orchviz/server/write-utils.js.map +1 -0
  214. package/dist/orchviz/session-discovery.d.ts +19 -0
  215. package/dist/orchviz/session-discovery.d.ts.map +1 -0
  216. package/dist/orchviz/session-discovery.js +104 -0
  217. package/dist/orchviz/session-discovery.js.map +1 -0
  218. package/dist/orchviz/session-manager.d.ts +17 -0
  219. package/dist/orchviz/session-manager.d.ts.map +1 -0
  220. package/dist/orchviz/session-manager.js +62 -0
  221. package/dist/orchviz/session-manager.js.map +1 -0
  222. package/dist/orchviz/session-runtime.d.ts +22 -0
  223. package/dist/orchviz/session-runtime.d.ts.map +1 -0
  224. package/dist/orchviz/session-runtime.js +135 -0
  225. package/dist/orchviz/session-runtime.js.map +1 -0
  226. package/dist/orchviz/session-watcher.d.ts +33 -0
  227. package/dist/orchviz/session-watcher.d.ts.map +1 -0
  228. package/dist/orchviz/session-watcher.js +135 -0
  229. package/dist/orchviz/session-watcher.js.map +1 -0
  230. package/dist/orchviz/subagent-meta.d.ts +8 -0
  231. package/dist/orchviz/subagent-meta.d.ts.map +1 -0
  232. package/dist/orchviz/subagent-meta.js +28 -0
  233. package/dist/orchviz/subagent-meta.js.map +1 -0
  234. package/dist/orchviz/subagent-scanner.d.ts +15 -0
  235. package/dist/orchviz/subagent-scanner.d.ts.map +1 -0
  236. package/dist/orchviz/subagent-scanner.js +27 -0
  237. package/dist/orchviz/subagent-scanner.js.map +1 -0
  238. package/dist/orchviz/subagent-watcher.d.ts +19 -0
  239. package/dist/orchviz/subagent-watcher.d.ts.map +1 -0
  240. package/dist/orchviz/subagent-watcher.js +147 -0
  241. package/dist/orchviz/subagent-watcher.js.map +1 -0
  242. package/dist/orchviz/test-server-boot.d.ts +28 -0
  243. package/dist/orchviz/test-server-boot.d.ts.map +1 -0
  244. package/dist/orchviz/test-server-boot.js +64 -0
  245. package/dist/orchviz/test-server-boot.js.map +1 -0
  246. package/dist/orchviz/token-estimator.d.ts +11 -0
  247. package/dist/orchviz/token-estimator.d.ts.map +1 -0
  248. package/dist/orchviz/token-estimator.js +38 -0
  249. package/dist/orchviz/token-estimator.js.map +1 -0
  250. package/dist/orchviz/tool-input-data.d.ts +11 -0
  251. package/dist/orchviz/tool-input-data.d.ts.map +1 -0
  252. package/dist/orchviz/tool-input-data.js +76 -0
  253. package/dist/orchviz/tool-input-data.js.map +1 -0
  254. package/dist/orchviz/tool-summarizer.d.ts +16 -0
  255. package/dist/orchviz/tool-summarizer.d.ts.map +1 -0
  256. package/dist/orchviz/tool-summarizer.js +131 -0
  257. package/dist/orchviz/tool-summarizer.js.map +1 -0
  258. package/dist/orchviz-web/index.css +1 -0
  259. package/dist/orchviz-web/index.html +18 -0
  260. package/dist/orchviz-web/index.js +51 -0
  261. package/package.json +18 -3
  262. package/dist/logger.d.ts +0 -26
  263. package/dist/logger.js +0 -70
  264. package/dist/logger.js.map +0 -1
@@ -0,0 +1,148 @@
1
+ /**
2
+ * listPlans — enumerate all non-archived plan dirs in tasks/plans/.
3
+ *
4
+ * Per red-team SEC#6: realpath boundary check is applied to EVERY subdir before
5
+ * any file inside is read. This mirrors the check in findActivePlan.
6
+ *
7
+ * Returns up to `limit` (default 100) PlanSummary objects sorted by plan.md
8
+ * mtimeMs descending (most recently modified first).
9
+ */
10
+ import * as fs from "node:fs";
11
+ import * as path from "node:path";
12
+ import yaml from "js-yaml";
13
+ import { FRONTMATTER_RE, PHASE_FILE_RE, SLUG_RE } from "./plan-constants.js";
14
+ const DEFAULT_LIMIT = 100;
15
+ const VALID_PLAN_STATUSES = new Set([
16
+ "draft",
17
+ "in_progress",
18
+ "active",
19
+ "completed",
20
+ "archived",
21
+ "blocked",
22
+ "unknown",
23
+ ]);
24
+ function normalizePlanStatus(raw) {
25
+ if (typeof raw !== "string")
26
+ return "unknown";
27
+ const lower = raw.toLowerCase().replace(/[-\s]+/g, "_").trim();
28
+ if (VALID_PLAN_STATUSES.has(lower))
29
+ return lower;
30
+ return "unknown";
31
+ }
32
+ function parsePlanFrontmatter(planFile) {
33
+ let raw;
34
+ try {
35
+ raw = fs.readFileSync(planFile, "utf-8");
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ const slug = path.basename(path.dirname(planFile));
41
+ const fmMatch = raw.match(FRONTMATTER_RE);
42
+ if (!fmMatch) {
43
+ return { title: slug, status: "unknown", created: "", effort: "?" };
44
+ }
45
+ let parsed;
46
+ try {
47
+ parsed = yaml.load(fmMatch[1], { schema: yaml.FAILSAFE_SCHEMA });
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ if (!parsed || typeof parsed !== "object") {
53
+ return { title: slug, status: "unknown", created: "", effort: "?" };
54
+ }
55
+ const obj = parsed;
56
+ const status = normalizePlanStatus(obj.status);
57
+ const title = typeof obj.title === "string" ? obj.title : slug;
58
+ const created = typeof obj.created === "string"
59
+ ? obj.created
60
+ : typeof obj.created === "number"
61
+ ? String(obj.created)
62
+ : "";
63
+ const effort = typeof obj.effort === "string"
64
+ ? obj.effort
65
+ : typeof obj.effort === "number"
66
+ ? String(obj.effort)
67
+ : "?";
68
+ return { title, status, created, effort };
69
+ }
70
+ /**
71
+ * List all non-archived plans in projectRoot/tasks/plans/.
72
+ * Each candidate subdir is realpath-checked against the boundary before read.
73
+ */
74
+ export function listPlans(projectRoot, opts = {}) {
75
+ const limit = opts.limit ?? DEFAULT_LIMIT;
76
+ const plansDir = path.join(projectRoot, "tasks", "plans");
77
+ let resolvedPlansDir;
78
+ try {
79
+ resolvedPlansDir = fs.realpathSync(plansDir);
80
+ }
81
+ catch {
82
+ return [];
83
+ }
84
+ const boundary = resolvedPlansDir + path.sep;
85
+ let entries;
86
+ try {
87
+ entries = fs.readdirSync(plansDir, { withFileTypes: true });
88
+ }
89
+ catch {
90
+ return [];
91
+ }
92
+ const results = [];
93
+ for (const entry of entries) {
94
+ if (!entry.isDirectory())
95
+ continue;
96
+ if (!SLUG_RE.test(entry.name))
97
+ continue;
98
+ const dir = path.join(plansDir, entry.name);
99
+ let resolved;
100
+ try {
101
+ resolved = fs.realpathSync(dir);
102
+ }
103
+ catch {
104
+ continue;
105
+ }
106
+ if (!(resolved + path.sep).startsWith(boundary))
107
+ continue;
108
+ // One readdir per plan dir — covers both phase-count and (later, if needed)
109
+ // any other phase-aware checks. Avoids a second readdirSync.
110
+ let dirEntries;
111
+ try {
112
+ dirEntries = fs.readdirSync(dir);
113
+ }
114
+ catch {
115
+ continue;
116
+ }
117
+ if (!dirEntries.includes("plan.md"))
118
+ continue;
119
+ const planFile = path.join(dir, "plan.md");
120
+ let planStat;
121
+ try {
122
+ planStat = fs.statSync(planFile);
123
+ }
124
+ catch {
125
+ continue;
126
+ }
127
+ if (!planStat.isFile())
128
+ continue;
129
+ const fm = parsePlanFrontmatter(planFile);
130
+ if (!fm)
131
+ continue;
132
+ if (fm.status === "archived")
133
+ continue;
134
+ const phaseCount = dirEntries.filter((name) => PHASE_FILE_RE.test(name)).length;
135
+ results.push({
136
+ slug: entry.name,
137
+ title: fm.title,
138
+ status: fm.status,
139
+ created: fm.created,
140
+ effort: fm.effort,
141
+ mtimeMs: planStat.mtimeMs,
142
+ phaseCount,
143
+ });
144
+ }
145
+ results.sort((a, b) => b.mtimeMs - a.mtimeMs);
146
+ return results.slice(0, limit);
147
+ }
148
+ //# sourceMappingURL=list-plans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-plans.js","sourceRoot":"","sources":["../../../src/orchviz/plan/list-plans.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAa;IAC/C,OAAO;IACP,aAAa;IACb,QAAQ;IACR,WAAW;IACX,UAAU;IACV,SAAS;IACT,SAAS;CACT,CAAC,CAAC;AAEH,SAAS,mBAAmB,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAmB,CAAC;QAAE,OAAO,KAAmB,CAAC;IAC7E,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAC5B,QAAgB;IAOhB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,MAAM,OAAO,GACZ,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC9B,CAAC,CAAC,GAAG,CAAC,OAAO;QACb,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAChC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YACrB,CAAC,CAAC,EAAE,CAAC;IACR,MAAM,MAAM,GACX,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC7B,CAAC,CAAC,GAAG,CAAC,MAAM;QACZ,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAC/B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YACpB,CAAC,CAAC,GAAG,CAAC;IACT,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAMD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,OAAyB,EAAE;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,gBAAwB,CAAC;IAC7B,IAAI,CAAC;QACJ,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC;IAE7C,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACJ,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAExC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACJ,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAE1D,4EAA4E;QAC5E,6DAA6D;QAC7D,IAAI,UAAoB,CAAC;QACzB,IAAI,CAAC;YACJ,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,SAAS;QAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACJ,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,SAAS;QAEjC,MAAM,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,IAAI,EAAE,CAAC,MAAM,KAAK,UAAU;YAAE,SAAS;QAEvC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAEhF,OAAO,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,UAAU;SACV,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * parse-phase-file — extract status + todos + metadata from a phase-NN-*.md file.
3
+ *
4
+ * Per red-team H1: status extraction tries 3 sources (frontmatter, permissive
5
+ * regex against `## Overview`, lowercase scan) before falling back to "unknown"
6
+ * — never silently coerce to "pending".
7
+ *
8
+ * Per red-team C1: caller is responsible for boundary checks before this runs.
9
+ * Per red-team M2: frontmatter regex tolerates `\r\n`.
10
+ */
11
+ import type { PhaseState } from "./types.js";
12
+ export declare function parsePhaseFile(filePath: string): PhaseState | null;
13
+ //# sourceMappingURL=parse-phase-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-phase-file.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/parse-phase-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,YAAY,CAAC;AA2BpE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAgElE"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * parse-phase-file — extract status + todos + metadata from a phase-NN-*.md file.
3
+ *
4
+ * Per red-team H1: status extraction tries 3 sources (frontmatter, permissive
5
+ * regex against `## Overview`, lowercase scan) before falling back to "unknown"
6
+ * — never silently coerce to "pending".
7
+ *
8
+ * Per red-team C1: caller is responsible for boundary checks before this runs.
9
+ * Per red-team M2: frontmatter regex tolerates `\r\n`.
10
+ */
11
+ import * as fs from "node:fs";
12
+ import * as path from "node:path";
13
+ import yaml from "js-yaml";
14
+ import { FRONTMATTER_RE } from "./plan-constants.js";
15
+ const STATUS_BOLD_RE = /\*+\s*Status\s*:?\s*\*+\s*([A-Za-z_-]+)/i;
16
+ const STATUS_PLAIN_RE = /\bstatus\s*:\s*([a-z_-]+)/i;
17
+ const TODO_RE = /^\s*-\s*\[(\s|x|X|~|✓)\]\s+(.+?)\s*$/;
18
+ const PHASE_NUM_RE = /^phase-(\d+)/;
19
+ const HEADING_RE = /^#\s+Phase\s+\d+\s*[:.\-—]?\s*(.+?)\s*$/im;
20
+ const VALID_STATUSES = new Set([
21
+ "pending",
22
+ "active",
23
+ "in_progress",
24
+ "completed",
25
+ "failed",
26
+ "abandoned",
27
+ "unknown",
28
+ ]);
29
+ function normalizeStatus(raw) {
30
+ const lower = raw.toLowerCase().replace(/\s+/g, "_");
31
+ if (VALID_STATUSES.has(lower))
32
+ return lower;
33
+ if (lower === "in-progress")
34
+ return "in_progress";
35
+ if (lower === "done")
36
+ return "completed";
37
+ return "unknown";
38
+ }
39
+ export function parsePhaseFile(filePath) {
40
+ const fileName = path.basename(filePath);
41
+ let raw;
42
+ try {
43
+ raw = fs.readFileSync(filePath, "utf-8");
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ const numMatch = fileName.match(PHASE_NUM_RE);
49
+ const number = numMatch ? parseInt(numMatch[1], 10) : 0;
50
+ const abandonedFromName = fileName.toUpperCase().includes("ABANDONED");
51
+ let frontmatter = {};
52
+ const fmMatch = raw.match(FRONTMATTER_RE);
53
+ if (fmMatch) {
54
+ try {
55
+ const parsed = yaml.load(fmMatch[1], { schema: yaml.FAILSAFE_SCHEMA });
56
+ if (parsed && typeof parsed === "object") {
57
+ frontmatter = parsed;
58
+ }
59
+ }
60
+ catch {
61
+ /* malformed frontmatter; treat as absent */
62
+ }
63
+ }
64
+ const fmStatus = typeof frontmatter.status === "string" ? frontmatter.status.toLowerCase() : null;
65
+ const abandoned = abandonedFromName || fmStatus === "abandoned";
66
+ let status = "unknown";
67
+ if (abandoned) {
68
+ status = "abandoned";
69
+ }
70
+ else if (fmStatus) {
71
+ status = normalizeStatus(fmStatus);
72
+ }
73
+ else {
74
+ const boldMatch = raw.match(STATUS_BOLD_RE);
75
+ if (boldMatch) {
76
+ status = normalizeStatus(boldMatch[1]);
77
+ }
78
+ else {
79
+ const plainMatch = raw.match(STATUS_PLAIN_RE);
80
+ if (plainMatch)
81
+ status = normalizeStatus(plainMatch[1]);
82
+ }
83
+ }
84
+ const headingMatch = raw.match(HEADING_RE);
85
+ const title = headingMatch ? headingMatch[1].trim() : fileName.replace(/\.md$/, "");
86
+ const effort = typeof frontmatter.effort === "string"
87
+ ? frontmatter.effort
88
+ : extractEffort(raw) ?? "?";
89
+ const todos = extractTodos(raw);
90
+ return {
91
+ number,
92
+ title,
93
+ status,
94
+ effort,
95
+ todos,
96
+ filePath,
97
+ abandoned,
98
+ };
99
+ }
100
+ function extractEffort(raw) {
101
+ const match = raw.match(/\*+\s*Effort\s*:?\s*\*+\s*([^\n*]+?)\s*(?:\(|$)/im);
102
+ return match ? match[1].trim() : null;
103
+ }
104
+ /**
105
+ * Extract todos from the ## Todo List section.
106
+ *
107
+ * Per red-team C1: tracks ``` fence depth and skips checkbox lines inside
108
+ * fenced code blocks. This makes the reader's todoIdx consistent with the
109
+ * writer's applyTodoToggle walk (Phase 2). Reader and writer use the SAME
110
+ * counting logic — only checkboxes OUTSIDE fences are counted.
111
+ */
112
+ function extractTodos(raw) {
113
+ const todoSection = raw.match(/##\s+Todo\s+List\s*\n([\s\S]*?)(?=\n##\s|\n#\s|$)/i);
114
+ if (!todoSection)
115
+ return [];
116
+ const out = [];
117
+ let fenceDepth = 0;
118
+ for (const line of todoSection[1].split(/\r?\n/)) {
119
+ if (/^```/.test(line)) {
120
+ fenceDepth = fenceDepth === 0 ? 1 : 0;
121
+ continue;
122
+ }
123
+ if (fenceDepth > 0)
124
+ continue;
125
+ const m = line.match(TODO_RE);
126
+ if (!m)
127
+ continue;
128
+ const marker = m[1];
129
+ const text = m[2].trim();
130
+ if (!text)
131
+ continue;
132
+ out.push({ checked: marker !== " " && marker !== "", text });
133
+ }
134
+ return out;
135
+ }
136
+ //# sourceMappingURL=parse-phase-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-phase-file.js","sourceRoot":"","sources":["../../../src/orchviz/plan/parse-phase-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * parse-plan-file — read plan.md frontmatter into a PlanState scaffold.
3
+ *
4
+ * Per red-team M2: frontmatter regex tolerates `\r\n` (Windows checkouts).
5
+ * Per red-team C1: caller is responsible for boundary checks before this runs.
6
+ */
7
+ import type { PlanState } from "./types.js";
8
+ export interface PlanScaffold {
9
+ slug: string;
10
+ title: string;
11
+ status: string;
12
+ effort: string;
13
+ created: string;
14
+ path: string;
15
+ }
16
+ export declare function parsePlanFile(planDir: string): PlanScaffold | null;
17
+ /** Combine a scaffold + parsed phases into a PlanState. */
18
+ export declare function buildPlanState(scaffold: PlanScaffold, phases: PlanState["phases"]): PlanState;
19
+ //# sourceMappingURL=parse-plan-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-plan-file.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/parse-plan-file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACb;AAUD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAsClE;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,SAAS,CAE7F"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * parse-plan-file — read plan.md frontmatter into a PlanState scaffold.
3
+ *
4
+ * Per red-team M2: frontmatter regex tolerates `\r\n` (Windows checkouts).
5
+ * Per red-team C1: caller is responsible for boundary checks before this runs.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import yaml from "js-yaml";
10
+ import { FRONTMATTER_RE } from "./plan-constants.js";
11
+ function asString(v, fallback = "") {
12
+ if (typeof v === "string")
13
+ return v;
14
+ if (typeof v === "number")
15
+ return String(v);
16
+ return fallback;
17
+ }
18
+ export function parsePlanFile(planDir) {
19
+ const planFile = path.join(planDir, "plan.md");
20
+ let raw;
21
+ try {
22
+ raw = fs.readFileSync(planFile, "utf-8");
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ const slug = path.basename(planDir);
28
+ const fmMatch = raw.match(FRONTMATTER_RE);
29
+ if (!fmMatch) {
30
+ return {
31
+ slug,
32
+ title: slug,
33
+ status: "unknown",
34
+ effort: "?",
35
+ created: "",
36
+ path: planDir,
37
+ };
38
+ }
39
+ let parsed;
40
+ try {
41
+ parsed = yaml.load(fmMatch[1], { schema: yaml.FAILSAFE_SCHEMA });
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ if (!parsed || typeof parsed !== "object")
47
+ return null;
48
+ const obj = parsed;
49
+ return {
50
+ slug,
51
+ title: asString(obj.title, slug),
52
+ status: asString(obj.status, "unknown"),
53
+ effort: asString(obj.effort, "?"),
54
+ created: asString(obj.created, ""),
55
+ path: planDir,
56
+ };
57
+ }
58
+ /** Combine a scaffold + parsed phases into a PlanState. */
59
+ export function buildPlanState(scaffold, phases) {
60
+ return { ...scaffold, phases };
61
+ }
62
+ //# sourceMappingURL=parse-plan-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-plan-file.js","sourceRoot":"","sources":["../../../src/orchviz/plan/parse-plan-file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,IAAI,MAAM,SAAS,CAAC;AAY3B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,SAAS,QAAQ,CAAC,CAAU,EAAE,QAAQ,GAAG,EAAE;IAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO;YACN,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,OAAO;SACb,CAAC;IACH,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,OAAO;QACN,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;QAChC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;QACvC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;QACjC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,EAAE,OAAO;KACb,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,QAAsB,EAAE,MAA2B;IACjF,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared constants for the plan module — regexes used across multiple
3
+ * files (parser, collector, listPlans, etag, find-active-plan).
4
+ *
5
+ * Single source of truth eliminates drift if naming conventions change.
6
+ */
7
+ export declare const FRONTMATTER_RE: RegExp;
8
+ export declare const PHASE_FILE_RE: RegExp;
9
+ export declare const PHASE_FILE_NUM_RE: RegExp;
10
+ export declare const SLUG_RE: RegExp;
11
+ /**
12
+ * Build a regex matching `phase-NN-*.md` for a specific phase number,
13
+ * tolerating zero-padding (R2-1): phase=1 matches both `phase-01-x.md`
14
+ * and `phase-1-x.md`. Excludes leading-dot files (orphan tmps).
15
+ */
16
+ export declare function buildPhaseNumberRe(phase: number): RegExp;
17
+ //# sourceMappingURL=plan-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-constants.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/plan-constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,QAAgC,CAAC;AAC5D,eAAO,MAAM,aAAa,QAAwB,CAAC;AACnD,eAAO,MAAM,iBAAiB,QAA0B,CAAC;AACzD,eAAO,MAAM,OAAO,QAA0B,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared constants for the plan module — regexes used across multiple
3
+ * files (parser, collector, listPlans, etag, find-active-plan).
4
+ *
5
+ * Single source of truth eliminates drift if naming conventions change.
6
+ */
7
+ export const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---/;
8
+ export const PHASE_FILE_RE = /^phase-\d+-.+\.md$/i;
9
+ export const PHASE_FILE_NUM_RE = /^phase-(\d+)-.+\.md$/i;
10
+ export const SLUG_RE = /^[a-zA-Z0-9_-]{1,80}$/;
11
+ /**
12
+ * Build a regex matching `phase-NN-*.md` for a specific phase number,
13
+ * tolerating zero-padding (R2-1): phase=1 matches both `phase-01-x.md`
14
+ * and `phase-1-x.md`. Excludes leading-dot files (orphan tmps).
15
+ */
16
+ export function buildPhaseNumberRe(phase) {
17
+ return new RegExp(`^phase-0*${phase}-.*\\.md$`, "i");
18
+ }
19
+ //# sourceMappingURL=plan-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-constants.js","sourceRoot":"","sources":["../../../src/orchviz/plan/plan-constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,6BAA6B,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,uBAAuB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC/C,OAAO,IAAI,MAAM,CAAC,YAAY,KAAK,WAAW,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Plan parser types — describes the shape of an active plan + its phases for
3
+ * the /api/plan endpoint. Pure data; no logic.
4
+ */
5
+ export type PhaseStatus = "pending" | "active" | "in_progress" | "completed" | "failed" | "abandoned" | "unknown";
6
+ /**
7
+ * Plan-level status vocabulary (red-team H3).
8
+ * Used by listPlans and PlanSummary. "unknown" is the fallback for unrecognized strings.
9
+ */
10
+ export type PlanStatus = "draft" | "in_progress" | "active" | "completed" | "archived" | "blocked" | "unknown";
11
+ /**
12
+ * Lightweight summary of a plan — returned by GET /api/plans.
13
+ * Full plan state (with phases + todos) is returned by GET /api/plan?slug=<slug>.
14
+ */
15
+ export interface PlanSummary {
16
+ slug: string;
17
+ title: string;
18
+ status: PlanStatus;
19
+ created: string;
20
+ effort: string;
21
+ mtimeMs: number;
22
+ phaseCount: number;
23
+ }
24
+ export interface TodoItem {
25
+ checked: boolean;
26
+ text: string;
27
+ }
28
+ export interface PhaseState {
29
+ number: number;
30
+ title: string;
31
+ status: PhaseStatus;
32
+ effort: string;
33
+ todos: TodoItem[];
34
+ filePath: string;
35
+ abandoned: boolean;
36
+ }
37
+ export interface PlanState {
38
+ slug: string;
39
+ title: string;
40
+ status: string;
41
+ effort: string;
42
+ created: string;
43
+ phases: PhaseState[];
44
+ path: string;
45
+ }
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/orchviz/plan/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GACpB,SAAS,GACT,QAAQ,GACR,aAAa,GACb,WAAW,GACX,QAAQ,GACR,WAAW,GACX,SAAS,CAAC;AAEb;;;GAGG;AACH,MAAM,MAAM,UAAU,GACnB,OAAO,GACP,aAAa,GACb,QAAQ,GACR,WAAW,GACX,UAAU,GACV,SAAS,GACT,SAAS,CAAC;AAEb;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Plan parser types — describes the shape of an active plan + its phases for
3
+ * the /api/plan endpoint. Pure data; no logic.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/orchviz/plan/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Agent event protocol — types describing live Claude Code session events.
3
+ *
4
+ * Ported (in part) from patoles/agent-flow @ 59ccf4e
5
+ * Original: extension/src/protocol.ts
6
+ * License: Apache-2.0 (see ../../NOTICE)
7
+ *
8
+ * Modifications: dropped VS Code extension/webview message types;
9
+ * replaced FSWatcher import path; pruned helper signatures unused server-side.
10
+ */
11
+ import type { FSWatcher } from "node:fs";
12
+ export type AgentEventType = "agent_spawn" | "agent_complete" | "agent_idle" | "message" | "context_update" | "model_detected" | "tool_call_start" | "tool_call_end" | "subagent_dispatch" | "subagent_return" | "permission_requested" | "error";
13
+ export interface AgentEvent {
14
+ time: number;
15
+ type: AgentEventType;
16
+ payload: Record<string, unknown>;
17
+ sessionId?: string;
18
+ }
19
+ export interface SessionInfo {
20
+ id: string;
21
+ label: string;
22
+ status: "active" | "completed";
23
+ startTime: number;
24
+ lastActivityTime: number;
25
+ }
26
+ export interface TranscriptEntry {
27
+ sessionId: string;
28
+ type: string;
29
+ uuid?: string;
30
+ message: {
31
+ role: string;
32
+ model?: string;
33
+ content: Array<TranscriptContentBlock> | string;
34
+ };
35
+ }
36
+ export interface ToolUseBlock {
37
+ type: "tool_use";
38
+ name: string;
39
+ id: string;
40
+ input: Record<string, unknown>;
41
+ }
42
+ export interface ToolResultBlock {
43
+ type: "tool_result";
44
+ tool_use_id: string;
45
+ content: string | Array<{
46
+ text?: string;
47
+ type?: string;
48
+ }>;
49
+ }
50
+ export interface ThinkingBlock {
51
+ type: "thinking";
52
+ thinking: string;
53
+ }
54
+ export interface TextBlock {
55
+ type: "text";
56
+ text: string;
57
+ }
58
+ export type TranscriptContentBlock = ToolUseBlock | ToolResultBlock | ThinkingBlock | TextBlock | {
59
+ type: string;
60
+ [key: string]: unknown;
61
+ };
62
+ export interface AgentEventEmitter {
63
+ emit(event: AgentEvent, sessionId?: string): void;
64
+ elapsed(sessionId?: string): number;
65
+ }
66
+ export declare function emitSubagentSpawn(emitter: AgentEventEmitter, parent: string, child: string, task: string, sessionId?: string): void;
67
+ export interface PendingToolCall {
68
+ name: string;
69
+ args: string;
70
+ filePath?: string;
71
+ startTime: number;
72
+ }
73
+ export interface SubagentState {
74
+ watcher: FSWatcher | null;
75
+ fileSize: number;
76
+ agentName: string;
77
+ pendingToolCalls: Map<string, PendingToolCall>;
78
+ seenToolUseIds: Set<string>;
79
+ permissionTimer: NodeJS.Timeout | null;
80
+ permissionEmitted: boolean;
81
+ spawnEmitted: boolean;
82
+ }
83
+ export interface ContextBreakdown {
84
+ systemPrompt: number;
85
+ userMessages: number;
86
+ toolResults: number;
87
+ reasoning: number;
88
+ subagentResults: number;
89
+ }
90
+ export interface WatchedSession {
91
+ sessionId: string;
92
+ filePath: string;
93
+ fileWatcher: FSWatcher | null;
94
+ pollTimer: NodeJS.Timeout | null;
95
+ fileSize: number;
96
+ sessionStartTime: number;
97
+ pendingToolCalls: Map<string, PendingToolCall>;
98
+ seenToolUseIds: Set<string>;
99
+ seenMessageHashes: Set<string>;
100
+ sessionDetected: boolean;
101
+ sessionCompleted: boolean;
102
+ lastActivityTime: number;
103
+ inactivityTimer: NodeJS.Timeout | null;
104
+ subagentWatchers: Map<string, SubagentState>;
105
+ spawnedSubagents: Set<string>;
106
+ inlineProgressAgents: Set<string>;
107
+ subagentsDirWatcher: FSWatcher | null;
108
+ subagentsDir: string | null;
109
+ label: string;
110
+ labelSet: boolean;
111
+ model: string | null;
112
+ permissionTimer: NodeJS.Timeout | null;
113
+ permissionEmitted: boolean;
114
+ contextBreakdown: ContextBreakdown;
115
+ }
116
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/orchviz/protocol.ts"],"names":[],"mappings":"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"}