elanous 0.2.9 → 0.2.11

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 (694) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/Y4zKzL62sakG5momz3SoQ/_buildManifest.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/1159-0c5ef8bc21cb6afb.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1394-556de6d71bbdb0fb.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1452.93700483b9d4fc61.js +9 -0
  7. package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 1829-b453a1b22d3999bb.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/2176-c379e3ebce874151.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/2426.8c6ee0c668d53def.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/3170-7ec60a56fa0e4728.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/3278-ae6ef084769f6195.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/3454-988a53dac60a1763.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/3638-aa80b4641ea439db.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/3735-fe3402553ac1c9c6.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/390.c373e31b3b9d0c41.js +5 -0
  19. package/apps/pwa/out/_next/static/chunks/3992-2e522a8ac5f2afde.js +25 -0
  20. package/apps/pwa/out/_next/static/chunks/4215-c9d91dd644ec1719.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/4508-5d0161d1e724d735.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/4685-c3c1c625b71accd1.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/4733-623a79345b171e1c.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/4883.3bd969ea1d3aaaff.js +2 -0
  25. package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/5532.6899a12958a89b72.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/5845-e6c003ce8d5fd36a.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/5978-b27004c677119115.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → 5cd7e3a9-404fd6b8d0ecd44c.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/6048-4c5c33579bc4ef78.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/6303-422dbf0f67c72aac.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/6751-bb3595948b2e311b.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/7274-19b7279f18b47ab3.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 7334.a6679d9168f37aa8.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/7551-a0e0707b79164ddd.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/7777-79f845045aa1ed86.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/79f8be9e-957d68913b590b08.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/8025-cc24ee5d8f2fb6f8.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/8039-df92e08fede5de8f.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/8206-c6684dcde12be721.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/8421-1c4acfb1395a0edf.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/8605-ea5bee9dfae512c7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/8725.bf46bb1395dd0fa2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/8734-252d511cd276c0dc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/8834-ca1cb09c1cb1a6bf.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{2415.ed6428ff334c7ce2.js → 9269.d2a4795bc6812717.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/9538-2816b90923606459.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/9656-c1540088f5859c80.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d16993889b125c42.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-6a061bd97f0b9398.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/board/page-cb95a7432c9ee744.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-b12b6d2f8d2d1aea.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/app/bots/page-b9efe868bfd36255.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/app/chat/page-7c97dcdfe2e37a60.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/control/page-5721537ca8a3598c.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/app/design-check/page-b654240a572e4c48.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/app/editor/page-b9750abc897508c3.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d16993889b125c42.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/app/intake/page-c8b1ccda6ba7ae98.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/app/live/page-2a9932ddb62d76bd.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/app/market/page-9688f5b4f1ff950f.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/app/morning/{page-adfbd2ba9598e59a.js → page-35414e0a007b4082.js} +1 -1
  72. package/apps/pwa/out/_next/static/chunks/app/not-found-e7a529e0507ac86c.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/app/observatory/page-e001823c35c9dd67.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a24072b35470157.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/app/reflection/page-0be8d4b2ced75ba0.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d37cb0d52f9b6bd5.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/app/sessions/page-686da0df9bf23e5c.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/app/settings/page-53f80edc6b8dc07c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d16993889b125c42.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/app/setup/page-239c17b911b84e72.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/app/tasks/page-1218753c82d585f6.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/app/term/page-4b5935e67531efb5.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/app/today/page-3285bc87caf1eaa5.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/app/trace/page-ad553b0e06505ecd.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{2ea96958-e8c7e112de50b067.js → f48170cc-d05d28bf87a43bf4.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/framework-172630e6aa5e2d7f.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/main-app-f0fe2d7477845181.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/main-fc98ac70b44eccb0.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/pages/_app-5bd7f10271f72413.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/pages/_error-97d0d85ea05fef9b.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/webpack-9e4d02d567b98240.js +1 -0
  105. package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +1 -0
  106. package/apps/pwa/out/approvals/index.html +1 -1
  107. package/apps/pwa/out/approvals/index.txt +23 -23
  108. package/apps/pwa/out/autopilot/index.html +1 -1
  109. package/apps/pwa/out/autopilot/index.txt +23 -23
  110. package/apps/pwa/out/board/index.html +1 -1
  111. package/apps/pwa/out/board/index.txt +23 -23
  112. package/apps/pwa/out/botlab/index.html +1 -1
  113. package/apps/pwa/out/botlab/index.txt +22 -22
  114. package/apps/pwa/out/bots/index.html +1 -1
  115. package/apps/pwa/out/bots/index.txt +22 -22
  116. package/apps/pwa/out/chat/index.html +1 -1
  117. package/apps/pwa/out/chat/index.txt +22 -22
  118. package/apps/pwa/out/consult/index.html +1 -1
  119. package/apps/pwa/out/consult/index.txt +23 -23
  120. package/apps/pwa/out/control/index.html +1 -1
  121. package/apps/pwa/out/control/index.txt +23 -23
  122. package/apps/pwa/out/design-check/index.html +1 -1
  123. package/apps/pwa/out/design-check/index.txt +23 -23
  124. package/apps/pwa/out/editor/index.html +1 -1
  125. package/apps/pwa/out/editor/index.txt +23 -23
  126. package/apps/pwa/out/exec/index.html +1 -1
  127. package/apps/pwa/out/exec/index.txt +23 -23
  128. package/apps/pwa/out/field/index.html +1 -1
  129. package/apps/pwa/out/field/index.txt +23 -23
  130. package/apps/pwa/out/healthz +1 -1
  131. package/apps/pwa/out/index.html +1 -1
  132. package/apps/pwa/out/index.txt +22 -22
  133. package/apps/pwa/out/inside/index.html +1 -0
  134. package/apps/pwa/out/inside/index.txt +31 -0
  135. package/apps/pwa/out/intake/index.html +1 -1
  136. package/apps/pwa/out/intake/index.txt +23 -23
  137. package/apps/pwa/out/live/index.html +1 -1
  138. package/apps/pwa/out/live/index.txt +23 -23
  139. package/apps/pwa/out/market/index.html +1 -1
  140. package/apps/pwa/out/market/index.txt +22 -22
  141. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  142. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  143. package/apps/pwa/out/morning/index.html +1 -1
  144. package/apps/pwa/out/morning/index.txt +23 -23
  145. package/apps/pwa/out/observatory/index.html +1 -1
  146. package/apps/pwa/out/observatory/index.txt +23 -23
  147. package/apps/pwa/out/ops/checklist/index.html +1 -1
  148. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  149. package/apps/pwa/out/ops/release/index.html +1 -1
  150. package/apps/pwa/out/ops/release/index.txt +22 -22
  151. package/apps/pwa/out/ops/seats/index.html +1 -0
  152. package/apps/pwa/out/ops/seats/index.txt +30 -0
  153. package/apps/pwa/out/outputs/index.html +1 -0
  154. package/apps/pwa/out/outputs/index.txt +30 -0
  155. package/apps/pwa/out/reflection/index.html +1 -1
  156. package/apps/pwa/out/reflection/index.txt +23 -23
  157. package/apps/pwa/out/scheduler/index.html +1 -1
  158. package/apps/pwa/out/scheduler/index.txt +23 -23
  159. package/apps/pwa/out/sessions/index.html +1 -1
  160. package/apps/pwa/out/sessions/index.txt +22 -22
  161. package/apps/pwa/out/settings/devices/index.html +1 -1
  162. package/apps/pwa/out/settings/devices/index.txt +23 -23
  163. package/apps/pwa/out/settings/index.html +1 -1
  164. package/apps/pwa/out/settings/index.txt +23 -23
  165. package/apps/pwa/out/setup/done/index.html +1 -1
  166. package/apps/pwa/out/setup/done/index.txt +23 -23
  167. package/apps/pwa/out/setup/index.html +1 -1
  168. package/apps/pwa/out/setup/index.txt +23 -23
  169. package/apps/pwa/out/share/index.html +1 -1
  170. package/apps/pwa/out/share/index.txt +23 -23
  171. package/apps/pwa/out/showroom/index.html +1 -1
  172. package/apps/pwa/out/showroom/index.txt +22 -22
  173. package/apps/pwa/out/tasks/index.html +1 -1
  174. package/apps/pwa/out/tasks/index.txt +23 -23
  175. package/apps/pwa/out/term/index.html +1 -1
  176. package/apps/pwa/out/term/index.txt +23 -24
  177. package/apps/pwa/out/today/index.html +1 -0
  178. package/apps/pwa/out/today/index.txt +33 -0
  179. package/apps/pwa/out/trace/index.html +1 -1
  180. package/apps/pwa/out/trace/index.txt +23 -23
  181. package/apps/pwa/out/vault/index.html +1 -1
  182. package/apps/pwa/out/vault/index.txt +23 -23
  183. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  184. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  185. package/apps/pwa/out/workflows/index.html +1 -1
  186. package/apps/pwa/out/workflows/index.txt +23 -23
  187. package/apps/pwa/out/workspace/index.html +1 -1
  188. package/apps/pwa/out/workspace/index.txt +23 -24
  189. package/apps/pwa/out/worktrees/index.html +1 -1
  190. package/apps/pwa/out/worktrees/index.txt +23 -23
  191. package/graphs/drafts/draft-cleanup.yaml +19 -0
  192. package/graphs/drafts/recipes.yaml +23 -0
  193. package/graphs/field/field-feed.yaml +2 -0
  194. package/graphs/implement-loop.yaml +1 -1
  195. package/graphs/intake/intake-daily.yaml +2 -1
  196. package/graphs/ops/recipes.yaml +3 -0
  197. package/graphs/ops/secret-exposure.yaml +24 -0
  198. package/graphs/release/recipes.yaml +3 -0
  199. package/graphs/release/release-loop.yaml +4 -1
  200. package/graphs/video/explainer-line.yaml +2 -2
  201. package/package.json +2 -1
  202. package/plugins/card-followup/graphs/run-step.ts +48 -13
  203. package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
  204. package/plugins/doc-draft/graphs/run-step.ts +13 -6
  205. package/plugins/elanous-hwp/README.md +25 -0
  206. package/plugins/elanous-hwp/cli.ts +22 -0
  207. package/plugins/elanous-hwp/converter.ts +237 -0
  208. package/plugins/elanous-hwp/fixtures/fixed-controls.hwpx +0 -0
  209. package/plugins/elanous-hwp/fixtures/fixed-table-controls.hwpx +0 -0
  210. package/plugins/elanous-hwp/fixtures/fixed.hwpx +0 -0
  211. package/plugins/elanous-hwp/plugin.json +16 -0
  212. package/plugins/elanous-hwp/plugin.ts +40 -0
  213. package/scripts/ci-public-export-leak-gate.ts +75 -14
  214. package/scripts/ci-public-leak-gate.ts +44 -9
  215. package/scripts/ci-pwa-build-gate.ts +160 -0
  216. package/scripts/context-hooks/claude-stop.sh +4 -0
  217. package/scripts/context-hooks/emit.ts +24 -0
  218. package/scripts/context-hooks/post-tool-use.sh +4 -0
  219. package/scripts/coord-channel-watch.sh +54 -8
  220. package/scripts/coord-digest.ts +199 -0
  221. package/scripts/coord-post.sh +60 -3
  222. package/scripts/coord-requests-bridge.ts +143 -0
  223. package/scripts/field-feed/lib.ts +4 -0
  224. package/scripts/fleet/node-setup.sh +20 -3
  225. package/scripts/homebrew-formula-bump.ts +69 -0
  226. package/scripts/install.ps1 +68 -9
  227. package/scripts/install.sh +39 -12
  228. package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
  229. package/scripts/lib/tui-regress-checks.ts +146 -0
  230. package/scripts/marketing/measure-site-numbers.ts +169 -0
  231. package/scripts/measure-gate-shards.ts +309 -0
  232. package/scripts/memory-lifecycle-cycle.ts +2 -2
  233. package/scripts/mission-request-judge.ts +31 -1
  234. package/scripts/morning-report.ts +2 -2
  235. package/scripts/opportunity-scan.ts +1 -1
  236. package/scripts/ops-now-probe.ts +327 -0
  237. package/scripts/publish-internal-dist.ts +11 -1
  238. package/scripts/release-loop/auto-approve-node.ts +21 -4
  239. package/scripts/release-loop/cut-branch.ts +84 -0
  240. package/scripts/release-loop/cutoff.ts +19 -8
  241. package/scripts/release-loop/gate-node.ts +14 -13
  242. package/scripts/release-loop/mac-smoke-node.ts +229 -0
  243. package/scripts/release-loop/node-verdict.ts +3 -3
  244. package/scripts/release-loop/ops-upgrade-node.ts +72 -16
  245. package/scripts/release-loop/release-readiness.ts +9 -0
  246. package/scripts/release-loop/tui-node-checks.ts +42 -0
  247. package/scripts/release-loop/tui-sim-node.ts +32 -8
  248. package/scripts/release-loop/unattended-release.ts +5 -3
  249. package/scripts/release-loop/version-node.ts +112 -13
  250. package/scripts/repo-watch-cycle.ts +1 -1
  251. package/scripts/retro-cycle.ts +2 -2
  252. package/scripts/schedule-health-report.ts +1 -1
  253. package/scripts/signal-digest-cycle.ts +2 -7
  254. package/scripts/signal-digest-photo.ts +11 -0
  255. package/scripts/storyboard/storyboard.ts +5 -161
  256. package/scripts/tech1-public-measure.ts +94 -0
  257. package/scripts/test-diet/lib.ts +30 -1
  258. package/scripts/test-diet/node.ts +83 -8
  259. package/scripts/test-timeout-audit.ts +114 -0
  260. package/scripts/tree-sync-alert.ts +1 -1
  261. package/scripts/tui-regress.ts +71 -0
  262. package/scripts/ux/demo-rehearsal.ts +243 -0
  263. package/scripts/ux/lib/rehearsal-verdict.ts +73 -0
  264. package/scripts/waitlist-daily-digest.ts +1 -1
  265. package/skills/diagram-master/SKILL.md +366 -0
  266. package/skills/diagram-master/references/engines/excalidraw/color-palette.md +67 -0
  267. package/skills/diagram-master/references/engines/excalidraw/element-templates.md +182 -0
  268. package/skills/diagram-master/references/engines/excalidraw/json-schema.md +71 -0
  269. package/skills/diagram-master/references/engines/excalidraw/render_excalidraw.py +189 -0
  270. package/skills/diagram-master/references/engines/excalidraw/render_template.html +57 -0
  271. package/skills/diagram-master/references/engines/matplotlib/matplotlib-patterns.md +235 -0
  272. package/skills/diagram-master/references/engines/matplotlib/render_matplotlib.py +184 -0
  273. package/skills/diagram-master/references/engines/mermaid/domain-templates.md +435 -0
  274. package/skills/diagram-master/references/engines/mermaid/render_mermaid.py +116 -0
  275. package/skills/diagram-master/references/engines/mermaid/syntax-reference.md +2247 -0
  276. package/skills/diagram-master/references/engines/nanobannana/render_nanobannana2.py +168 -0
  277. package/skills/diagram-master/references/engines/svg/color-palette.md +188 -0
  278. package/skills/diagram-master/references/engines/svg/html-base-template.html +332 -0
  279. package/skills/diagram-master/references/engines/svg/interactivity-patterns.md +435 -0
  280. package/skills/diagram-master/references/engines/svg/render_interactive_svg.py +212 -0
  281. package/skills/diagram-master/references/engines/svg/svg-element-templates.md +349 -0
  282. package/skills/diagram-master/references/examples/README.md +69 -0
  283. package/skills/diagram-master/references/examples/ref_grid_architecture.png +0 -0
  284. package/skills/diagram-master/references/examples/ref_layered_flow.png +0 -0
  285. package/skills/diagram-master/references/pyproject.toml +16 -0
  286. package/skills/diagram-master/references/quality-checklist.md +33 -0
  287. package/skills/diagram-master/references/routing-guide.md +164 -0
  288. package/skills/diagram-master/references/uv.lock +1356 -0
  289. package/skills/explainer-video/SKILL.md +4 -0
  290. package/skills/explainer-video/engine/reel.mjs +18 -13
  291. package/skills/explainer-video/engine/reel.sh +24 -5
  292. package/skills/explainer-video/engine/stitch.mjs +145 -0
  293. package/skills/google-workspace/SKILL.md +33 -0
  294. package/skills/google-workspace/scripts/gws-safe.sh +177 -0
  295. package/skills/grill-me/SKILL.md +1 -1
  296. package/skills/lecture-note-digitizer/SKILL.md +926 -0
  297. package/skills/lecture-note-digitizer/references/convert_to_pdf.py +30 -0
  298. package/skills/lecture-note-digitizer/references/extract_slide_diagram.py +73 -0
  299. package/skills/lecture-note-digitizer/references/html-template.md +167 -0
  300. package/skills/lecture-note-digitizer/references/katex-style-guide.md +165 -0
  301. package/skills/omni-crawl/SKILL.md +21 -11
  302. package/skills/omni-crawl/scripts/main.ts +6 -6
  303. package/skills/omni-crawl/src/router.ts +3 -3
  304. package/skills/omni-digest/SKILL.md +17 -9
  305. package/skills/omni-digest/digest.md +2 -2
  306. package/skills/omni-digest/src/fetch.ts +30 -3
  307. package/skills/pitch-deck/SKILL.md +36 -0
  308. package/skills/pitch-deck/template.html +80 -0
  309. package/skills/youtube-master/SKILL.md +163 -0
  310. package/skills/youtube-master/package-lock.json +558 -0
  311. package/skills/youtube-master/package.json +13 -0
  312. package/skills/youtube-master/references/study-note-template.md +124 -0
  313. package/skills/youtube-master/scripts/main.ts +435 -0
  314. package/skills/youtube-master/scripts/transcribe-local.ts +24 -0
  315. package/skills/youtube-master/src/audio.ts +63 -0
  316. package/skills/youtube-master/src/domain-staging.ts +50 -0
  317. package/skills/youtube-master/src/env.ts +36 -0
  318. package/skills/youtube-master/src/obsidian.ts +155 -0
  319. package/skills/youtube-master/src/router.ts +110 -0
  320. package/skills/youtube-master/src/stt.ts +199 -0
  321. package/skills/youtube-master/src/study-note.ts +175 -0
  322. package/skills/youtube-master/src/summarize.ts +358 -0
  323. package/skills/youtube-master/src/transcript.ts +76 -0
  324. package/skills/youtube-master/src/types.ts +91 -0
  325. package/skills/youtube-master/src/util.ts +93 -0
  326. package/skills/youtube-master/src/youtube.ts +70 -0
  327. package/skills/youtube-master/tsconfig.json +13 -0
  328. package/src/acp/codex-approval-adapter.ts +9 -3
  329. package/src/acp/core-turn-bridge.ts +117 -18
  330. package/src/acp/fact-question.ts +11 -0
  331. package/src/acp/server.ts +53 -9
  332. package/src/acp/tool-approval.ts +126 -0
  333. package/src/acp/turn-runner.ts +36 -0
  334. package/src/agent/monad-agent-turn.ts +8 -0
  335. package/src/agent-mission/driver.ts +80 -10
  336. package/src/agent-mission/pty-decision.ts +71 -0
  337. package/src/agent-mission/review-loop.ts +30 -0
  338. package/src/ask-user-question/pending-questions.ts +25 -10
  339. package/src/ask-user-question/types.ts +9 -0
  340. package/src/auth/setup-link-tokens.ts +16 -5
  341. package/src/autopilot/build/integrity-gate.ts +12 -0
  342. package/src/autopilot/build/llm-conflict-merge.ts +16 -3
  343. package/src/autopilot/tool-registry.ts +2 -0
  344. package/src/boot/daemon-prompt-turn.ts +8 -0
  345. package/src/boot/daemon-runtime.ts +9 -3
  346. package/src/boot/daemon-tools/index.ts +8 -0
  347. package/src/boot/daemon-tools/types.ts +2 -0
  348. package/src/boot/daemon-tools/web-search.ts +4 -0
  349. package/src/card-followup/core.ts +109 -0
  350. package/src/chat/ctrl-c-in-input.ts +14 -0
  351. package/src/chat/index.ts +53 -0
  352. package/src/chat/pickers/state.ts +6 -2
  353. package/src/cli/agent-cli.ts +7 -0
  354. package/src/cli/decisions-cli.ts +25 -3
  355. package/src/cli/doctor-bundle-upload.ts +68 -0
  356. package/src/cli/doctor-cli.ts +38 -4
  357. package/src/cli/drive-input-jail.ts +101 -0
  358. package/src/cli/hooks-cli.ts +17 -3
  359. package/src/cli/make-cli.ts +43 -0
  360. package/src/cli/ops-cli.ts +20 -0
  361. package/src/cli/persona-cli.ts +90 -4
  362. package/src/cli/plugin-cli.ts +31 -22
  363. package/src/cli/pod-cli.ts +61 -2
  364. package/src/cli/pr-cli.ts +82 -17
  365. package/src/cli/pty-drive-cli.ts +41 -7
  366. package/src/cli/pty-drive-verdict.ts +40 -0
  367. package/src/cli/pwa-stop.ts +163 -13
  368. package/src/cli/pwa-test.ts +3 -0
  369. package/src/cli/release-cli.ts +80 -24
  370. package/src/cli/self-update.ts +14 -0
  371. package/src/cli/setup-cli.ts +43 -1
  372. package/src/cli/skills-cli.ts +17 -1
  373. package/src/cli/storyboard-cli.ts +37 -0
  374. package/src/cli/test-state-dir-flag.ts +11 -4
  375. package/src/connectors/linear.ts +146 -0
  376. package/src/context-bus/claude-hooks-install.ts +10 -0
  377. package/src/context-bus/context-now-surfaces.ts +48 -0
  378. package/src/context-bus/context-now.ts +104 -0
  379. package/src/context-bus/coord-events.ts +115 -0
  380. package/src/context-bus/external-events.ts +52 -0
  381. package/src/context-bus/long-term-memory.ts +108 -0
  382. package/src/dashboard/dashboard-boot-fixture.ts +23 -0
  383. package/src/dashboard/index.ts +63 -21
  384. package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -1
  385. package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
  386. package/src/decisions/decision-cards.ts +58 -3
  387. package/src/decisions/decision-ledger.ts +85 -6
  388. package/src/decisions/decision-linear-projection.ts +157 -0
  389. package/src/decisions/web-push-decision-cards.ts +50 -0
  390. package/src/directive/interpretation-card.ts +36 -0
  391. package/src/discord/sprint21-runtime.ts +5 -1
  392. package/src/discord-self-message.ts +32 -0
  393. package/src/discord-slash-wire.ts +5 -1
  394. package/src/discord.ts +19 -2
  395. package/src/domains/coo-admin-tool.ts +62 -0
  396. package/src/domains/core-tools.ts +13 -4
  397. package/src/domains/elanous-card.ts +29 -0
  398. package/src/domains/ops-facts-tool.ts +76 -0
  399. package/src/domains/outbound-alert.ts +46 -13
  400. package/src/domains/release-tool.ts +168 -0
  401. package/src/domains/telegram-kind-route.ts +65 -9
  402. package/src/exec-requests/default-outputs.ts +25 -0
  403. package/src/exec-requests/planner.ts +106 -28
  404. package/src/exec-requests/runner.ts +123 -12
  405. package/src/exec-requests/store.ts +11 -2
  406. package/src/execution-loop/launch-gate.ts +100 -0
  407. package/src/field/field-media.ts +10 -7
  408. package/src/field/field-reel.ts +19 -5
  409. package/src/field-note/index.ts +201 -0
  410. package/src/field-note/transcribe.ts +248 -0
  411. package/src/git-fs/worktree.ts +45 -6
  412. package/src/graph-kinds/registry.ts +3 -3
  413. package/src/graph-runner/graph-approval-card.ts +113 -0
  414. package/src/graph-runner/graph-cli.ts +189 -4
  415. package/src/graph-runner/graph-grow-llm.ts +37 -0
  416. package/src/graph-runner/graph-grow.ts +47 -0
  417. package/src/graph-runner/graph-notify.ts +25 -3
  418. package/src/graph-runner/runner.ts +453 -35
  419. package/src/grok/agent-search.ts +8 -2
  420. package/src/guardian/secret-exposure-scan.ts +101 -0
  421. package/src/harness/browser-verify.ts +25 -2
  422. package/src/harness/harness-cli-command.ts +478 -42
  423. package/src/harness/harness-incidents-writer.fixture.ts +24 -0
  424. package/src/harness/harness-incidents.ts +129 -0
  425. package/src/harness/harness-pod-dispatch.ts +43 -23
  426. package/src/harness/harness-seams.ts +38 -4
  427. package/src/harness/harness-stop.ts +75 -6
  428. package/src/harness/launch-registry.ts +91 -0
  429. package/src/harness/process-garbage.ts +5 -3
  430. package/src/hitl/clarification-policy.ts +3 -1
  431. package/src/hooks/dispatch.ts +82 -0
  432. package/src/hooks/expose.ts +254 -0
  433. package/src/hooks/github-shadow.ts +108 -0
  434. package/src/hooks/providers.ts +71 -5
  435. package/src/hooks/queue.ts +1 -1
  436. package/src/hooks/receiver.ts +21 -20
  437. package/src/index.ts +206 -49
  438. package/src/intake-plane/author-goals.ts +37 -4
  439. package/src/intake-plane/categorize.ts +18 -46
  440. package/src/intake-plane/check.ts +3 -0
  441. package/src/intake-plane/discord-seat-work.ts +57 -2
  442. package/src/intake-plane/front-route-classifier.ts +33 -39
  443. package/src/intake-plane/persona-answer.ts +30 -0
  444. package/src/intake-plane/runtime-callables.ts +8 -1
  445. package/src/intake-plane/seat-doc-route.ts +170 -6
  446. package/src/intake-plane/telegram-seat-work.ts +80 -4
  447. package/src/intake-plane/telegram-work.ts +1 -0
  448. package/src/intake-plane/wish-folder.ts +67 -0
  449. package/src/intent-gate/gate.ts +30 -10
  450. package/src/live/detail-switch.ts +5 -0
  451. package/src/llm/difficulty.ts +57 -0
  452. package/src/llm/judge-layer.ts +101 -0
  453. package/src/llm/mission-router.ts +33 -19
  454. package/src/loops/contract/examples/cmo-seat.loop.yaml +51 -0
  455. package/src/loops/contract/examples/orchestrator.loop.yaml +57 -0
  456. package/src/loops/contract/examples/steward.loop.yaml +50 -0
  457. package/src/loops/contract/loop-agent.schema.json +138 -0
  458. package/src/loops/contract/validate.ts +64 -0
  459. package/src/loops/registry.ts +20 -6
  460. package/src/market/signed-index.ts +4 -0
  461. package/src/maturity/bot-command-maturity.ts +45 -0
  462. package/src/maturity/cli-maturity.ts +34 -0
  463. package/src/maturity/feature-maturity.ts +120 -1
  464. package/src/maturity/tui-slash-maturity.ts +31 -0
  465. package/src/memory.ts +32 -4
  466. package/src/model-tier/index.ts +2 -2
  467. package/src/model-tier/tier-resolver.ts +20 -20
  468. package/src/model-tier/types.ts +6 -6
  469. package/src/mss/logging/log-store.ts +15 -0
  470. package/src/nexus/api/config-model-tier.ts +5 -4
  471. package/src/nexus/api/exec-requests.ts +33 -3
  472. package/src/nexus/api/fabric-plans.ts +53 -0
  473. package/src/nexus/api/harness-api.ts +5 -1
  474. package/src/nexus/api/health.ts +2 -0
  475. package/src/nexus/api/http-server.ts +89 -1
  476. package/src/nexus/api/inside-events.ts +226 -0
  477. package/src/nexus/api/meta-api.ts +32 -8
  478. package/src/nexus/api/missions.ts +6 -1
  479. package/src/nexus/api/ops-api.ts +10 -1
  480. package/src/nexus/api/ops-seats-sources.ts +37 -7
  481. package/src/nexus/api/ops-seats.ts +49 -6
  482. package/src/nexus/api/outputs-route.ts +44 -0
  483. package/src/nexus/api/seat-requests.ts +132 -10
  484. package/src/nexus/api/sessions-store.ts +42 -0
  485. package/src/nexus/api/setup-codex-login.ts +160 -0
  486. package/src/nexus/api/sub-seat-charters.ts +34 -0
  487. package/src/nexus/api/tabs-mutations.ts +3 -1
  488. package/src/nexus/api/trace.ts +18 -6
  489. package/src/nexus/api/usage-api.ts +102 -0
  490. package/src/nexus/api/workflow-run-event-bridge.ts +1 -0
  491. package/src/nexus/api/workflows.ts +80 -6
  492. package/src/nexus/index.ts +47 -4
  493. package/src/nexus/kinds/webterm.ts +2 -1
  494. package/src/nexus/webterm/pty.ts +6 -2
  495. package/src/onboarding/cli-auth-status.ts +80 -0
  496. package/src/onboarding/first-run.ts +89 -0
  497. package/src/onboarding/lan-address.ts +45 -0
  498. package/src/onboarding/voice-ai.ts +3 -3
  499. package/src/onboarding/web-first.ts +119 -24
  500. package/src/onboarding.ts +4 -0
  501. package/src/ops-now/ops-now-refresh.ts +100 -0
  502. package/src/org/seat-budget.ts +48 -0
  503. package/src/org/stall-escalation.ts +63 -0
  504. package/src/outputs/ledger.ts +120 -0
  505. package/src/persona/persona-todo.ts +79 -0
  506. package/src/persona/presets.ts +116 -2
  507. package/src/persona/team-set.ts +155 -0
  508. package/src/plugins/install/plugin-install.ts +14 -0
  509. package/src/plugins/maker/market-bundle.ts +109 -0
  510. package/src/plugins/maker/plugin-maker.ts +254 -11
  511. package/src/plugins/maker/wizard-generate.ts +103 -0
  512. package/src/pod-lease/admission.ts +150 -0
  513. package/src/pod-lease/dependency-state.ts +85 -0
  514. package/src/pod-lease/host-lease.ts +127 -0
  515. package/src/project/project-store.ts +115 -0
  516. package/src/project/project-suggestion.ts +16 -0
  517. package/src/project/session-context.ts +24 -0
  518. package/src/release-loop/checklist.ts +79 -5
  519. package/src/release-loop/feature-store.ts +159 -24
  520. package/src/release-loop/next-md-merge.ts +58 -0
  521. package/src/release-loop/release-note.ts +59 -4
  522. package/src/release-loop/release-schedule.ts +53 -0
  523. package/src/repl/index.ts +7 -0
  524. package/src/seat-dispatch/ceo-commands.ts +41 -8
  525. package/src/seat-dispatch/ceo-intent.ts +38 -0
  526. package/src/seat-dispatch/seat-ask.ts +130 -0
  527. package/src/seat-dispatch/seat-questions.ts +100 -0
  528. package/src/seat-loop/seat-loop.ts +750 -0
  529. package/src/seat-loop/seat-report.ts +99 -0
  530. package/src/self-dev/decompose.ts +66 -11
  531. package/src/self-dev/dev-cli.ts +4 -1
  532. package/src/self-dev/dev-pipeline.ts +37 -1
  533. package/src/self-dev/draft-sweep.ts +38 -33
  534. package/src/self-dev/draft-triage-rules.ts +8 -5
  535. package/src/self-dev/fabric-plan-core.ts +297 -0
  536. package/src/self-dev/orchestrate.ts +36 -4
  537. package/src/self-dev/release-path-guard.ts +62 -0
  538. package/src/self-dev/run-store.ts +10 -1
  539. package/src/self-dev/shard-aggregate.ts +230 -0
  540. package/src/self-dev/shard-placement.ts +60 -0
  541. package/src/self-dev/shard-plan.ts +48 -0
  542. package/src/self-dev/shard-pod-run.ts +77 -0
  543. package/src/self-dev/shard-run.ts +105 -0
  544. package/src/self-implement/execution-clarification.ts +115 -0
  545. package/src/self-implement/gate-baseline.ts +1 -1
  546. package/src/self-implement/gate-cli.ts +46 -4
  547. package/src/self-implement/gate-scope.ts +37 -7
  548. package/src/self-implement/graph-variant.ts +171 -0
  549. package/src/self-implement/harness-policy-gates.ts +1 -1
  550. package/src/self-implement/headless-elanous-driver.ts +22 -3
  551. package/src/self-implement/host-regate.ts +22 -1
  552. package/src/self-implement/importer-test-index.ts +2 -1
  553. package/src/self-implement/l8-merge-queue.ts +130 -0
  554. package/src/self-implement/orchestrator.ts +279 -12
  555. package/src/self-implement/pipeline-shape.ts +1 -1
  556. package/src/self-implement/route-consumer-test-index.ts +122 -0
  557. package/src/self-implement/run-status-mapping.ts +5 -3
  558. package/src/self-implement/seams.ts +72 -11
  559. package/src/self-implement/test-seams.ts +1 -0
  560. package/src/self-implement/uncommitted-work.ts +59 -0
  561. package/src/session/chat.ts +2 -0
  562. package/src/session/index.ts +45 -13
  563. package/src/shell-env-bootstrap.ts +17 -0
  564. package/src/skills/gift-install.ts +215 -0
  565. package/src/skills/tools/web-search.ts +4 -1
  566. package/src/steward/directive.ts +51 -2
  567. package/src/steward/launch.ts +266 -0
  568. package/src/steward/outcome-notify.ts +115 -0
  569. package/src/steward/steward-cards.ts +25 -11
  570. package/src/steward/triage-plan.ts +32 -4
  571. package/src/steward/triage.ts +129 -13
  572. package/src/steward/working-backwards.ts +64 -0
  573. package/src/storyboard/storyboard.ts +141 -0
  574. package/src/task-cards/card-cli.ts +25 -1
  575. package/src/task-cards/card-store.ts +2 -2
  576. package/src/task-orchestrator/mission.ts +5 -0
  577. package/src/task-orchestrator/store.ts +12 -3
  578. package/src/task-orchestrator/surfaces/pod-command-job.ts +29 -7
  579. package/src/task-orchestrator/surfaces/pod-lease.ts +397 -0
  580. package/src/task-orchestrator/surfaces/pod-pool.ts +127 -26
  581. package/src/task-orchestrator/surfaces/self-implement-pod.ts +214 -40
  582. package/src/task-orchestrator/surfaces/self-implement.ts +15 -2
  583. package/src/task-orchestrator/types.ts +2 -0
  584. package/src/telegram-card-followup.ts +153 -0
  585. package/src/telegram-commands.ts +10 -1
  586. package/src/telegram-project-command.ts +71 -0
  587. package/src/telegram-report.ts +29 -19
  588. package/src/telegram-run.ts +7 -0
  589. package/src/telegram.ts +58 -11
  590. package/src/tool-runtime/self-cognition-runtimes.ts +13 -3
  591. package/src/tool-runtime/types.ts +4 -0
  592. package/src/tui-client/dashboard-session.ts +2 -0
  593. package/src/user-config.ts +216 -27
  594. package/src/version/packed-revision.json +1 -1
  595. package/src/web-push/notify-exec-request.ts +32 -0
  596. package/src/web-search/grok.ts +7 -1
  597. package/src/web-search/index.ts +28 -1
  598. package/src/web-search/provider.ts +4 -0
  599. package/src/web-search/x-intent.ts +5 -0
  600. package/src/workflow-runtime/executor.ts +277 -47
  601. package/src/workflow-runtime/index.ts +1 -0
  602. package/src/workflow-runtime/nodes/subworkflow.ts +60 -0
  603. package/src/workflow-runtime/plugin-kind-node.ts +1 -1
  604. package/src/workflow-runtime/schema.ts +79 -4
  605. package/src/workflow-runtime/types.ts +35 -4
  606. package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/2375-cb6debea56cce4fb.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +0 -25
  617. package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
  618. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5080-1613752891fcadb4.js +0 -10
  622. package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/editor/page-973996d584f008c1.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/market/page-8b0402a46a749a3d.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-037f83e2a1edc8e2.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0df30e0c7e50148a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-90670589b87abea8.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-35bedde6d885f08f.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +0 -1
  692. package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
  693. package/src/dashboard/turn-typeahead-echo.ts +0 -23
  694. /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → Y4zKzL62sakG5momz3SoQ}/_ssgManifest.js +0 -0
@@ -3,6 +3,7 @@ param(
3
3
  [string] $Prefix,
4
4
  [string] $Source,
5
5
  [switch] $NoModifyPath,
6
+ [switch] $NoBootstrapBun,
6
7
  [switch] $Help,
7
8
  [Parameter(ValueFromRemainingArguments = $true)]
8
9
  [string[]] $RemainingArgs
@@ -20,8 +21,8 @@ $ErrorActionPreference = 'Stop'
20
21
 
21
22
  function Show-Usage {
22
23
  @'
23
- Usage: powershell -File scripts/install.ps1 [-Prefix PATH] [-Source PATH.tgz|URL] [-NoModifyPath] [-Help]
24
- powershell -File scripts/install.ps1 [--prefix PATH] [--source PATH.tgz|URL] [--no-modify-path] [--help]
24
+ Usage: powershell -File scripts/install.ps1 [-Prefix PATH] [-Source PATH.tgz|URL] [-NoModifyPath] [-NoBootstrapBun] [-Help]
25
+ powershell -File scripts/install.ps1 [--prefix PATH] [--source PATH.tgz|URL] [--no-modify-path] [--no-bootstrap-bun] [--help]
25
26
 
26
27
  Install elanous into a versioned layout.
27
28
  Prefix / --prefix installation root (default: $ELANOUS_INSTALL_PREFIX or %LOCALAPPDATA%\elanous)
@@ -29,6 +30,7 @@ Install elanous into a versioned layout.
29
30
  Source / --source install a package tarball (local path or http(s) URL; default: $ELANOUS_INSTALL_SOURCE,
30
31
  else pack the checkout or fetch the verified release when standalone)
31
32
  NoModifyPath / --no-modify-path do not append the elanous PATH block to the PowerShell profile
33
+ NoBootstrapBun / --no-bootstrap-bun fail instead of installing bun when missing
32
34
  Help / --help show this help
33
35
  '@ | Write-Output
34
36
  }
@@ -38,11 +40,15 @@ function Fail([string] $Message, [int] $Code) {
38
40
  exit $Code
39
41
  }
40
42
 
43
+ # PowerShell 5.1 parses BOM-less scripts as ANSI. Keep translated messages ASCII in source and decode at runtime.
44
+ function Say([string] $English, [string] $Korean) {
45
+ if ($installLang -eq 'ko') { return [regex]::Unescape($Korean) }
46
+ return $English
47
+ }
48
+
41
49
  function Get-RequiredCommands([string] $InstallerPath) {
42
- # install.sh is the single source of the required-command list; a non-checkout run (e.g. `irm ... | iex`) has no
43
- # install.sh beside it and falls back to the same two names.
44
- $fallbackCommands = 'git', 'bun'
45
- if (-not $InstallerPath -or -not (Test-Path -LiteralPath $InstallerPath)) { return $fallbackCommands }
50
+ # A checkout follows install.sh; standalone release installs need bun but not git.
51
+ if (-not $InstallerPath -or -not (Test-Path -LiteralPath $InstallerPath)) { return @('bun') }
46
52
  $content = Get-Content -LiteralPath $InstallerPath -Raw
47
53
  $match = [regex]::Match($content, 'REQUIRED_COMMANDS=\(([^)]*)\)')
48
54
  if (-not $match.Success) { Fail "could not read REQUIRED_COMMANDS from $InstallerPath" 1 }
@@ -87,11 +93,14 @@ for ($index = 0; $index -lt $RemainingArgs.Count; $index++) {
87
93
  $Source = $RemainingArgs[++$index]
88
94
  }
89
95
  '--no-modify-path' { $NoModifyPath = $true }
96
+ '--no-bootstrap-bun' { $NoBootstrapBun = $true }
90
97
  default { Fail "unknown argument: $($RemainingArgs[$index])" 2 }
91
98
  }
92
99
  }
93
100
 
94
101
  if ($Help) { Show-Usage; exit 0 }
102
+ $installLang = if ($env:ELANOUS_INSTALL_LANG) { $env:ELANOUS_INSTALL_LANG } else { [Globalization.CultureInfo]::CurrentUICulture.Name }
103
+ $installLang = if ($installLang -match '^ko(?:-|$)') { 'ko' } else { 'en' }
95
104
  if (-not $Prefix) {
96
105
  $dataHome = if ($env:LOCALAPPDATA) { $env:LOCALAPPDATA } else { Join-Path $HOME 'AppData\Local' }
97
106
  $Prefix = if ($env:ELANOUS_INSTALL_PREFIX) { $env:ELANOUS_INSTALL_PREFIX } else { Join-Path $dataHome 'elanous' }
@@ -100,15 +109,46 @@ if (-not $Source -and $env:ELANOUS_INSTALL_SOURCE) { $Source = $env:ELANOUS_INST
100
109
 
101
110
  $scriptDir = if ($PSCommandPath) { Split-Path -Parent $PSCommandPath } else { $null }
102
111
  $repoRoot = if ($scriptDir) { [IO.Path]::GetFullPath((Join-Path $scriptDir '..')) } else { $null }
103
- $requiredCommands = Get-RequiredCommands $(if ($scriptDir) { Join-Path $scriptDir 'install.sh' } else { $null })
112
+ $installerPath = if ($scriptDir) { Join-Path $scriptDir 'install.sh' } else { $null }
113
+ $requiredCommands = Get-RequiredCommands $installerPath
114
+ $missingGit = -not (Get-Command git -ErrorAction SilentlyContinue)
115
+ $bootstrappedBun = $false
116
+ $bunBin = Join-Path $HOME '.bun\bin'
117
+ if (-not (Get-Command bun -ErrorAction SilentlyContinue) -and (Test-Path -LiteralPath (Join-Path $bunBin 'bun.exe') -PathType Leaf)) {
118
+ $env:PATH = $bunBin + [IO.Path]::PathSeparator + $env:PATH
119
+ }
120
+ # Preserve checkout required-command enforcement, including git, before changing any installation files.
104
121
  foreach ($command in $requiredCommands) {
122
+ if ($command -eq 'bun') { continue }
105
123
  if (-not (Get-Command $command -ErrorAction SilentlyContinue)) { Fail "required command missing: $command" 127 }
106
124
  }
125
+ if (-not (Get-Command bun -ErrorAction SilentlyContinue)) {
126
+ $bunCommand = 'irm https://bun.sh/install.ps1 | iex'
127
+ if ($NoBootstrapBun) { Fail "$(Say 'bun is missing; run:' 'bun \uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uba3c\uc800 \uc2e4\ud589\ud558\uc138\uc694:') $bunCommand" 127 }
128
+ # Bun's official install.ps1 resets the session PATH to the user PATH only (System32 and tar vanish) - keep ours.
129
+ $pathBeforeBun = $env:PATH
130
+ try {
131
+ $bootstrapScript = if ($env:ELANOUS_INSTALL_BUN_SCRIPT) {
132
+ Read-Text $env:ELANOUS_INSTALL_BUN_SCRIPT
133
+ } else {
134
+ (Invoke-WebRequest -UseBasicParsing -Uri 'https://bun.sh/install.ps1').Content
135
+ }
136
+ if (-not $bootstrapScript) { throw 'empty installer response' }
137
+ & ([scriptblock]::Create([string]$bootstrapScript))
138
+ if (-not $?) { throw 'installer returned failure' }
139
+ if ($LASTEXITCODE -and $LASTEXITCODE -ne 0) { throw "installer exited with code $LASTEXITCODE" }
140
+ } catch { Fail "$(Say 'bun bootstrap failed:' 'bun \uc124\uce58 \uc2e4\ud328:') $($_.Exception.Message)" 1 }
141
+ $env:PATH = $bunBin + [IO.Path]::PathSeparator + $pathBeforeBun
142
+ if (-not (Get-Command bun -ErrorAction SilentlyContinue)) {
143
+ Fail (Say 'bun bootstrap failed: bun not found after installation' 'bun \uc124\uce58 \uc2e4\ud328: \uc124\uce58 \ub4a4\uc5d0\ub3c4 bun \uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4') 1
144
+ }
145
+ $bootstrappedBun = $true
146
+ }
107
147
  $bunPath = (Get-Command bun).Source
108
148
 
109
149
  # A standalone installer fetches a verified release; explicit sources and checkouts keep their existing paths.
110
150
  $isCheckout = $false
111
- if ($repoRoot -and (Test-Path -LiteralPath (Join-Path $repoRoot 'package.json'))) {
151
+ if ($installerPath -and (Test-Path -LiteralPath $installerPath) -and $repoRoot -and (Test-Path -LiteralPath (Join-Path $repoRoot 'package.json'))) {
112
152
  $isCheckout = (Read-Text (Join-Path $repoRoot 'package.json')) -match '"name":\s*"elanous"'
113
153
  }
114
154
  $releaseDirectory = $null
@@ -247,7 +287,26 @@ try {
247
287
  if (-not $NoModifyPath -and -not (Read-Text $profilePath).Contains($markerStart)) {
248
288
  Add-Content -LiteralPath $profilePath -Value ("`r`n$markerStart`r`n$pathLine`r`n$markerEnd")
249
289
  }
250
- Write-Output "Installed elanous $version at $shimPath"
290
+ # The default execution policy (Restricted) skips $PROFILE in a new window - the user PATH is what a fresh shell sees.
291
+ if (-not $NoModifyPath -and -not $env:ELANOUS_INSTALL_NO_USER_PATH) {
292
+ $binDirectory = Join-Path $Prefix 'bin'
293
+ $userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
294
+ $userEntries = @(($userPath -split ';') | Where-Object { $_ })
295
+ if ($userEntries -notcontains $binDirectory) {
296
+ [Environment]::SetEnvironmentVariable('Path', (@($binDirectory) + $userEntries) -join ';', 'User')
297
+ }
298
+ }
299
+ $installedMessage = Say 'Installed elanous {0} at {1}' 'elanous {0} \uc744(\ub97c) \uc124\uce58\ud588\uc2b5\ub2c8\ub2e4: {1}'
300
+ Write-Output ($installedMessage -f $version, $shimPath)
301
+ $bootstrapped = if ($bootstrappedBun) { 'bun' } else { 'none' }
302
+ $missing = if ($missingGit -and -not $isCheckout) { 'git(next step)' } else { 'none' }
303
+ Write-Output "$(Say 'Install summary' '\uc124\uce58 \uc694\uc57d'): bootstrapped: $bootstrapped; missing: $missing"
304
+ Write-Output (Say 'Next:' '\ub2e4\uc74c:')
305
+ if (-not $NoModifyPath) { Write-Output (Say ' Open a new PowerShell window to use elanous on PATH.' ' elanous \uc744 PATH \uc5d0\uc11c \uc4f0\ub824\uba74 \uc0c8 PowerShell \ucc3d\uc744 \uc5ec\uc138\uc694.') }
306
+ else { Write-Output "$(Say ' Run:' ' \uc2e4\ud589:') $shimPath" }
307
+ if ($missing -ne 'none') {
308
+ Write-Output " winget install --id Git.Git -e # $(Say 'the harness uses git' '\ud558\ub2c8\uc2a4\uac00 git \uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4')"
309
+ }
251
310
  } finally {
252
311
  Remove-Item -LiteralPath $tempDirectory -Recurse -Force -ErrorAction SilentlyContinue
253
312
  }
@@ -11,7 +11,7 @@ set -euo pipefail
11
11
 
12
12
  usage() {
13
13
  cat <<'EOF'
14
- Usage: bash scripts/install.sh [--prefix PATH] [--source PATH.tgz|URL] [--no-modify-path] [--no-bootstrap-bun] [--no-setup] [--yes] [--allow-downgrade] [--help]
14
+ Usage: bash scripts/install.sh [--prefix PATH] [--source PATH.tgz|URL] [--no-modify-path] [--no-bootstrap-bun] [--no-install-deps] [--no-setup] [--yes] [--allow-downgrade] [--help]
15
15
  curl -fsSL https://github.com/ElanvitalAI/elanous/releases/latest/download/install.sh | bash
16
16
 
17
17
  Install elanous without contacting a package registry.
@@ -23,6 +23,7 @@ Install elanous without contacting a package registry.
23
23
  (or set $ELANOUS_INSTALL_SOURCE; without either, fetch the verified latest release)
24
24
  --no-modify-path do not append the elanous PATH block to a shell startup file
25
25
  --no-bootstrap-bun fail instead of installing bun with its official installer when bun is missing
26
+ --no-install-deps do not install missing prerequisites with apt even when running as root
26
27
  --no-setup do not start first-time setup in this window after installing (interactive terminals only)
27
28
  --yes do not ask before updating an existing installation
28
29
  --allow-downgrade allow installing a version older than the one already installed
@@ -38,6 +39,7 @@ PREFIX="${ELANOUS_INSTALL_PREFIX:-${XDG_DATA_HOME:-${HOME:?HOME is required}/.lo
38
39
  SOURCE="${ELANOUS_INSTALL_SOURCE:-}"
39
40
  MODIFY_PATH=1
40
41
  BOOTSTRAP_BUN=1
42
+ INSTALL_DEPS=1
41
43
  RUN_SETUP=1
42
44
  ASSUME_YES=0
43
45
  ALLOW_DOWNGRADE=0
@@ -53,6 +55,7 @@ while [ "$#" -gt 0 ]; do
53
55
  SOURCE="$2"; shift 2 ;;
54
56
  --no-modify-path) MODIFY_PATH=0; shift ;;
55
57
  --no-bootstrap-bun) BOOTSTRAP_BUN=0; shift ;;
58
+ --no-install-deps) INSTALL_DEPS=0; shift ;;
56
59
  --no-setup) RUN_SETUP=0; shift ;;
57
60
  --yes|-y) ASSUME_YES=1; shift ;;
