mewkit 1.14.1 → 1.15.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 +7 -0
  2. package/dist/commands/capabilities.d.ts +13 -0
  3. package/dist/commands/capabilities.d.ts.map +1 -0
  4. package/dist/commands/capabilities.js +230 -0
  5. package/dist/commands/capabilities.js.map +1 -0
  6. package/dist/commands/context.d.ts +10 -0
  7. package/dist/commands/context.d.ts.map +1 -0
  8. package/dist/commands/context.js +125 -0
  9. package/dist/commands/context.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +27 -0
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +123 -0
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/providers.d.ts +2 -0
  15. package/dist/commands/providers.d.ts.map +1 -1
  16. package/dist/commands/providers.js +77 -0
  17. package/dist/commands/providers.js.map +1 -1
  18. package/dist/commands/task-state.d.ts +13 -0
  19. package/dist/commands/task-state.d.ts.map +1 -0
  20. package/dist/commands/task-state.js +106 -0
  21. package/dist/commands/task-state.js.map +1 -0
  22. package/dist/commands/validate.d.ts +48 -1
  23. package/dist/commands/validate.d.ts.map +1 -1
  24. package/dist/commands/validate.js +97 -24
  25. package/dist/commands/validate.js.map +1 -1
  26. package/dist/core/availability.d.ts +40 -0
  27. package/dist/core/availability.d.ts.map +1 -0
  28. package/dist/core/availability.js +47 -0
  29. package/dist/core/availability.js.map +1 -0
  30. package/dist/core/bootstrap.d.ts +19 -0
  31. package/dist/core/bootstrap.d.ts.map +1 -0
  32. package/dist/core/bootstrap.js +42 -0
  33. package/dist/core/bootstrap.js.map +1 -0
  34. package/dist/core/build-capabilities.d.ts +9 -0
  35. package/dist/core/build-capabilities.d.ts.map +1 -0
  36. package/dist/core/build-capabilities.js +123 -0
  37. package/dist/core/build-capabilities.js.map +1 -0
  38. package/dist/core/build-inventory.d.ts +2 -0
  39. package/dist/core/build-inventory.d.ts.map +1 -1
  40. package/dist/core/build-inventory.js +1 -1
  41. package/dist/core/build-inventory.js.map +1 -1
  42. package/dist/core/capability-authored.d.ts +26 -0
  43. package/dist/core/capability-authored.d.ts.map +1 -0
  44. package/dist/core/capability-authored.js +117 -0
  45. package/dist/core/capability-authored.js.map +1 -0
  46. package/dist/core/capability-snapshot.d.ts +13 -0
  47. package/dist/core/capability-snapshot.d.ts.map +1 -0
  48. package/dist/core/capability-snapshot.js +53 -0
  49. package/dist/core/capability-snapshot.js.map +1 -0
  50. package/dist/core/capability.d.ts +519 -0
  51. package/dist/core/capability.d.ts.map +1 -0
  52. package/dist/core/capability.js +114 -0
  53. package/dist/core/capability.js.map +1 -0
  54. package/dist/core/compute-checksums.d.ts.map +1 -1
  55. package/dist/core/compute-checksums.js +8 -2
  56. package/dist/core/compute-checksums.js.map +1 -1
  57. package/dist/core/consolidation-ledger.d.ts +30 -0
  58. package/dist/core/consolidation-ledger.d.ts.map +1 -0
  59. package/dist/core/consolidation-ledger.js +145 -0
  60. package/dist/core/consolidation-ledger.js.map +1 -0
  61. package/dist/core/generate-capability-view.d.ts +21 -0
  62. package/dist/core/generate-capability-view.d.ts.map +1 -0
  63. package/dist/core/generate-capability-view.js +48 -0
  64. package/dist/core/generate-capability-view.js.map +1 -0
  65. package/dist/core/install-metadata.d.ts +47 -30
  66. package/dist/core/install-metadata.d.ts.map +1 -1
  67. package/dist/core/install-metadata.js +49 -9
  68. package/dist/core/install-metadata.js.map +1 -1
  69. package/dist/core/plugin-manifest.d.ts +16 -16
  70. package/dist/core/provider-adapter.d.ts +28 -0
  71. package/dist/core/provider-adapter.d.ts.map +1 -0
  72. package/dist/core/provider-adapter.js +31 -0
  73. package/dist/core/provider-adapter.js.map +1 -0
  74. package/dist/core/provider-invocation.d.ts +14 -0
  75. package/dist/core/provider-invocation.d.ts.map +1 -0
  76. package/dist/core/provider-invocation.js +56 -0
  77. package/dist/core/provider-invocation.js.map +1 -0
  78. package/dist/core/provider-lifecycle.d.ts +35 -0
  79. package/dist/core/provider-lifecycle.d.ts.map +1 -0
  80. package/dist/core/provider-lifecycle.js +101 -0
  81. package/dist/core/provider-lifecycle.js.map +1 -0
  82. package/dist/core/provider-projection.d.ts +29 -0
  83. package/dist/core/provider-projection.d.ts.map +1 -0
  84. package/dist/core/provider-projection.js +47 -0
  85. package/dist/core/provider-projection.js.map +1 -0
  86. package/dist/core/release-metadata.d.ts +9 -2
  87. package/dist/core/release-metadata.d.ts.map +1 -1
  88. package/dist/core/release-metadata.js +13 -0
  89. package/dist/core/release-metadata.js.map +1 -1
  90. package/dist/core/repo-context-adapter.d.ts +23 -0
  91. package/dist/core/repo-context-adapter.d.ts.map +1 -0
  92. package/dist/core/repo-context-adapter.js +44 -0
  93. package/dist/core/repo-context-adapter.js.map +1 -0
  94. package/dist/core/repo-context.d.ts +147 -0
  95. package/dist/core/repo-context.d.ts.map +1 -0
  96. package/dist/core/repo-context.js +204 -0
  97. package/dist/core/repo-context.js.map +1 -0
  98. package/dist/core/resolve-capabilities.d.ts +70 -0
  99. package/dist/core/resolve-capabilities.d.ts.map +1 -0
  100. package/dist/core/resolve-capabilities.js +124 -0
  101. package/dist/core/resolve-capabilities.js.map +1 -0
  102. package/dist/core/smart-update.d.ts.map +1 -1
  103. package/dist/core/smart-update.js +13 -12
  104. package/dist/core/smart-update.js.map +1 -1
  105. package/dist/core/task-record.d.ts +252 -0
  106. package/dist/core/task-record.d.ts.map +1 -0
  107. package/dist/core/task-record.js +252 -0
  108. package/dist/core/task-record.js.map +1 -0
  109. package/dist/core/validate-capabilities.d.ts +12 -0
  110. package/dist/core/validate-capabilities.d.ts.map +1 -0
  111. package/dist/core/validate-capabilities.js +138 -0
  112. package/dist/core/validate-capabilities.js.map +1 -0
  113. package/dist/index.js +66 -4
  114. package/dist/index.js.map +1 -1
  115. package/dist/migrate/capability-bootstrap-projection.d.ts +11 -0
  116. package/dist/migrate/capability-bootstrap-projection.d.ts.map +1 -0
  117. package/dist/migrate/capability-bootstrap-projection.js +48 -0
  118. package/dist/migrate/capability-bootstrap-projection.js.map +1 -0
  119. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
  120. package/dist/migrate/migrate-orchestrator.js +22 -0
  121. package/dist/migrate/migrate-orchestrator.js.map +1 -1
  122. package/dist/migrate/reconcile/portable-registry.d.ts +18 -18
  123. package/dist/orchviz-web/index.js +3 -3
  124. package/package.json +1 -1
  125. package/dist/commands/evolve.d.ts +0 -11
  126. package/dist/commands/evolve.d.ts.map +0 -1
  127. package/dist/commands/evolve.js +0 -63
  128. package/dist/commands/evolve.js.map +0 -1
  129. package/dist/commands/health.d.ts +0 -14
  130. package/dist/commands/health.d.ts.map +0 -1
  131. package/dist/commands/health.js +0 -193
  132. package/dist/commands/health.js.map +0 -1
  133. package/dist/commands/policy.d.ts +0 -8
  134. package/dist/commands/policy.d.ts.map +0 -1
  135. package/dist/commands/policy.js +0 -65
  136. package/dist/commands/policy.js.map +0 -1
  137. package/dist/commands/portability.d.ts +0 -7
  138. package/dist/commands/portability.d.ts.map +0 -1
  139. package/dist/commands/portability.js +0 -50
  140. package/dist/commands/portability.js.map +0 -1
  141. package/dist/commands/reflect.d.ts +0 -14
  142. package/dist/commands/reflect.d.ts.map +0 -1
  143. package/dist/commands/reflect.js +0 -135
  144. package/dist/commands/reflect.js.map +0 -1
  145. package/dist/commands/simulate.d.ts +0 -14
  146. package/dist/commands/simulate.d.ts.map +0 -1
  147. package/dist/commands/simulate.js +0 -86
  148. package/dist/commands/simulate.js.map +0 -1
  149. package/dist/core/event-log.d.ts +0 -44
  150. package/dist/core/event-log.d.ts.map +0 -1
  151. package/dist/core/event-log.js +0 -169
  152. package/dist/core/event-log.js.map +0 -1
  153. package/dist/core/evolution/event-clusters.d.ts +0 -4
  154. package/dist/core/evolution/event-clusters.d.ts.map +0 -1
  155. package/dist/core/evolution/event-clusters.js +0 -82
  156. package/dist/core/evolution/event-clusters.js.map +0 -1
  157. package/dist/core/evolution/recommendation-renderer.d.ts +0 -3
  158. package/dist/core/evolution/recommendation-renderer.d.ts.map +0 -1
  159. package/dist/core/evolution/recommendation-renderer.js +0 -24
  160. package/dist/core/evolution/recommendation-renderer.js.map +0 -1
  161. package/dist/core/evolution/review-failure-clusters.d.ts +0 -10
  162. package/dist/core/evolution/review-failure-clusters.d.ts.map +0 -1
  163. package/dist/core/evolution/review-failure-clusters.js +0 -30
  164. package/dist/core/evolution/review-failure-clusters.js.map +0 -1
  165. package/dist/core/evolution/suggestions.d.ts +0 -24
  166. package/dist/core/evolution/suggestions.d.ts.map +0 -1
  167. package/dist/core/evolution/suggestions.js +0 -11
  168. package/dist/core/evolution/suggestions.js.map +0 -1
  169. package/dist/core/gate-policy.d.ts +0 -20
  170. package/dist/core/gate-policy.d.ts.map +0 -1
  171. package/dist/core/gate-policy.js +0 -64
  172. package/dist/core/gate-policy.js.map +0 -1
  173. package/dist/core/portability-matrix.d.ts +0 -17
  174. package/dist/core/portability-matrix.d.ts.map +0 -1
  175. package/dist/core/portability-matrix.js +0 -31
  176. package/dist/core/portability-matrix.js.map +0 -1
  177. package/dist/core/simulation-runner.d.ts +0 -93
  178. package/dist/core/simulation-runner.d.ts.map +0 -1
  179. package/dist/core/simulation-runner.js +0 -161
  180. package/dist/core/simulation-runner.js.map +0 -1
  181. package/dist/core/usage/usage-analyzer.d.ts +0 -18
  182. package/dist/core/usage/usage-analyzer.d.ts.map +0 -1
  183. package/dist/core/usage/usage-analyzer.js +0 -41
  184. package/dist/core/usage/usage-analyzer.js.map +0 -1
  185. package/dist/memory/archive.d.ts +0 -9
  186. package/dist/memory/archive.d.ts.map +0 -1
  187. package/dist/memory/archive.js +0 -42
  188. package/dist/memory/archive.js.map +0 -1
  189. package/dist/memory/compact.d.ts +0 -9
  190. package/dist/memory/compact.d.ts.map +0 -1
  191. package/dist/memory/compact.js +0 -33
  192. package/dist/memory/compact.js.map +0 -1
  193. package/dist/memory/conflicts.d.ts +0 -8
  194. package/dist/memory/conflicts.d.ts.map +0 -1
  195. package/dist/memory/conflicts.js +0 -28
  196. package/dist/memory/conflicts.js.map +0 -1
  197. package/dist/memory/promote.d.ts +0 -8
  198. package/dist/memory/promote.d.ts.map +0 -1
  199. package/dist/memory/promote.js +0 -10
  200. package/dist/memory/promote.js.map +0 -1
  201. package/dist/memory/store-utils.d.ts +0 -14
  202. package/dist/memory/store-utils.d.ts.map +0 -1
  203. package/dist/memory/store-utils.js +0 -44
  204. package/dist/memory/store-utils.js.map +0 -1
  205. package/dist/migrate/__tests__/frontmatter-parser.test.d.ts +0 -2
  206. package/dist/migrate/__tests__/frontmatter-parser.test.d.ts.map +0 -1
  207. package/dist/migrate/__tests__/frontmatter-parser.test.js +0 -73
  208. package/dist/migrate/__tests__/frontmatter-parser.test.js.map +0 -1
  209. package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts +0 -2
  210. package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts.map +0 -1
  211. package/dist/migrate/__tests__/md-strip-mewkit.test.js +0 -55
  212. package/dist/migrate/__tests__/md-strip-mewkit.test.js.map +0 -1
  213. package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts +0 -2
  214. package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts.map +0 -1
  215. package/dist/migrate/__tests__/migrate-scope-resolver.test.js +0 -53
  216. package/dist/migrate/__tests__/migrate-scope-resolver.test.js.map +0 -1
  217. package/dist/migrate/__tests__/process-lock.test.d.ts +0 -2
  218. package/dist/migrate/__tests__/process-lock.test.d.ts.map +0 -1
  219. package/dist/migrate/__tests__/process-lock.test.js +0 -63
  220. package/dist/migrate/__tests__/process-lock.test.js.map +0 -1
  221. package/dist/migrate/__tests__/provider-registry.test.d.ts +0 -2
  222. package/dist/migrate/__tests__/provider-registry.test.d.ts.map +0 -1
  223. package/dist/migrate/__tests__/provider-registry.test.js +0 -53
  224. package/dist/migrate/__tests__/provider-registry.test.js.map +0 -1
  225. package/dist/migrate/__tests__/reconciler.test.d.ts +0 -2
  226. package/dist/migrate/__tests__/reconciler.test.d.ts.map +0 -1
  227. package/dist/migrate/__tests__/reconciler.test.js +0 -180
  228. package/dist/migrate/__tests__/reconciler.test.js.map +0 -1
  229. package/dist/migrate/__tests__/skill-id-utils.test.d.ts +0 -2
  230. package/dist/migrate/__tests__/skill-id-utils.test.d.ts.map +0 -1
  231. package/dist/migrate/__tests__/skill-id-utils.test.js +0 -78
  232. package/dist/migrate/__tests__/skill-id-utils.test.js.map +0 -1
  233. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts +0 -15
  234. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts.map +0 -1
  235. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js +0 -165
  236. package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js.map +0 -1
  237. package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts +0 -11
  238. package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts.map +0 -1
  239. package/dist/orchviz/plan/__tests__/atomic-write.test.js +0 -89
  240. package/dist/orchviz/plan/__tests__/atomic-write.test.js.map +0 -1
  241. package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts +0 -10
  242. package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts.map +0 -1
  243. package/dist/orchviz/plan/__tests__/end-to-end.test.js +0 -132
  244. package/dist/orchviz/plan/__tests__/end-to-end.test.js.map +0 -1
  245. package/dist/orchviz/plan/__tests__/etag.test.d.ts +0 -11
  246. package/dist/orchviz/plan/__tests__/etag.test.d.ts.map +0 -1
  247. package/dist/orchviz/plan/__tests__/etag.test.js +0 -92
  248. package/dist/orchviz/plan/__tests__/etag.test.js.map +0 -1
  249. package/dist/orchviz/plan/__tests__/list-plans.test.d.ts +0 -14
  250. package/dist/orchviz/plan/__tests__/list-plans.test.d.ts.map +0 -1
  251. package/dist/orchviz/plan/__tests__/list-plans.test.js +0 -154
  252. package/dist/orchviz/plan/__tests__/list-plans.test.js.map +0 -1
  253. package/dist/orchviz/server/__tests__/security-smoke.test.d.ts +0 -13
  254. package/dist/orchviz/server/__tests__/security-smoke.test.d.ts.map +0 -1
  255. package/dist/orchviz/server/__tests__/security-smoke.test.js +0 -207
  256. package/dist/orchviz/server/__tests__/security-smoke.test.js.map +0 -1
  257. package/dist/orchviz/server/__tests__/write-handlers.test.d.ts +0 -24
  258. package/dist/orchviz/server/__tests__/write-handlers.test.d.ts.map +0 -1
  259. package/dist/orchviz/server/__tests__/write-handlers.test.js +0 -347
  260. package/dist/orchviz/server/__tests__/write-handlers.test.js.map +0 -1
  261. package/dist/orchviz/test-server-boot.d.ts +0 -28
  262. package/dist/orchviz/test-server-boot.d.ts.map +0 -1
  263. package/dist/orchviz/test-server-boot.js +0 -64
  264. package/dist/orchviz/test-server-boot.js.map +0 -1
