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
@@ -0,0 +1,926 @@
1
+ ---
2
+ name: lecture-note-digitizer
3
+ description: "모든 대학 강의(경영/공학/의학/법학/인문 등)를 위한 강의노트 디지털화 스킬. 손필기 PDF + 슬라이드 + 요약 → Mermaid rich 코드 Markdown → PNG → HTML → PDF. diagram-master 스킬 연동 (Mermaid/Matplotlib/Excalidraw 자동 선택). Use when: '강의노트 정리', '디지털 노트', '강의 정리', 'lecture note', '노트 변환', '강의 요약 PDF', '손필기 디지털화', '강의 PDF'."
4
+ minTier: T1
5
+ composes: [diagram-master]
6
+ category: digest
7
+ requires: []
8
+ ---
9
+
10
+ # Lecture Note Digitizer
11
+
12
+ 손글씨 강의 노트 + 강의 요약을 종합하여 다이어그램 포함 디지털 강의 노트 PDF를 생성하는 스킬.
13
+
14
+ **핵심 원칙**
15
+ - **Mermaid 우선 (90%)**: 마크다운에 Mermaid 코드 내장 → render_mermaid.py로 PNG 생성
16
+ - **Excalidraw fallback (10%)**: 곡선 그래프, 완전 자유형만
17
+ - **Phase 2 후 사용자 확인 필수**: 마크다운 완료 후 반드시 피드백 받고 다음 단계 진행
18
+
19
+ ## 전체 파이프라인
20
+
21
+ ```
22
+ Input Sources (any combination):
23
+ ├─ 손필기 노트 PDF / 이미지
24
+ ├─ 강의 슬라이드 PDF
25
+ └─ 강의 요약 / 녹취록 마크다운
26
+ ↓
27
+ Phase 1: 자료 수집 및 분석
28
+ ↓
29
+ Phase 2: 종합 Markdown (Mermaid 코드 포함)
30
+ ↓
31
+ ★ 사용자 확인 (구조/내용 피드백) ★
32
+ ↓
33
+ Phase 3: Chart PNG 생성 (Mermaid 우선, 곡선만 Excalidraw)
34
+ ↓
35
+ Phase 4: 통합 HTML 생성 (PNG 삽입)
36
+ ↓
37
+ Phase 5: Playwright PDF 변환
38
+ ↓
39
+ Output: {주차}_학습노트.pdf
40
+ ```
41
+
42
+ ---
43
+
44
+ ## 무료로 쓰는 길 (키 없이)
45
+
46
+ 로컬 PDF/이미지와 텍스트를 읽고 Markdown의 Mermaid 코드블록으로 노트를 작성합니다. 렌더링이 필요하면 형제 스킬 `../diagram-master/references`의 Mermaid 렌더러를 사용하고, PDF는 로컬 Playwright로 생성합니다. 입력이 이미지뿐일 때는 로컬 OCR을 먼저 사용합니다. 이 경로에 API 키는 필요하지 않습니다.
47
+
48
+ ## 내 키로 쓰는 길
49
+
50
+ AI가 새 일러스트형 다이어그램을 만들어야 할 때만 형제 스킬의 Nano Banana 엔진에 자신의 `GEMINI_API_KEY` 또는 `GOOGLE_API_KEY`를 실행 환경변수로 전달합니다. 나머지 로컬 Mermaid/PDF 경로에는 키가 필요 없습니다. 키 값이나 자격 파일은 사본에 넣지 않습니다.
51
+
52
+ ## Phase 1: 자료 수집 및 분석
53
+
54
+ ### 1.1 입력 파일 탐색
55
+
56
+ 사용자가 작업 디렉토리를 지정하면, 해당 디렉토리에서 관련 파일을 자동 탐색한다.
57
+
58
+ ```
59
+ 탐색 대상:
60
+ ├─ *.pdf → 강의 슬라이드, 손필기 노트
61
+ ├─ *.md → 강의 요약, 녹취록
62
+ ├─ *.png/*.jpg → 손필기 이미지 (사용자가 메시지에 첨부하는 경우)
63
+ ├─ sources/common/ → 과목 공통 자료 (실라버스, 교재, 과목 개요 등)
64
+ └─ 이전 주차 디지털 노트 → 포맷 참조용
65
+ ```
66
+
67
+ ### 1.2 자료 읽기
68
+
69
+ 1. **손필기 PDF**: `Read` 도구로 페이지별 읽기 (한 번에 10페이지씩)
70
+ 2. **강의 요약 마크다운**: `Read` 도구로 전체 읽기 (큰 파일은 분할)
71
+ 3. **이미지**: `Read` 도구로 시각적 분석 (손글씨 다이어그램 해석)
72
+ 4. **이전 주차 노트**: 포맷, 스타일, 구조 참조
73
+
74
+ ### 1.3 구조 파악
75
+
76
+ 읽은 자료를 바탕으로 강의의 논리적 구조를 파악한다:
77
+
78
+ - 강의의 **파트/섹션 구분** (주제별)
79
+ - 각 섹션의 **핵심 개념** 식별
80
+ - **다이어그램 후보** 식별 (손필기에서 그림/도표가 있는 부분)
81
+ - **Mermaid vs Excalidraw 분류** (아래 판단 기준 참조)
82
+ - **사례/케이스** 식별
83
+ - **핵심 공식/원칙** 식별
84
+
85
+ ---
86
+
87
+ ## Phase 2: 종합 디지털 강의 노트 (Markdown)
88
+
89
+ ### 2.1 마크다운 구조
90
+
91
+ ```markdown
92
+ # {과목명} {N}주차 강의 노트 ({날짜})
93
+ ## {부제: 강의 핵심 주제}
94
+
95
+ ---
96
+
97
+ ## 목차
98
+ - [강의 개요](#overview) ← **optional** (기본 미포함, 온보딩 시 결정)
99
+ - [용어집 (Glossary)](#glossary)
100
+ - [제1부: {섹션 제목}](#part1)
101
+ - [1.1 {소주제}](#sec1-1)
102
+ - [1.2 {소주제}](#sec1-2)
103
+ - [제2부: {섹션 제목}](#part2)
104
+ - [2.1 {소주제}](#sec2-1)
105
+ - [부록: 다이어그램 목록](#appendix)
106
+
107
+ **부록 정책:**
108
+ - 마크다운: `# 부록: 다이어그램 목록` 섹션 항상 포함 (파일명, 유형, 내용 테이블). 다이어그램 변경 시 반드시 동기화.
109
+ - 웹 HTML / PDF: 부록 섹션 제외 — `regenerate_all_html.py`에서 마크다운 → HTML 변환 전 regex 스트리핑: `re.sub(r'\n---\n\n#+ 부록: 다이어그램 목록.*', '', md_text, flags=re.DOTALL)`
110
+
111
+ **강의 개요 정책:**
112
+ - 마크다운: 기본 미포함 (이미 생성된 노트에서는 제거 완료)
113
+ - 표지 정보(과목명, 교수, 일시 등)는 HTML 커버 페이지에서 직접 생성
114
+
115
+ ---
116
+
117
+ <a id="overview"></a>
118
+ ## 강의 개요 *(optional — 온보딩(Phase 0) 시 사용자가 포함 여부를 결정)*
119
+
120
+ > **기본 정책**: 주차별 노트에서는 기본 미포함. course-master 종합 가이드에 포함할 수 있음.
121
+
122
+ | 항목 | 내용 |
123
+ |------|------|
124
+ | 과목명 | ... |
125
+ | 일시 | ... |
126
+ | 주차 | ... |
127
+ | 핵심 키워드 | ... |
128
+
129
+ > **핵심 메시지**: {한 문장 요약}
130
+
131
+ ---
132
+
133
+ <a id="glossary"></a>
134
+ ## 용어집 (Glossary)
135
+
136
+ | 약어 | 영문 | 한국어 | 정의 |
137
+ |------|------|--------|------|
138
+ | \( MB \) | Marginal Benefit | 한계편익 | 활동 1단위 추가 시 얻는 추가 이득 |
139
+ | \( APL \) | Average Product of Labor | 노동의 평균생산 | 총생산량을 노동 투입량으로 나눈 값 |
140
+
141
+ > 해당 주차에서 **처음 등장하는** 약어/전문용어만 포함. 이전 주차에서 이미 정의된 용어는 생략.
142
+
143
+ ---
144
+
145
+ <a id="part1"></a>
146
+ # 제{N}부: {섹션 제목}
147
+
148
+ <a id="sec1-1"></a>
149
+ ## {N}.1 {소주제}
150
+
151
+ {내용}
152
+
153
+ ```mermaid
154
+ flowchart TB
155
+ ...Mermaid 코드...
156
+ ```
157
+
158
+ ### 사례/케이스 박스
159
+ {사례 내용}
160
+
161
+ ---
162
+
163
+ <a id="appendix"></a>
164
+ # 부록: 다이어그램 목록
165
+ | # | 파일명 | 유형 | 내용 |
166
+ ```
167
+
168
+ **목차 + 앵커 ID 규칙:**
169
+ - 마크다운 최상단에 `[텍스트](#앵커)` 형식 목차 포함
170
+ - 각 헤딩 바로 위에 `<a id="앵커"></a>` 삽입
171
+ - 앵커 ID는 영문 사용: `overview`, `glossary`, `part1`, `sec1-1`, `appendix` 등
172
+ - 이 구조는 마크다운(Typora/GitHub), 웹 HTML(사이드바), PDF(내부 링크) 3중 작동 보장
173
+
174
+ ### 2.2 작성 원칙
175
+
176
+ 1. **강의 순서 유지**: 실제 강의 진행 순서를 따른다
177
+ 2. **손필기 + 요약 통합**: 손필기의 시각적 정보와 요약의 텍스트 정보를 결합
178
+ 3. **Mermaid 코드 내장**: 각 다이어그램 위치에 Mermaid 코드블록 삽입 (GitHub/Obsidian에서 렌더링)
179
+ 4. **표/테이블 활용**: 비교, 분류, 요약에 적극 활용
180
+ 5. **수식/공식**: KaTeX LaTeX 구문 `\( ... \)` (인라인) 사용. 강조 수식은 `> \( ... \)` (blockquote + 인라인). **`$$ ... $$` 블록 수식은 사용 금지** — Typora에서 렌더링 깨짐. 분수는 `\frac{}{}`, 첨자는 `_x`, `^{n}`, 그리스문자는 `\varepsilon`, `\pi` 등. 절대로 `**볼드**`나 `` `code` ``로 수식을 표기하지 않는다. 상세 패턴은 `references/katex-style-guide.md` 참조.
181
+ 6. **사례 박스**: 실제 기업 사례는 별도 박스로 구분
182
+ 7. **핵심 원칙**: blockquote 또는 formula-box로 강조
183
+ 8. **용어 정리 (Glossary)**: 각 주차 노트에 해당 주차에서 처음 등장하는 약어/전문용어를 정리하는 테이블을 강의 개요 바로 아래에 배치. 형식: `| 약어 | 영문 | 한국어 | 정의 |`. 예: `| \( APL \) | Average Product of Labor | 노동의 평균생산 | 총생산량을 노동 투입량으로 나눈 값 |`
184
+ 9. **다이어그램 참조 방식 (하이브리드)**:
185
+ - **Mermaid**: ` ```mermaid ``` ` 코드블록 유지 — Typora 렌더링 가능 + AI 학습 컨텍스트 보존. 소스 코드가 마크다운에 남아 있으므로 별도 .mmd 파일과 이중 관리 가능하나 장점이 크다.
186
+ - **Excalidraw/슬라이드 추출**: `![캡션](../diagrams/excalidraw/파일명.png)` 또는 `![캡션](../diagrams/slides/파일명.png)` — 코드로 표현 불가하므로 렌더링된 PNG를 직접 참조. Typora에서 바로 확인 가능.
187
+ - **`<!-- DIAGRAM: ... -->` 코멘트는 더 이상 사용하지 않는다** — Excalidraw/슬라이드는 PNG 직접 참조로 교체.
188
+
189
+ ### 2.3 사용자 확인 (필수)
190
+
191
+ Phase 2 완료 후, **반드시 사용자에게 마크다운을 보여주고 피드백을 받는다**.
192
+
193
+ ```
194
+ 확인 요청 항목:
195
+ ├─ 강의 구조 (파트/섹션 분류)가 적절한지
196
+ ├─ 다이어그램 후보 목록이 적절한지
197
+ ├─ 내용의 정확성과 누락 여부
198
+ └─ 추가/삭제/수정 요청
199
+ ```
200
+
201
+ **사용자 확인 없이 Phase 3으로 진행하지 않는다.** 마크다운 단계에서 수정하는 것이 HTML/PDF 생성 후 수정하는 것보다 훨씬 효율적이다.
202
+
203
+ ---
204
+
205
+ ## Phase 3: 다이어그램 PNG 생성
206
+
207
+ ### 3.1 다이어그램 소싱 판단 기준
208
+
209
+ | 다이어그램 유형 | 추천 Tool | 이유 |
210
+ |---|---|---|
211
+ | 단순 선형 흐름 (3~5 노드) | **Mermaid** flowchart | 텍스트 기반, 마크다운 내장 |
212
+ | 단순 비교/분류 | **Mermaid** flowchart + subgraph | 구조 가독성 |
213
+ | 계층 구조/분류 체계 | **Mermaid** flowchart/mindmap | 자동 레이아웃 |
214
+ | **복잡한 인과 루프/시스템 다이어그램** | **Excalidraw** | 자유 배치, 곡선 화살표, +/- 부호 |
215
+ | **매트릭스/2축 포지셔닝** | **Excalidraw** | 축 레이블, 영역 표시 |
216
+ | **비교/대조 개념도** | **Excalidraw** | 시각적 대비 효과 |
217
+ | 상태/생명주기 | **Mermaid** stateDiagram-v2 | 상태 전환 표현 |
218
+ | 시퀀스/상호작용 | **Mermaid** sequenceDiagram | 순서 표현 |
219
+ | 타임라인/역사 | **Mermaid** timeline | 내장 지원 |
220
+ | 데이터 차트 (이산값) | **Mermaid** xychart-beta | 막대/꺾은선 |
221
+ | **곡선 그래프 (원본 슬라이드에 있음)** | **PDF 추출** | 원본이 가장 정확하고 깔끔 |
222
+ | **곡선 그래프 (원본에 없음)** | **Excalidraw** | 새로 생성 필요 시 |
223
+ | **특수 레이아웃 (Porter 등)** | **PDF 추출** or **Excalidraw** | 원본 우선, 없으면 생성 |
224
+
225
+ ### 3.2 PDF 슬라이드 원본 추출 (곡선/그래프)
226
+
227
+ 원본 슬라이드 PDF에 수학적 곡선이나 정교한 그래프가 있는 경우, 직접 추출하는 것이 가장 깔끔하다.
228
+
229
+ ```bash
230
+ cd ../diagram-master/references && \
231
+ uv run python ../../lecture-note-digitizer/references/extract_slide_diagram.py \
232
+ {슬라이드_PDF} --page {페이지번호} --output {출력_PNG}
233
+ ```
234
+
235
+ **옵션:**
236
+ - `--page N`: 특정 페이지 추출
237
+ - `--pages 9,11,19`: 여러 페이지 일괄 추출
238
+ - `--crop "left,top,width,height"`: 백분율(%) 기반 크롭 (다이어그램 영역만 추출)
239
+ - `--dpi 300`: 해상도 (기본 300, 초고해상도 시 450)
240
+
241
+ **사용 시점:**
242
+ - 슬라이드에 곡선 그래프(무차별곡선, 수요-공급, 비용 곡선 등)가 이미 있을 때
243
+ - Excalidraw로 재현하면 곡선이 각지거나 가독성이 떨어질 때
244
+ - 교수가 만든 원본 그래프가 가장 정확할 때
245
+
246
+ ### 3.3 다이어그램 생성 (diagram-master 위임)
247
+
248
+ 1. **diagram-master 스킬 참조**: 다이어그램 생성 시 diagram-master 스킬의 auto-routing decision tree를 따른다 (구조도→Mermaid, 곡선/분포→Matplotlib, 자유형→Excalidraw 자동 선택)
249
+ 2. **.mmd 파일 생성**: 각 다이어그램을 `{날짜}_mermaid_{번호}_{이름}.mmd`로 저장
250
+ 3. **수식 포함 여부 판단**: 노드에 수식(분수, 첨자, 그리스문자 등)이 있으면 `@svg-katex` 힌트 추가
251
+ 4. **PNG 렌더링**:
252
+ - 일반 다이어그램: `render_mermaid.py`로 렌더링
253
+ - `@svg-katex` 다이어그램: `render_mermaid_katex.py`로 렌더링 (KaTeX 수식 치환)
254
+ 5. **병렬 생성**: 여러 .mmd를 순차적으로 렌더링 (Mermaid는 Excalidraw보다 빠름)
255
+
256
+ **@svg-katex 사용 시** (diagram-master → mermaid 엔진 참조):
257
+ 마크다운의 ` ```mermaid ` 코드블록 안에 힌트를 작성한다 (마크다운이 source of truth).
258
+ ````markdown
259
+ ```mermaid
260
+ %% @svg-katex
261
+ %% @formula "Plain text" = "LaTeX"
262
+ flowchart LR
263
+ ...
264
+ ```
265
+ ````
266
+ `.mmd` 추출 시 힌트가 자동 포함되며, 렌더링: `python render_mermaid_katex.py diagram.mmd --output diagram.png`
267
+
268
+ ### 3.3 Excalidraw 다이어그램 생성 (fallback)
269
+
270
+ 곡선/자유형 다이어그램만 Excalidraw로 생성:
271
+
272
+ 1. **Agent 도구 활용**: 최대 6개씩 병렬로 다이어그램 생성
273
+ 2. **diagram-master 스킬 참조**: 각 Agent에게 auto-routing 규칙 전달
274
+ 3. **렌더링 검증**: 생성 후 PNG 렌더링하여 시각적 확인
275
+
276
+ ### 3.4 색상 팔레트 (시맨틱 팔레트)
277
+
278
+ Mermaid `style` 인라인과 Excalidraw 공통으로 사용. **Mermaid에서 `classDef`/`class` 구문은 사용 금지** — Typora 호환성 문제. 대신 `style NodeId fill:...,stroke:...,color:...` 인라인 사용.
279
+
280
+ | Role | Mermaid style 인라인 | Excalidraw Fill/Stroke | 용도 |
281
+ |---|---|---|---|
282
+ | **primary** | `style X fill:#3b82f6,stroke:#1e3a5f,color:#fff` | `#dbeafe` / `#1e3a5f` | 핵심 개념, 주요 노드 |
283
+ | **secondary** | `style X fill:#8b5cf6,stroke:#5b21b6,color:#fff` | `#ddd6fe` / `#6d28d9` | 보조 개념 |
284
+ | **accent** | `style X fill:#f59e0b,stroke:#92400e,color:#fff` | `#fef3c7` / `#b45309` | 강조 포인트 |
285
+ | **success** | `style X fill:#bbf7d0,stroke:#166534` | `#a7f3d0` / `#047857` | 결과, 최적해 |
286
+ | **warning** | `style X fill:#fef08a,stroke:#854d0e` | `#fee2e2` / `#dc2626` | 제약, 주의 |
287
+ | **danger** | `style X fill:#fecaca,stroke:#991b1b` | `#fee2e2` / `#dc2626` | 오류, 위험 |
288
+ | **groupA** | `style X fill:#fed7aa,stroke:#c2410c` | `#fed7aa` / `#c2410c` | 분류 A |
289
+ | **groupB** | `style X fill:#ddd6fe,stroke:#6d28d9` | `#ddd6fe` / `#6d28d9` | 분류 B |
290
+ | **groupC** | `style X fill:#a7f3d0,stroke:#065f46` | `#a7f3d0` / `#047857` | 분류 C |
291
+
292
+ ### 3.5 렌더링 명령
293
+
294
+ **Mermaid (기본 — diagram-master 경유)**:
295
+ ```bash
296
+ cd ../diagram-master/references && \
297
+ uv run python engines/mermaid/render_mermaid.py {path_to_mmd_file}
298
+ ```
299
+
300
+ **Matplotlib (수학 곡선/분포 — diagram-master 경유)**:
301
+ ```bash
302
+ cd ../diagram-master/references && \
303
+ uv run python engines/matplotlib/render_matplotlib.py {path_to_script.py}
304
+ ```
305
+
306
+ **Excalidraw (자유형 fallback — diagram-master 경유)**:
307
+ ```bash
308
+ cd ../diagram-master/references && \
309
+ uv run python engines/excalidraw/render_excalidraw.py {path_to_excalidraw_file}
310
+ ```
311
+
312
+ ### 3.5b 웹 배포 시 SVG interactive 업그레이드 (선택적, diagram-master 경유)
313
+
314
+ 웹 배포가 목적인 경우, PNG 다이어그램 중 **diagram-master → SVG 엔진으로 업그레이드할 후보를 선별**하여 사용자에게 추천한다. SVG는 웹 전용 — PDF에는 PNG fallback 필요.
315
+
316
+ **추천 기준:**
317
+ - **정적 SVG**: hover glow가 의미 있는 경우 (인과관계, 프로세스 흐름)
318
+ - **동적 SVG**: 레이어 토글, A vs B 비교가 필요한 경우 (프레임워크, 비교 다이어그램)
319
+ - **PNG 유지**: 인터랙션이 가치를 더하지 않는 경우
320
+
321
+ **반드시 사용자 확인 후 진행.**
322
+
323
+ ---
324
+
325
+ ## Phase 4: 통합 HTML 생성
326
+
327
+ ### 4.1 HTML 템플릿 구조
328
+
329
+ `references/html-template.md` 참조 — 전체 HTML 뼈대와 CSS 스타일.
330
+
331
+ ### 4.2 핵심 CSS 클래스
332
+
333
+ | 클래스 | 용도 | 스타일 |
334
+ |--------|------|--------|
335
+ | `.cover` | 표지 페이지 | 중앙 정렬, min-height: auto (print) |
336
+ | `.toc` | 목차 | page-break-after |
337
+ | `.formula-box` | 핵심 공식/원칙 | 파란 그라데이션 배경, 흰 텍스트 |
338
+ | `.insight-box` | 인사이트/팁 | 노란 배경, 주황 보더 |
339
+ | `.warning-box` | 경고/핵심 경고 | 빨간 배경, 빨간 보더 |
340
+ | `.case-box` | 사례/케이스 | 초록 배경, 초록 보더 |
341
+ | `.diagram-container` | 다이어그램 | 중앙 정렬, 그림자, page-break-inside: avoid |
342
+ | `.diagram-caption` | 다이어그램 캡션 | 이탤릭, 회색, 10pt |
343
+ | `.two-col` | 2단 레이아웃 | flexbox, 16px 갭 |
344
+ | `.page-break` | 페이지 나눔 | page-break-before |
345
+
346
+ ### 4.3 다이어그램 삽입 방식
347
+
348
+ ```html
349
+ <div class="diagram-container">
350
+ <img src="diagram_14_reinforcing_loop.png" alt="Reinforcing Loop">
351
+ <div class="diagram-caption">다이어그램 14 — Reinforcing Loop: 설명</div>
352
+ </div>
353
+ ```
354
+
355
+ - **파일 참조**: `src="파일명.png"` (같은 디렉토리 기준)
356
+ - Mermaid/Excalidraw 모두 동일하게 **사전 렌더링된 PNG**로 삽입
357
+ - Playwright가 `file://` 프로토콜로 로컬 파일 접근
358
+
359
+ ### 4.4 HTML 생성 — 두 가지 버전
360
+
361
+ **웹 배포용 HTML** (사이드바 레이아웃):
362
+ - deploy-scm-v2 스타일: 고정 사이드바(260px, #1e293b) + 메인 콘텐츠
363
+ - 사이드바에 Part + 하위 섹션 네비게이션 (`.sub` 클래스, indent)
364
+ - **본문에 별도 TOC 섹션 넣지 않는다** — 사이드바가 목차 역할
365
+ - IntersectionObserver로 스크롤 시 active 하이라이트
366
+ - 이미지 경로: `src="images/파일명.png"`
367
+ - KaTeX CDN v0.16.11, Google Fonts
368
+ - 반응형: 모바일 ≤900px 햄버거 메뉴
369
+
370
+ **PDF용 HTML** (단일 컬럼):
371
+ - 사이드바 없음, `max-width: 100%`
372
+ - **목차 페이지 삽입** (타이틀 다음, page-break-after: always)
373
+ - 목차 항목은 `<a href="#앵커">` 클릭 가능 링크
374
+ - 본문 헤딩에 `id` 속성: `<h2 id="sec1-1">1.1 소주제</h2>`
375
+ - 이미지 경로: 같은 디렉토리 `src="파일명.png"`
376
+ - print CSS: page-break 규칙
377
+
378
+ ### 4.5 HTML 작성 순서 (PDF용)
379
+
380
+ 1. `<head>` — CSS + KaTeX CDN + Google Fonts
381
+ 2. Cover page (타이틀, 부제)
382
+ 3. **TOC page** (클릭 가능한 `<a href="#id">` 링크, page-break-after)
383
+ 4. 각 파트/섹션 (헤딩에 `id` 속성 필수)
384
+ 5. 다이어그램 삽입
385
+ 6. Key Learning Points / 부록
386
+
387
+ ---
388
+
389
+ ## Phase 5: PDF 변환
390
+
391
+ ### 5.1 변환 스크립트
392
+
393
+ `references/convert_to_pdf.py` 사용:
394
+
395
+ ```python
396
+ """Convert integrated lecture notes HTML to PDF using Playwright."""
397
+ import sys
398
+ from pathlib import Path
399
+
400
+ def main():
401
+ html_path = Path(sys.argv[1])
402
+ pdf_path = html_path.with_suffix(".pdf")
403
+
404
+ from playwright.sync_api import sync_playwright
405
+ with sync_playwright() as p:
406
+ browser = p.chromium.launch()
407
+ page = browser.new_page()
408
+ page.goto(f"file://{html_path.resolve()}")
409
+ page.wait_for_timeout(2000)
410
+ page.pdf(
411
+ path=str(pdf_path),
412
+ format="A4",
413
+ margin={"top": "15mm", "bottom": "15mm",
414
+ "left": "15mm", "right": "15mm"},
415
+ print_background=True,
416
+ )
417
+ browser.close()
418
+ print(pdf_path)
419
+
420
+ if __name__ == "__main__":
421
+ main()
422
+ ```
423
+
424
+ ### 5.2 실행 명령
425
+
426
+ ```bash
427
+ cd ../diagram-master/references && \
428
+ uv run python {작업디렉토리}/convert_to_pdf.py {HTML파일경로}
429
+ ```
430
+
431
+ ### 5.3 PDF 검증
432
+
433
+ 생성된 PDF를 `Read` 도구로 열어 주요 페이지를 시각적으로 확인:
434
+
435
+ ```
436
+ 확인 항목:
437
+ ├─ 표지 페이지 레이아웃
438
+ ├─ 목차 완성도
439
+ ├─ 다이어그램 렌더링 (잘림, 깨짐 없는지)
440
+ ├─ 표/테이블 레이아웃
441
+ ├─ 페이지 나눔 적절성
442
+ └─ 전체 페이지 수
443
+ ```
444
+
445
+ ---
446
+
447
+ ## Phase 0: 초기 설정 — 과목 온보딩
448
+
449
+ 새 과목 또는 기존 과목을 시작할 때 반드시 Phase 0을 먼저 진행한다.
450
+
451
+ ### 0.1 기존 디렉토리 마이그레이션 (해당 시)
452
+
453
+ 기존에 루트에 모든 파일이 섞여 있는 경우, 아래 트리 구조로 정리:
454
+
455
+ ```
456
+ 마이그레이션 절차:
457
+ 1. backup/ 디렉토리 생성 → 기존 파일 전체를 backup/에 복사 (원본 보존)
458
+ 2. sources/ 생성 → 원본 PDF, Transcript 등을 sources/로 이동
459
+ 3. sources/common/ 생성 → 실라버스, 교재, 시험 정보 등 공통 자료 이동
460
+ 4. notes/ 생성 → 기존 디지털 노트(.md, .html, .pdf) 이동
461
+ 5. diagrams/mermaid/, diagrams/slides/ 생성 → 다이어그램 파일 이동
462
+ 6. guides/, deploy/ 생성 (빈 디렉토리)
463
+ 7. 이동 후 파일 참조 경로 확인 (마크다운 내 이미지 참조 등)
464
+ ```
465
+
466
+ **마이그레이션 전 반드시 사용자 확인**: "기존 파일을 정리하겠습니다. backup/에 전체 백업 후 진행합니다. 진행할까요?"
467
+
468
+ ### 0.2 과목 온보딩 (필수)
469
+
470
+ 새 과목 시작 시 **최소한의 질문 → 소스 분석 → 에이전트 추천 → 사용자 확인** 흐름으로 진행.
471
+
472
+ **Step 1: 사용자에게 묻는 것 (최소)**
473
+ - 과목명, 교수명, 프로그램 (EMBA/MBA/학부 등)
474
+ - 대표 키워드 (예: `econ`, `scm`, `strategy`) → 모든 파일명에 포함
475
+ - **Excalidraw 활용 수준**: 소극 / 중립(기본) / 적극 — 다이어그램 생성 시 Mermaid vs Excalidraw 비율 결정
476
+ - **강의 개요 포함 여부**: 주차별 노트에 강의 개요 테이블 포함할지 (기본: 미포함)
477
+
478
+ **Step 2: 소스 자동 분석 → 에이전트 추천**
479
+
480
+ 사용자가 Step 1만 답하면, `sources/` 디렉토리를 자동 탐색하여 에이전트가 추천안을 생성:
481
+
482
+ ```
483
+ 탐색 대상:
484
+ ├─ *.pdf → 슬라이드 내용 파악 (수학 비중, 다이어그램 유형)
485
+ ├─ *.md → 녹취록/요약 분석 (강의 톤, 시험 정보)
486
+ └─ sources/common/ → 실라버스, 교재 (과목 구조, 평가 방식)
487
+ ```
488
+
489
+ 에이전트가 소스를 읽고 다음을 **자동 판단하여 추천**:
490
+
491
+ | 항목 | 자동 판단 기준 | 추천 예시 |
492
+ |------|--------------|----------|
493
+ | 수학 공식 비중 | 슬라이드 내 수식 밀도 | "높음 — LaTeX 전면 적용 추천" |
494
+ | 다이어그램 전략 | 슬라이드 내 그래프/도표 유형 | "곡선 그래프 多 → PDF 추출 추천, 흐름도 → Mermaid" |
495
+ | 노트 톤 | 프로그램 + 녹취록 어투 | "EMBA 경영자 대상 → 큰 그림 + 의사결정 프레임워크 중심" |
496
+ | 웹 배포 | 다이어그램 복잡도 | "사이드바 스타일 + 정적 PNG (SVG 불필요)" |
497
+ | 시험 형식 | 녹취록에서 시험 관련 발언 추출 | "오픈북, 에세이 2~3문항, 응용 중심" |
498
+
499
+ **Step 3: 추천안 사용자 확인**
500
+
501
+ 에이전트 추천안을 사용자에게 보여주고 확인/수정:
502
+ ```
503
+ [자동 분석 결과]
504
+ - 수학 비중: 높음 (슬라이드 60% 이상 수식 포함)
505
+ - 다이어그램: 곡선 그래프 PDF 추출 + 구조도 Mermaid
506
+ - 톤: EMBA 경영자 대상, 산문체 블로그 기본
507
+ - 웹: 사이드바 스타일
508
+ - 시험: 오픈북, 에세이 중심
509
+
510
+ 이 설정으로 진행할까요? 수정하실 부분이 있으면 알려주세요.
511
+ ```
512
+
513
+ **Step 4: 커스텀 요청 (반드시 마지막에)**
514
+ - "그 외에 특별히 원하시는 스타일이나 요구사항이 있으신가요?"
515
+ - 사용자만의 특별한 요청을 받아 requirements.md에 기록
516
+ - 예: "사례는 한국 기업 위주로", "수식은 최소화", "매 주차 퀴즈 포함" 등
517
+
518
+ **Step 5: requirements.md 생성**
519
+
520
+ Step 1~4의 결과를 `requirements.md`에 기록. 이후 주차별 노트 생성 시 이 파일을 참조.
521
+
522
+ ### requirements.md & progress.md — 두 스킬의 공유 허브
523
+
524
+ `requirements.md`와 `progress.md`는 **lecture-note-digitizer와 course-master가 공유하는 상태 파일**이다. 두 스킬 모두 작업 시작 시 이 파일들을 반드시 읽고, 작업 완료 시 업데이트한다.
525
+
526
+ **requirements.md** — 과목 설정 (Phase 0에서 생성, 이후 업데이트)
527
+ ```markdown
528
+ # {과목명} 요구사항
529
+ ## 기본 정보
530
+ - 과목명, 교수, 프로그램, 키워드
531
+ ## 과목 특성 (에이전트 분석 결과)
532
+ - 수학 비중, 다이어그램 전략, 톤, 시험 형식
533
+ ## 슬라이드/노트 컨셉
534
+ - 스타일, 웹 배포, SVG 여부
535
+ ## 커스텀 요청
536
+ - 사용자 특별 요청 사항
537
+ ```
538
+
539
+ **progress.md** — 작업 현황 (매 포인트마다 업데이트)
540
+ ```markdown
541
+ # {과목명} 진행 현황
542
+ **최종 업데이트**: {날짜} (세션 N)
543
+
544
+ ## 1. 주차별 디지털 강의노트
545
+ | 주차 | 날짜 | 주제 | Mermaid | 슬라이드 | KaTeX | 상태 |
546
+ |------|------|------|---------|--------|-------|------|
547
+ | 0주차 | 02-28 | 경제학 입문 | 5 | — | 37 | 완료 |
548
+
549
+ ## 2. 종합 가이드 (course-master)
550
+ | 버전 | 범위 | 상태 | 배포 URL |
551
+ |------|------|------|---------|
552
+
553
+ ## 3. 스킬/기술 변경 이력
554
+ | 세션 | 변경 내용 |
555
+
556
+ ## 4. 다음 작업
557
+ ```
558
+
559
+ **progress.md 업데이트 타이밍** — 다음 포인트마다 반드시 기록:
560
+ - Phase 0 완료 (온보딩/마이그레이션)
561
+ - 각 주차 마크다운 완료
562
+ - 각 주차 HTML/PDF 생성 완료
563
+ - 가이드 생성 완료 (course-master)
564
+ - 웹 배포 완료 (URL 기록)
565
+ - 스킬 업데이트 내역
566
+
567
+ ## 디렉토리 구조
568
+
569
+ ```
570
+ {작업디렉토리}/
571
+ ├── requirements.md ← 과목 요구사항
572
+ ├── progress.md ← 진행 현황
573
+ ├── convert_to_pdf.py ← 변환 스크립트
574
+ │
575
+ ├── sources/ ← 원본 강의 자료
576
+ │ ├── common/ ← 과목 공통 자료 (실라버스, 교재, 시험 정보 등)
577
+ │ ├── {날짜}_{주차}_{과목}.pdf ← 강의 슬라이드
578
+ │ └── {날짜}_{주차}_*Transcript.md ← 강의 녹취/요약
579
+ │
580
+ ├── notes/ ← 주차별 디지털 노트 (핵심 산출물)
581
+ │ ├── {날짜}_{주차}_{키워드}_학습노트.md
582
+ │ ├── {날짜}_{주차}_{키워드}_학습노트.html
583
+ │ └── {날짜}_{주차}_{키워드}_학습노트.pdf
584
+ │
585
+ ├── diagrams/ ← 다이어그램 소스 + PNG
586
+ │ ├── mermaid/ ← .mmd + .png
587
+ │ ├── excalidraw/ ← .excalidraw + .png
588
+ │ └── slides/ ← PDF 추출 슬라이드 PNG
589
+ │
590
+ ├── guides/ ← 시험 가이드 + 종합 정리
591
+ │ └── {시험명}_가이드.md/html/pdf
592
+ │
593
+ └── deploy/ ← 웹 배포 디렉토리
594
+ └── {topic}/
595
+ ├── index.html
596
+ └── images/
597
+ ```
598
+
599
+ ## 파일 명명 규칙
600
+
601
+ ```
602
+ notes/{날짜}_{주차}_{키워드}_학습노트.md → 종합 마크다운 (Mermaid 코드 내장)
603
+ notes/{날짜}_{주차}_{키워드}_학습노트.html → 통합 HTML
604
+ notes/{날짜}_{주차}_{키워드}_학습노트.pdf → 최종 PDF
605
+ diagrams/mermaid/{날짜}_mermaid_{번호}_{영문이름}.mmd → Mermaid 소스
606
+ diagrams/mermaid/{날짜}_mermaid_{번호}_{영문이름}.png → Mermaid 렌더링 PNG
607
+ diagrams/excalidraw/{날짜}_diagram_{번호}_{이름}.excalidraw → Excalidraw 소스
608
+ diagrams/excalidraw/{날짜}_diagram_{번호}_{이름}.png → Excalidraw 렌더링 PNG
609
+ diagrams/slides/{날짜}_slide_{페이지}.png → PDF 추출 슬라이드 PNG
610
+ ```
611
+
612
+ ---
613
+
614
+ ## 체크리스트
615
+
616
+ ### Phase 1 완료 조건
617
+ - [ ] 모든 입력 파일 읽기 완료
618
+ - [ ] 강의 구조(파트/섹션) 파악
619
+ - [ ] 다이어그램 후보 목록 작성 (Mermaid/Excalidraw 분류)
620
+
621
+ ### Phase 2 완료 조건
622
+ - [ ] 전체 강의 내용 마크다운으로 작성
623
+ - [ ] 용어집(Glossary) 섹션 추가 (강의 개요 아래, 제1부 위)
624
+ - [ ] 각 다이어그램 위치에 Mermaid 코드블록 또는 `![캡션](상대경로.png)` 이미지 참조 삽입
625
+ - [ ] 사례/공식/인사이트 박스 적용
626
+ - [ ] `## 목차` 섹션 미포함 확인 (convert_to_pdf.py가 TOC 자동 생성)
627
+ - [ ] KaTeX 사전 검증: `\(` / `\)` 짝 맞음, plain text 수식 없음
628
+ - [ ] **사용자 확인 완료**
629
+
630
+ ### Phase 3 완료 조건
631
+ - [ ] Mermaid .mmd → PNG 렌더링 완료
632
+ - [ ] Excalidraw fallback → PNG 렌더링 완료 (해당 시)
633
+ - [ ] 렌더링 품질 검증 (시각적 확인)
634
+
635
+ ### Phase 4 완료 조건
636
+ - [ ] HTML 파일 생성
637
+ - [ ] 모든 다이어그램 PNG 삽입
638
+ - [ ] CSS 스타일 적용 (표지, 목차, 본문, 사례 박스 등)
639
+ - [ ] 페이지 나눔 적절히 배치
640
+
641
+ ### Phase 5 완료 조건
642
+ - [ ] PDF 변환 성공
643
+ - [ ] 주요 페이지 시각적 검증
644
+ - [ ] 사용자에게 최종 결과물 경로 안내
645
+
646
+ ---
647
+
648
+ ## 주의사항
649
+
650
+ 1. **diagram-master 스킬 연동**: 모든 다이어그램 생성 시 diagram-master 스킬의 auto-routing decision tree를 따른다. Mermaid syntax는 `../diagram-master/references/engines/mermaid/syntax-reference.md` 참조.
651
+ 2. **엔진 자동 선택**: 구조도→Mermaid, 수학곡선/분포→Matplotlib, 자유형→Excalidraw — diagram-master가 자동 판단.
652
+ 3. **Playwright 필요**: PNG 렌더링(Mermaid/Excalidraw)과 PDF 변환 모두 Playwright chromium 사용. diagram-master의 uv 환경에 이미 설치되어 있어야 함.
653
+ 4. **로컬 파일 참조**: HTML에서 이미지를 `file://`로 참조하므로 모든 파일이 같은 디렉토리에 있어야 함.
654
+ 5. **한국어 지원**: 모든 텍스트, 제목, 캡션, 주석은 한국어로 작성. 학술 용어는 영어 병기.
655
+
656
+ ---
657
+
658
+ ## Known Issues & Lessons Learned
659
+
660
+ ### Mermaid ELK vs dagre 줄바꿈 동작
661
+ - **dagre (기본)**: `wrappingWidth` 설정이 정상 적용됨. 간단한 다이어그램에 권장.
662
+ - **ELK**: `wrappingWidth`를 무시하고 자체 노드 크기를 결정. 텍스트를 짧게 줄이고 `<br/>`로 명시적 줄바꿈 필요.
663
+ - **권장**: 대부분 dagre 사용. 복잡한 다이어그램(노드 20개+)에서만 ELK 사용.
664
+
665
+ ### 대규모 마크다운 → HTML 변환: Python 스크립트 권장
666
+ 1000줄 이상의 마크다운 파일을 HTML로 변환할 때, **서브에이전트에게 위임하면 ANSI escape code가 혼입**되어 HTML이 깨질 수 있다. 대신 **Python 변환 스크립트**를 작성하여 직접 실행하는 것이 안정적이다.
667
+
668
+ ### 웹 배포 시 이미지 포함 주의
669
+ `convert_to_pdf.py`로 로컬 PDF를 만들 때는 같은 디렉토리의 이미지를 `file://`로 참조하므로 문제없으나, **웹 배포 시**에는 이미지 파일을 `images/` 디렉토리에 복사하고 HTML의 `src` 경로를 `images/파일명.png`으로 변경해야 한다.
670
+
671
+ ### 마크다운 내 이미지 참조와 실제 파일 불일치
672
+ 마크다운에서 `![alt](filename.png)`으로 참조하는 이미지가 실제로 존재하는지 반드시 확인할 것.
673
+
674
+ ### 마크다운에 ASCII 텍스트 다이어그램 금지
675
+ 마크다운에는 **Mermaid 코드블록만** 포함한다. ASCII 텍스트 다이어그램(┌└│├─→ 등)은 사용하지 않는다. ASCII는 유지보수 어렵고, HTML/PDF 변환 시 깨지며, 이미 Mermaid/PNG로 대체 가능하다.
676
+
677
+ ### Mermaid 코드블록 → HTML 변환 시 반드시 PNG 사전 렌더링
678
+ HTML/PDF 생성 전에 **모든 Mermaid 코드블록을 .mmd → PNG로 사전 렌더링**해야 한다. HTML에 Mermaid.js CDN을 포함하는 방식은 PDF 변환 시 렌더링 실패 위험이 있다. 파이프라인:
679
+ 1. 마크다운에서 ```mermaid 블록 추출 → `.mmd` 파일 저장
680
+ 2. `render_mermaid.py`로 PNG 생성
681
+ 3. 마크다운에서 ```mermaid 블록을 `![](파일.png)` 으로 교체
682
+ 4. 교체된 마크다운으로 HTML/PDF 생성
683
+
684
+ ### PDF 표지(Cover Page) 정보 소스 정책
685
+ 표지 정보는 convert_to_pdf 스크립트에서 직접 생성한다. 마크다운의 강의 개요 테이블에서 읽어오지 않는다.
686
+ - **정적 정보** (과목명, 프로그램, 교수): `requirements.md`에서 관리. 모든 주차 동일.
687
+ - **동적 정보** (주차, 날짜, 부제, 키워드): 마크다운 제목(`# ... N주차 강의 노트 (MM-DD)`)과 부제(`## 부제`)에서 추출 가능. convert_to_pdf 스크립트에 하드코딩하거나 파싱.
688
+
689
+ ### Excalidraw 활용 기준 조정 정책
690
+ 프로젝트(과목)별로 Excalidraw 활용 수준을 **온보딩(Phase 0) Step 1**에서 사용자에게 확인한다. 3단계 중 선택:
691
+
692
+ | 수준 | 명칭 | Excalidraw 사용 범위 | Mermaid 사용 범위 |
693
+ |------|------|-------------------|---------------|
694
+ | **소극** | Mermaid 우선 | 곡선/자유형 그래프만 Excalidraw | 나머지 모든 다이어그램 |
695
+ | **중립** (기본) | 상황별 판단 | 곡선 + 복잡한 시스템 다이어그램 | 단순~중간 복잡도 |
696
+ | **적극** | Excalidraw 우선 | 복잡한 다이어그램 전부 (인과관계, 시스템, 매트릭스, 비교, 곡선) | 단순 선형 흐름(3~5 노드)만 |
697
+
698
+ 기준 변경 시 `requirements.md`의 커스텀 요청에 기록하고, 프로젝트별 메모리(feedback)에도 기록하여 일관성 유지.
699
+
700
+ ### HTML PDF 최적화 CSS 필수 규칙
701
+ 1. **커버 h1 page-break 방지**: `.cover h1 { page-break-before: avoid; border-bottom: none; }` — 커버 h1에 `page-break-before: always`가 적용되면 빈 첫 페이지 생성
702
+ 2. **다이어그램 img max-height**: `.diagram-container img { max-height: 500px; object-fit: contain; }` — 과도하게 큰 Mermaid PNG가 페이지를 넘치는 것 방지
703
+ 3. **print CSS page-break 규칙**:
704
+ - `.diagram-container { page-break-inside: avoid; }` — 다이어그램 페이지 분할 방지
705
+ - `table { page-break-inside: avoid; }` — 테이블 분할 방지
706
+ - `h2, h3 { page-break-after: avoid; }` — 제목 뒤 빈 공간 방지
707
+ - `blockquote, .formula-box { page-break-inside: avoid; }`
708
+ 4. **Mermaid compact 모드 기본**: diagram-master → mermaid 엔진의 compact/complex 모드 참조. ≤6 노드는 `flowchart LR`로 가로 배치하여 세로 길이 최소화
709
+
710
+ ### 웹 배포 시 CSS 폭 제한 필수
711
+ PDF용 HTML 템플릿은 `max-width: 100%`이지만, 웹 배포 시에는 **`max-width: 860px; margin: 0 auto;`** 로 변경해야 가독성이 좋다. PDF용과 웹용 CSS를 분리하거나, 배포 전에 body 스타일을 수정할 것.
712
+
713
+ ### PDF 슬라이드 추출은 수학적 곡선 그래프에만 사용
714
+ 경제학 등 수학적 곡선(수요곡선, 무차별곡선, 비용곡선 등)이 있는 경우에만 `extract_slide_diagram.py`로 원본 추출. SCM 등 구조도/흐름도 위주 과목은 Excalidraw/Mermaid로 충분. 추출 시 전체 슬라이드 사용 (크롭 시 제목/라벨 잘림 문제).
715
+
716
+ ### 중복 다이어그램 방지
717
+ 같은 개념에 대해 Mermaid + 기존 PNG가 둘 다 존재하면 하나만 남길 것. 마크다운 생성 후 `grep -c '!\[다이어그램'` 으로 참조 수 확인, 근접 줄에 같은 주제의 다이어그램이 2개 있으면 하나 제거.
718
+
719
+ ### EMBA 대상 톤 조절
720
+ EMBA 수강생은 경영자/임원 — 수학 디테일보다 큰 그림과 의사결정 프레임워크 중심. 수식 설명 시 개념 먼저 → 공식 → 의미. "미분" 대신 "변화율", 증명은 "수학적으로 풀면..." 으로 축약.
721
+
722
+ ### 수식은 반드시 KaTeX LaTeX `\(...\)` 구문으로 작성 — 상세 패턴은 `references/katex-style-guide.md` 참조
723
+ 마크다운에서 수식을 `**볼드**`나 `` `code` ``로 쓰면 HTML/웹에서 렌더링되지 않는다. **모든 수식**은 KaTeX 호환 LaTeX 구문을 사용한다:
724
+
725
+ - **인라인 수식**: `\( MRS = \frac{P_x}{P_y} \)` → 문장 속에서 렌더링
726
+ - **강조 수식**: `> \( C(q) = FC + VC(q) \)` → blockquote로 별도 줄 강조 (`$$` 블록 수식 사용 금지)
727
+ - **분수**: `\frac{MU_x}{P_x}` (슬래시 `/` 대신)
728
+ - **첨자**: `P_x`, `x^{0.5}`, `Q_m` (중괄호 사용)
729
+ - **그리스 문자**: `\varepsilon`, `\pi`, `\lambda`, `\Delta`
730
+ - **곱셈**: `\cdot` (별표 `*` 대신)
731
+ - **부등호**: `\leq`, `\geq`
732
+ - **루트**: `\sqrt{x}` (sqrt() 대신)
733
+ - **특수함수**: `\ln(x)`, `\max`, `\min`
734
+
735
+ **적용 범위**: 블록인용 수식, 본문 인라인, 테이블 셀, 단계별 풀이, 부록, 체크리스트, 제목 모두 포함.
736
+
737
+ **특히 놓치기 쉬운 패턴 (반드시 LaTeX 처리)**:
738
+ - **본문 속 짧은 수식 참조**: "이것이 `MB = MC`의 변형입니다" → "이것이 \( MB = MC \)의 변형입니다"
739
+ - **부등호 비교**: "`P > AC`이면 초과이윤" → "\( P > AC \)이면 초과이윤"
740
+ - **테이블 셀의 수식**: `| MR = P |` → `| \( MR = P \) |`
741
+ - **제목/헤딩의 수식**: `### P·MPL = W` → `### \( P \cdot MPL = W \)`
742
+ - **조건 비교 테이블**: `MRS > P_x/P_y` → `\( MRS > \frac{P_x}{P_y} \)`
743
+ - **체크리스트**: `- [ ] MRS = P_x/P_y 조건을 유도` → `- [ ] \( MRS = \frac{P_x}{P_y} \) 조건을 유도`
744
+ - **볼드 안 수식**: `**MB = MC**입니다` → `\( MB = MC \)입니다` (볼드 제거하고 LaTeX으로)
745
+
746
+ **원칙: 변수명이 2개 이상 포함된 표현은 모두 `\(...\)` 감싸기.**
747
+ `MB = MC`, `P = MC`, `MR = MC`, `SW = CS + PS`, `P > AC`, `MRS = P_x/P_y` 등 짧은 수식도 예외 없이 LaTeX 처리. 본문에서 "MRS는"처럼 변수 하나만 단독 언급할 때는 감싸지 않아도 되지만, `MU_x`, `P_x` 같은 첨자 변수는 반드시 `\( MU_x \)`, `\( P_x \)`로 감싼다.
748
+
749
+ **금지**: `> **MU_x = dU/dx**` 같은 볼드 수식, `MU_x/P_x = MU_y/P_y` 같은 Plain text 수식, `MB = MC` 같은 Plain text 등호 수식.
750
+
751
+ ### 목차는 클릭 가능한 링크 + 영문 앵커 ID 필수
752
+
753
+ 한국어 헤딩의 자동 앵커는 환경마다 다르게 생성되어 불안정. **영문 앵커 ID**를 명시적으로 사용:
754
+ - 마크다운: `[텍스트](#앵커)` + `<a id="앵커"></a>`
755
+ - 웹 HTML: 사이드바 `href="#id"` + 본문 `id` 속성
756
+ - PDF HTML: TOC `<a href="#id">` + 본문 `<h2 id="앵커">` — 둘 다 있어야 PDF 내부 링크 작동
757
+
758
+ ### 웹 vs PDF HTML 분리 생성
759
+
760
+ 하나의 HTML로 두 용도를 겸하면 사이드바/이미지 경로 충돌 발생:
761
+ - **웹용**: 사이드바 260px, `images/` 경로, 본문 TOC 없음
762
+ - **PDF용**: 사이드바 없음, 같은 디렉토리 이미지, TOC 페이지 포함 (page-break-after)
763
+
764
+ ### 배포 전 browser-debug 검증 필수
765
+ HTML 생성 후 Vercel 배포 전에 반드시 `browser-debug diagnose` 로 로컬 검증:
766
+ ```bash
767
+ # 설치한 브라우저 검사 도구로 로컬 HTML의 깨진 이미지와 레이아웃을 확인
768
+ ```
769
+ 깨진 이미지 0, KaTeX 렌더링 확인, 레이아웃 정상 확인 후 배포.
770
+
771
+ ### Vercel 배포 시 `--scope` 필수
772
+ non-interactive 모드에서 `--scope`를 명시하지 않으면 `missing_scope` 에러:
773
+ ```bash
774
+ vercel --yes --prod --scope <your-scope>
775
+ ```
776
+
777
+ ### 다이어그램 렌더링 후 사용자 컨펌 필수
778
+ Mermaid PNG 렌더링 후 반드시 사용자에게 결과를 보여주고 컨펌을 받아야 한다. compact(LR) vs complex(TB) 선택, 노드 수, 텍스트 길이는 사용자 판단이 필요하다. 자동으로 다음 Phase로 넘어가지 않는다.
779
+
780
+ ### 테이블 파싱 실패: nl2br + tables 확장 충돌
781
+
782
+ `markdown.extensions.nl2br` 사용 시, 테이블 바로 앞 줄이 비어있지 않으면(예: `**제목**:` 뒤 바로 `| 헤더 |`) tables 확장이 테이블을 인식하지 못한다. nl2br이 줄바꿈을 `<br>`로 변환하여 테이블 구문이 깨지기 때문.
783
+
784
+ **해결 — convert_to_pdf.py 필수 패턴**:
785
+ ```python
786
+ def ensure_table_blank_lines(md: str) -> str:
787
+ """테이블 앞에 빈 줄 자동 삽입."""
788
+ lines = md.split('\n')
789
+ result = []
790
+ for i, line in enumerate(lines):
791
+ if (line.strip().startswith('|') and
792
+ i > 0 and result and
793
+ result[-1].strip() != '' and
794
+ not result[-1].strip().startswith('|')):
795
+ result.append('') # 빈 줄 삽입
796
+ result.append(line)
797
+ return '\n'.join(result)
798
+
799
+ # markdown.markdown() 호출 전에 적용
800
+ md_text = ensure_table_blank_lines(md_text)
801
+ ```
802
+ 이 패턴은 LaTeX 보호와 함께 모든 주차의 convert_to_pdf.py에 **기본 적용**해야 한다.
803
+
804
+ ### KaTeX `\( ... \)` 구문이 markdown 라이브러리에서 소실됨 (구조적 문제)
805
+ Python `markdown` 라이브러리는 `\(`를 escaped parenthesis로 처리하여 backslash를 제거한다. 이로 인해 KaTeX auto-render가 `\( ... \)` 구분자를 찾지 못해 수식이 렌더링되지 않는다.
806
+
807
+ **해결 — convert_to_pdf.py 필수 패턴**:
808
+ ```python
809
+ # Phase 4 HTML 생성 시 반드시 포함 (모든 주차 공통)
810
+ # Step 1: markdown 변환 전 — LaTeX 구분자를 placeholder로 보호
811
+ md_text = md_text.replace(r"\(", "LATEX_INLINE_OPEN")
812
+ md_text = md_text.replace(r"\)", "LATEX_INLINE_CLOSE")
813
+ md_text = md_text.replace(r"\[", "LATEX_DISPLAY_OPEN")
814
+ md_text = md_text.replace(r"\]", "LATEX_DISPLAY_CLOSE")
815
+
816
+ # Step 2: markdown.markdown() 실행
817
+
818
+ # Step 3: 변환 후 — placeholder를 원래 LaTeX 구분자로 복원
819
+ html_body = html_body.replace("LATEX_INLINE_OPEN", r"\(")
820
+ html_body = html_body.replace("LATEX_INLINE_CLOSE", r"\)")
821
+ html_body = html_body.replace("LATEX_DISPLAY_OPEN", r"\[")
822
+ html_body = html_body.replace("LATEX_DISPLAY_CLOSE", r"\]")
823
+ ```
824
+ 이 패턴은 모든 주차의 convert_to_pdf.py에 **기본 적용**해야 한다. Phase 4 HTML 생성 시 자동 포함할 것.
825
+
826
+ **예방 — Phase 2 마크다운 작성 시 KaTeX 사전 검증**:
827
+ 마크다운 작성 완료 후 다음 체크를 수행하여 수식 누락을 사전 방지:
828
+ ```bash
829
+ # 1. LaTeX 수식 개수 확인 (최소 예상 수 이상인지)
830
+ grep -c '\\\\(' notes/{날짜}_*_디지털.md
831
+ # 2. Plain text 수식 패턴 탐지 (볼드/코드로 쓰인 수식 찾기)
832
+ grep -nE '\*\*[A-Z].+=.+\*\*|`[A-Z].+=.+`' notes/{날짜}_*_디지털.md
833
+ # 3. 짝이 안 맞는 구분자 탐지
834
+ python3 -c "t=open('notes/{파일}').read(); print('open:', t.count(r'\('), 'close:', t.count(r'\)'))"
835
+ ```
836
+
837
+ **Phase 5 PDF 검증 시 KaTeX 확인 항목 추가**:
838
+ PDF 생성 후 반드시 수식이 포함된 페이지를 Read로 확인. raw `\(` 텍스트가 보이면 KaTeX 렌더링 실패.
839
+
840
+ ### Excalidraw PNG 고해상도 → PDF 페이지 넘침 (구조적 문제)
841
+ Excalidraw 렌더러가 생성하는 PNG는 3000~4500px 폭으로, Playwright PDF 변환 시 CSS `max-height`가 무시되어 여러 페이지에 걸쳐 넘칠 수 있다.
842
+ **해결**: Excalidraw PNG 생성 후 반드시 `sips --resampleWidth 1400`으로 리사이즈. Phase 3 완료 후 자동 리사이즈 단계 추가할 것. Mermaid PNG는 보통 1000~1500px 이내이므로 별도 리사이즈 불필요.
843
+
844
+ ### 마크다운 내 다이어그램 참조 방식 통일 (하이브리드 방식으로 변경)
845
+ - Mermaid: ` ```mermaid ... ``` ` 코드블록 유지 (변경 없음, convert_to_pdf.py가 순차 매핑으로 PNG 치환)
846
+ - Excalidraw/슬라이드: `![캡션](상대경로.png)` 직접 참조 (convert_to_pdf.py가 상대경로→절대경로 변환)
847
+ - `<!-- DIAGRAM: ... -->` 코멘트 방식 폐기
848
+
849
+ ### DIAGRAM 코멘트 키워드 매칭 시 마침표/하이픈 주의
850
+ `Fig 1.4`와 `fig1-4`는 다른 문자열이다. DIAGRAM_COMMENT_MAP에 `"fig 1.4"`와 `"fig1-4"` 양쪽 모두 등록하거나, 매칭 함수에서 `.`→`-` 정규화를 적용할 것.
851
+
852
+ ### 슬라이드 PDF 추출은 사용자 확인 필수
853
+ 슬라이드 원본 추출 시 반드시 사용자에게 "이 다이어그램은 교재 슬라이드에서 추출했습니다"라고 고지하고 피드백을 받는다. 수학 과목이 아닌 경우 Mermaid/Excalidraw 자체 생성이 기본이다. requirements.md의 과목 특성에 따라 판단.
854
+
855
+ ### 커버 h1에 text-shadow 사용 금지
856
+ Playwright PDF 렌더링에서 한국어 대형 텍스트(`font-size: 2.6em+`)에 `text-shadow`를 적용하면 글리프별 회색 박스 아티팩트가 발생한다. 커버 제목에는 `text-shadow` 대신 `font-weight: 800; letter-spacing: -0.02em`만 사용. 제목이 한 줄에 안 들어가면 `<br><span style="font-size:0.75em;font-weight:400;">{부제}</span>`으로 2줄 분리.
857
+
858
+ ### 마크다운 내 목차 섹션과 convert_to_pdf.py TOC 페이지 중복 방지
859
+ convert_to_pdf.py가 별도 TOC 페이지를 자동 생성하므로, 마크다운에 `## 목차` 섹션을 포함하지 않는다. 마크다운에는 앵커 ID(`<a id="..."></a>`)만 유지하고, 목차는 HTML 변환 시 자동 생성되도록 한다.
860
+
861
+ ### pypdf 최신 버전: PdfMerger 제거됨
862
+ pypdf 6.x+에서 `PdfMerger`는 제거됨. `PdfWriter` + `PdfReader`로 대체:
863
+ ```python
864
+ from pypdf import PdfWriter, PdfReader
865
+ ```
866
+
867
+ ### Mermaid 노드/라벨 텍스트에 마크다운 리스트 패턴 금지
868
+ Mermaid 노드 텍스트 또는 화살표 라벨(`|"..."|`)이 마크다운 리스트로 해석되면 "Unsupported markdown: list" 오류 발생. 다음 패턴을 모두 금지:
869
+ - `"1. ..."`, `"2. ..."` (ordered list) → 원숫자 ①②③④⑤ 사용
870
+ - `"+ ..."` (unordered list) → "Positive" 등 텍스트로 대체
871
+ - `"- ..."` (unordered list) → `−`(유니코드 마이너스 U+2212) 또는 "Negative" 등으로 대체
872
+ - `"* ..."` (unordered list) → 다른 문자로 대체
873
+ 노드 내부뿐 아니라 **화살표 라벨**(`-->|"+ 관계"|`)에서도 동일 적용.
874
+
875
+
876
+ ---
877
+
878
+ ## 🔧 공통 파이프라인 — `course-master/references/note_pipeline.py` (공용)
879
+
880
+ 주차별 노트/가이드를 **PDF + 반응형 웹**으로 뽑는 로직을 공용 모듈로 분리했다.
881
+ 프로젝트에는 **얇은 `build.py` 만** 두고 이 모듈을 import 한다. (레퍼런스 구현: `scripts/build.py`)
882
+
883
+ ```python
884
+ import sys; from pathlib import Path
885
+ # 선택 연동: 별도 설치한 공용 파이프라인 모듈의 경로를 제공할 때만 사용합니다.
886
+ sys.path.insert(0, str(Path("../course-master/references")))
887
+ import note_pipeline as P
888
+ P.configure(root="/path/to/project")
889
+
890
+ md, pngs = P.render_mermaid_blocks(md, slug) # 해시 캐싱 + 자연 크기 PNG
891
+ md, n = P.redact(md) # 배포본 전용 실명 마스킹
892
+ body = P.inject_heading_ids(P.md_to_html(md), P.extract_outline(md))
893
+ body = P.wrap_tables(body) # 모바일 표 가로 스크롤
894
+ html = P.build_web_html(title, sub, meta, body, outline, version, pdf_url=...)
895
+ P.html_to_pdf(tmp_html, pdf_path) # Playwright + KaTeX 명시 호출
896
+ ```
897
+
898
+ ### 이 모듈이 해결하는 실전 함정 6가지
899
+
900
+ | # | 함정 | 해결 |
901
+ |---|------|------|
902
+ | 1 | **`mermaid_png_map` index 밀림** — 블록을 중간에 삽입하면 이후 매핑이 전부 어긋남 | 블록 **내용 SHA1 해시**로 파일명 생성 → 수동 매핑 자체가 불필요 |
903
+ | 2 | **Mermaid 차트가 거대하게 보임** | `mmdc -w 1600` 같은 **폭 강제 지정 금지**. 자연 크기로 렌더하고 **과대할 때만 축소**. (실측: 강제 시 전부 1568px → 세로형 TB 차트가 화면을 잡아먹음. 자연 크기는 242~784px 로 제각각) |
904
+ | 3 | **`$$` 정규식이 본문을 삼킴** | `\$\$\n(.*?)\n\$\$` + DOTALL 은 블록인용 안의 한 줄짜리 `$$...$$` 때문에 짝이 어긋나 **수백 줄을 통째로 먹는다.** → 내부에 `$$` 가 없을 때만 매칭: `\$\$\n((?:(?!\$\$)[\s\S])*?)\n\$\$` |
905
+ | 4 | **인라인 `$` 가 금액을 수식으로 오인** | `$600bn`, `$1,200` 은 건드리지 않도록 **`$` 바로 뒤가 숫자·쉼표면 제외**: `\$(?![\d,\s])([^$\n]{1,300}?)\$(?!\d)` |
906
+ | 5 | **모바일 가로 overflow** | 표는 `@media(max-width:760px){table{display:block;overflow-x:auto}}`, 수식은 `.katex-display{overflow-x:auto}`, 본문은 `max-width:1300px` + `padding:clamp(.9rem,3vw,2.2rem)` |
907
+ | 6 | **개인정보가 공개 배포본에 노출** | `redact_names.txt` 기반으로 **배포본에서만** 실명 → `성○○` 치환. **소스 노트는 원본 유지.** 동명이인은 `KEEP` 리스트로 예외 처리(예: "이재명 대통령") |
908
+
909
+ ### 산출 구조
910
+
911
+ ```
912
+ deploy/{topic}/
913
+ index.html ← 허브 (문서 카드 목록)
914
+ {doc}.html ← 사이드바 + IntersectionObserver + 문서 간 이동
915
+ pdf/{doc}.pdf ← 커버 + 목차 + 본문 (Vercel 이 그대로 서빙 → S3 선택)
916
+ images/*.png|svg
917
+ robots.txt ← 개인정보 포함 시 색인 차단
918
+ ```
919
+
920
+ ```bash
921
+ python3 scripts/build.py # 전체
922
+ python3 scripts/build.py w04 quiz1 # 특정 문서만
923
+ cd deploy/{topic} && vercel --yes --prod --scope <your-scope>
924
+ ```
925
+
926
+ > 새 주차 추가 = `build.py` 의 `DOCS` 리스트에 **한 줄 추가** → 빌드 → 배포.