create-workframe 0.1.4 → 0.1.6

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 (182) hide show
  1. package/.dockerignore +22 -22
  2. package/.gitignore +73 -73
  3. package/LICENSE +201 -201
  4. package/NOTICE +12 -12
  5. package/README.md +40 -40
  6. package/SECURITY.md +38 -38
  7. package/bin/create-workframe.js +2816 -2814
  8. package/bin/workframe.js +329 -329
  9. package/docs/workspace-instructions/WORKFRAME_DISCORD.md +20 -20
  10. package/docs/workspace-instructions/WORKFRAME_DOCUMENTS_AND_ARTIFACTS.md +20 -20
  11. package/docs/workspace-instructions/WORKFRAME_KANBAN.md +20 -20
  12. package/docs/workspace-instructions/WORKFRAME_ONBOARDING.md +21 -21
  13. package/docs/workspace-instructions/WORKFRAME_ROUTING.md +29 -29
  14. package/docs/workspace-instructions/WORKFRAME_TELEGRAM.md +19 -19
  15. package/package.json +64 -64
  16. package/profiles/README.md +15 -15
  17. package/profiles/architect/AGENTS.md +29 -29
  18. package/profiles/architect/SOUL.md +44 -44
  19. package/profiles/architect/skills/devops/kanban-worker/SKILL.md +27 -27
  20. package/profiles/designer/AGENTS.md +26 -26
  21. package/profiles/designer/SOUL.md +31 -31
  22. package/profiles/designer/skills/devops/kanban-worker/SKILL.md +27 -27
  23. package/profiles/dev/AGENTS.md +28 -28
  24. package/profiles/dev/SOUL.md +31 -31
  25. package/profiles/dev/skills/devops/kanban-worker/SKILL.md +27 -27
  26. package/profiles/docs/AGENTS.md +27 -27
  27. package/profiles/docs/SOUL.md +30 -30
  28. package/profiles/docs/skills/devops/kanban-worker/SKILL.md +27 -27
  29. package/profiles/research/AGENTS.md +26 -26
  30. package/profiles/research/SOUL.md +31 -31
  31. package/profiles/research/skills/devops/kanban-worker/SKILL.md +27 -27
  32. package/profiles/visionary/AGENTS.md +25 -25
  33. package/profiles/visionary/SOUL.md +31 -31
  34. package/profiles/visionary/skills/devops/kanban-worker/SKILL.md +27 -27
  35. package/profiles/workframe-agent/AGENTS.md +37 -37
  36. package/profiles/workframe-agent/SETUP.md +185 -185
  37. package/profiles/workframe-agent/SOUL.md +61 -61
  38. package/profiles/workframe-agent/skills/devops/botfather/SKILL.md +85 -85
  39. package/profiles/workframe-agent/skills/devops/kanban-handoff-pattern/SKILL.md +58 -58
  40. package/profiles/workframe-agent/skills/devops/workframe-cohort/SKILL.md +54 -54
  41. package/prompts/WORKFRAME_PROMPT_TEMPLATES.md +16 -16
  42. package/rules/.hermes.md +11 -11
  43. package/rules/AGENTS.md +22 -22
  44. package/rules/workspace-README.md +5 -5
  45. package/scripts/apply-update-workframe.sh +91 -21
  46. package/scripts/bundle-workframe-ui.mjs +83 -83
  47. package/scripts/create_workframe_scaffold.py +648 -648
  48. package/scripts/ensure-compose-host-paths.mjs +51 -51
  49. package/scripts/lib/install-identity.mjs +212 -212
  50. package/scripts/lib/workframe-registry.mjs +290 -290
  51. package/scripts/new-project.mjs +68 -68
  52. package/scripts/select_agent_pack.py +31 -31
  53. package/scripts/set-compose-public-url.mjs +92 -92
  54. package/scripts/sync-canonical-to-package.mjs +164 -164
  55. package/shared/WORKFRAME_AGENT_LIBRARY.md +31 -31
  56. package/shared/WORKFRAME_AGENT_OPERATIONS.md +29 -29
  57. package/shared/WORKFRAME_AGENT_PACKS.json +64 -64
  58. package/shared/WORKFRAME_AGENT_PACKS.yaml +20 -20
  59. package/shared/WORKFRAME_CHAT_PERMISSION_MODEL.md +20 -20
  60. package/shared/WORKFRAME_HANDOFF_SCHEMA.md +25 -25
  61. package/shared/WORKFRAME_SKILL_CURATION.md +27 -27
  62. package/workframe-api/Dockerfile +14 -14
  63. package/workframe-api/README.md +24 -24
  64. package/workframe-api/action_proxy.py +131 -131
  65. package/workframe-api/auth_rate_limit.py +49 -49
  66. package/workframe-api/credential_vault.py +445 -445
  67. package/workframe-api/data/avatar-catalog.json +41 -41
  68. package/workframe-api/data/logo-catalog.json +14 -14
  69. package/workframe-api/data/user-avatar-catalog.json +18 -18
  70. package/workframe-api/email_sender.py +220 -220
  71. package/workframe-api/google_auth.py +90 -90
  72. package/workframe-api/install_api.py +359 -359
  73. package/workframe-api/internal_proxy_auth.py +150 -150
  74. package/workframe-api/llm_proxy.py +280 -280
  75. package/workframe-api/oidc_jwt.py +108 -108
  76. package/workframe-api/package.json +12 -12
  77. package/workframe-api/platform_auth.py +194 -194
  78. package/workframe-api/profile_secret_policy.py +86 -86
  79. package/workframe-api/public/assets/index-DPXu_lGn.css +1 -1
  80. package/workframe-api/public/assets/index-DYnLrCZZ.js +8 -8
  81. package/workframe-api/public/assets/index-DglUqFB_.js +8 -8
  82. package/workframe-api/public/index.html +12 -12
  83. package/workframe-api/requirements.txt +2 -2
  84. package/workframe-api/server.py +19866 -19774
  85. package/workframe-api/site_meta.py +271 -271
  86. package/workframe-api/stack_config.py +427 -427
  87. package/workframe-api/test_billing_provider.py +24 -0
  88. package/workframe-api/time-bind-chat.py +99 -99
  89. package/workframe-api/turn_credentials.py +226 -226
  90. package/workframe-api/updates.py +506 -506
  91. package/workframe-api/vault_kek.py +159 -159
  92. package/workframe-api/zk_auth.py +633 -633
  93. package/workframe-supervisor/Dockerfile +11 -11
  94. package/workframe-supervisor/profile_secret_policy.py +76 -76
  95. package/workframe-supervisor/server.py +860 -860
  96. package/workframe-ui/docker/nginx.conf +85 -85
  97. package/workframe-ui/public/assets/{arc-BskqxLmE.js → arc-DoYr2T5c.js} +1 -1
  98. package/workframe-ui/public/assets/architecture-7EHR7CIX-CmDi28hh.js +1 -0
  99. package/workframe-ui/public/assets/{architectureDiagram-3BPJPVTR-B3eGdqvq.js → architectureDiagram-3BPJPVTR-Clher08G.js} +1 -1
  100. package/workframe-ui/public/assets/{blockDiagram-GPEHLZMM-CzFZG7uX.js → blockDiagram-GPEHLZMM-Bdw9txrZ.js} +1 -1
  101. package/workframe-ui/public/assets/{c4Diagram-AAUBKEIU-BS-gGyCH.js → c4Diagram-AAUBKEIU-DlI_h_uo.js} +1 -1
  102. package/workframe-ui/public/assets/channel-DZYVoEdD.js +1 -0
  103. package/workframe-ui/public/assets/{chunk-2J33WTMH-Cjvqf7c9.js → chunk-2J33WTMH-ol-uwoeq.js} +1 -1
  104. package/workframe-ui/public/assets/{chunk-3OPIFGDE--eUuL8AK.js → chunk-3OPIFGDE-7eDhBen0.js} +1 -1
  105. package/workframe-ui/public/assets/{chunk-4BX2VUAB-s9lHUFKL.js → chunk-4BX2VUAB-xPORD7Js.js} +1 -1
  106. package/workframe-ui/public/assets/{chunk-55IACEB6-D1McA5nz.js → chunk-55IACEB6-Cwd7dr1z.js} +1 -1
  107. package/workframe-ui/public/assets/{chunk-5ZQYHXKU-DIstLfU2.js → chunk-5ZQYHXKU-Ckt4Sjy1.js} +1 -1
  108. package/workframe-ui/public/assets/{chunk-727SXJPM-Cd0GD2CO.js → chunk-727SXJPM-sMk1op_G.js} +1 -1
  109. package/workframe-ui/public/assets/{chunk-AQP2D5EJ-gc5Ra6G4.js → chunk-AQP2D5EJ-CMgSvr6H.js} +1 -1
  110. package/workframe-ui/public/assets/{chunk-BSJP7CBP-Cg5QfihJ.js → chunk-BSJP7CBP-Dx7GN0T4.js} +1 -1
  111. package/workframe-ui/public/assets/{chunk-CSCIHK7Q-D_gobbhY.js → chunk-CSCIHK7Q--OCu86u0.js} +1 -1
  112. package/workframe-ui/public/assets/{chunk-FMBD7UC4-B6eLY9_d.js → chunk-FMBD7UC4-CejmwJpz.js} +1 -1
  113. package/workframe-ui/public/assets/{chunk-KSCS5N6A-BGroAeW2.js → chunk-KSCS5N6A-CvOj2Yvp.js} +1 -1
  114. package/workframe-ui/public/assets/{chunk-L5ZTLDWV-34xv7WgT.js → chunk-L5ZTLDWV-B0nGBjLU.js} +1 -1
  115. package/workframe-ui/public/assets/{chunk-LZXEDZCA-XJBctFZw.js → chunk-LZXEDZCA-Bdzvu227.js} +2 -2
  116. package/workframe-ui/public/assets/{chunk-ND2GUHAM-nTOZpln8.js → chunk-ND2GUHAM-CGR07jTY.js} +1 -1
  117. package/workframe-ui/public/assets/{chunk-NZK2D7GU-BBrzcaPH.js → chunk-NZK2D7GU-CBojDPNC.js} +1 -1
  118. package/workframe-ui/public/assets/{chunk-O5CBEL6O-Cntncx6L.js → chunk-O5CBEL6O-DBin5MPF.js} +1 -1
  119. package/workframe-ui/public/assets/chunk-QZHKN3VN-DwiajAaK.js +1 -0
  120. package/workframe-ui/public/assets/chunk-WU5MYG2G-Bz8vA5s7.js +1 -0
  121. package/workframe-ui/public/assets/{chunk-XPW4576I-DSbtd0cg.js → chunk-XPW4576I-TD7I7pcb.js} +1 -1
  122. package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-DQiq8od0.js +1 -0
  123. package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-DQiq8od0.js +1 -0
  124. package/workframe-ui/public/assets/{cose-bilkent-S5V4N54A-lmYstEMQ.js → cose-bilkent-S5V4N54A-Bmm5x5xm.js} +1 -1
  125. package/workframe-ui/public/assets/{dagre-BM42HDAG-Bdkbdul2.js → dagre-BM42HDAG-zU2r0aq2.js} +1 -1
  126. package/workframe-ui/public/assets/{diagram-2AECGRRQ-Clb9kSXe.js → diagram-2AECGRRQ-AL01qukm.js} +1 -1
  127. package/workframe-ui/public/assets/{diagram-5GNKFQAL-BApg0yec.js → diagram-5GNKFQAL-DKi1xSMg.js} +1 -1
  128. package/workframe-ui/public/assets/{diagram-KO2AKTUF-peZjDRV6.js → diagram-KO2AKTUF-DQJDQ-f-.js} +1 -1
  129. package/workframe-ui/public/assets/{diagram-LMA3HP47-DZm_1pjc.js → diagram-LMA3HP47-B1oisGUj.js} +1 -1
  130. package/workframe-ui/public/assets/{diagram-OG6HWLK6-DP_N6fYL.js → diagram-OG6HWLK6-DjpJKffk.js} +1 -1
  131. package/workframe-ui/public/assets/{dist-CqP43hXK.js → dist-Jk20AnQG.js} +1 -1
  132. package/workframe-ui/public/assets/{erDiagram-TEJ5UH35-Blfs6kLv.js → erDiagram-TEJ5UH35-Vu8RtLUf.js} +1 -1
  133. package/workframe-ui/public/assets/eventmodeling-FCH6USID-BXUnTe0c.js +1 -0
  134. package/workframe-ui/public/assets/{flowDiagram-I6XJVG4X-CcmMOkwH.js → flowDiagram-I6XJVG4X-CHAXEhbR.js} +1 -1
  135. package/workframe-ui/public/assets/{ganttDiagram-6RSMTGT7-ByoO3dF7.js → ganttDiagram-6RSMTGT7-DhiEkfH8.js} +1 -1
  136. package/workframe-ui/public/assets/{gitGraph-WXDBUCRP-DCyTpmPs.js → gitGraph-WXDBUCRP-Cuq44XvU.js} +1 -1
  137. package/workframe-ui/public/assets/{gitGraphDiagram-PVQCEYII-CvLYB55b.js → gitGraphDiagram-PVQCEYII-B7kgReRt.js} +1 -1
  138. package/workframe-ui/public/assets/index-72-j0sA5.js +129 -0
  139. package/workframe-ui/public/assets/index-auJ0bLMU.css +1 -0
  140. package/workframe-ui/public/assets/{info-J43DQDTF-CfSRIfOI.js → info-J43DQDTF-oV4b3M4f.js} +1 -1
  141. package/workframe-ui/public/assets/{infoDiagram-5YYISTIA-DwS44DS6.js → infoDiagram-5YYISTIA-CthN4b6o.js} +1 -1
  142. package/workframe-ui/public/assets/{ishikawaDiagram-YF4QCWOH-MRlyodyU.js → ishikawaDiagram-YF4QCWOH-oEGS3TKg.js} +1 -1
  143. package/workframe-ui/public/assets/{journeyDiagram-JHISSGLW-sq7awk87.js → journeyDiagram-JHISSGLW-CXJsWmKF.js} +1 -1
  144. package/workframe-ui/public/assets/{kanban-definition-UN3LZRKU-CH6HbcWu.js → kanban-definition-UN3LZRKU-DTPo8yHW.js} +1 -1
  145. package/workframe-ui/public/assets/{line-DRBjFmUW.js → line-Bm9Pmcnz.js} +1 -1
  146. package/workframe-ui/public/assets/{linear-BR0LunjE.js → linear-Cn-uD6eX.js} +1 -1
  147. package/workframe-ui/public/assets/{mermaid-parser.core-Cl1GjHkT.js → mermaid-parser.core-BBVSTQZ4.js} +2 -2
  148. package/workframe-ui/public/assets/{mermaid.core-DsiKK1kE.js → mermaid.core-DE668nUy.js} +3 -3
  149. package/workframe-ui/public/assets/{mindmap-definition-RKZ34NQL-DBvi3OpW.js → mindmap-definition-RKZ34NQL-4qVsiwCf.js} +1 -1
  150. package/workframe-ui/public/assets/{packet-YPE3B663-CPDgtUHg.js → packet-YPE3B663-CqJeoiFG.js} +1 -1
  151. package/workframe-ui/public/assets/{pie-LRSECV5Y-BXJIPPDm.js → pie-LRSECV5Y-DcOqVssg.js} +1 -1
  152. package/workframe-ui/public/assets/{pieDiagram-4H26LBE5-CZwLEK-o.js → pieDiagram-4H26LBE5-CosMnpAM.js} +1 -1
  153. package/workframe-ui/public/assets/{quadrantDiagram-W4KKPZXB-B65bEUIQ.js → quadrantDiagram-W4KKPZXB-DtsnIK98.js} +1 -1
  154. package/workframe-ui/public/assets/{radar-GUYGQ44K-vXHkZzRK.js → radar-GUYGQ44K-BqLpJuWc.js} +1 -1
  155. package/workframe-ui/public/assets/{requirementDiagram-4Y6WPE33-BGWdvDfG.js → requirementDiagram-4Y6WPE33-Pb7cuX8_.js} +1 -1
  156. package/workframe-ui/public/assets/{sankeyDiagram-5OEKKPKP-BT2oC8dV.js → sankeyDiagram-5OEKKPKP-BJBlMM1m.js} +1 -1
  157. package/workframe-ui/public/assets/{sequenceDiagram-3UESZ5HK-45yj0Wtx.js → sequenceDiagram-3UESZ5HK-i4HnjP39.js} +1 -1
  158. package/workframe-ui/public/assets/{src-D-P8U2PB.js → src-DIhmc_XG.js} +1 -1
  159. package/workframe-ui/public/assets/{stateDiagram-AJRCARHV-SBrBJBZG.js → stateDiagram-AJRCARHV-Ba2iClPT.js} +1 -1
  160. package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-aUpqRAhy.js +1 -0
  161. package/workframe-ui/public/assets/{timeline-definition-PNZ67QCA-DegmxXXj.js → timeline-definition-PNZ67QCA-CL4X9vSF.js} +1 -1
  162. package/workframe-ui/public/assets/{treeView-BLDUP644-BVy7CsCj.js → treeView-BLDUP644-BJrjnbMj.js} +1 -1
  163. package/workframe-ui/public/assets/{treemap-LRROVOQU-BD5Kb74J.js → treemap-LRROVOQU-CN6H54RF.js} +1 -1
  164. package/workframe-ui/public/assets/{vennDiagram-CIIHVFJN-hwAkNbl3.js → vennDiagram-CIIHVFJN-Cee6sbUy.js} +1 -1
  165. package/workframe-ui/public/assets/{wardley-L42UT6IY-CBMPT8Y1.js → wardley-L42UT6IY-D0cXq60c.js} +1 -1
  166. package/workframe-ui/public/assets/{wardleyDiagram-YWT4CUSO-DXqihVlE.js → wardleyDiagram-YWT4CUSO-CaH9XkCx.js} +1 -1
  167. package/workframe-ui/public/assets/{xychartDiagram-2RQKCTM6-Cbb4LBzj.js → xychartDiagram-2RQKCTM6-BEisgFoI.js} +1 -1
  168. package/workframe-ui/public/favicon.svg +7 -7
  169. package/workframe-ui/public/icons.svg +24 -24
  170. package/workframe-ui/public/index.html +47 -50
  171. package/workframe-ui/public/manifest.webmanifest +18 -18
  172. package/workframe-ui/public/workframe-config.json +3 -3
  173. package/workframe-ui/public/assets/architecture-7EHR7CIX-DOxsUI33.js +0 -1
  174. package/workframe-ui/public/assets/channel-Baa20pIs.js +0 -1
  175. package/workframe-ui/public/assets/chunk-QZHKN3VN-B7tPxs4H.js +0 -1
  176. package/workframe-ui/public/assets/chunk-WU5MYG2G-Dvh2By1o.js +0 -1
  177. package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-BljHyDzF.js +0 -1
  178. package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-BljHyDzF.js +0 -1
  179. package/workframe-ui/public/assets/eventmodeling-FCH6USID-C4xwO6dx.js +0 -1
  180. package/workframe-ui/public/assets/index-BIfRGM8p.js +0 -133
  181. package/workframe-ui/public/assets/index-DpoUZAxh.css +0 -1
  182. package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-B3im3So2.js +0 -1