58
61
  --allow-downgrade) ALLOW_DOWNGRADE=1; shift ;;
@@ -91,8 +94,8 @@ if ! command -v bun >/dev/null 2>&1 && [ -x "${BUN_INSTALL:-$HOME/.bun}/bin/bun"
91
94
  export PATH="${BUN_INSTALL:-$HOME/.bun}/bin:$PATH"
92
95
  fi
93
96
  # Match doctor-distro.ts families when a required command is absent; do not source os-release as shell code.
94
- required_command_hint() {
95
- local package="$1" id='' id_like='' version='' key value family='unknown' like
97
+ required_command_family() {
98
+ local id='' id_like='' version='' key value family='unknown' like
96
99
  if [ "$(uname -s)" = 'Darwin' ]; then
97
100
  family='darwin'
98
101
  elif [ "$(uname -s)" = 'Linux' ] && [ -r "${ELANOUS_INSTALL_OS_RELEASE_FILE:-/etc/os-release}" ]; then
@@ -121,6 +124,12 @@ required_command_hint() {
121
124
  fi
122
125
  fi
123
126
  fi
127
+ printf '%s' "$family"
128
+ }
129
+
130
+ required_command_hint() {
131
+ local package="$1" family
132
+ family="$(required_command_family)"
124
133
  if [ "$package" = 'bun' ] && [ "$family" != 'unknown' ]; then
125
134
  echo ' curl -fsSL https://bun.sh/install | bash' >&2
126
135
  return
@@ -138,16 +147,33 @@ required_command_hint() {
138
147
  SUDO='sudo '
139
148
  [ "$(id -u 2>/dev/null)" = 0 ] && SUDO=''
140
149
 
141
- # 빠진 선행 명령을 «한 번에» 모아 한 줄로 댄다.
142
- # 🩸 09-25 베어 ubuntu:24.04 실측: unzip 으로 멈추고, 깔고 다시 돌리면 git 으로 또 멈췄다(세 판).
143
- # 패키지 매니저 권한은 사람 몫이라 대신 깔지 않는다. bun 은 여기서 세지 않는다(없으면 아래에서 공식 설치기로 깐다).
144
- MISSING=()
145
- if ! command -v bun >/dev/null 2>&1 && [ "$BOOTSTRAP_BUN" -eq 1 ]; then
146
- command -v curl >/dev/null 2>&1 || MISSING+=(curl)
147
- command -v unzip >/dev/null 2>&1 || MISSING+=(unzip) # bun 공식 설치기가 쓴다
150
+ # 빠진 선행 명령을 «한 번에» 모아 한 줄로 댄다. bun 은 여기서 세지 않는다(없으면 아래에서 공식 설치기로 깐다).
151
+ missing_prerequisites() {
152
+ MISSING=()
153
+ if ! command -v bun >/dev/null 2>&1 && [ "$BOOTSTRAP_BUN" -eq 1 ]; then
154
+ command -v curl >/dev/null 2>&1 || MISSING+=(curl)
155
+ command -v unzip >/dev/null 2>&1 || MISSING+=(unzip) # bun 공식 설치기가 쓴다
156
+ fi
157
+ command -v git >/dev/null 2>&1 || MISSING+=(git)
158
+ }
159
+ missing_prerequisites
160
+ INSTALLED_DEPS=''
161
+ DEPS_INSTALL_FAILED=0
162
+ if [ "${#MISSING[@]}" -gt 0 ] && [ "$INSTALL_DEPS" -eq 1 ] && [ "$SUDO" = '' ] &&
163
+ command -v apt-get >/dev/null 2>&1 && [ "$(required_command_family)" = debian ]; then
164
+ DEPS_TO_INSTALL=("${MISSING[@]}")
165
+ # Fresh container images ship with empty package lists — refresh once, then install without prompts.
166
+ if DEBIAN_FRONTEND=noninteractive apt-get update -qq >&2 &&
167
+ DEBIAN_FRONTEND=noninteractive apt-get install -y -qq "${DEPS_TO_INSTALL[@]}" >&2; then
168
+ INSTALLED_DEPS="${DEPS_TO_INSTALL[*]}"
169
+ echo "installed: $INSTALLED_DEPS" >&2
170
+ missing_prerequisites
171
+ else
172
+ DEPS_INSTALL_FAILED=1
173
+ echo '⛔ 자동 설치 실패 — 아래를 직접 실행하라 (automatic install failed — run the command below yourself):' >&2
174
+ fi
148
175
  fi
149
- command -v git >/dev/null 2>&1 || MISSING+=(git)
150
- if [ "${#MISSING[@]}" -gt 0 ]; then
176
+ if [ "${#MISSING[@]}" -gt 0 ] || [ "$DEPS_INSTALL_FAILED" -eq 1 ]; then
151
177
  echo "⛔ required command missing: ${MISSING[*]}. Install it, then rerun this script:" >&2
152
178
  required_command_hint "${MISSING[*]}"
153
179
  exit 127
@@ -429,6 +455,7 @@ if [ "$MODIFY_PATH" -eq 1 ] && [ -n "${LOGIN_STARTUP:-}" ] && ! grep -Fqx "$MARK
429
455
  fi
430
456
 
431
457
  echo "$(t "Installed elanous $VERSION at $PREFIX/bin/elanous" "elanous $VERSION 을(를) 설치했습니다: $PREFIX/bin/elanous")"
458
+ [ -z "$INSTALLED_DEPS" ] || echo "installed: $INSTALLED_DEPS"
432
459
 
433
460
  # ── 다음 걸음 (2026-09-23 · Phase 3 「사람 손」) ─────────────────────────
434
461
  # ⛔ 설치가 끝나도 «무엇을 더 쳐야 하나»를 안 말하면, 빠뜨린 손이 나중에 «다른 원인의 얼굴»로 나타난다
@@ -79,6 +79,9 @@ export function createScenarios(): Scenario[] {
79
79
  export function createScenariosWithReplay(readReplay: typeof readTerminalReplay): Scenario[] {
80
80
  const marker = `pwa-scn-${randomBytes(8).toString('hex')}`;
81
81
  const t1bMarker = `pwa-scn-${randomBytes(8).toString('hex')}`;
82
+ const t5bFirst = `ELANOUS_T5B_${randomBytes(8).toString('hex')}`;
83
+ const t5bSecond = `ELANOUS_T5B_${randomBytes(8).toString('hex')}`;
84
+ const screenContains = (text: string): string => `(() => { const host = document.querySelector('[data-xterm-host]'); const term = host?.__elanousTerm; if (!term || !host.getClientRects().length) return false; const buffer = term.buffer.active; for (let row = buffer.viewportY; row < buffer.viewportY + term.rows; row++) if (buffer.getLine(row)?.translateToString().includes(${JSON.stringify(text)})) return true; return false; })()`;
82
85
  // C1 — the answer (n+1) never appears in the question, so finding it on the page means a model replied.
83
86
  const c1Base = 1000 + (randomBytes(2).readUInt16BE(0) % 8000);
84
87
  return [
@@ -149,6 +152,23 @@ export function createScenariosWithReplay(readReplay: typeof readTerminalReplay)
149
152
  return body.terminals.filter((row) => row.producer === 'web-registration' && row.id === ids.terminalId).length === 1;
150
153
  } }],
151
154
  },
155
+ {
156
+ id: 'T5b', surface: 'terminal', path: '/app/term/', title: 'terminal shows output on open and after reload',
157
+ steps: [
158
+ { kind: 'goto' }, { kind: 'waitFor', selector: terminal, timeoutMs: 20_000 },
159
+ { kind: 'waitFor', jsPredicate: `Array.from(document.querySelectorAll(${JSON.stringify(connected)})).some(node => node.textContent?.includes('ACP: 연결됨'))`, timeoutMs: 20_000 },
160
+ { kind: 'click', selector: terminal }, { kind: 'type', text: `echo ${t5bFirst}` }, { kind: 'press', key: 'Enter' },
161
+ { kind: 'waitFor', jsPredicate: screenContains(t5bFirst), timeoutMs: 20_000 },
162
+ { kind: 'goto' }, { kind: 'waitFor', selector: terminal, timeoutMs: 20_000 },
163
+ { kind: 'waitFor', jsPredicate: screenContains(t5bFirst), timeoutMs: 20_000 },
164
+ { kind: 'click', selector: terminal }, { kind: 'type', text: `echo ${t5bSecond}` }, { kind: 'press', key: 'Enter' },
165
+ { kind: 'waitFor', jsPredicate: screenContains(t5bSecond), timeoutMs: 20_000 },
166
+ ],
167
+ expect: [
168
+ { js: screenContains(t5bFirst), expected: 'first marker still visible after reload' },
169
+ { js: screenContains(t5bSecond), expected: 'new output visible after reload' },
170
+ ],
171
+ },
152
172
  {
153
173
  id: 'C1', surface: 'chat', path: '/app/chat/', title: 'first message streams a model reply', costly: true,
154
174
  steps: [{ kind: 'goto' }, { kind: 'waitFor', selector: chatInput, timeoutMs: 20_000 }, { kind: 'click', selector: chatInput }, { kind: 'type', text: `Reply with only the number that is one more than ${c1Base}.` }, { kind: 'press', key: 'Enter' }],
@@ -0,0 +1,146 @@
1
+ // V1 — TUI regression checks that UX measured by hand on 10-02 (U1a · U1b · MAT1c · ONB1), as data.
2
+ // Each check says what to type and how to judge the rendered screen text. The verdicts are pure
3
+ // (screen string → ok/reason) so they are unit-tested without a PTY; scripts/tui-regress.ts drives the PTY.
4
+
5
+ export type Step =
6
+ | { kind: 'type'; text: string }
7
+ | { kind: 'key'; data: string }
8
+ | { kind: 'wait'; ms: number }
9
+ | { kind: 'snap'; as: string }
10
+ | { kind: 'erase'; count: number };
11
+
12
+ export interface Verdict { ok: boolean; reason: string }
13
+
14
+ export interface TuiCheck {
15
+ id: string;
16
+ title: string;
17
+ /** `tui.role` to set in the temp config before launch (owner when omitted). */
18
+ role?: 'owner' | 'contributor' | 'general';
19
+ steps: Step[];
20
+ judge: (snaps: Record<string, string>) => Verdict;
21
+ }
22
+
23
+ const CTRL_C = '\x03';
24
+ const BACKSPACE = '\x7f';
25
+ const HINT = /한 번 더 누르면 나갑니다/;
26
+
27
+ const ok = (reason: string): Verdict => ({ ok: true, reason });
28
+ const no = (reason: string): Verdict => ({ ok: false, reason });
29
+
30
+ /** The input row: the last screen line that starts with the prompt marker. */
31
+ export function inputRow(screen: string): string | undefined {
32
+ return screen.split('\n').filter((line) => line.trimStart().startsWith('❯')).at(-1);
33
+ }
34
+
35
+ /** Palette entries visible after typing a slash prefix (lines other than the input row that show `/name`). */
36
+ export function paletteHas(screen: string, name: string): boolean {
37
+ const row = inputRow(screen);
38
+ return screen.split('\n').some((line) => line !== row && line.includes(`/${name}`));
39
+ }
40
+
41
+ export function judgeFirstScreen(screen: string): Verdict {
42
+ if (/Step 1/.test(screen)) return no('«Step 1» 마법사가 떴다');
43
+ if (!inputRow(screen)) return no('입력칸 «❯» 가 없다');
44
+ return ok('입력칸이 보이고 «Step 1» 이 없다');
45
+ }
46
+
47
+ export function judgeHintAppearsThenClears(armed: string, later: string): Verdict {
48
+ if (!HINT.test(armed)) return no('빈 입력 Ctrl+C 뒤 안내가 안 보인다');
49
+ if (HINT.test(later)) return no('2.6초 뒤에도 안내가 남아 있다');
50
+ return ok('안내가 떴다가 2초 뒤 사라졌다');
51
+ }
52
+
53
+ export function judgeCtrlCClearsText(typed: string, after: string, text: string): Verdict {
54
+ if (!(inputRow(typed) ?? '').includes(text)) return no('친 글이 입력칸에 안 보인다(준비 실패)');
55
+ if ((inputRow(after) ?? '').includes(text)) return no('Ctrl+C 뒤에도 글이 남아 있다');
56
+ if (HINT.test(after)) return no('글을 지우는 Ctrl+C 에 나가기 안내가 떴다');
57
+ return ok('글이 지워지고 안내는 없다');
58
+ }
59
+
60
+ export function judgePalette(screens: Record<string, string>, expectations: Record<string, boolean>): Verdict {
61
+ for (const [name, want] of Object.entries(expectations)) {
62
+ const screen = screens[name];
63
+ if (screen === undefined) return no(`/${name} 화면이 없다`);
64
+ if (paletteHas(screen, name) !== want) return no(`/${name} 가 팔레트에 ${want ? '없다' : '보인다'}`);
65
+ }
66
+ return ok(Object.entries(expectations).map(([n, w]) => `/${n} ${w ? '보임' : '숨김'}`).join(' · '));
67
+ }
68
+
69
+ /** U1b — the help is drawn (key section ⊕ a run of command rows) and the prompt survives below it.
70
+ * Not «the whole grid fits»: an owner sees 60+ commands, which exceed a 50-row screen and scroll (PgUp). */
71
+ export function judgeHelpShown(screen: string): Verdict {
72
+ const lines = screen.split('\n');
73
+ const commandRows = lines.filter((line) => /^\s+\/[a-z][a-z-]*/.test(line)).length;
74
+ if (!lines.some((line) => /^\s*Keys\s*$/.test(line))) return no('/help 의 Keys 절이 안 보인다');
75
+ if (commandRows < 10) return no(`명령 줄이 ${commandRows}개뿐이다`);
76
+ if (!inputRow(screen)) return no('도움말을 연 뒤 입력칸이 화면 밖으로 밀렸다');
77
+ return ok(`도움말이 그려졌다(명령 줄 ${commandRows} · Keys 절 · 입력칸 유지)`);
78
+ }
79
+
80
+ /** U1c2 — lines typed while a reply streams show up as «my» lines, in order, each above its own answer. */
81
+ export function judgeQueuedEcho(screen: string): Verdict {
82
+ const lines = screen.split('\n');
83
+ const at = (re: RegExp, after = -1) => lines.findIndex((line, i) => i > after && re.test(line));
84
+ const u2 = at(/Q2MARK 라고만/);
85
+ if (u2 < 0) return no('줄 서 있던 «Q2MARK 라고만» 이 내 말로 안 보인다');
86
+ const a2 = lines.findIndex((line, i) => i > u2 && /Q2MARK/.test(line) && !/라고만/.test(line));
87
+ const u3 = at(/Q3MARK 라고만/, u2);
88
+ if (u3 < 0) return no('«Q3MARK 라고만» 이 내 말로 안 보인다(또는 순서가 뒤집혔다)');
89
+ const a3 = lines.findIndex((line, i) => i > u3 && /Q3MARK/.test(line) && !/라고만/.test(line));
90
+ if (!(a2 > u2 && u3 > a2 && a3 > u3)) return no(`순서가 내 말2(${u2}) → 답2(${a2}) → 내 말3(${u3}) → 답3(${a3}) 가 아니다`);
91
+ return ok('내 말2 → 답2 → 내 말3 → 답3');
92
+ }
93
+
94
+ const PALETTE_STEPS = (names: string[]): Step[] => names.flatMap((name) => [
95
+ { kind: 'type', text: `/${name.slice(0, 3)}` } as Step,
96
+ { kind: 'wait', ms: 800 } as Step,
97
+ { kind: 'snap', as: name } as Step,
98
+ { kind: 'erase', count: 4 } as Step,
99
+ { kind: 'wait', ms: 300 } as Step,
100
+ ]);
101
+
102
+ export const TUI_REGRESS_CHECKS: TuiCheck[] = [
103
+ {
104
+ id: 'R1', title: '첫 화면 — 입력칸 · «Step 1» 0 (ONB1)',
105
+ steps: [{ kind: 'snap', as: 'boot' }],
106
+ judge: (s) => judgeFirstScreen(s.boot ?? ''),
107
+ },
108
+ {
109
+ id: 'R2', title: '빈 입력 Ctrl+C → 안내 → 2초 뒤 사라짐 (U1a · #22868)',
110
+ steps: [{ kind: 'key', data: CTRL_C }, { kind: 'wait', ms: 300 }, { kind: 'snap', as: 'armed' }, { kind: 'wait', ms: 2600 }, { kind: 'snap', as: 'later' }],
111
+ judge: (s) => judgeHintAppearsThenClears(s.armed ?? '', s.later ?? ''),
112
+ },
113
+ {
114
+ id: 'R3', title: '글 친 뒤 Ctrl+C → 입력 지움 · 안내 없음 (U1a)',
115
+ steps: [{ kind: 'type', text: 'regress-abc' }, { kind: 'wait', ms: 400 }, { kind: 'snap', as: 'typed' }, { kind: 'key', data: CTRL_C }, { kind: 'wait', ms: 400 }, { kind: 'snap', as: 'after' }],
116
+ judge: (s) => judgeCtrlCClearsText(s.typed ?? '', s.after ?? '', 'regress-abc'),
117
+ },
118
+ {
119
+ id: 'R4', title: 'owner 팔레트 — /directive · /help 보임 (MAT1c)',
120
+ steps: PALETTE_STEPS(['directive', 'help']),
121
+ judge: (s) => judgePalette(s, { directive: true, help: true }),
122
+ },
123
+ {
124
+ id: 'R5', title: 'general 팔레트 — /directive 숨김 · /help 보임 (MAT1c)',
125
+ role: 'general',
126
+ steps: PALETTE_STEPS(['directive', 'help']),
127
+ judge: (s) => judgePalette(s, { directive: false, help: true }),
128
+ },
129
+ {
130
+ id: 'R6', title: '/help 가 그려지고 입력칸이 남는다 (U1b · #22802)',
131
+ steps: [{ kind: 'type', text: '/help' }, { kind: 'key', data: '\r' }, { kind: 'wait', ms: 1500 }, { kind: 'snap', as: 'help' }],
132
+ judge: (s) => judgeHelpShown(s.help ?? ''),
133
+ },
134
+ {
135
+ id: 'R7', title: '답 오는 중 쳐 둔 두 줄이 내 말로 차례로 (U1c2 · #23026 · 실제 LLM 턴)',
136
+ steps: [
137
+ { kind: 'type', text: '1부터 25까지 숫자를 한 줄에 하나씩 써 줘. 도구는 쓰지 마.' }, { kind: 'key', data: '\r' }, { kind: 'wait', ms: 2500 },
138
+ { kind: 'type', text: 'Q2MARK 라고만 답해' }, { kind: 'key', data: '\r' }, { kind: 'wait', ms: 500 },
139
+ { kind: 'type', text: 'Q3MARK 라고만 답해' }, { kind: 'key', data: '\r' }, { kind: 'wait', ms: 60_000 },
140
+ { kind: 'snap', as: 'after' },
141
+ ],
142
+ judge: (s) => judgeQueuedEcho(s.after ?? ''),
143
+ },
144
+ ];
145
+
146
+ export const ERASE = BACKSPACE;
@@ -0,0 +1,169 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { closeSync, lstatSync, openSync, readSync } from 'node:fs';
3
+ import { basename, sep } from 'node:path';
4
+
5
+ const COMMANDS = {
6
+ lines: 'git ls-files -z',
7
+ prs: 'gh pr list --state merged --limit 100000 --json number',
8
+ months: 'git log --reverse --format=%cs | head -1',
9
+ } as const;
10
+
11
+ const UNMEASURED = '못 잼' as const;
12
+ type Metric = number | typeof UNMEASURED;
13
+
14
+ interface SiteNumberRow {
15
+ value: Metric;
16
+ command: string;
17
+ denominator: string;
18
+ candidate: string;
19
+ error?: string;
20
+ }
21
+
22
+ interface SiteNumbers {
23
+ measuredAtKst: string;
24
+ lines: SiteNumberRow;
25
+ prs: SiteNumberRow;
26
+ months: SiteNumberRow;
27
+ }
28
+
29
+ function command(binary: string, args: string[], cwd: string): Buffer {
30
+ return execFileSync(binary, args, { cwd, maxBuffer: 64 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'] });
31
+ }
32
+
33
+ export function siteNumberCandidate(value: number, kind: 'lines' | 'prs' | 'months'): string {
34
+ if (!Number.isSafeInteger(value) || value < 0) throw new Error('invalid measurement');
35
+ if (kind === 'months') return value >= 1 ? `${value}개월+` : '큰 수 후보 없음';
36
+ if (kind === 'lines' && value >= 1_000_000) return `${Math.floor(value / 100_000) * 10}만+`;
37
+ return value >= 10_000 ? `${Math.floor(value / 10_000)}만+` : '큰 수 후보 없음';
38
+ }
39
+
40
+ export function completedMonths(firstDay: string, todayKst: string): number {
41
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(firstDay) || !/^\d{4}-\d{2}-\d{2}$/.test(todayKst)
42
+ || !Number.isFinite(Date.parse(`${firstDay}T00:00:00Z`)) || !Number.isFinite(Date.parse(`${todayKst}T00:00:00Z`))) {
43
+ throw new Error('invalid commit or measurement date');
44
+ }
45
+ const [year, month, day] = firstDay.split('-').map(Number);
46
+ const [nowYear, nowMonth, nowDay] = todayKst.split('-').map(Number);
47
+ const months = (nowYear - year) * 12 + nowMonth - month - Number(nowDay < day);
48
+ if (months < 0) throw new Error('first commit is after measurement day');
49
+ return months;
50
+ }
51
+
52
+ function trackedTextLines(cwd: string): { lines: number; included: number; excluded: number } {
53
+ const paths = command('git', ['ls-files', '-z'], cwd).toString('utf8').split('\0').filter(Boolean);
54
+ let lines = 0;
55
+ let included = 0;
56
+ let excluded = 0;
57
+ const chunk = Buffer.allocUnsafe(64 * 1024);
58
+ for (const path of paths) {
59
+ const name = basename(path);
60
+ if (path.split(/[\\/]/).includes('node_modules') || name.endsWith('.lock')
61
+ || ['package-lock.json', 'npm-shrinkwrap.json', 'pnpm-lock.yaml', 'yarn.lock', 'Pipfile.lock'].includes(name)) {
62
+ excluded++;
63
+ continue;
64
+ }
65
+ const fullPath = `${cwd}${sep}${path}`;
66
+ try {
67
+ if (!lstatSync(fullPath).isFile()) { excluded++; continue; }
68
+ const fd = openSync(fullPath, 'r');
69
+ let fileLines = 0;
70
+ let lastByte: number | undefined;
71
+ let binary = false;
72
+ const decoder = new TextDecoder('utf-8', { fatal: true });
73
+ try {
74
+ let n: number;
75
+ while ((n = readSync(fd, chunk, 0, chunk.length, null)) > 0) {
76
+ for (let i = 0; i < n; i++) {
77
+ const byte = chunk[i];
78
+ if (byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13 && byte !== 12 && byte !== 27)) {
79
+ binary = true;
80
+ break;
81
+ }
82
+ if (byte === 10) fileLines++;
83
+ }
84
+ if (binary) break;
85
+ lastByte = chunk[n - 1];
86
+ try { decoder.decode(chunk.subarray(0, n), { stream: true }); }
87
+ catch { binary = true; break; }
88
+ }
89
+ if (!binary) {
90
+ try { decoder.decode(); } catch { binary = true; }
91
+ }
92
+ } finally { closeSync(fd); }
93
+ if (binary) excluded++;
94
+ else { lines += fileLines + Number(lastByte !== undefined && lastByte !== 10); included++; }
95
+ } catch (error) {
96
+ throw new Error(`tracked file cannot be read: ${path}`, { cause: error });
97
+ }
98
+ }
99
+ return { lines, included, excluded };
100
+ }
101
+
102
+ function measured(value: number, commandText: string, denominator: string, kind: 'lines' | 'prs' | 'months'): SiteNumberRow {
103
+ const candidate = siteNumberCandidate(value, kind);
104
+ const unit = kind === 'lines' ? '줄' : 'PR';
105
+ return { value, command: commandText, denominator,
106
+ candidate: candidate === '큰 수 후보 없음' || kind === 'months' ? candidate : `${candidate} ${unit}` };
107
+ }
108
+
109
+ function unavailable(commandText: string, denominator: string, error: unknown): SiteNumberRow {
110
+ return { value: UNMEASURED, command: commandText, denominator, candidate: UNMEASURED,
111
+ error: error instanceof Error ? error.message : String(error) };
112
+ }
113
+
114
+ export function measureSiteNumbers(options: { cwd: string; now?: Date; ghCommand?: string }): SiteNumbers {
115
+ const { cwd, now = new Date(), ghCommand = 'gh' } = options;
116
+ const measuredAtKst = new Intl.DateTimeFormat('sv-SE', {
117
+ timeZone: 'Asia/Seoul', year: 'numeric', month: '2-digit', day: '2-digit',
118
+ hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23',
119
+ }).format(now).replace(' ', 'T') + '+09:00';
120
+ const todayKst = measuredAtKst.slice(0, 10);
121
+ let lines: SiteNumberRow;
122
+ try {
123
+ const result = trackedTextLines(cwd);
124
+ lines = measured(result.lines, COMMANDS.lines,
125
+ `git ls-files 추적 파일 ${result.included + result.excluded}개 중 UTF-8 일반 텍스트 ${result.included}개; 제외 ${result.excluded}개 (바이너리/제어 바이트·node_modules·잠금 파일·심볼릭 링크); 각 파일의 LF 개수 + 마지막 개행 없는 비어 있지 않은 파일의 마지막 줄`, 'lines');
126
+ } catch (error) {
127
+ lines = unavailable(COMMANDS.lines, 'git ls-files 추적 UTF-8 일반 텍스트 파일; 바이너리·node_modules·잠금 파일·심볼릭 링크 제외; LF 개수 + 마지막 개행 없는 비어 있지 않은 파일의 마지막 줄', error);
128
+ }
129
+ let prs: SiteNumberRow;
130
+ const prDenominator = '현재 저장소에서 gh가 반환한 병합 PR 목록 (상한 100000개; 제작 주체 미분류)';
131
+ try {
132
+ const list: unknown = JSON.parse(command(ghCommand, ['pr', 'list', '--state', 'merged', '--limit', '100000', '--json', 'number'], cwd).toString('utf8'));
133
+ if (!Array.isArray(list) || !list.every(item => item !== null && typeof item === 'object' && Number.isSafeInteger(item.number))) {
134
+ throw new Error('invalid gh PR response');
135
+ }
136
+ prs = measured(list.length, COMMANDS.prs, prDenominator, 'prs');
137
+ } catch (error) {
138
+ prs = unavailable(COMMANDS.prs, prDenominator, error);
139
+ }
140
+ let months: SiteNumberRow;
141
+ try {
142
+ const firstDay = command('git', ['log', '--reverse', '--format=%cs'], cwd).toString('utf8').split('\n')[0];
143
+ if (!firstDay) throw new Error('no commits');
144
+ months = measured(completedMonths(firstDay, todayKst), COMMANDS.months,
145
+ `첫 커밋 날짜 ${firstDay}부터 KST 오늘 ${todayKst}까지 완료된 달력 개월 (일 미도달이면 1개월 차감)`, 'months');
146
+ } catch (error) {
147
+ months = unavailable(COMMANDS.months, `첫 커밋 날짜부터 KST 오늘 ${todayKst}까지 완료된 달력 개월`, error);
148
+ }
149
+ return { measuredAtKst, lines, prs, months };
150
+ }
151
+
152
+ if (import.meta.main) {
153
+ const args = process.argv.slice(2);
154
+ if (args.some(arg => arg !== '--json') || args.length > 1) {
155
+ console.error('Usage: bun scripts/marketing/measure-site-numbers.ts [--json]');
156
+ process.exitCode = 2;
157
+ } else {
158
+ const result = measureSiteNumbers({ cwd: process.cwd() });
159
+ if (args.includes('--json')) console.log(JSON.stringify(result, null, 2));
160
+ else {
161
+ console.log(`잰 시각: ${result.measuredAtKst} (KST)`);
162
+ for (const [label, row] of [['줄 수', result.lines], ['병합 PR', result.prs], ['기간', result.months]] as const) {
163
+ console.log(`${label}: ${row.value} · 후보 ${row.candidate}`);
164
+ console.log(` 명령: ${row.command}\n 분모: ${row.denominator}`);
165
+ if (row.error) console.log(` 못 잰 이유: ${row.error}`);
166
+ }
167
+ }
168
+ }
169
+ }