create-workframe 0.1.5 → 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 (181) 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 -19866
  85. package/workframe-api/site_meta.py +271 -271
  86. package/workframe-api/stack_config.py +427 -427
  87. package/workframe-api/time-bind-chat.py +99 -99
  88. package/workframe-api/turn_credentials.py +226 -226
  89. package/workframe-api/updates.py +506 -506
  90. package/workframe-api/vault_kek.py +159 -159
  91. package/workframe-api/zk_auth.py +633 -633
  92. package/workframe-supervisor/Dockerfile +11 -11
  93. package/workframe-supervisor/profile_secret_policy.py +76 -76
  94. package/workframe-supervisor/server.py +860 -860
  95. package/workframe-ui/docker/nginx.conf +85 -85
  96. package/workframe-ui/public/assets/{arc-CnriPN3G.js → arc-DoYr2T5c.js} +1 -1
  97. package/workframe-ui/public/assets/architecture-7EHR7CIX-CmDi28hh.js +1 -0
  98. package/workframe-ui/public/assets/{architectureDiagram-3BPJPVTR-DYYB1Ic2.js → architectureDiagram-3BPJPVTR-Clher08G.js} +1 -1
  99. package/workframe-ui/public/assets/{blockDiagram-GPEHLZMM-Bn-fFOyj.js → blockDiagram-GPEHLZMM-Bdw9txrZ.js} +1 -1
  100. package/workframe-ui/public/assets/{c4Diagram-AAUBKEIU-BPPDtAnD.js → c4Diagram-AAUBKEIU-DlI_h_uo.js} +1 -1
  101. package/workframe-ui/public/assets/channel-DZYVoEdD.js +1 -0
  102. package/workframe-ui/public/assets/{chunk-2J33WTMH-Bz2CJiC3.js → chunk-2J33WTMH-ol-uwoeq.js} +1 -1
  103. package/workframe-ui/public/assets/{chunk-3OPIFGDE-B8aMeE1B.js → chunk-3OPIFGDE-7eDhBen0.js} +1 -1
  104. package/workframe-ui/public/assets/{chunk-4BX2VUAB-bLFHQTuT.js → chunk-4BX2VUAB-xPORD7Js.js} +1 -1
  105. package/workframe-ui/public/assets/{chunk-55IACEB6-BRxhx-lG.js → chunk-55IACEB6-Cwd7dr1z.js} +1 -1
  106. package/workframe-ui/public/assets/{chunk-5ZQYHXKU-BLyOgEJ8.js → chunk-5ZQYHXKU-Ckt4Sjy1.js} +1 -1
  107. package/workframe-ui/public/assets/{chunk-727SXJPM-DiuvBl7G.js → chunk-727SXJPM-sMk1op_G.js} +1 -1
  108. package/workframe-ui/public/assets/{chunk-AQP2D5EJ-BE1_aBdC.js → chunk-AQP2D5EJ-CMgSvr6H.js} +1 -1
  109. package/workframe-ui/public/assets/{chunk-BSJP7CBP-BicGsmBs.js → chunk-BSJP7CBP-Dx7GN0T4.js} +1 -1
  110. package/workframe-ui/public/assets/{chunk-CSCIHK7Q-C3VTns3d.js → chunk-CSCIHK7Q--OCu86u0.js} +1 -1
  111. package/workframe-ui/public/assets/{chunk-FMBD7UC4-DSiXY3bY.js → chunk-FMBD7UC4-CejmwJpz.js} +1 -1
  112. package/workframe-ui/public/assets/{chunk-KSCS5N6A-Cvw5s3fR.js → chunk-KSCS5N6A-CvOj2Yvp.js} +1 -1
  113. package/workframe-ui/public/assets/{chunk-L5ZTLDWV-jJifGdIQ.js → chunk-L5ZTLDWV-B0nGBjLU.js} +1 -1
  114. package/workframe-ui/public/assets/{chunk-LZXEDZCA-Maee1aqo.js → chunk-LZXEDZCA-Bdzvu227.js} +2 -2
  115. package/workframe-ui/public/assets/{chunk-ND2GUHAM-C77N3VAM.js → chunk-ND2GUHAM-CGR07jTY.js} +1 -1
  116. package/workframe-ui/public/assets/{chunk-NZK2D7GU-BY68lrPB.js → chunk-NZK2D7GU-CBojDPNC.js} +1 -1
  117. package/workframe-ui/public/assets/{chunk-O5CBEL6O-D_c4kWzh.js → chunk-O5CBEL6O-DBin5MPF.js} +1 -1
  118. package/workframe-ui/public/assets/chunk-QZHKN3VN-DwiajAaK.js +1 -0
  119. package/workframe-ui/public/assets/chunk-WU5MYG2G-Bz8vA5s7.js +1 -0
  120. package/workframe-ui/public/assets/{chunk-XPW4576I-DlQgvqBp.js → chunk-XPW4576I-TD7I7pcb.js} +1 -1
  121. package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-DQiq8od0.js +1 -0
  122. package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-DQiq8od0.js +1 -0
  123. package/workframe-ui/public/assets/{cose-bilkent-S5V4N54A-CHCOHDSd.js → cose-bilkent-S5V4N54A-Bmm5x5xm.js} +1 -1
  124. package/workframe-ui/public/assets/{dagre-BM42HDAG-CKPcSYwU.js → dagre-BM42HDAG-zU2r0aq2.js} +1 -1
  125. package/workframe-ui/public/assets/{diagram-2AECGRRQ-C6qe0jP-.js → diagram-2AECGRRQ-AL01qukm.js} +1 -1
  126. package/workframe-ui/public/assets/{diagram-5GNKFQAL-DhQhrieU.js → diagram-5GNKFQAL-DKi1xSMg.js} +1 -1
  127. package/workframe-ui/public/assets/{diagram-KO2AKTUF-Bqf6Iw1r.js → diagram-KO2AKTUF-DQJDQ-f-.js} +1 -1
  128. package/workframe-ui/public/assets/{diagram-LMA3HP47-Bt1ms2D2.js → diagram-LMA3HP47-B1oisGUj.js} +1 -1
  129. package/workframe-ui/public/assets/{diagram-OG6HWLK6-C0Rrxe1i.js → diagram-OG6HWLK6-DjpJKffk.js} +1 -1
  130. package/workframe-ui/public/assets/{dist-BLcLhTn6.js → dist-Jk20AnQG.js} +1 -1
  131. package/workframe-ui/public/assets/{erDiagram-TEJ5UH35-Cy1GbZVu.js → erDiagram-TEJ5UH35-Vu8RtLUf.js} +1 -1
  132. package/workframe-ui/public/assets/eventmodeling-FCH6USID-BXUnTe0c.js +1 -0
  133. package/workframe-ui/public/assets/{flowDiagram-I6XJVG4X-DL3ALqDG.js → flowDiagram-I6XJVG4X-CHAXEhbR.js} +1 -1
  134. package/workframe-ui/public/assets/{ganttDiagram-6RSMTGT7-CMpwBhXQ.js → ganttDiagram-6RSMTGT7-DhiEkfH8.js} +1 -1
  135. package/workframe-ui/public/assets/{gitGraph-WXDBUCRP-C0mwHUXL.js → gitGraph-WXDBUCRP-Cuq44XvU.js} +1 -1
  136. package/workframe-ui/public/assets/{gitGraphDiagram-PVQCEYII-6gzhWaF0.js → gitGraphDiagram-PVQCEYII-B7kgReRt.js} +1 -1
  137. package/workframe-ui/public/assets/index-72-j0sA5.js +129 -0
  138. package/workframe-ui/public/assets/index-auJ0bLMU.css +1 -0
  139. package/workframe-ui/public/assets/{info-J43DQDTF-Bb_wZTxU.js → info-J43DQDTF-oV4b3M4f.js} +1 -1
  140. package/workframe-ui/public/assets/{infoDiagram-5YYISTIA-601evYFV.js → infoDiagram-5YYISTIA-CthN4b6o.js} +1 -1
  141. package/workframe-ui/public/assets/{ishikawaDiagram-YF4QCWOH-BYtF-wHm.js → ishikawaDiagram-YF4QCWOH-oEGS3TKg.js} +1 -1
  142. package/workframe-ui/public/assets/{journeyDiagram-JHISSGLW-BMizyHzC.js → journeyDiagram-JHISSGLW-CXJsWmKF.js} +1 -1
  143. package/workframe-ui/public/assets/{kanban-definition-UN3LZRKU-CLLJsdnh.js → kanban-definition-UN3LZRKU-DTPo8yHW.js} +1 -1
  144. package/workframe-ui/public/assets/{line-BFiSvu-q.js → line-Bm9Pmcnz.js} +1 -1
  145. package/workframe-ui/public/assets/{linear-D6HYZ18_.js → linear-Cn-uD6eX.js} +1 -1
  146. package/workframe-ui/public/assets/{mermaid-parser.core-Cid5yDBQ.js → mermaid-parser.core-BBVSTQZ4.js} +2 -2
  147. package/workframe-ui/public/assets/{mermaid.core-DqIiju5Z.js → mermaid.core-DE668nUy.js} +3 -3
  148. package/workframe-ui/public/assets/{mindmap-definition-RKZ34NQL-Bg7xJdsz.js → mindmap-definition-RKZ34NQL-4qVsiwCf.js} +1 -1
  149. package/workframe-ui/public/assets/{packet-YPE3B663-1ebGt86D.js → packet-YPE3B663-CqJeoiFG.js} +1 -1
  150. package/workframe-ui/public/assets/{pie-LRSECV5Y-DJ9wOBC_.js → pie-LRSECV5Y-DcOqVssg.js} +1 -1
  151. package/workframe-ui/public/assets/{pieDiagram-4H26LBE5-BmK96Aus.js → pieDiagram-4H26LBE5-CosMnpAM.js} +1 -1
  152. package/workframe-ui/public/assets/{quadrantDiagram-W4KKPZXB-ByUqtWPZ.js → quadrantDiagram-W4KKPZXB-DtsnIK98.js} +1 -1
  153. package/workframe-ui/public/assets/{radar-GUYGQ44K-DN-Hkt96.js → radar-GUYGQ44K-BqLpJuWc.js} +1 -1
  154. package/workframe-ui/public/assets/{requirementDiagram-4Y6WPE33-ByU2r8gb.js → requirementDiagram-4Y6WPE33-Pb7cuX8_.js} +1 -1
  155. package/workframe-ui/public/assets/{sankeyDiagram-5OEKKPKP-elyWa0GK.js → sankeyDiagram-5OEKKPKP-BJBlMM1m.js} +1 -1
  156. package/workframe-ui/public/assets/{sequenceDiagram-3UESZ5HK-CzZwsAiK.js → sequenceDiagram-3UESZ5HK-i4HnjP39.js} +1 -1
  157. package/workframe-ui/public/assets/{src-5vgsM_dl.js → src-DIhmc_XG.js} +1 -1
  158. package/workframe-ui/public/assets/{stateDiagram-AJRCARHV-B0O5w5lJ.js → stateDiagram-AJRCARHV-Ba2iClPT.js} +1 -1
  159. package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-aUpqRAhy.js +1 -0
  160. package/workframe-ui/public/assets/{timeline-definition-PNZ67QCA-oyqa5w5y.js → timeline-definition-PNZ67QCA-CL4X9vSF.js} +1 -1
  161. package/workframe-ui/public/assets/{treeView-BLDUP644-MCV12-eP.js → treeView-BLDUP644-BJrjnbMj.js} +1 -1
  162. package/workframe-ui/public/assets/{treemap-LRROVOQU-DiA1P9n5.js → treemap-LRROVOQU-CN6H54RF.js} +1 -1
  163. package/workframe-ui/public/assets/{vennDiagram-CIIHVFJN-CO_4x7OR.js → vennDiagram-CIIHVFJN-Cee6sbUy.js} +1 -1
  164. package/workframe-ui/public/assets/{wardley-L42UT6IY-CmQNv6Xv.js → wardley-L42UT6IY-D0cXq60c.js} +1 -1
  165. package/workframe-ui/public/assets/{wardleyDiagram-YWT4CUSO-CJxDkbIj.js → wardleyDiagram-YWT4CUSO-CaH9XkCx.js} +1 -1
  166. package/workframe-ui/public/assets/{xychartDiagram-2RQKCTM6-B02MxgzG.js → xychartDiagram-2RQKCTM6-BEisgFoI.js} +1 -1
  167. package/workframe-ui/public/favicon.svg +7 -7
  168. package/workframe-ui/public/icons.svg +24 -24
  169. package/workframe-ui/public/index.html +47 -47
  170. package/workframe-ui/public/manifest.webmanifest +18 -18
  171. package/workframe-ui/public/workframe-config.json +3 -3
  172. package/workframe-ui/public/assets/architecture-7EHR7CIX-CFhr7xAe.js +0 -1
  173. package/workframe-ui/public/assets/channel-Dok_-T0o.js +0 -1
  174. package/workframe-ui/public/assets/chunk-QZHKN3VN-C3wwLrTa.js +0 -1
  175. package/workframe-ui/public/assets/chunk-WU5MYG2G-GFFSg2kf.js +0 -1
  176. package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-DKbGfT5Z.js +0 -1
  177. package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-DKbGfT5Z.js +0 -1
  178. package/workframe-ui/public/assets/eventmodeling-FCH6USID-C_PrceHe.js +0 -1
  179. package/workframe-ui/public/assets/index-DyO6K0TD.css +0 -1
  180. package/workframe-ui/public/assets/index-yvpSUs8T.js +0 -133
  181. package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-RXZRaSgT.js +0 -1
