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.
- package/.dockerignore +22 -22
- package/.gitignore +73 -73
- package/LICENSE +201 -201
- package/NOTICE +12 -12
- package/README.md +40 -40
- package/SECURITY.md +38 -38
- package/bin/create-workframe.js +2816 -2814
- package/bin/workframe.js +329 -329
- package/docs/workspace-instructions/WORKFRAME_DISCORD.md +20 -20
- package/docs/workspace-instructions/WORKFRAME_DOCUMENTS_AND_ARTIFACTS.md +20 -20
- package/docs/workspace-instructions/WORKFRAME_KANBAN.md +20 -20
- package/docs/workspace-instructions/WORKFRAME_ONBOARDING.md +21 -21
- package/docs/workspace-instructions/WORKFRAME_ROUTING.md +29 -29
- package/docs/workspace-instructions/WORKFRAME_TELEGRAM.md +19 -19
- package/package.json +64 -64
- package/profiles/README.md +15 -15
- package/profiles/architect/AGENTS.md +29 -29
- package/profiles/architect/SOUL.md +44 -44
- package/profiles/architect/skills/devops/kanban-worker/SKILL.md +27 -27
- package/profiles/designer/AGENTS.md +26 -26
- package/profiles/designer/SOUL.md +31 -31
- package/profiles/designer/skills/devops/kanban-worker/SKILL.md +27 -27
- package/profiles/dev/AGENTS.md +28 -28
- package/profiles/dev/SOUL.md +31 -31
- package/profiles/dev/skills/devops/kanban-worker/SKILL.md +27 -27
- package/profiles/docs/AGENTS.md +27 -27
- package/profiles/docs/SOUL.md +30 -30
- package/profiles/docs/skills/devops/kanban-worker/SKILL.md +27 -27
- package/profiles/research/AGENTS.md +26 -26
- package/profiles/research/SOUL.md +31 -31
- package/profiles/research/skills/devops/kanban-worker/SKILL.md +27 -27
- package/profiles/visionary/AGENTS.md +25 -25
- package/profiles/visionary/SOUL.md +31 -31
- package/profiles/visionary/skills/devops/kanban-worker/SKILL.md +27 -27
- package/profiles/workframe-agent/AGENTS.md +37 -37
- package/profiles/workframe-agent/SETUP.md +185 -185
- package/profiles/workframe-agent/SOUL.md +61 -61
- package/profiles/workframe-agent/skills/devops/botfather/SKILL.md +85 -85
- package/profiles/workframe-agent/skills/devops/kanban-handoff-pattern/SKILL.md +58 -58
- package/profiles/workframe-agent/skills/devops/workframe-cohort/SKILL.md +54 -54
- package/prompts/WORKFRAME_PROMPT_TEMPLATES.md +16 -16
- package/rules/.hermes.md +11 -11
- package/rules/AGENTS.md +22 -22
- package/rules/workspace-README.md +5 -5
- package/scripts/apply-update-workframe.sh +91 -21
- package/scripts/bundle-workframe-ui.mjs +83 -83
- package/scripts/create_workframe_scaffold.py +648 -648
- package/scripts/ensure-compose-host-paths.mjs +51 -51
- package/scripts/lib/install-identity.mjs +212 -212
- package/scripts/lib/workframe-registry.mjs +290 -290
- package/scripts/new-project.mjs +68 -68
- package/scripts/select_agent_pack.py +31 -31
- package/scripts/set-compose-public-url.mjs +92 -92
- package/scripts/sync-canonical-to-package.mjs +164 -164
- package/shared/WORKFRAME_AGENT_LIBRARY.md +31 -31
- package/shared/WORKFRAME_AGENT_OPERATIONS.md +29 -29
- package/shared/WORKFRAME_AGENT_PACKS.json +64 -64
- package/shared/WORKFRAME_AGENT_PACKS.yaml +20 -20
- package/shared/WORKFRAME_CHAT_PERMISSION_MODEL.md +20 -20
- package/shared/WORKFRAME_HANDOFF_SCHEMA.md +25 -25
- package/shared/WORKFRAME_SKILL_CURATION.md +27 -27
- package/workframe-api/Dockerfile +14 -14
- package/workframe-api/README.md +24 -24
- package/workframe-api/action_proxy.py +131 -131
- package/workframe-api/auth_rate_limit.py +49 -49
- package/workframe-api/credential_vault.py +445 -445
- package/workframe-api/data/avatar-catalog.json +41 -41
- package/workframe-api/data/logo-catalog.json +14 -14
- package/workframe-api/data/user-avatar-catalog.json +18 -18
- package/workframe-api/email_sender.py +220 -220
- package/workframe-api/google_auth.py +90 -90
- package/workframe-api/install_api.py +359 -359
- package/workframe-api/internal_proxy_auth.py +150 -150
- package/workframe-api/llm_proxy.py +280 -280
- package/workframe-api/oidc_jwt.py +108 -108
- package/workframe-api/package.json +12 -12
- package/workframe-api/platform_auth.py +194 -194
- package/workframe-api/profile_secret_policy.py +86 -86
- package/workframe-api/public/assets/index-DPXu_lGn.css +1 -1
- package/workframe-api/public/assets/index-DYnLrCZZ.js +8 -8
- package/workframe-api/public/assets/index-DglUqFB_.js +8 -8
- package/workframe-api/public/index.html +12 -12
- package/workframe-api/requirements.txt +2 -2
- package/workframe-api/server.py +19866 -19866
- package/workframe-api/site_meta.py +271 -271
- package/workframe-api/stack_config.py +427 -427
- package/workframe-api/time-bind-chat.py +99 -99
- package/workframe-api/turn_credentials.py +226 -226
- package/workframe-api/updates.py +506 -506
- package/workframe-api/vault_kek.py +159 -159
- package/workframe-api/zk_auth.py +633 -633
- package/workframe-supervisor/Dockerfile +11 -11
- package/workframe-supervisor/profile_secret_policy.py +76 -76
- package/workframe-supervisor/server.py +860 -860
- package/workframe-ui/docker/nginx.conf +85 -85
- package/workframe-ui/public/assets/{arc-CnriPN3G.js → arc-DoYr2T5c.js} +1 -1
- package/workframe-ui/public/assets/architecture-7EHR7CIX-CmDi28hh.js +1 -0
- package/workframe-ui/public/assets/{architectureDiagram-3BPJPVTR-DYYB1Ic2.js → architectureDiagram-3BPJPVTR-Clher08G.js} +1 -1
- package/workframe-ui/public/assets/{blockDiagram-GPEHLZMM-Bn-fFOyj.js → blockDiagram-GPEHLZMM-Bdw9txrZ.js} +1 -1
- package/workframe-ui/public/assets/{c4Diagram-AAUBKEIU-BPPDtAnD.js → c4Diagram-AAUBKEIU-DlI_h_uo.js} +1 -1
- package/workframe-ui/public/assets/channel-DZYVoEdD.js +1 -0
- package/workframe-ui/public/assets/{chunk-2J33WTMH-Bz2CJiC3.js → chunk-2J33WTMH-ol-uwoeq.js} +1 -1
- package/workframe-ui/public/assets/{chunk-3OPIFGDE-B8aMeE1B.js → chunk-3OPIFGDE-7eDhBen0.js} +1 -1
- package/workframe-ui/public/assets/{chunk-4BX2VUAB-bLFHQTuT.js → chunk-4BX2VUAB-xPORD7Js.js} +1 -1
- package/workframe-ui/public/assets/{chunk-55IACEB6-BRxhx-lG.js → chunk-55IACEB6-Cwd7dr1z.js} +1 -1
- package/workframe-ui/public/assets/{chunk-5ZQYHXKU-BLyOgEJ8.js → chunk-5ZQYHXKU-Ckt4Sjy1.js} +1 -1
- package/workframe-ui/public/assets/{chunk-727SXJPM-DiuvBl7G.js → chunk-727SXJPM-sMk1op_G.js} +1 -1
- package/workframe-ui/public/assets/{chunk-AQP2D5EJ-BE1_aBdC.js → chunk-AQP2D5EJ-CMgSvr6H.js} +1 -1
- package/workframe-ui/public/assets/{chunk-BSJP7CBP-BicGsmBs.js → chunk-BSJP7CBP-Dx7GN0T4.js} +1 -1
- package/workframe-ui/public/assets/{chunk-CSCIHK7Q-C3VTns3d.js → chunk-CSCIHK7Q--OCu86u0.js} +1 -1
- package/workframe-ui/public/assets/{chunk-FMBD7UC4-DSiXY3bY.js → chunk-FMBD7UC4-CejmwJpz.js} +1 -1
- package/workframe-ui/public/assets/{chunk-KSCS5N6A-Cvw5s3fR.js → chunk-KSCS5N6A-CvOj2Yvp.js} +1 -1
- package/workframe-ui/public/assets/{chunk-L5ZTLDWV-jJifGdIQ.js → chunk-L5ZTLDWV-B0nGBjLU.js} +1 -1
- package/workframe-ui/public/assets/{chunk-LZXEDZCA-Maee1aqo.js → chunk-LZXEDZCA-Bdzvu227.js} +2 -2
- package/workframe-ui/public/assets/{chunk-ND2GUHAM-C77N3VAM.js → chunk-ND2GUHAM-CGR07jTY.js} +1 -1
- package/workframe-ui/public/assets/{chunk-NZK2D7GU-BY68lrPB.js → chunk-NZK2D7GU-CBojDPNC.js} +1 -1
- package/workframe-ui/public/assets/{chunk-O5CBEL6O-D_c4kWzh.js → chunk-O5CBEL6O-DBin5MPF.js} +1 -1
- package/workframe-ui/public/assets/chunk-QZHKN3VN-DwiajAaK.js +1 -0
- package/workframe-ui/public/assets/chunk-WU5MYG2G-Bz8vA5s7.js +1 -0
- package/workframe-ui/public/assets/{chunk-XPW4576I-DlQgvqBp.js → chunk-XPW4576I-TD7I7pcb.js} +1 -1
- package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-DQiq8od0.js +1 -0
- package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-DQiq8od0.js +1 -0
- package/workframe-ui/public/assets/{cose-bilkent-S5V4N54A-CHCOHDSd.js → cose-bilkent-S5V4N54A-Bmm5x5xm.js} +1 -1
- package/workframe-ui/public/assets/{dagre-BM42HDAG-CKPcSYwU.js → dagre-BM42HDAG-zU2r0aq2.js} +1 -1
- package/workframe-ui/public/assets/{diagram-2AECGRRQ-C6qe0jP-.js → diagram-2AECGRRQ-AL01qukm.js} +1 -1
- package/workframe-ui/public/assets/{diagram-5GNKFQAL-DhQhrieU.js → diagram-5GNKFQAL-DKi1xSMg.js} +1 -1
- package/workframe-ui/public/assets/{diagram-KO2AKTUF-Bqf6Iw1r.js → diagram-KO2AKTUF-DQJDQ-f-.js} +1 -1
- package/workframe-ui/public/assets/{diagram-LMA3HP47-Bt1ms2D2.js → diagram-LMA3HP47-B1oisGUj.js} +1 -1
- package/workframe-ui/public/assets/{diagram-OG6HWLK6-C0Rrxe1i.js → diagram-OG6HWLK6-DjpJKffk.js} +1 -1
- package/workframe-ui/public/assets/{dist-BLcLhTn6.js → dist-Jk20AnQG.js} +1 -1
- package/workframe-ui/public/assets/{erDiagram-TEJ5UH35-Cy1GbZVu.js → erDiagram-TEJ5UH35-Vu8RtLUf.js} +1 -1
- package/workframe-ui/public/assets/eventmodeling-FCH6USID-BXUnTe0c.js +1 -0
- package/workframe-ui/public/assets/{flowDiagram-I6XJVG4X-DL3ALqDG.js → flowDiagram-I6XJVG4X-CHAXEhbR.js} +1 -1
- package/workframe-ui/public/assets/{ganttDiagram-6RSMTGT7-CMpwBhXQ.js → ganttDiagram-6RSMTGT7-DhiEkfH8.js} +1 -1
- package/workframe-ui/public/assets/{gitGraph-WXDBUCRP-C0mwHUXL.js → gitGraph-WXDBUCRP-Cuq44XvU.js} +1 -1
- package/workframe-ui/public/assets/{gitGraphDiagram-PVQCEYII-6gzhWaF0.js → gitGraphDiagram-PVQCEYII-B7kgReRt.js} +1 -1
- package/workframe-ui/public/assets/index-72-j0sA5.js +129 -0
- package/workframe-ui/public/assets/index-auJ0bLMU.css +1 -0
- package/workframe-ui/public/assets/{info-J43DQDTF-Bb_wZTxU.js → info-J43DQDTF-oV4b3M4f.js} +1 -1
- package/workframe-ui/public/assets/{infoDiagram-5YYISTIA-601evYFV.js → infoDiagram-5YYISTIA-CthN4b6o.js} +1 -1
- package/workframe-ui/public/assets/{ishikawaDiagram-YF4QCWOH-BYtF-wHm.js → ishikawaDiagram-YF4QCWOH-oEGS3TKg.js} +1 -1
- package/workframe-ui/public/assets/{journeyDiagram-JHISSGLW-BMizyHzC.js → journeyDiagram-JHISSGLW-CXJsWmKF.js} +1 -1
- package/workframe-ui/public/assets/{kanban-definition-UN3LZRKU-CLLJsdnh.js → kanban-definition-UN3LZRKU-DTPo8yHW.js} +1 -1
- package/workframe-ui/public/assets/{line-BFiSvu-q.js → line-Bm9Pmcnz.js} +1 -1
- package/workframe-ui/public/assets/{linear-D6HYZ18_.js → linear-Cn-uD6eX.js} +1 -1
- package/workframe-ui/public/assets/{mermaid-parser.core-Cid5yDBQ.js → mermaid-parser.core-BBVSTQZ4.js} +2 -2
- package/workframe-ui/public/assets/{mermaid.core-DqIiju5Z.js → mermaid.core-DE668nUy.js} +3 -3
- package/workframe-ui/public/assets/{mindmap-definition-RKZ34NQL-Bg7xJdsz.js → mindmap-definition-RKZ34NQL-4qVsiwCf.js} +1 -1
- package/workframe-ui/public/assets/{packet-YPE3B663-1ebGt86D.js → packet-YPE3B663-CqJeoiFG.js} +1 -1
- package/workframe-ui/public/assets/{pie-LRSECV5Y-DJ9wOBC_.js → pie-LRSECV5Y-DcOqVssg.js} +1 -1
- package/workframe-ui/public/assets/{pieDiagram-4H26LBE5-BmK96Aus.js → pieDiagram-4H26LBE5-CosMnpAM.js} +1 -1
- package/workframe-ui/public/assets/{quadrantDiagram-W4KKPZXB-ByUqtWPZ.js → quadrantDiagram-W4KKPZXB-DtsnIK98.js} +1 -1
- package/workframe-ui/public/assets/{radar-GUYGQ44K-DN-Hkt96.js → radar-GUYGQ44K-BqLpJuWc.js} +1 -1
- package/workframe-ui/public/assets/{requirementDiagram-4Y6WPE33-ByU2r8gb.js → requirementDiagram-4Y6WPE33-Pb7cuX8_.js} +1 -1
- package/workframe-ui/public/assets/{sankeyDiagram-5OEKKPKP-elyWa0GK.js → sankeyDiagram-5OEKKPKP-BJBlMM1m.js} +1 -1
- package/workframe-ui/public/assets/{sequenceDiagram-3UESZ5HK-CzZwsAiK.js → sequenceDiagram-3UESZ5HK-i4HnjP39.js} +1 -1
- package/workframe-ui/public/assets/{src-5vgsM_dl.js → src-DIhmc_XG.js} +1 -1
- package/workframe-ui/public/assets/{stateDiagram-AJRCARHV-B0O5w5lJ.js → stateDiagram-AJRCARHV-Ba2iClPT.js} +1 -1
- package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-aUpqRAhy.js +1 -0
- package/workframe-ui/public/assets/{timeline-definition-PNZ67QCA-oyqa5w5y.js → timeline-definition-PNZ67QCA-CL4X9vSF.js} +1 -1
- package/workframe-ui/public/assets/{treeView-BLDUP644-MCV12-eP.js → treeView-BLDUP644-BJrjnbMj.js} +1 -1
- package/workframe-ui/public/assets/{treemap-LRROVOQU-DiA1P9n5.js → treemap-LRROVOQU-CN6H54RF.js} +1 -1
- package/workframe-ui/public/assets/{vennDiagram-CIIHVFJN-CO_4x7OR.js → vennDiagram-CIIHVFJN-Cee6sbUy.js} +1 -1
- package/workframe-ui/public/assets/{wardley-L42UT6IY-CmQNv6Xv.js → wardley-L42UT6IY-D0cXq60c.js} +1 -1
- package/workframe-ui/public/assets/{wardleyDiagram-YWT4CUSO-CJxDkbIj.js → wardleyDiagram-YWT4CUSO-CaH9XkCx.js} +1 -1
- package/workframe-ui/public/assets/{xychartDiagram-2RQKCTM6-B02MxgzG.js → xychartDiagram-2RQKCTM6-BEisgFoI.js} +1 -1
- package/workframe-ui/public/favicon.svg +7 -7
- package/workframe-ui/public/icons.svg +24 -24
- package/workframe-ui/public/index.html +47 -47
- package/workframe-ui/public/manifest.webmanifest +18 -18
- package/workframe-ui/public/workframe-config.json +3 -3
- package/workframe-ui/public/assets/architecture-7EHR7CIX-CFhr7xAe.js +0 -1
- package/workframe-ui/public/assets/channel-Dok_-T0o.js +0 -1
- package/workframe-ui/public/assets/chunk-QZHKN3VN-C3wwLrTa.js +0 -1
- package/workframe-ui/public/assets/chunk-WU5MYG2G-GFFSg2kf.js +0 -1
- package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-DKbGfT5Z.js +0 -1
- package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-DKbGfT5Z.js +0 -1
- package/workframe-ui/public/assets/eventmodeling-FCH6USID-C_PrceHe.js +0 -1
- package/workframe-ui/public/assets/index-DyO6K0TD.css +0 -1
- package/workframe-ui/public/assets/index-yvpSUs8T.js +0 -133
- 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
|