@@ -1,83 +1,83 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Build apps/web and copy dist into create-workframe/workframe-ui/public for npm publish.
4
- * Canonical UI pipeline: apps/web `npm run build` → dist (same as monorepo `pnpm build:web`).
5
- * Run from repository root: node packages/create-workframe/scripts/bundle-workframe-ui.mjs
6
- */
7
- import fs from 'node:fs';
8
- import path from 'node:path';
9
- import { fileURLToPath } from 'node:url';
10
- import { spawnSync } from 'node:child_process';
11
-
12
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
- const PKG_ROOT = path.resolve(__dirname, '..');
14
- const REPO_ROOT = path.resolve(PKG_ROOT, '../..');
15
- const UI_SRC = path.join(REPO_ROOT, 'apps/web');
16
- const UI_DEST = path.join(PKG_ROOT, 'workframe-ui', 'public');
17
-
18
- function npmCmd() {
19
- return process.platform === 'win32' ? 'npm.cmd' : 'npm';
20
- }
21
-
22
- function copyTree(src, dst) {
23
- if (!fs.existsSync(src)) throw new Error(`Missing source: ${src}`);
24
- fs.rmSync(dst, { recursive: true, force: true });
25
- fs.mkdirSync(dst, { recursive: true });
26
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
27
- const from = path.join(src, entry.name);
28
- const to = path.join(dst, entry.name);
29
- if (entry.isDirectory()) copyTree(from, to);
30
- else fs.copyFileSync(from, to);
31
- }
32
- }
33
-
34
- const skipBuild = process.argv.includes('--skip-build');
35
-
36
- if (!fs.existsSync(UI_SRC)) {
37
- console.error(`apps/web source not found: ${UI_SRC}`);
38
- process.exit(1);
39
- }
40
-
41
- if (!skipBuild) {
42
- console.log('Building @workframe/web...');
43
- const build = spawnSync(npmCmd(), ['run', 'build'], {
44
- cwd: UI_SRC,
45
- stdio: 'inherit',
46
- shell: process.platform === 'win32',
47
- });
48
- if (build.status !== 0) process.exit(build.status ?? 1);
49
- } else {
50
- console.log('Skipping @workframe/web build (--skip-build)');
51
- }
52
-
53
- const dist = path.join(UI_SRC, 'dist');
54
- if (!fs.existsSync(path.join(dist, 'index.html'))) {
55
- console.error(`Build output missing index.html in ${dist}`);
56
- process.exit(1);
57
- }
58
-
59
- console.log(`Copying ${dist} -> ${UI_DEST}`);
60
- copyTree(dist, UI_DEST);
61
-
62
- const avatarShared = path.join(PKG_ROOT, 'shared', 'agent-avatars');
63
-
64
- function copyPresetPngs(src, dst, { keepCatalog = false } = {}) {
65
- if (!fs.existsSync(src)) return;
66
- fs.mkdirSync(dst, { recursive: true });
67
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
68
- if (!entry.isFile() || !entry.name.endsWith('.png')) continue;
69
- fs.copyFileSync(path.join(src, entry.name), path.join(dst, entry.name));
70
- }
71
- if (keepCatalog && fs.existsSync(path.join(src, 'catalog.json'))) {
72
- fs.copyFileSync(path.join(src, 'catalog.json'), path.join(dst, 'catalog.json'));
73
- }
74
- }
75
-
76
- for (const dir of ['avatars', 'logos']) {
77
- copyPresetPngs(path.join(dist, 'assets', dir), path.join(UI_DEST, 'assets', dir), { keepCatalog: true });
78
- }
79
-
80
- // ponytail: shared/agent-avatars is npm-pack mirror of avatars only (legacy seed path)
81
- copyPresetPngs(path.join(dist, 'assets', 'avatars'), avatarShared, { keepCatalog: true });
82
-
83
- console.log('Workframe UI bundle ready for create-workframe.');
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Build apps/web and copy dist into create-workframe/workframe-ui/public for npm publish.
4
+ * Canonical UI pipeline: apps/web `npm run build` → dist (same as monorepo `pnpm build:web`).
5
+ * Run from repository root: node packages/create-workframe/scripts/bundle-workframe-ui.mjs
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { spawnSync } from 'node:child_process';
11
+
12
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
+ const PKG_ROOT = path.resolve(__dirname, '..');
14
+ const REPO_ROOT = path.resolve(PKG_ROOT, '../..');
15
+ const UI_SRC = path.join(REPO_ROOT, 'apps/web');
16
+ const UI_DEST = path.join(PKG_ROOT, 'workframe-ui', 'public');
17
+
18
+ function npmCmd() {
19
+ return process.platform === 'win32' ? 'npm.cmd' : 'npm';
20
+ }
21
+
22
+ function copyTree(src, dst) {
23
+ if (!fs.existsSync(src)) throw new Error(`Missing source: ${src}`);
24
+ fs.rmSync(dst, { recursive: true, force: true });
25
+ fs.mkdirSync(dst, { recursive: true });
26
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
27
+ const from = path.join(src, entry.name);
28
+ const to = path.join(dst, entry.name);
29
+ if (entry.isDirectory()) copyTree(from, to);
30
+ else fs.copyFileSync(from, to);
31
+ }
32
+ }
33
+
34
+ const skipBuild = process.argv.includes('--skip-build');
35
+
36
+ if (!fs.existsSync(UI_SRC)) {
37
+ console.error(`apps/web source not found: ${UI_SRC}`);
38
+ process.exit(1);
39
+ }
40
+
41
+ if (!skipBuild) {
42
+ console.log('Building @workframe/web...');
43
+ const build = spawnSync(npmCmd(), ['run', 'build'], {
44
+ cwd: UI_SRC,
45
+ stdio: 'inherit',
46
+ shell: process.platform === 'win32',
47
+ });
48
+ if (build.status !== 0) process.exit(build.status ?? 1);
49
+ } else {
50
+ console.log('Skipping @workframe/web build (--skip-build)');
51
+ }
52
+
53
+ const dist = path.join(UI_SRC, 'dist');
54
+ if (!fs.existsSync(path.join(dist, 'index.html'))) {
55
+ console.error(`Build output missing index.html in ${dist}`);
56
+ process.exit(1);
57
+ }
58
+
59
+ console.log(`Copying ${dist} -> ${UI_DEST}`);
60
+ copyTree(dist, UI_DEST);
61
+
62
+ const avatarShared = path.join(PKG_ROOT, 'shared', 'agent-avatars');
63
+
64
+ function copyPresetPngs(src, dst, { keepCatalog = false } = {}) {
65
+ if (!fs.existsSync(src)) return;
66
+ fs.mkdirSync(dst, { recursive: true });
67
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
68
+ if (!entry.isFile() || !entry.name.endsWith('.png')) continue;
69
+ fs.copyFileSync(path.join(src, entry.name), path.join(dst, entry.name));
70
+ }
71
+ if (keepCatalog && fs.existsSync(path.join(src, 'catalog.json'))) {
72
+ fs.copyFileSync(path.join(src, 'catalog.json'), path.join(dst, 'catalog.json'));
73
+ }
74
+ }
75
+
76
+ for (const dir of ['avatars', 'logos']) {
77
+ copyPresetPngs(path.join(dist, 'assets', dir), path.join(UI_DEST, 'assets', dir), { keepCatalog: true });
78
+ }
79
+
80
+ // ponytail: shared/agent-avatars is npm-pack mirror of avatars only (legacy seed path)
81
+ copyPresetPngs(path.join(dist, 'assets', 'avatars'), avatarShared, { keepCatalog: true });
82
+
83
+ console.log('Workframe UI bundle ready for create-workframe.');