@@ -1,207 +0,0 @@
1
- /**
2
- * Security smoke tests — adversarial and regression cases for OrchvizServer.
3
- *
4
- * Adv-3 Symlink-out (M15): symlink inside planDir → 403; target unchanged
5
- * Adv-4 Slow-loris (M11): body trickle triggers 5s timeout socket destroy
6
- * R2-13 Orphaned .orchviz-tmp-* > 5min cleaned on next write
7
- * V1-1 GET /api/plan most-recent works (no slug)
8
- * V1-2 serveStatic 404 on unknown path
9
- * V1-3 SSE /events responds with text/event-stream
10
- * V1-4 Bad Host header → 403
11
- */
12
- import { describe, expect, it, beforeEach, afterEach } from "vitest";
13
- import { EventEmitter } from "node:events";
14
- import * as fs from "node:fs";
15
- import * as os from "node:os";
16
- import * as path from "node:path";
17
- import * as http from "node:http";
18
- import { OrchvizServer } from "../index.js";
19
- import { PlanCollector } from "../../plan/collector.js";
20
- import { computePhaseFileEtag } from "../../plan/etag.js";
21
- import { resetPlansDirCache } from "../write-utils.js";
22
- let active = null;
23
- let tmpDir = null;
24
- let serverUrl = "";
25
- let serverPort = 0;
26
- let currentSlug = "";
27
- function makeProjectRoot() {
28
- currentSlug = `260501-smoke-${Date.now()}`;
29
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "security-smoke-"));
30
- const plansDir = path.join(tmpDir, "tasks", "plans", currentSlug);
31
- fs.mkdirSync(plansDir, { recursive: true });
32
- fs.writeFileSync(path.join(plansDir, "phase-01-smoke.md"), "# Phase 1\n\n## Todo List\n\n- [ ] Smoke task A\n- [ ] Smoke task B\n", "utf-8");
33
- fs.writeFileSync(path.join(plansDir, "plan.md"), "---\ntitle: Smoke\nstatus: draft\n---\n# Smoke\n", "utf-8");
34
- return tmpDir;
35
- }
36
- async function startServer(root) {
37
- resetPlansDirCache();
38
- const planCollector = new PlanCollector(root);
39
- const ev = new EventEmitter();
40
- active = new OrchvizServer({ staticDir: os.tmpdir(), eventSource: ev, projectRoot: root,
41
- planCollector, planProvider: (slug) => planCollector.snapshot(slug) });
42
- serverUrl = await active.start();
43
- serverPort = active.port;
44
- }
45
- /** GET that resolves on headers (safe for SSE — doesn't wait for stream end). */
46
- function headGet(urlPath, hdrs = {}) {
47
- const u = new URL(serverUrl);
48
- return new Promise((resolve, reject) => {
49
- const req = http.request({ hostname: u.hostname, port: Number(u.port), path: urlPath, method: "GET",
50
- headers: { Host: `${u.hostname}:${u.port}`, ...hdrs } }, (res) => {
51
- const ct = typeof res.headers["content-type"] === "string" ? res.headers["content-type"] : "";
52
- let body = "";
53
- res.setEncoding("utf-8");
54
- res.on("data", (c) => { body += c; });
55
- res.on("end", () => resolve({ status: res.statusCode ?? 0, body, ct }));
56
- // For SSE: destroy after first data or after 50ms so the stream doesn't hang
57
- setTimeout(() => {
58
- try {
59
- res.destroy();
60
- req.destroy();
61
- }
62
- catch { /* ok */ }
63
- resolve({ status: res.statusCode ?? 0, body, ct });
64
- }, 50);
65
- res.on("error", (e) => {
66
- if (e.code === "ECONNRESET" || e.code === "ERR_HTTP_SOCKET_CLOSED")
67
- return;
68
- reject(e);
69
- });
70
- });
71
- req.on("error", (e) => {
72
- if (e.code === "ECONNRESET")
73
- return;
74
- reject(e);
75
- });
76
- req.end();
77
- });
78
- }
79
- function postTodo(body, extraHdrs = {}) {
80
- const u = new URL(serverUrl);
81
- const bodyStr = JSON.stringify(body);
82
- return new Promise((resolve, reject) => {
83
- const req = http.request({ hostname: u.hostname, port: Number(u.port), path: "/api/plan/todo", method: "POST",
84
- headers: { Host: `${u.hostname}:${u.port}`, "Content-Type": "application/json",
85
- Origin: `http://127.0.0.1:${serverPort}`, "Content-Length": String(Buffer.byteLength(bodyStr)), ...extraHdrs } }, (res) => {
86
- let body = "";
87
- res.setEncoding("utf-8");
88
- res.on("data", (c) => { body += c; });
89
- res.on("end", () => resolve({ status: res.statusCode ?? 0, body }));
90
- res.on("error", reject);
91
- });
92
- req.on("error", reject);
93
- req.write(bodyStr);
94
- req.end();
95
- });
96
- }
97
- beforeEach(async () => { delete process.env.MEOWKIT_ORCHVIZ_READONLY; await startServer(makeProjectRoot()); });
98
- afterEach(async () => {
99
- delete process.env.MEOWKIT_ORCHVIZ_READONLY;
100
- if (active) {
101
- await active.stop();
102
- active = null;
103
- }
104
- if (tmpDir) {
105
- fs.rmSync(tmpDir, { recursive: true, force: true });
106
- tmpDir = null;
107
- }
108
- resetPlansDirCache();
109
- });
110
- describe("Adv-3: symlink-out (M15)", () => {
111
- it("POST to symlinked phase outside planDir → 4xx; target unchanged", async () => {
112
- const outsideTarget = path.join(os.tmpdir(), `orchviz-outside-${Date.now()}.md`);
113
- fs.writeFileSync(outsideTarget, "sensitive data — must not be touched", "utf-8");
114
- try {
115
- const planDir = path.join(tmpDir, "tasks", "plans", currentSlug);
116
- try {
117
- fs.symlinkSync(outsideTarget, path.join(planDir, "phase-09-evil.md"));
118
- }
119
- catch {
120
- fs.unlinkSync(outsideTarget);
121
- return;
122
- }
123
- const etag = computePhaseFileEtag(path.join(planDir, "phase-01-smoke.md"));
124
- const r = await postTodo({ slug: currentSlug, phase: 9, todoIdx: 0, checked: true, etag });
125
- expect([400, 403]).toContain(r.status);
126
- expect(JSON.parse(r.body).ok).toBeUndefined();
127
- expect(fs.readFileSync(outsideTarget, "utf-8")).toBe("sensitive data — must not be touched");
128
- }
129
- finally {
130
- try {
131
- fs.unlinkSync(outsideTarget);
132
- }
133
- catch { /* ok */ }
134
- }
135
- });
136
- });
137
- describe("Adv-4: slow-loris (M11)", () => {
138
- it("server destroys socket at 5s timeout", async () => {
139
- const start = Date.now();
140
- const result = await new Promise((resolve) => {
141
- const u = new URL(serverUrl);
142
- const req = http.request({ hostname: u.hostname, port: Number(u.port), path: "/api/plan/todo", method: "POST",
143
- headers: { Host: `${u.hostname}:${u.port}`, "Content-Type": "application/json",
144
- Origin: `http://127.0.0.1:${serverPort}`, "Transfer-Encoding": "chunked" } }, (res) => { res.resume(); resolve({ closed: true, elapsed: Date.now() - start }); });
145
- req.on("error", (err) => {
146
- const c = err.code;
147
- resolve({ closed: c === "ECONNRESET" || c === "EPIPE" || c === "ECONNREFUSED", elapsed: Date.now() - start });
148
- });
149
- let sent = 0;
150
- const tick = setInterval(() => {
151
- sent++;
152
- try {
153
- req.write("{");
154
- }
155
- catch {
156
- clearInterval(tick);
157
- resolve({ closed: true, elapsed: Date.now() - start });
158
- }
159
- if (sent > 10) {
160
- clearInterval(tick);
161
- req.destroy();
162
- resolve({ closed: false, elapsed: Date.now() - start });
163
- }
164
- }, 1000);
165
- });
166
- expect(result.closed).toBe(true);
167
- expect(result.elapsed).toBeLessThan(6500);
168
- }, 8000);
169
- });
170
- describe("R2-13: orphan tmp cleanup", () => {
171
- it("orphaned .orchviz-tmp-* older than 5min removed on next write", async () => {
172
- const planDir = path.join(tmpDir, "tasks", "plans", currentSlug);
173
- const orphan1 = path.join(planDir, ".orchviz-tmp-fakeorphan1");
174
- const orphan2 = path.join(planDir, ".orchviz-tmp-fakeorphan2");
175
- fs.writeFileSync(orphan1, "o1");
176
- fs.writeFileSync(orphan2, "o2");
177
- const t = new Date(Date.now() - 6 * 60 * 1000);
178
- fs.utimesSync(orphan1, t, t);
179
- fs.utimesSync(orphan2, t, t);
180
- const etag = computePhaseFileEtag(path.join(planDir, "phase-01-smoke.md"));
181
- const r = await postTodo({ slug: currentSlug, phase: 1, todoIdx: 0, checked: true, etag });
182
- expect(r.status).toBe(200);
183
- expect(JSON.parse(r.body)).toMatchObject({ ok: true });
184
- expect(fs.existsSync(orphan1)).toBe(false);
185
- expect(fs.existsSync(orphan2)).toBe(false);
186
- });
187
- });
188
- describe("V1.1 regression smokes", () => {
189
- it("V1-1: GET /api/plan returns 200 with non-null plan", async () => {
190
- const { status, body } = await headGet("/api/plan");
191
- expect(status).toBe(200);
192
- const json = JSON.parse(body);
193
- expect(json.plan).not.toBeNull();
194
- });
195
- it("V1-2: GET /nonexistent → 404", async () => {
196
- expect((await headGet("/nonexistent-path-xyz")).status).toBe(404);
197
- });
198
- it("V1-3: GET /events returns text/event-stream", async () => {
199
- const { status, ct } = await headGet("/events");
200
- expect(status).toBe(200);
201
- expect(ct).toContain("text/event-stream");
202
- });
203
- it("V1-4: bad Host → 403", async () => {
204
- expect((await headGet("/api/plan", { Host: "evil.example.com" })).status).toBe(403);
205
- });
206
- });
207
- //# sourceMappingURL=security-smoke.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-smoke.test.js","sourceRoot":"","sources":["../../../../src/orchviz/server/__tests__/security-smoke.test.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Integration tests for write-handlers.ts — POST /api/plan/todo.
3
- *
4
- * Each test spins up an ephemeral-port OrchvizServer with a temp fixture dir,
5
- * makes HTTP requests, and verifies responses + on-disk state.
6
- *
7
- * Coverage (10+ cases):
8
- * 1. 200 happy path — file mutated, ok:true, changed:true, new etag
9
- * 2. 200 idempotent no-op — changed:false, mtime unchanged
10
- * 3. 400 missing Origin header
11
- * 4. 403 disallowed Origin header
12
- * 5. 405 MEOWKIT_ORCHVIZ_READONLY=1
13
- * 6. 409 stale etag — file unchanged
14
- * 7. 413 body > 4KB
15
- * 8. 415 wrong Content-Type
16
- * 9. OPTIONS 204 — allowed origin
17
- * 10. OPTIONS 403 — disallowed origin (no ACAO header emitted)
18
- * 11. 400 invalid JSON
19
- * 12. 400 zod validation failure (bad phase number)
20
- * 13. POST to /api/plan (unrelated path) still returns 405 (v1.1 regression guard)
21
- * 14. Phase zero-pad: POST {phase:1} matches phase-01-*.md
22
- */
23
- export {};
24
- //# sourceMappingURL=write-handlers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-handlers.test.d.ts","sourceRoot":"","sources":["../../../../src/orchviz/server/__tests__/write-handlers.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
@@ -1,347 +0,0 @@
1
- /**
2
- * Integration tests for write-handlers.ts — POST /api/plan/todo.
3
- *
4
- * Each test spins up an ephemeral-port OrchvizServer with a temp fixture dir,
5
- * makes HTTP requests, and verifies responses + on-disk state.
6
- *
7
- * Coverage (10+ cases):
8
- * 1. 200 happy path — file mutated, ok:true, changed:true, new etag
9
- * 2. 200 idempotent no-op — changed:false, mtime unchanged
10
- * 3. 400 missing Origin header
11
- * 4. 403 disallowed Origin header
12
- * 5. 405 MEOWKIT_ORCHVIZ_READONLY=1
13
- * 6. 409 stale etag — file unchanged
14
- * 7. 413 body > 4KB
15
- * 8. 415 wrong Content-Type
16
- * 9. OPTIONS 204 — allowed origin
17
- * 10. OPTIONS 403 — disallowed origin (no ACAO header emitted)
18
- * 11. 400 invalid JSON
19
- * 12. 400 zod validation failure (bad phase number)
20
- * 13. POST to /api/plan (unrelated path) still returns 405 (v1.1 regression guard)
21
- * 14. Phase zero-pad: POST {phase:1} matches phase-01-*.md
22
- */
23
- import { describe, expect, it, afterEach, beforeEach } from "vitest";
24
- import { EventEmitter } from "node:events";
25
- import * as fs from "node:fs";
26
- import * as os from "node:os";
27
- import * as path from "node:path";
28
- import * as http from "node:http";
29
- import { OrchvizServer } from "../index.js";
30
- import { computePhaseFileEtag } from "../../plan/etag.js";
31
- import { PlanCollector } from "../../plan/collector.js";
32
- let active = null;
33
- let tmpDir = null;
34
- let serverUrl = "";
35
- let serverPort = 0;
36
- // ── Fixture helpers ─────────────────────────────────────────────────────────
37
- function makeProjectRoot() {
38
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "write-handler-test-"));
39
- const root = tmpDir;
40
- const slug = "260501-test-plan";
41
- const planDir = path.join(root, "tasks", "plans", slug);
42
- fs.mkdirSync(planDir, { recursive: true });
43
- const phaseContent = [
44
- "# Phase 1",
45
- "",
46
- "## Todo List",
47
- "",
48
- "- [ ] Task A",
49
- "- [x] Task B",
50
- "- [ ] Task C",
51
- "",
52
- "## Next Steps",
53
- "",
54
- ].join("\n");
55
- const phaseFile = path.join(planDir, "phase-01-setup.md");
56
- fs.writeFileSync(phaseFile, phaseContent, "utf-8");
57
- // plan.md stub
58
- fs.writeFileSync(path.join(planDir, "plan.md"), "---\ntitle: Test\n---\n# Test\n", "utf-8");
59
- return { root, planDir, phaseFile };
60
- }
61
- async function startServer(projectRoot) {
62
- const staticDir = os.tmpdir();
63
- const planCollector = new PlanCollector(projectRoot);
64
- const ev = new EventEmitter();
65
- active = new OrchvizServer({
66
- staticDir,
67
- eventSource: ev,
68
- projectRoot,
69
- planCollector,
70
- });
71
- serverUrl = await active.start();
72
- serverPort = active.port;
73
- }
74
- function rawRequest(opts) {
75
- return new Promise((resolve, reject) => {
76
- const u = new URL(serverUrl);
77
- const reqOpts = {
78
- host: u.hostname,
79
- port: Number(u.port),
80
- path: opts.path,
81
- method: opts.method,
82
- headers: {
83
- Host: `${u.hostname}:${u.port}`,
84
- ...opts.headers,
85
- },
86
- };
87
- const req = http.request(reqOpts, (res) => {
88
- const resHeaders = {};
89
- for (const [k, v] of Object.entries(res.headers)) {
90
- if (typeof v === "string")
91
- resHeaders[k] = v;
92
- }
93
- let body = "";
94
- res.setEncoding("utf-8");
95
- res.on("data", (chunk) => { body += chunk; });
96
- res.on("end", () => resolve({ status: res.statusCode ?? 0, headers: resHeaders, body }));
97
- res.on("error", reject);
98
- });
99
- req.on("error", reject);
100
- if (opts.body)
101
- req.write(opts.body);
102
- req.end();
103
- });
104
- }
105
- function postTodo(body, extraHeaders = {}) {
106
- const bodyStr = JSON.stringify(body);
107
- return rawRequest({
108
- method: "POST",
109
- path: "/api/plan/todo",
110
- headers: {
111
- "Content-Type": "application/json",
112
- "Origin": `http://127.0.0.1:${serverPort}`,
113
- ...extraHeaders,
114
- },
115
- body: bodyStr,
116
- });
117
- }
118
- function validBody(phaseFile, overrides = {}) {
119
- return {
120
- slug: "260501-test-plan",
121
- phase: 1,
122
- todoIdx: 0,
123
- checked: true,
124
- etag: computePhaseFileEtag(phaseFile),
125
- ...overrides,
126
- };
127
- }
128
- // ── Setup/teardown ──────────────────────────────────────────────────────────
129
- let projectRoot = "";
130
- let phaseFile = "";
131
- beforeEach(async () => {
132
- delete process.env.MEOWKIT_ORCHVIZ_READONLY;
133
- const fixture = makeProjectRoot();
134
- projectRoot = fixture.root;
135
- phaseFile = fixture.phaseFile;
136
- await startServer(projectRoot);
137
- });
138
- afterEach(async () => {
139
- delete process.env.MEOWKIT_ORCHVIZ_READONLY;
140
- if (active) {
141
- await active.stop();
142
- active = null;
143
- }
144
- if (tmpDir) {
145
- fs.rmSync(tmpDir, { recursive: true, force: true });
146
- tmpDir = null;
147
- }
148
- });
149
- // ── Tests ───────────────────────────────────────────────────────────────────
150
- describe("POST /api/plan/todo", () => {
151
- it("1. 200 happy path: file mutated, changed:true, new etag returned", async () => {
152
- const beforeEtag = computePhaseFileEtag(phaseFile);
153
- const r = await postTodo(validBody(phaseFile, { todoIdx: 0, checked: true }));
154
- expect(r.status).toBe(200);
155
- const parsed = JSON.parse(r.body);
156
- expect(parsed.ok).toBe(true);
157
- expect(parsed.changed).toBe(true);
158
- expect(parsed.etag).toHaveLength(64);
159
- expect(parsed.etag).not.toBe(beforeEtag);
160
- // File on disk is mutated
161
- const newContent = fs.readFileSync(phaseFile, "utf-8");
162
- expect(newContent).toContain("- [x] Task A");
163
- });
164
- it("2. 200 idempotent: already-checked flip → changed:false, mtime unchanged", async () => {
165
- // Task B (idx=1) is already [x]
166
- const mtime = fs.statSync(phaseFile).mtimeMs;
167
- const r = await postTodo(validBody(phaseFile, { todoIdx: 1, checked: true }));
168
- expect(r.status).toBe(200);
169
- const parsed = JSON.parse(r.body);
170
- expect(parsed.ok).toBe(true);
171
- expect(parsed.changed).toBe(false);
172
- // mtime unchanged (no write occurred)
173
- const newMtime = fs.statSync(phaseFile).mtimeMs;
174
- expect(newMtime).toBe(mtime);
175
- });
176
- it("3. 403 missing Origin header", async () => {
177
- const r = await rawRequest({
178
- method: "POST",
179
- path: "/api/plan/todo",
180
- headers: {
181
- "Content-Type": "application/json",
182
- // No Origin header
183
- },
184
- body: JSON.stringify(validBody(phaseFile)),
185
- });
186
- expect(r.status).toBe(403);
187
- });
188
- it("4. 403 disallowed Origin header", async () => {
189
- const r = await postTodo(validBody(phaseFile), {
190
- "Origin": "http://evil.example.com",
191
- });
192
- expect(r.status).toBe(403);
193
- });
194
- it("5. 405 MEOWKIT_ORCHVIZ_READONLY=1 blocks writes", async () => {
195
- process.env.MEOWKIT_ORCHVIZ_READONLY = "1";
196
- const r = await postTodo(validBody(phaseFile));
197
- expect(r.status).toBe(405);
198
- const parsed = JSON.parse(r.body);
199
- expect(parsed.error).toBe("readonly");
200
- });
201
- it("6. 409 stale etag: file unchanged", async () => {
202
- const staleEtag = "a".repeat(64); // not the real etag
203
- const mtime = fs.statSync(phaseFile).mtimeMs;
204
- const r = await postTodo(validBody(phaseFile, { etag: staleEtag }));
205
- expect(r.status).toBe(409);
206
- const parsed = JSON.parse(r.body);
207
- expect(parsed.error).toBe("stale");
208
- expect(parsed.currentEtag).toHaveLength(64);
209
- // File unchanged
210
- expect(fs.statSync(phaseFile).mtimeMs).toBe(mtime);
211
- });
212
- it("7. 413 body > 4KB — server destroys socket on overflow", async () => {
213
- // Build a body > 4096 bytes
214
- const bigPad = "x".repeat(4200);
215
- const bodyStr = JSON.stringify({
216
- slug: "260501-test-plan",
217
- phase: 1,
218
- todoIdx: 0,
219
- checked: true,
220
- etag: "a".repeat(64),
221
- _pad: bigPad,
222
- });
223
- expect(bodyStr.length).toBeGreaterThan(4096);
224
- // The server destroys the socket on overflow — rawRequest will either get
225
- // a 413 response (if response was sent before destroy) or an ECONNRESET.
226
- // Both are valid behaviors for the cap; we just verify the connection closes.
227
- const status = await new Promise((resolve) => {
228
- const u = new URL(serverUrl);
229
- const req = http.request({
230
- host: u.hostname,
231
- port: Number(u.port),
232
- path: "/api/plan/todo",
233
- method: "POST",
234
- headers: {
235
- Host: `${u.hostname}:${u.port}`,
236
- "Content-Type": "application/json",
237
- "Origin": `http://127.0.0.1:${serverPort}`,
238
- "Content-Length": String(Buffer.byteLength(bodyStr)),
239
- },
240
- }, (res) => {
241
- // Got a response — either 413 or something else
242
- resolve(res.statusCode ?? 0);
243
- res.resume();
244
- });
245
- req.on("error", (err) => {
246
- const code = err.code;
247
- // ECONNRESET = server destroyed socket (expected on overflow)
248
- if (code === "ECONNRESET" || code === "EPIPE") {
249
- resolve(413); // treat as 413 for test assertion
250
- }
251
- else {
252
- resolve(0);
253
- }
254
- });
255
- req.write(bodyStr);
256
- req.end();
257
- });
258
- expect(status).toBe(413);
259
- });
260
- it("8. 415 wrong Content-Type", async () => {
261
- const r = await rawRequest({
262
- method: "POST",
263
- path: "/api/plan/todo",
264
- headers: {
265
- "Content-Type": "text/plain",
266
- "Origin": `http://127.0.0.1:${serverPort}`,
267
- },
268
- body: JSON.stringify(validBody(phaseFile)),
269
- });
270
- expect(r.status).toBe(415);
271
- });
272
- it("11. 400 invalid JSON", async () => {
273
- const r = await rawRequest({
274
- method: "POST",
275
- path: "/api/plan/todo",
276
- headers: {
277
- "Content-Type": "application/json",
278
- "Origin": `http://127.0.0.1:${serverPort}`,
279
- },
280
- body: "not valid json {",
281
- });
282
- expect(r.status).toBe(400);
283
- const parsed = JSON.parse(r.body);
284
- expect(parsed.error).toBe("invalid-json");
285
- });
286
- it("12. 400 zod validation failure (phase out of range)", async () => {
287
- const r = await postTodo({ ...validBody(phaseFile), phase: 200 }); // max is 99
288
- expect(r.status).toBe(400);
289
- const parsed = JSON.parse(r.body);
290
- expect(parsed.error).toBe("validation-failed");
291
- });
292
- it("13. POST to /api/plan still returns 405 (v1.1 regression guard)", async () => {
293
- const r = await rawRequest({
294
- method: "POST",
295
- path: "/api/plan",
296
- headers: { "Content-Type": "application/json" },
297
- body: "{}",
298
- });
299
- expect(r.status).toBe(405);
300
- });
301
- it("14. Phase zero-pad: POST {phase:1} matches phase-01-setup.md (not phase-10-*)", async () => {
302
- // Verify: phase:1 unambiguously matches phase-01-setup.md.
303
- // phaseFile IS phase-01-setup.md, so the etag is fresh → expect 200.
304
- const body = validBody(phaseFile, { phase: 1 });
305
- const r = await postTodo(body);
306
- const parsed = JSON.parse(r.body);
307
- // Must NOT be ambiguous-phase error (phase-01-setup.md is the only match)
308
- expect(parsed.error).not.toBe("ambiguous-phase");
309
- // Must succeed: phase:1 → regex /^phase-0*1-.*\.md$/i matches "phase-01-setup.md"
310
- // and does NOT match "phase-10-*.md" (zero-pad correct)
311
- expect(r.status).toBe(200);
312
- // Verify the matched file ends with phase-01-setup.md (not phase-1-anything or phase-10-*)
313
- const updatedContent = fs.readFileSync(phaseFile, "utf-8");
314
- // File content changed means phase-01-setup.md was correctly targeted
315
- expect(updatedContent).toContain("- [x] Task A");
316
- expect(phaseFile.endsWith("phase-01-setup.md")).toBe(true);
317
- });
318
- });
319
- describe("OPTIONS /api/plan/todo", () => {
320
- it("9. OPTIONS 204 with allowed origin — emits ACAO header", async () => {
321
- const r = await rawRequest({
322
- method: "OPTIONS",
323
- path: "/api/plan/todo",
324
- headers: {
325
- "Origin": `http://127.0.0.1:${serverPort}`,
326
- "Access-Control-Request-Method": "POST",
327
- },
328
- });
329
- expect(r.status).toBe(204);
330
- expect(r.headers["access-control-allow-origin"]).toBe(`http://127.0.0.1:${serverPort}`);
331
- expect(r.headers["access-control-allow-methods"]).toContain("POST");
332
- });
333
- it("10. OPTIONS 403 with disallowed origin — NO ACAO header emitted", async () => {
334
- const r = await rawRequest({
335
- method: "OPTIONS",
336
- path: "/api/plan/todo",
337
- headers: {
338
- "Origin": "http://evil.example.com",
339
- "Access-Control-Request-Method": "POST",
340
- },
341
- });
342
- expect(r.status).toBe(403);
343
- // CRITICAL: no ACAO header on rejected origin
344
- expect(r.headers["access-control-allow-origin"]).toBeUndefined();
345
- });
346
- });
347
- //# sourceMappingURL=write-handlers.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-handlers.test.js","sourceRoot":"","sources":["../../../../src/orchviz/server/__tests__/write-handlers.test.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- /**
2
- * test-server-boot — shared helper for integration and security smoke tests.
3
- *
4
- * bootTestServer({ fixturesDir }) copies fixturesDir contents into a mkdtemp
5
- * workspace under tasks/plans/, starts a real OrchvizServer on port 0
6
- * (ephemeral), and returns { server, port, projectRoot, cleanup }.
7
- *
8
- * CRITICAL: calls resetPlansDirCache() from write-utils.ts before starting so
9
- * the per-process plansDir realpath cache does not leak across temp dirs.
10
- *
11
- * NOTE: This module is for test use only and is NOT included in the dist build
12
- * (tsconfig.json excludes it via "include": ["src"] but the build script
13
- * additionally excludes test-only files via separate path checks — this file
14
- * has no runtime import chain from the CLI entrypoint).
15
- */
16
- import { OrchvizServer } from "./server/index.js";
17
- export interface TestServerHandle {
18
- server: OrchvizServer;
19
- port: number;
20
- projectRoot: string;
21
- cleanup: () => Promise<void>;
22
- }
23
- export interface BootOptions {
24
- /** Directory whose contents (plan slug subdirs) are copied into tasks/plans/ */
25
- fixturesDir: string;
26
- }
27
- export declare function bootTestServer(opts: BootOptions): Promise<TestServerHandle>;
28
- //# sourceMappingURL=test-server-boot.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-server-boot.d.ts","sourceRoot":"","sources":["../../src/orchviz/test-server-boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC3B,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;CACpB;AAeD,wBAAsB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCjF"}