@@ -1,164 +1,164 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Copy canonical Workframe BFF into create-workframe package tree before npm pack.
4
- * Run from repository root: node packages/create-workframe/scripts/sync-canonical-to-package.mjs
5
- */
6
- import fs from 'node:fs';
7
- import path from 'node:path';
8
- import { fileURLToPath } from 'node:url';
9
-
10
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
- const PKG_ROOT = path.resolve(__dirname, '..');
12
- const REPO_ROOT = path.resolve(PKG_ROOT, '../..');
13
- const CANONICAL_API = path.join(REPO_ROOT, 'services/workframe-api');
14
- const PKG_API = path.join(PKG_ROOT, 'workframe-api');
15
- const CANONICAL_SUPERVISOR = path.join(REPO_ROOT, 'services/workframe-supervisor');
16
- const PKG_SUPERVISOR = path.join(PKG_ROOT, 'workframe-supervisor');
17
-
18
- const SKIP_DIRS = new Set([
19
- 'data',
20
- 'tests',
21
- '__pycache__',
22
- '.pytest_cache',
23
- '.venv',
24
- 'node_modules',
25
- ]);
26
-
27
- const SKIP_FILES = new Set([
28
- 'board.db',
29
- 'workframe.db',
30
- 'auth.db',
31
- 'fix_crlf.py',
32
- 'insert_endpoints.py',
33
- ]);
34
-
35
- function shouldSkip(name, isDir) {
36
- if (SKIP_DIRS.has(name)) return true;
37
- if (!isDir && SKIP_FILES.has(name)) return true;
38
- if (!isDir && name.endsWith('.pyc')) return true;
39
- return false;
40
- }
41
-
42
- function copyTree(src, dst) {
43
- if (!fs.existsSync(src)) throw new Error(`Missing canonical source: ${src}`);
44
- fs.rmSync(dst, { recursive: true, force: true });
45
- fs.mkdirSync(dst, { recursive: true });
46
-
47
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
48
- if (shouldSkip(entry.name, entry.isDirectory())) continue;
49
- const from = path.join(src, entry.name);
50
- const to = path.join(dst, entry.name);
51
- if (entry.isDirectory()) copyTree(from, to);
52
- else fs.copyFileSync(from, to);
53
- }
54
- }
55
-
56
- function removeIfExists(p) {
57
- if (fs.existsSync(p)) fs.rmSync(p, { recursive: true, force: true });
58
- }
59
-
60
- /** Alpine sh breaks on CRLF (then\r). Normalize at pack time — Windows checkout is CRLF. */
61
- function copyIntoPackage(src, dst) {
62
- fs.mkdirSync(path.dirname(dst), { recursive: true });
63
- if (dst.endsWith('.sh')) {
64
- const text = fs.readFileSync(src, 'utf8').replace(/\r\n/g, '\n').replace(/\r/g, '\n');
65
- fs.writeFileSync(dst, text, 'utf8');
66
- } else {
67
- fs.copyFileSync(src, dst);
68
- }
69
- }
70
-
71
- console.log(`Sync canonical BFF: ${CANONICAL_API} -> ${PKG_API}`);
72
- copyTree(CANONICAL_API, PKG_API);
73
-
74
- console.log(`Sync canonical supervisor: ${CANONICAL_SUPERVISOR} -> ${PKG_SUPERVISOR}`);
75
- copyTree(CANONICAL_SUPERVISOR, PKG_SUPERVISOR);
76
-
77
- const dataDir = path.join(PKG_API, 'data');
78
- fs.mkdirSync(dataDir, { recursive: true });
79
- const gitkeep = path.join(dataDir, '.gitkeep');
80
- if (!fs.existsSync(gitkeep)) fs.writeFileSync(gitkeep, '');
81
-
82
- const catalogSrc = path.join(CANONICAL_API, 'data', 'avatar-catalog.json');
83
- const catalogDst = path.join(PKG_API, 'data', 'avatar-catalog.json');
84
- if (fs.existsSync(catalogSrc)) {
85
- fs.mkdirSync(path.dirname(catalogDst), { recursive: true });
86
- fs.copyFileSync(catalogSrc, catalogDst);
87
- }
88
- for (const name of ['user-avatar-catalog.json', 'logo-catalog.json']) {
89
- const src = path.join(CANONICAL_API, 'data', name);
90
- const dst = path.join(PKG_API, 'data', name);
91
- if (fs.existsSync(src)) {
92
- fs.mkdirSync(path.dirname(dst), { recursive: true });
93
- fs.copyFileSync(src, dst);
94
- }
95
- }
96
-
97
- const missionControl = path.join(PKG_ROOT, 'mission-control');
98
- removeIfExists(missionControl);
99
- console.log('Removed deprecated mission-control from package tree');
100
-
101
- const uiSrcMirror = path.join(PKG_ROOT, 'workframe-ui', 'src');
102
- removeIfExists(uiSrcMirror);
103
- console.log('Removed stale workframe-ui/src mirror (canonical UI is apps/web)');
104
-
105
- const applyScripts = [
106
- 'apply-update-hermes.sh',
107
- 'apply-update-workframe.sh',
108
- 'restart-gateway-hermes.sh',
109
- 'compose-docker-host.sh',
110
- 'setup-stack-secrets.sh',
111
- 'bootstrap-workspace-link.sh',
112
- 'verify-public-deploy.sh',
113
- 'fix-zk-encryption-key.sh',
114
- 'set-compose-public-url.mjs',
115
- 'ensure-compose-host-paths.mjs',
116
- ];
117
- for (const name of applyScripts) {
118
- const src = path.join(REPO_ROOT, 'scripts/workframe', name);
119
- const dst = path.join(PKG_ROOT, 'scripts', name);
120
- if (!fs.existsSync(src)) throw new Error(`Missing apply script: ${src}`);
121
- copyIntoPackage(src, dst);
122
- console.log(`Synced ${name} -> package/scripts/`);
123
- }
124
-
125
- for (const sh of fs.readdirSync(path.join(PKG_ROOT, 'scripts')).filter((n) => n.endsWith('.sh'))) {
126
- const p = path.join(PKG_ROOT, 'scripts', sh);
127
- if (fs.readFileSync(p).includes(0x0d)) {
128
- throw new Error(`CRLF remains in package script after sync: ${sh}`);
129
- }
130
- }
131
-
132
- const publicDeploySrc = path.join(REPO_ROOT, 'infra/compose/workframe/PUBLIC_DEPLOY.md');
133
- const publicDeployDst = path.join(PKG_ROOT, 'docs/PUBLIC_DEPLOY.md');
134
- if (fs.existsSync(publicDeploySrc)) {
135
- fs.mkdirSync(path.dirname(publicDeployDst), { recursive: true });
136
- fs.copyFileSync(publicDeploySrc, publicDeployDst);
137
- console.log('Synced PUBLIC_DEPLOY.md -> package/docs/');
138
- }
139
-
140
- for (const name of ['LICENSE', 'NOTICE', 'SECURITY.md']) {
141
- const src = path.join(REPO_ROOT, name);
142
- const dst = path.join(PKG_ROOT, name);
143
- if (!fs.existsSync(src)) throw new Error(`Missing publish file: ${src}`);
144
- fs.copyFileSync(src, dst);
145
- console.log(`Synced ${name} -> package/`);
146
- }
147
-
148
- const uiStale = [
149
- 'components.json',
150
- 'eslint.config.js',
151
- 'index.html',
152
- 'package.json',
153
- 'README.md',
154
- 'tsconfig.app.json',
155
- 'tsconfig.json',
156
- 'tsconfig.node.json',
157
- 'vite.config.ts',
158
- 'scripts',
159
- ];
160
- for (const name of uiStale) {
161
- removeIfExists(path.join(PKG_ROOT, 'workframe-ui', name));
162
- }
163
-
164
- console.log('Canonical sync complete. Run bundle-workframe-ui.mjs next.');
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copy canonical Workframe BFF into create-workframe package tree before npm pack.
4
+ * Run from repository root: node packages/create-workframe/scripts/sync-canonical-to-package.mjs
5
+ */
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+
10
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
+ const PKG_ROOT = path.resolve(__dirname, '..');
12
+ const REPO_ROOT = path.resolve(PKG_ROOT, '../..');
13
+ const CANONICAL_API = path.join(REPO_ROOT, 'services/workframe-api');
14
+ const PKG_API = path.join(PKG_ROOT, 'workframe-api');
15
+ const CANONICAL_SUPERVISOR = path.join(REPO_ROOT, 'services/workframe-supervisor');
16
+ const PKG_SUPERVISOR = path.join(PKG_ROOT, 'workframe-supervisor');
17
+
18
+ const SKIP_DIRS = new Set([
19
+ 'data',
20
+ 'tests',
21
+ '__pycache__',
22
+ '.pytest_cache',
23
+ '.venv',
24
+ 'node_modules',
25
+ ]);
26
+
27
+ const SKIP_FILES = new Set([
28
+ 'board.db',
29
+ 'workframe.db',
30
+ 'auth.db',
31
+ 'fix_crlf.py',
32
+ 'insert_endpoints.py',
33
+ ]);
34
+
35
+ function shouldSkip(name, isDir) {
36
+ if (SKIP_DIRS.has(name)) return true;
37
+ if (!isDir && SKIP_FILES.has(name)) return true;
38
+ if (!isDir && name.endsWith('.pyc')) return true;
39
+ return false;
40
+ }
41
+
42
+ function copyTree(src, dst) {
43
+ if (!fs.existsSync(src)) throw new Error(`Missing canonical source: ${src}`);
44
+ fs.rmSync(dst, { recursive: true, force: true });
45
+ fs.mkdirSync(dst, { recursive: true });
46
+
47
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
48
+ if (shouldSkip(entry.name, entry.isDirectory())) continue;
49
+ const from = path.join(src, entry.name);
50
+ const to = path.join(dst, entry.name);
51
+ if (entry.isDirectory()) copyTree(from, to);
52
+ else fs.copyFileSync(from, to);
53
+ }
54
+ }
55
+
56
+ function removeIfExists(p) {
57
+ if (fs.existsSync(p)) fs.rmSync(p, { recursive: true, force: true });
58
+ }
59
+
60
+ /** Alpine sh breaks on CRLF (then\r). Normalize at pack time — Windows checkout is CRLF. */
61
+ function copyIntoPackage(src, dst) {
62
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
63
+ if (dst.endsWith('.sh')) {
64
+ const text = fs.readFileSync(src, 'utf8').replace(/\r\n/g, '\n').replace(/\r/g, '\n');
65
+ fs.writeFileSync(dst, text, 'utf8');
66
+ } else {
67
+ fs.copyFileSync(src, dst);
68
+ }
69
+ }
70
+
71
+ console.log(`Sync canonical BFF: ${CANONICAL_API} -> ${PKG_API}`);
72
+ copyTree(CANONICAL_API, PKG_API);
73
+
74
+ console.log(`Sync canonical supervisor: ${CANONICAL_SUPERVISOR} -> ${PKG_SUPERVISOR}`);
75
+ copyTree(CANONICAL_SUPERVISOR, PKG_SUPERVISOR);
76
+
77
+ const dataDir = path.join(PKG_API, 'data');
78
+ fs.mkdirSync(dataDir, { recursive: true });
79
+ const gitkeep = path.join(dataDir, '.gitkeep');
80
+ if (!fs.existsSync(gitkeep)) fs.writeFileSync(gitkeep, '');
81
+
82
+ const catalogSrc = path.join(CANONICAL_API, 'data', 'avatar-catalog.json');
83
+ const catalogDst = path.join(PKG_API, 'data', 'avatar-catalog.json');
84
+ if (fs.existsSync(catalogSrc)) {
85
+ fs.mkdirSync(path.dirname(catalogDst), { recursive: true });
86
+ fs.copyFileSync(catalogSrc, catalogDst);
87
+ }
88
+ for (const name of ['user-avatar-catalog.json', 'logo-catalog.json']) {
89
+ const src = path.join(CANONICAL_API, 'data', name);
90
+ const dst = path.join(PKG_API, 'data', name);
91
+ if (fs.existsSync(src)) {
92
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
93
+ fs.copyFileSync(src, dst);
94
+ }
95
+ }
96
+
97
+ const missionControl = path.join(PKG_ROOT, 'mission-control');
98
+ removeIfExists(missionControl);
99
+ console.log('Removed deprecated mission-control from package tree');
100
+
101
+ const uiSrcMirror = path.join(PKG_ROOT, 'workframe-ui', 'src');
102
+ removeIfExists(uiSrcMirror);
103
+ console.log('Removed stale workframe-ui/src mirror (canonical UI is apps/web)');
104
+
105
+ const applyScripts = [
106
+ 'apply-update-hermes.sh',
107
+ 'apply-update-workframe.sh',
108
+ 'restart-gateway-hermes.sh',
109
+ 'compose-docker-host.sh',
110
+ 'setup-stack-secrets.sh',
111
+ 'bootstrap-workspace-link.sh',
112
+ 'verify-public-deploy.sh',
113
+ 'fix-zk-encryption-key.sh',
114
+ 'set-compose-public-url.mjs',
115
+ 'ensure-compose-host-paths.mjs',
116
+ ];
117
+ for (const name of applyScripts) {
118
+ const src = path.join(REPO_ROOT, 'scripts/workframe', name);
119
+ const dst = path.join(PKG_ROOT, 'scripts', name);
120
+ if (!fs.existsSync(src)) throw new Error(`Missing apply script: ${src}`);
121
+ copyIntoPackage(src, dst);
122
+ console.log(`Synced ${name} -> package/scripts/`);
123
+ }
124
+
125
+ for (const sh of fs.readdirSync(path.join(PKG_ROOT, 'scripts')).filter((n) => n.endsWith('.sh'))) {
126
+ const p = path.join(PKG_ROOT, 'scripts', sh);
127
+ if (fs.readFileSync(p).includes(0x0d)) {
128
+ throw new Error(`CRLF remains in package script after sync: ${sh}`);
129
+ }
130
+ }
131
+
132
+ const publicDeploySrc = path.join(REPO_ROOT, 'infra/compose/workframe/PUBLIC_DEPLOY.md');
133
+ const publicDeployDst = path.join(PKG_ROOT, 'docs/PUBLIC_DEPLOY.md');
134
+ if (fs.existsSync(publicDeploySrc)) {
135
+ fs.mkdirSync(path.dirname(publicDeployDst), { recursive: true });
136
+ fs.copyFileSync(publicDeploySrc, publicDeployDst);
137
+ console.log('Synced PUBLIC_DEPLOY.md -> package/docs/');
138
+ }
139
+
140
+ for (const name of ['LICENSE', 'NOTICE', 'SECURITY.md']) {
141
+ const src = path.join(REPO_ROOT, name);
142
+ const dst = path.join(PKG_ROOT, name);
143
+ if (!fs.existsSync(src)) throw new Error(`Missing publish file: ${src}`);
144
+ fs.copyFileSync(src, dst);
145
+ console.log(`Synced ${name} -> package/`);
146
+ }
147
+
148
+ const uiStale = [
149
+ 'components.json',
150
+ 'eslint.config.js',
151
+ 'index.html',
152
+ 'package.json',
153
+ 'README.md',
154
+ 'tsconfig.app.json',
155
+ 'tsconfig.json',
156
+ 'tsconfig.node.json',
157
+ 'vite.config.ts',
158
+ 'scripts',
159
+ ];
160
+ for (const name of uiStale) {
161
+ removeIfExists(path.join(PKG_ROOT, 'workframe-ui', name));
162
+ }
163
+
164
+ console.log('Canonical sync complete. Run bundle-workframe-ui.mjs next.');
@@ -1,31 +1,31 @@
1
- # Workframe Agent Library
2
-
3
- Model
4
- - Main project agent (**{nativeAgentName}**) is concierge/orchestrator.
5
- - Specialists are modular workers that can be installed/imported/removed.
6
-
7
- Canonical behavior location
8
- - Runtime: `Agents/profiles/{nativeProfileSlug}/SOUL.md`
9
- - Bootstrap seed: `scripts/seed/profiles/{nativeProfileSlug}/SOUL.md`
10
-
11
- Default specialist catalog
12
- - visionary
13
- - architect
14
- - docs
15
- - dev
16
- - research
17
- - designer
18
-
19
- Install-time starter packs
20
- - Recorded in `workframe-manifest.json` (`pack`, `profiles`, `native_agent`)
21
- - Default scaffold pack is `native` (native agent only)
22
- - Reference packs can still be chosen explicitly
23
- - See `docs/SETUP.md` for the pack chosen at install
24
-
25
- Extension pattern
26
- - Add niche specialists only when recurring demand exists.
27
- - Preferred path: spawn specialists on demand through botfather/lifecycle flows instead of preinstalling the whole crew.
28
-
29
- Curation rule
30
- - Keep role-specific skill/tool bundles lean.
31
- - Avoid cloning massive identical bundles across all agents.
1
+ # Workframe Agent Library
2
+
3
+ Model
4
+ - Main project agent (**{nativeAgentName}**) is concierge/orchestrator.
5
+ - Specialists are modular workers that can be installed/imported/removed.
6
+
7
+ Canonical behavior location
8
+ - Runtime: `Agents/profiles/{nativeProfileSlug}/SOUL.md`
9
+ - Bootstrap seed: `scripts/seed/profiles/{nativeProfileSlug}/SOUL.md`
10
+
11
+ Default specialist catalog
12
+ - visionary
13
+ - architect
14
+ - docs
15
+ - dev
16
+ - research
17
+ - designer
18
+
19
+ Install-time starter packs
20
+ - Recorded in `workframe-manifest.json` (`pack`, `profiles`, `native_agent`)
21
+ - Default scaffold pack is `native` (native agent only)
22
+ - Reference packs can still be chosen explicitly
23
+ - See `docs/SETUP.md` for the pack chosen at install
24
+
25
+ Extension pattern
26
+ - Add niche specialists only when recurring demand exists.
27
+ - Preferred path: spawn specialists on demand through botfather/lifecycle flows instead of preinstalling the whole crew.
28
+
29
+ Curation rule
30
+ - Keep role-specific skill/tool bundles lean.
31
+ - Avoid cloning massive identical bundles across all agents.
@@ -1,29 +1,29 @@
1
- # Workframe Agent Operations
2
-
3
- Goal
4
- - keep the agent library dynamic but controlled.
5
-
6
- Concierge responsibilities
7
- - detect recurring specialist needs
8
- - propose profile add/remove/swap
9
- - route work through existing profiles until approved change lands
10
- - spawn specialists only when a real role gap exists
11
-
12
- Profile operations policy
13
- - Add profile: when repeated tasks do not fit existing specialists.
14
- - Remove profile: when low usage and overlapping role.
15
- - Replace profile: when role remains but mission changes.
16
-
17
- Approval
18
- - owner/admin approves profile topology changes in team environments.
19
-
20
- Preferred implementation path
21
- 1) Update runtime profile SOUL under `Agents/profiles/`.
22
- 2) Update bootstrap seeds under `scripts/seed/profiles/` when templates change.
23
- 3) Spawn or update the runtime profile set through lifecycle/botfather flows.
24
- 4) Announce changed routing behavior in docs and chat status.
25
-
26
- Default topology policy
27
- - Start native-only.
28
- - Treat specialist packs as reference presets, not mandatory first boot state.
29
- - Keep the installed crew as small as possible until real demand appears.
1
+ # Workframe Agent Operations
2
+
3
+ Goal
4
+ - keep the agent library dynamic but controlled.
5
+
6
+ Concierge responsibilities
7
+ - detect recurring specialist needs
8
+ - propose profile add/remove/swap
9
+ - route work through existing profiles until approved change lands
10
+ - spawn specialists only when a real role gap exists
11
+
12
+ Profile operations policy
13
+ - Add profile: when repeated tasks do not fit existing specialists.
14
+ - Remove profile: when low usage and overlapping role.
15
+ - Replace profile: when role remains but mission changes.
16
+
17
+ Approval
18
+ - owner/admin approves profile topology changes in team environments.
19
+
20
+ Preferred implementation path
21
+ 1) Update runtime profile SOUL under `Agents/profiles/`.
22
+ 2) Update bootstrap seeds under `scripts/seed/profiles/` when templates change.
23
+ 3) Spawn or update the runtime profile set through lifecycle/botfather flows.
24
+ 4) Announce changed routing behavior in docs and chat status.
25
+
26
+ Default topology policy
27
+ - Start native-only.
28
+ - Treat specialist packs as reference presets, not mandatory first boot state.
29
+ - Keep the installed crew as small as possible until real demand appears.
@@ -1,64 +1,64 @@
1
- {
2
- "version": 2,
3
- "packs": {
4
- "native": {
5
- "description": "One native project agent only. Spawn specialists later through Workframe botfather flows.",
6
- "profiles": [
7
- "project-agent"
8
- ]
9
- },
10
- "vanilla": {
11
- "description": "Reference default crew pack (native project agent + all core specialists)",
12
- "profiles": [
13
- "project-agent",
14
- "visionary",
15
- "architect",
16
- "docs",
17
- "dev",
18
- "research",
19
- "designer"
20
- ]
21
- },
22
- "core": {
23
- "description": "Minimal operational baseline",
24
- "profiles": [
25
- "project-agent",
26
- "docs",
27
- "dev"
28
- ]
29
- },
30
- "product": {
31
- "description": "Product discovery and direction",
32
- "profiles": [
33
- "project-agent",
34
- "docs",
35
- "dev",
36
- "visionary",
37
- "research",
38
- "designer"
39
- ]
40
- },
41
- "engineering": {
42
- "description": "Technical planning and delivery",
43
- "profiles": [
44
- "project-agent",
45
- "docs",
46
- "dev",
47
- "architect",
48
- "research"
49
- ]
50
- },
51
- "full": {
52
- "description": "Alias of vanilla for compatibility",
53
- "profiles": [
54
- "project-agent",
55
- "visionary",
56
- "architect",
57
- "docs",
58
- "dev",
59
- "research",
60
- "designer"
61
- ]
62
- }
63
- }
64
- }
1
+ {
2
+ "version": 2,
3
+ "packs": {
4
+ "native": {
5
+ "description": "One native project agent only. Spawn specialists later through Workframe botfather flows.",
6
+ "profiles": [
7
+ "project-agent"
8
+ ]
9
+ },
10
+ "vanilla": {
11
+ "description": "Reference default crew pack (native project agent + all core specialists)",
12
+ "profiles": [
13
+ "project-agent",
14
+ "visionary",
15
+ "architect",
16
+ "docs",
17
+ "dev",
18
+ "research",
19
+ "designer"
20
+ ]
21
+ },
22
+ "core": {
23
+ "description": "Minimal operational baseline",
24
+ "profiles": [
25
+ "project-agent",
26
+ "docs",
27
+ "dev"
28
+ ]
29
+ },
30
+ "product": {
31
+ "description": "Product discovery and direction",
32
+ "profiles": [
33
+ "project-agent",
34
+ "docs",
35
+ "dev",
36
+ "visionary",
37
+ "research",
38
+ "designer"
39
+ ]
40
+ },
41
+ "engineering": {
42
+ "description": "Technical planning and delivery",
43
+ "profiles": [
44
+ "project-agent",
45
+ "docs",
46
+ "dev",
47
+ "architect",
48
+ "research"
49
+ ]
50
+ },
51
+ "full": {
52
+ "description": "Alias of vanilla for compatibility",
53
+ "profiles": [
54
+ "project-agent",
55
+ "visionary",
56
+ "architect",
57
+ "docs",
58
+ "dev",
59
+ "research",
60
+ "designer"
61
+ ]
62
+ }
63
+ }
64
+ }
@@ -1,20 +1,20 @@
1
- version: 2
2
- packs:
3
- native:
4
- description: One native project agent only. Spawn specialists later through Workframe botfather flows.
5
- profiles: [project-agent]
6
- vanilla:
7
- description: Reference default crew pack (native project agent + all core specialists)
8
- profiles: [project-agent, visionary, architect, docs, dev, research, designer]
9
- core:
10
- description: Minimal operational baseline
11
- profiles: [project-agent, docs, dev]
12
- product:
13
- description: Product discovery and direction
14
- profiles: [project-agent, docs, dev, visionary, research, designer]
15
- engineering:
16
- description: Technical planning and delivery
17
- profiles: [project-agent, docs, dev, architect, research]
18
- full:
19
- description: Alias of vanilla for compatibility
20
- profiles: [project-agent, visionary, architect, docs, dev, research, designer]
1
+ version: 2
2
+ packs:
3
+ native:
4
+ description: One native project agent only. Spawn specialists later through Workframe botfather flows.
5
+ profiles: [project-agent]
6
+ vanilla:
7
+ description: Reference default crew pack (native project agent + all core specialists)
8
+ profiles: [project-agent, visionary, architect, docs, dev, research, designer]
9
+ core:
10
+ description: Minimal operational baseline
11
+ profiles: [project-agent, docs, dev]
12
+ product:
13
+ description: Product discovery and direction
14
+ profiles: [project-agent, docs, dev, visionary, research, designer]
15
+ engineering:
16
+ description: Technical planning and delivery
17
+ profiles: [project-agent, docs, dev, architect, research]
18
+ full:
19
+ description: Alias of vanilla for compatibility
20
+ profiles: [project-agent, visionary, architect, docs, dev, research, designer]
@@ -1,20 +1,20 @@
1
- # Workframe Chat Permission Model
2
-
3
- Purpose: keep chat collaboration simple, safe, and aligned with Workframe ontology.
4
-
5
- - Concierge agent is primary chat-facing interface.
6
- - Specialists are invoked through routing, not random direct control by default.
7
- - Platform permissions (Telegram/Discord roles/channels/threads) are the first trust gate.
8
-
9
- Trust model:
10
- - Owner/admin = highest-trust operator.
11
- - Team members = permitted by platform-level access policy.
12
-
13
- Risk model:
14
- - default allowed: docs + Kanban + status work
15
- - explicit approval required: high-impact external actions and credential changes
16
-
17
- Truth model:
18
- - chat = intent and coordination
19
- - Kanban = execution state
20
- - files = canonical project truth
1
+ # Workframe Chat Permission Model
2
+
3
+ Purpose: keep chat collaboration simple, safe, and aligned with Workframe ontology.
4
+
5
+ - Concierge agent is primary chat-facing interface.
6
+ - Specialists are invoked through routing, not random direct control by default.
7
+ - Platform permissions (Telegram/Discord roles/channels/threads) are the first trust gate.
8
+
9
+ Trust model:
10
+ - Owner/admin = highest-trust operator.
11
+ - Team members = permitted by platform-level access policy.
12
+
13
+ Risk model:
14
+ - default allowed: docs + Kanban + status work
15
+ - explicit approval required: high-impact external actions and credential changes
16
+
17
+ Truth model:
18
+ - chat = intent and coordination
19
+ - Kanban = execution state
20
+ - files = canonical project truth