create-workframe 0.1.0
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 -0
- package/.gitignore +73 -0
- package/LICENSE +201 -0
- package/NOTICE +12 -0
- package/README.md +111 -0
- package/SECURITY.md +40 -0
- package/bin/create-workframe.js +2814 -0
- package/bin/workframe.js +329 -0
- package/docs/workspace-instructions/WORKFRAME_DISCORD.md +20 -0
- package/docs/workspace-instructions/WORKFRAME_DOCUMENTS_AND_ARTIFACTS.md +20 -0
- package/docs/workspace-instructions/WORKFRAME_KANBAN.md +20 -0
- package/docs/workspace-instructions/WORKFRAME_ONBOARDING.md +21 -0
- package/docs/workspace-instructions/WORKFRAME_ROUTING.md +29 -0
- package/docs/workspace-instructions/WORKFRAME_TELEGRAM.md +19 -0
- package/package.json +67 -0
- package/profiles/README.md +15 -0
- package/profiles/architect/AGENTS.md +29 -0
- package/profiles/architect/SOUL.md +44 -0
- package/profiles/architect/skills/devops/kanban-worker/SKILL.md +27 -0
- package/profiles/designer/AGENTS.md +26 -0
- package/profiles/designer/SOUL.md +31 -0
- package/profiles/designer/skills/devops/kanban-worker/SKILL.md +27 -0
- package/profiles/dev/AGENTS.md +28 -0
- package/profiles/dev/SOUL.md +31 -0
- package/profiles/dev/skills/devops/kanban-worker/SKILL.md +27 -0
- package/profiles/docs/AGENTS.md +27 -0
- package/profiles/docs/SOUL.md +30 -0
- package/profiles/docs/skills/devops/kanban-worker/SKILL.md +27 -0
- package/profiles/research/AGENTS.md +26 -0
- package/profiles/research/SOUL.md +31 -0
- package/profiles/research/skills/devops/kanban-worker/SKILL.md +27 -0
- package/profiles/visionary/AGENTS.md +25 -0
- package/profiles/visionary/SOUL.md +31 -0
- package/profiles/visionary/skills/devops/kanban-worker/SKILL.md +27 -0
- package/profiles/workframe-agent/AGENTS.md +37 -0
- package/profiles/workframe-agent/SETUP.md +185 -0
- package/profiles/workframe-agent/SOUL.md +61 -0
- package/profiles/workframe-agent/skills/devops/botfather/SKILL.md +85 -0
- package/profiles/workframe-agent/skills/devops/kanban-handoff-pattern/SKILL.md +58 -0
- package/profiles/workframe-agent/skills/devops/workframe-cohort/SKILL.md +54 -0
- package/prompts/WORKFRAME_PROMPT_TEMPLATES.md +16 -0
- package/rules/.hermes.md +11 -0
- package/rules/AGENTS.md +22 -0
- package/rules/workspace-README.md +5 -0
- package/scripts/apply-update-hermes.sh +17 -0
- package/scripts/apply-update-workframe.sh +77 -0
- package/scripts/bootstrap-workspace-link.sh +8 -0
- package/scripts/bundle-workframe-ui.mjs +77 -0
- package/scripts/compose-docker-host.sh +37 -0
- package/scripts/create_workframe_scaffold.py +648 -0
- package/scripts/ensure-compose-host-paths.mjs +51 -0
- package/scripts/fix-zk-encryption-key.sh +35 -0
- package/scripts/lib/install-identity.mjs +212 -0
- package/scripts/lib/workframe-registry.mjs +290 -0
- package/scripts/new-project.mjs +68 -0
- package/scripts/restart-gateway-hermes.sh +12 -0
- package/scripts/security_audit.py +156 -0
- package/scripts/select_agent_pack.py +31 -0
- package/scripts/set-compose-public-url.mjs +92 -0
- package/scripts/setup-stack-secrets.sh +50 -0
- package/scripts/sync-canonical-to-package.mjs +146 -0
- package/scripts/test-scaffold.mjs +390 -0
- package/scripts/verify-public-deploy.sh +105 -0
- package/shared/WORKFRAME_AGENT_LIBRARY.md +31 -0
- package/shared/WORKFRAME_AGENT_OPERATIONS.md +29 -0
- package/shared/WORKFRAME_AGENT_PACKS.json +64 -0
- package/shared/WORKFRAME_AGENT_PACKS.yaml +20 -0
- package/shared/WORKFRAME_CHAT_PERMISSION_MODEL.md +20 -0
- package/shared/WORKFRAME_HANDOFF_SCHEMA.md +25 -0
- package/shared/WORKFRAME_SKILL_CURATION.md +27 -0
- package/shared/agent-avatars/ada.png +0 -0
- package/shared/agent-avatars/aibert.png +0 -0
- package/shared/agent-avatars/amelia.png +0 -0
- package/shared/agent-avatars/andy.png +0 -0
- package/shared/agent-avatars/arc.png +0 -0
- package/shared/agent-avatars/bob.png +0 -0
- package/shared/agent-avatars/buzz.png +0 -0
- package/shared/agent-avatars/carl.png +0 -0
- package/shared/agent-avatars/catalog.json +171 -0
- package/shared/agent-avatars/corbu.png +0 -0
- package/shared/agent-avatars/diana.png +0 -0
- package/shared/agent-avatars/ella.png +0 -0
- package/shared/agent-avatars/elvis.png +0 -0
- package/shared/agent-avatars/f1.png +0 -0
- package/shared/agent-avatars/f2.png +0 -0
- package/shared/agent-avatars/f3.png +0 -0
- package/shared/agent-avatars/f4.png +0 -0
- package/shared/agent-avatars/f5.png +0 -0
- package/shared/agent-avatars/f6.png +0 -0
- package/shared/agent-avatars/frida.png +0 -0
- package/shared/agent-avatars/george.png +0 -0
- package/shared/agent-avatars/grace.png +0 -0
- package/shared/agent-avatars/hedy.png +0 -0
- package/shared/agent-avatars/hermes.png +0 -0
- package/shared/agent-avatars/isaac.png +0 -0
- package/shared/agent-avatars/jes.png +0 -0
- package/shared/agent-avatars/john.png +0 -0
- package/shared/agent-avatars/joni.png +0 -0
- package/shared/agent-avatars/leo.png +0 -0
- package/shared/agent-avatars/louis.png +0 -0
- package/shared/agent-avatars/ludwig.png +0 -0
- package/shared/agent-avatars/m1.png +0 -0
- package/shared/agent-avatars/m2.png +0 -0
- package/shared/agent-avatars/m3.png +0 -0
- package/shared/agent-avatars/m4.png +0 -0
- package/shared/agent-avatars/m5.png +0 -0
- package/shared/agent-avatars/m6.png +0 -0
- package/shared/agent-avatars/marie.png +0 -0
- package/shared/agent-avatars/marilyn.png +0 -0
- package/shared/agent-avatars/neil.png +0 -0
- package/shared/agent-avatars/nikola.png +0 -0
- package/shared/agent-avatars/nina.png +0 -0
- package/shared/agent-avatars/paul.png +0 -0
- package/shared/agent-avatars/ringo.png +0 -0
- package/shared/agent-avatars/rosie.png +0 -0
- package/shared/agent-avatars/ste.png +0 -0
- package/shared/agent-avatars/steve.png +0 -0
- package/shared/agent-avatars/sun.png +0 -0
- package/shared/agent-avatars/tom.png +0 -0
- package/shared/agent-avatars/warren.png +0 -0
- package/shared/agent-avatars/woz.png +0 -0
- package/shared/agent-avatars/zaha.png +0 -0
- package/workframe-api/Dockerfile +14 -0
- package/workframe-api/README.md +28 -0
- package/workframe-api/action_proxy.py +131 -0
- package/workframe-api/auth_rate_limit.py +49 -0
- package/workframe-api/catalog/avatar-catalog.json +171 -0
- package/workframe-api/catalog/logo-catalog.json +86 -0
- package/workframe-api/catalog/user-avatar-catalog.json +171 -0
- package/workframe-api/credential_vault.py +445 -0
- package/workframe-api/data/.gitkeep +0 -0
- package/workframe-api/data/avatar-catalog.json +41 -0
- package/workframe-api/data/logo-catalog.json +14 -0
- package/workframe-api/data/user-avatar-catalog.json +18 -0
- package/workframe-api/email_sender.py +220 -0
- package/workframe-api/google_auth.py +90 -0
- package/workframe-api/install_api.py +359 -0
- package/workframe-api/internal_proxy_auth.py +150 -0
- package/workframe-api/llm_proxy.py +277 -0
- package/workframe-api/oidc_jwt.py +108 -0
- package/workframe-api/package.json +13 -0
- package/workframe-api/platform_auth.py +194 -0
- package/workframe-api/profile_secret_policy.py +86 -0
- package/workframe-api/public/assets/index-DPXu_lGn.css +1 -0
- package/workframe-api/public/assets/index-DYnLrCZZ.js +9 -0
- package/workframe-api/public/assets/index-DglUqFB_.js +9 -0
- package/workframe-api/public/index.html +12 -0
- package/workframe-api/requirements.txt +2 -0
- package/workframe-api/server.py +19646 -0
- package/workframe-api/site_meta.py +271 -0
- package/workframe-api/stack_config.py +427 -0
- package/workframe-api/tests/__init__.py +0 -0
- package/workframe-api/tests/db_setup.py +13 -0
- package/workframe-api/tests/test_admin_updates_gated.py +30 -0
- package/workframe-api/tests/test_agent_dm_bootstrap.py +196 -0
- package/workframe-api/tests/test_agent_profile_sync.py +76 -0
- package/workframe-api/tests/test_auth_email.py +222 -0
- package/workframe-api/tests/test_auth_hole_fix_selfcheck.py +99 -0
- package/workframe-api/tests/test_auth_rate_limit.py +19 -0
- package/workframe-api/tests/test_avatar_resolve.py +77 -0
- package/workframe-api/tests/test_child_soul_template.py +71 -0
- package/workframe-api/tests/test_credential_canary.py +135 -0
- package/workframe-api/tests/test_credential_isolation.py +448 -0
- package/workframe-api/tests/test_credential_resolution.py +206 -0
- package/workframe-api/tests/test_device_oauth.py +108 -0
- package/workframe-api/tests/test_doctor_repair.py +103 -0
- package/workframe-api/tests/test_ensure_profile_api.py +77 -0
- package/workframe-api/tests/test_gateway_compose_security.py +136 -0
- package/workframe-api/tests/test_install_secure_host.py +39 -0
- package/workframe-api/tests/test_internal_proxy_auth.py +125 -0
- package/workframe-api/tests/test_invite_runtime_bootstrap.py +72 -0
- package/workframe-api/tests/test_kanban_delegation.py +185 -0
- package/workframe-api/tests/test_llm_proxy.py +155 -0
- package/workframe-api/tests/test_login_access_policy.py +183 -0
- package/workframe-api/tests/test_mvp_model_bootstrap.py +75 -0
- package/workframe-api/tests/test_onboarding_bootstrap.py +248 -0
- package/workframe-api/tests/test_platform_auth.py +47 -0
- package/workframe-api/tests/test_profile_config_path.py +56 -0
- package/workframe-api/tests/test_profile_config_yaml_repair.py +63 -0
- package/workframe-api/tests/test_profile_create.py +72 -0
- package/workframe-api/tests/test_profile_identity_overlay.py +61 -0
- package/workframe-api/tests/test_profile_install_health.py +45 -0
- package/workframe-api/tests/test_profile_secret_policy.py +57 -0
- package/workframe-api/tests/test_profile_workspace_cwd.py +34 -0
- package/workframe-api/tests/test_provider_bootstrap.py +75 -0
- package/workframe-api/tests/test_provider_connect.py +54 -0
- package/workframe-api/tests/test_room_crud.py +192 -0
- package/workframe-api/tests/test_room_tenancy.py +701 -0
- package/workframe-api/tests/test_runtime_identity_backfill.py +34 -0
- package/workframe-api/tests/test_site_meta.py +81 -0
- package/workframe-api/tests/test_soul_stub.py +42 -0
- package/workframe-api/tests/test_space_member_sync.py +99 -0
- package/workframe-api/tests/test_stripe_stack_config.py +37 -0
- package/workframe-api/tests/test_supervisor_lifecycle.py +52 -0
- package/workframe-api/tests/test_turn_credential_vault.py +125 -0
- package/workframe-api/tests/test_updates.py +176 -0
- package/workframe-api/tests/test_user_cohort.py +113 -0
- package/workframe-api/tests/test_vault_envelope.py +110 -0
- package/workframe-api/tests/test_workspace_members.py +183 -0
- package/workframe-api/tests/test_workspace_messaging_sync.py +125 -0
- package/workframe-api/tests/test_workspace_provider_list.py +57 -0
- package/workframe-api/time-bind-chat.py +99 -0
- package/workframe-api/turn_credentials.py +226 -0
- package/workframe-api/updates.py +417 -0
- package/workframe-api/vault_kek.py +159 -0
- package/workframe-api/zk_auth.py +633 -0
- package/workframe-supervisor/Dockerfile +11 -0
- package/workframe-supervisor/profile_secret_policy.py +76 -0
- package/workframe-supervisor/server.py +787 -0
- package/workframe-supervisor/tests/test_exec_guard.py +42 -0
- package/workframe-supervisor/tests/test_server_import.py +21 -0
- package/workframe-ui/docker/nginx.conf +85 -0
- package/workframe-ui/public/assets/1-DLJbBkOb.png +0 -0
- package/workframe-ui/public/assets/10-uwRwj5ce.png +0 -0
- package/workframe-ui/public/assets/11-5OuV9F_e.png +0 -0
- package/workframe-ui/public/assets/12-u_axjxW-.png +0 -0
- package/workframe-ui/public/assets/13-ldSvcMsH.png +0 -0
- package/workframe-ui/public/assets/14-xdcALEYD.png +0 -0
- package/workframe-ui/public/assets/15-aZ4snEFB.png +0 -0
- package/workframe-ui/public/assets/16-L_5-DttY.png +0 -0
- package/workframe-ui/public/assets/2-zOPZTppD.png +0 -0
- package/workframe-ui/public/assets/3-Dc3WoVu5.png +0 -0
- package/workframe-ui/public/assets/4-C50hk7_m.png +0 -0
- package/workframe-ui/public/assets/5-Eweetkq4.png +0 -0
- package/workframe-ui/public/assets/6-5sOXgfkw.png +0 -0
- package/workframe-ui/public/assets/7-BqRBCbiC.png +0 -0
- package/workframe-ui/public/assets/8-DEDKS94h.png +0 -0
- package/workframe-ui/public/assets/9-DNj34GW-.png +0 -0
- package/workframe-ui/public/assets/ada-DsvuOc9n.png +0 -0
- package/workframe-ui/public/assets/aibert-BCz8Lo8H.png +0 -0
- package/workframe-ui/public/assets/amelia-DUf3EBGu.png +0 -0
- package/workframe-ui/public/assets/andy-Cpymuhhx.png +0 -0
- package/workframe-ui/public/assets/arc-CBDYvkAF.js +1 -0
- package/workframe-ui/public/assets/architecture-7EHR7CIX-CtbQKTuT.js +1 -0
- package/workframe-ui/public/assets/architectureDiagram-3BPJPVTR-XnBRKeW0.js +36 -0
- package/workframe-ui/public/assets/array-BifhSqXX.js +1 -0
- package/workframe-ui/public/assets/avatars/ada.png +0 -0
- package/workframe-ui/public/assets/avatars/aibert.png +0 -0
- package/workframe-ui/public/assets/avatars/amelia.png +0 -0
- package/workframe-ui/public/assets/avatars/andy.png +0 -0
- package/workframe-ui/public/assets/avatars/bob.png +0 -0
- package/workframe-ui/public/assets/avatars/buzz.png +0 -0
- package/workframe-ui/public/assets/avatars/carl.png +0 -0
- package/workframe-ui/public/assets/avatars/catalog.json +171 -0
- package/workframe-ui/public/assets/avatars/corbu.png +0 -0
- package/workframe-ui/public/assets/avatars/diana.png +0 -0
- package/workframe-ui/public/assets/avatars/elvis.png +0 -0
- package/workframe-ui/public/assets/avatars/frida.png +0 -0
- package/workframe-ui/public/assets/avatars/george.png +0 -0
- package/workframe-ui/public/assets/avatars/grace.png +0 -0
- package/workframe-ui/public/assets/avatars/hedy.png +0 -0
- package/workframe-ui/public/assets/avatars/hermes.png +0 -0
- package/workframe-ui/public/assets/avatars/isaac.png +0 -0
- package/workframe-ui/public/assets/avatars/john.png +0 -0
- package/workframe-ui/public/assets/avatars/joni.png +0 -0
- package/workframe-ui/public/assets/avatars/leo.png +0 -0
- package/workframe-ui/public/assets/avatars/louis.png +0 -0
- package/workframe-ui/public/assets/avatars/ludwig.png +0 -0
- package/workframe-ui/public/assets/avatars/marie.png +0 -0
- package/workframe-ui/public/assets/avatars/marilyn.png +0 -0
- package/workframe-ui/public/assets/avatars/nikola.png +0 -0
- package/workframe-ui/public/assets/avatars/nina.png +0 -0
- package/workframe-ui/public/assets/avatars/paul.png +0 -0
- package/workframe-ui/public/assets/avatars/ringo.png +0 -0
- package/workframe-ui/public/assets/avatars/rosie.png +0 -0
- package/workframe-ui/public/assets/avatars/steve.png +0 -0
- package/workframe-ui/public/assets/avatars/sun.png +0 -0
- package/workframe-ui/public/assets/avatars/warren.png +0 -0
- package/workframe-ui/public/assets/avatars/woz.png +0 -0
- package/workframe-ui/public/assets/avatars/zaha.png +0 -0
- package/workframe-ui/public/assets/blockDiagram-GPEHLZMM-VYHUfVhd.js +132 -0
- package/workframe-ui/public/assets/bob-DRz-48Id.png +0 -0
- package/workframe-ui/public/assets/branding/banner.png +0 -0
- package/workframe-ui/public/assets/branding/og-default.png +0 -0
- package/workframe-ui/public/assets/branding/workframe'white.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-1.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-2.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-3.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-4.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-5.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-banner.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-logo-horizontal-mini.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-logo-horizontal-nano.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-logo-horizontal.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-logo-vertical-alt.png +0 -0
- package/workframe-ui/public/assets/branding/workframe-logo-vertical.png +0 -0
- package/workframe-ui/public/assets/branding/workframe.png +0 -0
- package/workframe-ui/public/assets/buzz-mC4PtMvC.png +0 -0
- package/workframe-ui/public/assets/c4Diagram-AAUBKEIU-BTjUcJpm.js +10 -0
- package/workframe-ui/public/assets/carl-CtE74db_.png +0 -0
- package/workframe-ui/public/assets/channel-Dy4Z4-jn.js +1 -0
- package/workframe-ui/public/assets/chunk-2J33WTMH-w7uu7R-b.js +1 -0
- package/workframe-ui/public/assets/chunk-3OPIFGDE-Cb9LtnDX.js +62 -0
- package/workframe-ui/public/assets/chunk-4BX2VUAB-DiQ-qCwH.js +1 -0
- package/workframe-ui/public/assets/chunk-55IACEB6-C-mLFr7z.js +1 -0
- package/workframe-ui/public/assets/chunk-5ZQYHXKU-DOesfiCI.js +2 -0
- package/workframe-ui/public/assets/chunk-727SXJPM-BJ3oBZuz.js +206 -0
- package/workframe-ui/public/assets/chunk-AQP2D5EJ-CCA6xpGs.js +231 -0
- package/workframe-ui/public/assets/chunk-BSJP7CBP-a0cMNFb2.js +1 -0
- package/workframe-ui/public/assets/chunk-CSCIHK7Q-kuqN8EIY.js +122 -0
- package/workframe-ui/public/assets/chunk-FMBD7UC4-DyPgYHCg.js +15 -0
- package/workframe-ui/public/assets/chunk-KSCS5N6A-CdUuvR0V.js +10 -0
- package/workframe-ui/public/assets/chunk-L5ZTLDWV-Dq9NoWmK.js +1 -0
- package/workframe-ui/public/assets/chunk-LZXEDZCA-p74rddlO.js +2 -0
- package/workframe-ui/public/assets/chunk-ND2GUHAM-DBD2u1Gz.js +1 -0
- package/workframe-ui/public/assets/chunk-NNHCCRGN-DlpIbxXb.js +159 -0
- package/workframe-ui/public/assets/chunk-NZK2D7GU-BeIeYFnd.js +1 -0
- package/workframe-ui/public/assets/chunk-O5CBEL6O-ClHc56ib.js +70 -0
- package/workframe-ui/public/assets/chunk-QZHKN3VN-CtBEchFK.js +1 -0
- package/workframe-ui/public/assets/chunk-WU5MYG2G-B9pBtriN.js +1 -0
- package/workframe-ui/public/assets/chunk-XPW4576I-EFr8R_1p.js +32 -0
- package/workframe-ui/public/assets/classDiagram-4FO5ZUOK-BMAEA8jI.js +1 -0
- package/workframe-ui/public/assets/classDiagram-v2-Q7XG4LA2-BMAEA8jI.js +1 -0
- package/workframe-ui/public/assets/corbu-KiaMXzXQ.png +0 -0
- package/workframe-ui/public/assets/cose-bilkent-S5V4N54A-C7aPBODd.js +1 -0
- package/workframe-ui/public/assets/cytoscape.esm-h6BdjjI9.js +321 -0
- package/workframe-ui/public/assets/dagre-BM42HDAG-BdU1Rv-H.js +4 -0
- package/workframe-ui/public/assets/dagre-Bx709z4p.js +1 -0
- package/workframe-ui/public/assets/defaultLocale-C8Fc0cco.js +1 -0
- package/workframe-ui/public/assets/diagram-2AECGRRQ-DWowSo85.js +43 -0
- package/workframe-ui/public/assets/diagram-5GNKFQAL-MnxBbceO.js +10 -0
- package/workframe-ui/public/assets/diagram-KO2AKTUF-DQaLRXFf.js +3 -0
- package/workframe-ui/public/assets/diagram-LMA3HP47-CQaBud9k.js +24 -0
- package/workframe-ui/public/assets/diagram-OG6HWLK6-D8bAXbY9.js +24 -0
- package/workframe-ui/public/assets/diana-DW0MsL38.png +0 -0
- package/workframe-ui/public/assets/dist-DGpTLHr_.js +1 -0
- package/workframe-ui/public/assets/elvis-LCFaZIcT.png +0 -0
- package/workframe-ui/public/assets/erDiagram-TEJ5UH35-1E-xSvBK.js +85 -0
- package/workframe-ui/public/assets/eventmodeling-FCH6USID-D75cstNT.js +1 -0
- package/workframe-ui/public/assets/flowDiagram-I6XJVG4X-CgOVD5hu.js +162 -0
- package/workframe-ui/public/assets/frida-CXFA0w3F.png +0 -0
- package/workframe-ui/public/assets/ganttDiagram-6RSMTGT7-JFYAIauo.js +292 -0
- package/workframe-ui/public/assets/george-DBSH2Sm2.png +0 -0
- package/workframe-ui/public/assets/gitGraph-WXDBUCRP-B9REenIl.js +1 -0
- package/workframe-ui/public/assets/gitGraphDiagram-PVQCEYII-BQ7NcMSn.js +106 -0
- package/workframe-ui/public/assets/grace-BhV0UPc0.png +0 -0
- package/workframe-ui/public/assets/graphlib-B8gBHxth.js +1 -0
- package/workframe-ui/public/assets/hedy-BR2IHift.png +0 -0
- package/workframe-ui/public/assets/hermes-CqCzcE0y.png +0 -0
- package/workframe-ui/public/assets/index-Dnw6vjqb.js +133 -0
- package/workframe-ui/public/assets/index-DpAGxump.css +1 -0
- package/workframe-ui/public/assets/info-J43DQDTF-CL6-eTjH.js +1 -0
- package/workframe-ui/public/assets/infoDiagram-5YYISTIA-LJTODW4W.js +2 -0
- package/workframe-ui/public/assets/init-D6jRqBbL.js +1 -0
- package/workframe-ui/public/assets/isaac-D1nhJAuv.png +0 -0
- package/workframe-ui/public/assets/ishikawaDiagram-YF4QCWOH-bchrQVuo.js +70 -0
- package/workframe-ui/public/assets/john-zSPWwNi4.png +0 -0
- package/workframe-ui/public/assets/joni-BFLoyfJP.png +0 -0
- package/workframe-ui/public/assets/journeyDiagram-JHISSGLW-DkrvYuxP.js +139 -0
- package/workframe-ui/public/assets/kanban-definition-UN3LZRKU-DFRbj0IG.js +89 -0
- package/workframe-ui/public/assets/katex-Vhh-h91d.js +257 -0
- package/workframe-ui/public/assets/leo-C_3IOL11.png +0 -0
- package/workframe-ui/public/assets/line-Vd48P7-O.js +1 -0
- package/workframe-ui/public/assets/linear-Ckizh2G7.js +1 -0
- package/workframe-ui/public/assets/louis-DEEECFSX.png +0 -0
- package/workframe-ui/public/assets/ludwig-_hoKhhyK.png +0 -0
- package/workframe-ui/public/assets/marie-DET6MsfO.png +0 -0
- package/workframe-ui/public/assets/marilyn-DTqwt8Yh.png +0 -0
- package/workframe-ui/public/assets/mermaid-parser.core-Bkimsnqj.js +4 -0
- package/workframe-ui/public/assets/mermaid.core-x0TvVuPo.js +9 -0
- package/workframe-ui/public/assets/mindmap-definition-RKZ34NQL-6ykAFPEz.js +96 -0
- package/workframe-ui/public/assets/nikola-B4PtHrJv.png +0 -0
- package/workframe-ui/public/assets/nina-BYbrOn0d.png +0 -0
- package/workframe-ui/public/assets/ordinal-hYBb2elL.js +1 -0
- package/workframe-ui/public/assets/packet-YPE3B663-Dw3xgMDt.js +1 -0
- package/workframe-ui/public/assets/path-BWPyau1x.js +1 -0
- package/workframe-ui/public/assets/paul-CGURYQIn.png +0 -0
- package/workframe-ui/public/assets/pie-LRSECV5Y-DATysawG.js +1 -0
- package/workframe-ui/public/assets/pieDiagram-4H26LBE5-SJKD1S0S.js +30 -0
- package/workframe-ui/public/assets/project-logos/1.png +0 -0
- package/workframe-ui/public/assets/project-logos/10.png +0 -0
- package/workframe-ui/public/assets/project-logos/11.png +0 -0
- package/workframe-ui/public/assets/project-logos/12.png +0 -0
- package/workframe-ui/public/assets/project-logos/13.png +0 -0
- package/workframe-ui/public/assets/project-logos/14.png +0 -0
- package/workframe-ui/public/assets/project-logos/15.png +0 -0
- package/workframe-ui/public/assets/project-logos/16.png +0 -0
- package/workframe-ui/public/assets/project-logos/2.png +0 -0
- package/workframe-ui/public/assets/project-logos/3.png +0 -0
- package/workframe-ui/public/assets/project-logos/4.png +0 -0
- package/workframe-ui/public/assets/project-logos/5.png +0 -0
- package/workframe-ui/public/assets/project-logos/6.png +0 -0
- package/workframe-ui/public/assets/project-logos/7.png +0 -0
- package/workframe-ui/public/assets/project-logos/8.png +0 -0
- package/workframe-ui/public/assets/project-logos/9.png +0 -0
- package/workframe-ui/public/assets/project-logos/catalog.json +86 -0
- package/workframe-ui/public/assets/quadrantDiagram-W4KKPZXB-BrYDZX8q.js +7 -0
- package/workframe-ui/public/assets/radar-GUYGQ44K-BmWYPCds.js +1 -0
- package/workframe-ui/public/assets/requirementDiagram-4Y6WPE33-DwL9Mc8e.js +84 -0
- package/workframe-ui/public/assets/ringo-WhfUNOyY.png +0 -0
- package/workframe-ui/public/assets/rosie-CAtcIf87.png +0 -0
- package/workframe-ui/public/assets/rough.esm-CSKSodPl.js +1 -0
- package/workframe-ui/public/assets/sankeyDiagram-5OEKKPKP-DYIFsL8h.js +40 -0
- package/workframe-ui/public/assets/sequenceDiagram-3UESZ5HK-0-FPkFk8.js +162 -0
- package/workframe-ui/public/assets/src-B_od6b6h.js +1 -0
- package/workframe-ui/public/assets/stateDiagram-AJRCARHV-BQCiBk6u.js +1 -0
- package/workframe-ui/public/assets/stateDiagram-v2-BHNVJYJU-B89jAMFF.js +1 -0
- package/workframe-ui/public/assets/steve-CgXXJ9EZ.png +0 -0
- package/workframe-ui/public/assets/sun-BLNAhoZd.png +0 -0
- package/workframe-ui/public/assets/timeline-definition-PNZ67QCA-DS3tFcXj.js +120 -0
- package/workframe-ui/public/assets/treeView-BLDUP644-DSyUCKLY.js +1 -0
- package/workframe-ui/public/assets/treemap-LRROVOQU-CEZaNh5Y.js +1 -0
- package/workframe-ui/public/assets/vennDiagram-CIIHVFJN-CD-Vc9NF.js +34 -0
- package/workframe-ui/public/assets/wardley-L42UT6IY-Drq5w1Mc.js +1 -0
- package/workframe-ui/public/assets/wardleyDiagram-YWT4CUSO-DouXDJoF.js +78 -0
- package/workframe-ui/public/assets/warren-DIH7UKMY.png +0 -0
- package/workframe-ui/public/assets/woz-D2yleG-V.png +0 -0
- package/workframe-ui/public/assets/xychartDiagram-2RQKCTM6-DDf_Lol5.js +7 -0
- package/workframe-ui/public/assets/zaha-wersOEq9.png +0 -0
- package/workframe-ui/public/favicon.ico +0 -0
- package/workframe-ui/public/favicon.svg +7 -0
- package/workframe-ui/public/icons.svg +24 -0
- package/workframe-ui/public/index.html +50 -0
- package/workframe-ui/public/manifest.webmanifest +18 -0
- package/workframe-ui/public/workframe-config.json +4 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# {nativeAgentName}
|
|
2
|
+
|
|
3
|
+
## Identity (highest priority)
|
|
4
|
+
You are **{nativeAgentName}** — Workframe concierge for **{projectName}** (`{nativeProfileSlug}`). Your introduction name is **{nativeAgentName}**. When greeting or identifying yourself, always say "I am {nativeAgentName}" — never "I am OWL". OWL is your model, not your name. Never identify as the underlying model, provider, OWL, or a generic Hermes assistant.
|
|
5
|
+
|
|
6
|
+
If asked who you are, answer with your exact agent name and role only; never say you are OWL, Hermes Agent, or the underlying model/provider.
|
|
7
|
+
|
|
8
|
+
**Operating rules:** read `AGENTS.md` in this profile home for tools, skills, setup, and memory discipline.
|
|
9
|
+
|
|
10
|
+
**Setup gate:** Fresh install, incomplete crew, or user asks for config/crew/channels → read `/opt/data/profiles/{nativeProfileSlug}/SETUP.md` before replying; use its opening. If specialists are already installed and the user is on normal work, skip setup — a new chat session is not a new install.
|
|
11
|
+
|
|
12
|
+
## Layout
|
|
13
|
+
|
|
14
|
+
- `/workspace` (`Files/`) — project artifacts only
|
|
15
|
+
- `/opt/data` (`Agents/`) — profiles, SOUL, skills, secrets (not project source code)
|
|
16
|
+
- `/opt/install/scripts/` — Workframe lifecycle scripts + optional SOUL seeds (read-only mount of project `scripts/`)
|
|
17
|
+
|
|
18
|
+
## Job
|
|
19
|
+
|
|
20
|
+
Capture goal → **create or route to specialist agents** → persist in `/workspace`. Kanban for durable multi-step work. Handoff: files changed, next action, blockers.
|
|
21
|
+
|
|
22
|
+
## Cohort & orchestration (read every session)
|
|
23
|
+
|
|
24
|
+
1. Read **`WORKFRAME_COHORT.md`** in your profile home — it lists your user's runtime agents, kanban assignee slugs, and aliases (e.g. `fab-architect`).
|
|
25
|
+
2. Load skills **workframe-cohort** and **kanban-handoff-pattern** before kanban, cron, or `delegate_task`.
|
|
26
|
+
3. **Never** assign kanban/cron/delegation to bare template slugs (`architect`, `dev`). Always use **runtime_slug** from the cohort table — templates lack the user's API keys.
|
|
27
|
+
4. Valid kanban `workspace_kind`: `scratch`, `dir:/absolute/path`, `worktree` — not `project`.
|
|
28
|
+
5. Hermes CLI: `/opt/hermes/.venv/bin/hermes -p <your-runtime-slug> …` · use **terminal**, not `execute_code`, for CLI.
|
|
29
|
+
6. Only interact with agents in your cohort — never read other users' `u-*` profile secrets.
|
|
30
|
+
|
|
31
|
+
## Botfather (native-only)
|
|
32
|
+
|
|
33
|
+
You are the **Botfather** — the only agent that may create, configure, spawn, stop, or delete child agents. Load the **botfather** skill before any crew change.
|
|
34
|
+
|
|
35
|
+
**Child birth:** slug + role → draft **SOUL** (`--soul-text`, `--soul-file`, or `--from-seed`) → install **skills** (`--from-seed`, `--skills-from`, `--skills-dir`, or `add-skills`) → `create … --spawn` → verify with `get-config`.
|
|
36
|
+
|
|
37
|
+
| Intent | Tool |
|
|
38
|
+
|--------|------|
|
|
39
|
+
| New child | `create --slug … --display-name … --role … [--soul-text\|file] [--from-seed] [--skills-from …] --spawn` |
|
|
40
|
+
| Read config | `get-config --slug …` |
|
|
41
|
+
| Update config | `update-config --slug …` |
|
|
42
|
+
| Add skills | `add-skills --slug … --from-seed` or `--skills-from …` |
|
|
43
|
+
| Avatar | auto on create; `pick-avatar` / `set-avatar --avatar <id>` |
|
|
44
|
+
| Retire | `delete --slug …` (confirm first) |
|
|
45
|
+
|
|
46
|
+
**Host:** `node scripts/agent-lifecycle.mjs …` · **Docker:** `node /opt/install/scripts/agent-lifecycle.mjs …`
|
|
47
|
+
|
|
48
|
+
Child agents **must not** receive botfather skills or lifecycle scripts. Every child needs its own SOUL and task-appropriate skills under `Agents/profiles/<slug>/`.
|
|
49
|
+
|
|
50
|
+
## Workspace
|
|
51
|
+
|
|
52
|
+
Read `/workspace/AGENTS.md` and `/workspace/.hermes.md`. Workframe install doctrine lives under `/opt/data/profiles/`, not `/workspace/docs/`.
|
|
53
|
+
|
|
54
|
+
## Setup (Phase C)
|
|
55
|
+
|
|
56
|
+
Full playbook: `/opt/data/profiles/{nativeProfileSlug}/SETUP.md`. Concierge mode — one step at a time via lifecycle scripts, `docker compose`, and Hermes setup flows; never `./bin/hermes` on the host outside Docker. Non-secret IDs in chat OK; secrets only via `scripts/open-setup.*`. Workframe (method) ≠meta `Workframe/` repo ≠`{projectName}`.
|
|
57
|
+
|
|
58
|
+
## Policy
|
|
59
|
+
|
|
60
|
+
Short, action-first. Load **botfather** skill before creating or deleting agents. No secrets in chat. Confirm high-impact external actions and agent deletes first.
|
|
61
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: botfather
|
|
3
|
+
description: Native Workframe agent crew control — create/tune child agents via the BFF API. Child agents must never load this skill.
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
platforms: [linux, macos, windows]
|
|
6
|
+
metadata:
|
|
7
|
+
hermes:
|
|
8
|
+
tags: [workframe, botfather, crew, profiles, vault]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Botfather — Native Agent Crew Control
|
|
12
|
+
|
|
13
|
+
You are the **native Workframe agent** (concierge / botfather / PM). Only you orchestrate the crew. Child specialists cannot create agents or read the credential vault.
|
|
14
|
+
|
|
15
|
+
## Architecture (current — do not guess older models)
|
|
16
|
+
|
|
17
|
+
| Layer | What it is |
|
|
18
|
+
|---|---|
|
|
19
|
+
| **Template profile** | Shared Hermes profile (`architect`, `dev`, …) — identity, SOUL, skills |
|
|
20
|
+
| **Runtime profile** | Per-user chat profile `u-{user}-{template}` — this is what answers in DMs |
|
|
21
|
+
| **API vault** | Raw BYOK keys live in Workframe API storage — **never** in profile `config.yaml` or `.env` |
|
|
22
|
+
| **LLM access** | Runtime profiles call `/internal/llm/` with short-lived lease tokens per turn |
|
|
23
|
+
|
|
24
|
+
**Never** write `model.api_key`, provider secrets, or raw tokens into Hermes profile files. Users connect keys in Workframe UI (onboarding / Settings → Connect).
|
|
25
|
+
|
|
26
|
+
## Primary path — same as the UI
|
|
27
|
+
|
|
28
|
+
Create agents through the Workframe BFF (fastest, correct tenancy):
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
curl -s -X POST http://workframe-api:8080/api/hermes/profiles/create \
|
|
32
|
+
-H "Content-Type: application/json" \
|
|
33
|
+
-H "Cookie: <session>" \
|
|
34
|
+
-d '{
|
|
35
|
+
"name": "architect",
|
|
36
|
+
"display_name": "Architect",
|
|
37
|
+
"model": "openrouter/anthropic/claude-sonnet-4",
|
|
38
|
+
"workspace_id": "<workspace-uuid>"
|
|
39
|
+
}'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
This creates the template (if needed), provisions `u-{user}-architect`, sets the model on the **runtime**, opens a DM room, and binds a session.
|
|
43
|
+
|
|
44
|
+
Other BFF endpoints you may use (with user session):
|
|
45
|
+
|
|
46
|
+
| Intent | Endpoint |
|
|
47
|
+
|---|---|
|
|
48
|
+
| Bootstrap DM only | `POST /api/hermes/profiles/{template}/bootstrap-dm` |
|
|
49
|
+
| Delete child | `POST /api/hermes/profiles/delete` `{"profile":"slug"}` |
|
|
50
|
+
| Set SOUL | `POST /api/hermes/profiles/{slug}/soul` |
|
|
51
|
+
|
|
52
|
+
## Fallback — CLI inside gateway container
|
|
53
|
+
|
|
54
|
+
When the BFF is unreachable, use Hermes CLI for **child** profiles only (not native):
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
/opt/hermes/bin/hermes profile create --clone-from architect my-specialist
|
|
58
|
+
/opt/hermes/bin/hermes -p my-specialist gateway start
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Do **not** hand-edit `config.yaml` to embed API keys. Use Workframe Connect UI or `hermes setup` for provider auth that Hermes owns directly (Codex OAuth, etc.).
|
|
62
|
+
|
|
63
|
+
## `agent-lifecycle.mjs` (Docker-only fallback)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node /workspace/scripts/agent-lifecycle.mjs create --slug dev --from-seed --spawn
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Requires Docker on the host. Prefer the BFF path above when the API is up.
|
|
70
|
+
|
|
71
|
+
## Child birth checklist
|
|
72
|
+
|
|
73
|
+
1. Slug + display name + role
|
|
74
|
+
2. SOUL (purpose-specific — no empty shells)
|
|
75
|
+
3. Model (optional — MVP default applies; lands on **runtime**)
|
|
76
|
+
4. Skills (preset clone or `--clone-from`)
|
|
77
|
+
5. DM lane is auto-created by `profiles/create` — user lands in chat
|
|
78
|
+
|
|
79
|
+
## Rules
|
|
80
|
+
|
|
81
|
+
1. **Vault is off-limits** — no reading/exporting other users' or agents' keys
|
|
82
|
+
2. **Never delete native profile** (`workframe-agent`)
|
|
83
|
+
3. **Confirm** before destructive external actions
|
|
84
|
+
4. **Route work** to specialists — you orchestrate, not impersonate
|
|
85
|
+
5. Load this skill before crew changes
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kanban-handoff-pattern
|
|
3
|
+
description: Kanban task handoff from Workframe concierge to user-scoped specialist runtime profiles — workspace_kind, assignee slugs, worker protocol, failure modes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Kanban handoff pattern
|
|
7
|
+
|
|
8
|
+
**Prerequisite:** Read `WORKFRAME_COHORT.md` and use **runtime_slug** as `--assignee`, never bare template names (`architect`, `dev`).
|
|
9
|
+
|
|
10
|
+
## Kanban vs delegate_task
|
|
11
|
+
|
|
12
|
+
| Use kanban when | Use delegate_task when |
|
|
13
|
+
|-----------------|------------------------|
|
|
14
|
+
| Durable work, audit trail, human review | Quick parallel subtasks in one turn |
|
|
15
|
+
| Specialist may take minutes | Parent turn bounds the work |
|
|
16
|
+
|
|
17
|
+
## Create a task (CLI)
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
/opt/hermes/.venv/bin/hermes -p <your-runtime-slug> kanban create "Title" \
|
|
21
|
+
--assignee <specialist-runtime-slug-from-cohort> \
|
|
22
|
+
--workspace-kind scratch \
|
|
23
|
+
--body "Goal…\n\nOutput: /workspace/docs/…"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### workspace_kind (only these)
|
|
27
|
+
|
|
28
|
+
- `scratch` — default, isolated temp dir (safest)
|
|
29
|
+
- `dir:/absolute/path` — e.g. `dir:/workspace`
|
|
30
|
+
- `worktree` — git worktree
|
|
31
|
+
|
|
32
|
+
Using `project`, `repo`, or anything else → `spawn_failed: unknown workspace_kind`.
|
|
33
|
+
|
|
34
|
+
## Worker protocol (specialists)
|
|
35
|
+
|
|
36
|
+
1. `kanban_show` — orient
|
|
37
|
+
2. Do the work; write outputs to paths in task body
|
|
38
|
+
3. `kanban_comment` — handoff notes for reviewer
|
|
39
|
+
4. **`kanban_complete(summary=…)`** or **`kanban_block(reason=…)`** before exit
|
|
40
|
+
|
|
41
|
+
Clean exit without complete/block → protocol violation → auto-block after `failure_limit` (default 2).
|
|
42
|
+
|
|
43
|
+
## Failure modes
|
|
44
|
+
|
|
45
|
+
| Symptom | Cause | Fix |
|
|
46
|
+
|---------|-------|-----|
|
|
47
|
+
| empty API key | assignee is template slug, not runtime | cohort runtime_slug |
|
|
48
|
+
| unknown workspace_kind | invalid kind in DB/CLI | recreate with `scratch` |
|
|
49
|
+
| protocol violation | worker died without complete/block | fix credentials + skills |
|
|
50
|
+
| task blocked | failure_limit tripped | fix root cause, `kanban unblock` |
|
|
51
|
+
|
|
52
|
+
## Verify
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
/opt/hermes/.venv/bin/hermes -p <profile> kanban list
|
|
56
|
+
/opt/hermes/.venv/bin/hermes -p <profile> kanban show <task_id>
|
|
57
|
+
/opt/hermes/.venv/bin/hermes -p <profile> kanban log <task_id>
|
|
58
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workframe-cohort
|
|
3
|
+
description: Per-user Workframe agent cohort — runtime profile slugs, kanban assignees, credential boundaries, and orchestration rules for the concierge.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Workframe cohort (read first)
|
|
7
|
+
|
|
8
|
+
On every session start, read **`WORKFRAME_COHORT.md`** in your profile home (`/opt/data/profiles/<your-runtime-slug>/`). Workframe regenerates it when you bind a chat session.
|
|
9
|
+
|
|
10
|
+
## You are a per-user runtime instance
|
|
11
|
+
|
|
12
|
+
Your Hermes profile slug looks like `u-<user-part>-workframe-agent`. You are **not** the shared template `workframe-agent`. Introduce yourself using the display name from `WORKFRAME_COHORT.md` (e.g. "Fab's Workframe Agent").
|
|
13
|
+
|
|
14
|
+
## Specialists — always use runtime slugs
|
|
15
|
+
|
|
16
|
+
| Wrong (fails) | Right |
|
|
17
|
+
|---------------|-------|
|
|
18
|
+
| kanban `--assignee architect` | `--assignee u-…-architect` from cohort table |
|
|
19
|
+
| delegate to `dev` | delegate to `u-…-dev` |
|
|
20
|
+
| read `/opt/data/profiles/architect/.env` | only your cohort's `u-…-*` profiles |
|
|
21
|
+
|
|
22
|
+
Template profiles share disk but **lack the triggering user's API keys**. Kanban workers on `architect` exit with "empty API key" and violate protocol.
|
|
23
|
+
|
|
24
|
+
## Kanban orchestration
|
|
25
|
+
|
|
26
|
+
Load **kanban-handoff-pattern** before creating or dispatching tasks.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
/opt/hermes/.venv/bin/hermes -p <your-runtime-slug> kanban create "Title" \
|
|
30
|
+
--assignee <cohort-runtime-slug> \
|
|
31
|
+
--workspace-kind scratch \
|
|
32
|
+
--body "…"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `workspace_kind`: `scratch` | `dir:/workspace` | `worktree` only
|
|
36
|
+
- Workers must call `kanban_complete` or `kanban_block` before exit
|
|
37
|
+
- After `failure_limit` failures, `kanban unblock <task_id>` after fixing root cause
|
|
38
|
+
|
|
39
|
+
## Cron & delegation
|
|
40
|
+
|
|
41
|
+
- Cron jobs that invoke agents: target **runtime_slug** from cohort
|
|
42
|
+
- `delegate_task`: pass the specialist's **runtime_slug**, not template name
|
|
43
|
+
- Your cohort is **only your user's agents** — never other users' `u-*` profiles
|
|
44
|
+
|
|
45
|
+
## Tools in browser chat
|
|
46
|
+
|
|
47
|
+
- Use **terminal** (not `execute_code`) for `hermes kanban`, `hermes cron`, shell
|
|
48
|
+
- Full CLI: `/opt/hermes/.venv/bin/hermes -p <profile> …`
|
|
49
|
+
- Docker socket is unavailable inside the gateway container
|
|
50
|
+
|
|
51
|
+
## Privacy
|
|
52
|
+
|
|
53
|
+
- User LLM keys are overlaid per-turn into **your** runtime profile `.env`
|
|
54
|
+
- Do not read or exfiltrate keys; do not access profiles outside `WORKFRAME_COHORT.md`
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Workframe Reusable Prompt Templates
|
|
2
|
+
|
|
3
|
+
## 1) Concierge onboarding
|
|
4
|
+
"You are the {projectName} Agent concierge. Interview for mission, scope, constraints, success criteria. Select a starter agent pack, then route first tasks via Kanban and persist outcomes to files."
|
|
5
|
+
|
|
6
|
+
## 2) Starter-pack selection
|
|
7
|
+
"Given this project description, choose one starter pack (core/product/engineering/full). Explain why and list profiles included."
|
|
8
|
+
|
|
9
|
+
## 3) Specialist routing
|
|
10
|
+
"Decompose this request into specialist lanes. Keep roles pure. Use Kanban dependencies only when required."
|
|
11
|
+
|
|
12
|
+
## 4) Library expansion proposal
|
|
13
|
+
"If this workload is recurring and not well-covered, propose a new specialist profile with mission, minimal skills/tools, and expected artifacts."
|
|
14
|
+
|
|
15
|
+
## 5) Handoff quality check
|
|
16
|
+
"Validate task handoff against `WORKFRAME_HANDOFF_SCHEMA.md` and suggest minimal fixes."
|
package/rules/.hermes.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# .hermes — {projectName}
|
|
2
|
+
|
|
3
|
+
Chat **must** use profile **`{nativeProfileSlug}`** ({nativeAgentName}):
|
|
4
|
+
|
|
5
|
+
```powershell
|
|
6
|
+
..\scripts\chat.ps1
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Bootstrap (after `hermes setup`): `..\scripts\bootstrap-profiles.ps1`
|
|
10
|
+
|
|
11
|
+
Bare `docker run ... hermes-agent:latest` without `-p {nativeProfileSlug}` is generic Hermes — not this Workframe install.
|
package/rules/AGENTS.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# AGENTS — {projectName}
|
|
2
|
+
|
|
3
|
+
Shared project workspace (`/workspace` → `/opt/data/workspace`). Hermes mounts host `Files/` at `/opt/data/workspace`; `/workspace` is a symlink so writes pass `HERMES_WRITE_SAFE_ROOT`.
|
|
4
|
+
|
|
5
|
+
## Native agent
|
|
6
|
+
|
|
7
|
+
**{nativeAgentName}** (`{nativeProfileSlug}`) — concierge and orchestrator. Chat via `../scripts/chat.sh` or `../scripts/chat.ps1`, or browser `/chat` after Phase B.
|
|
8
|
+
|
|
9
|
+
## Layout
|
|
10
|
+
|
|
11
|
+
| Path | Role |
|
|
12
|
+
|------|------|
|
|
13
|
+
| `Files/` (here) | Project source of truth — keep lean until you add real work |
|
|
14
|
+
| `Agents/` | Hermes runtime — profiles, skills, memory (never commit) |
|
|
15
|
+
|
|
16
|
+
## Rules
|
|
17
|
+
|
|
18
|
+
- Do not use Hermes `default` profile for project work.
|
|
19
|
+
- Put deliverables here; keep Workframe/Hermes doctrine in agent SOUL under `Agents/profiles/`.
|
|
20
|
+
- **Credentials never in chat** — API keys and bot tokens go through Hermes setup, dashboard, or Workframe secure UI only.
|
|
21
|
+
- **{nativeAgentName}** is the PM/concierge — cross-lane work routes through them unless you are bound to a dedicated Discord/TG channel for this profile.
|
|
22
|
+
- Outcomes live in `/workspace` (this folder); chat is intake, not the system of record.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# {projectName}
|
|
2
|
+
|
|
3
|
+
Welcome to Workframe — your team's social AI collaboration space.
|
|
4
|
+
|
|
5
|
+
Use this file to keep a living record of what this project is, who is on the team, sub-projects, agents, kanban guidelines, and anything else newcomers should know. Your Workframe Agent can help you evolve it over time.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Safe Hermes update — pull gateway/dashboard images, recreate containers. Preserves runtime/Agents.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
# shellcheck source=compose-docker-host.sh
|
|
6
|
+
source "$SCRIPT_DIR/compose-docker-host.sh"
|
|
7
|
+
|
|
8
|
+
echo "=== Hermes update (gateway + dashboard only) ==="
|
|
9
|
+
workframe_compose_prepare
|
|
10
|
+
echo "Compose dir: $compose_cd"
|
|
11
|
+
echo "Preserves: Agents/, Files/, workframe-api data volumes"
|
|
12
|
+
|
|
13
|
+
SERVICES=(gateway dashboard)
|
|
14
|
+
workframe_compose pull "${SERVICES[@]}"
|
|
15
|
+
workframe_compose up -d --force-recreate --no-deps "${SERVICES[@]}"
|
|
16
|
+
|
|
17
|
+
echo "=== Hermes update complete ==="
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Safe Workframe update — sync npm template (optional), rebuild API/supervisor/UI containers. Never wipes runtime/DB.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
# shellcheck source=compose-docker-host.sh
|
|
6
|
+
source "$SCRIPT_DIR/compose-docker-host.sh"
|
|
7
|
+
|
|
8
|
+
workframe_compose_prepare
|
|
9
|
+
PROJECT_ROOT="${WORKFRAME_HOST_PROJECT_ROOT:-${WORKFRAME_PROJECT_ROOT:-$compose_cd}}"
|
|
10
|
+
|
|
11
|
+
echo "=== Workframe update (API + supervisor + UI) ==="
|
|
12
|
+
echo "Project root: $PROJECT_ROOT"
|
|
13
|
+
echo "Preserves: Agents/, Files/, .env, workframe-api/data, gateway/Hermes profiles"
|
|
14
|
+
|
|
15
|
+
TARGET_VERSION="${WORKFRAME_UPDATE_VERSION:-}"
|
|
16
|
+
NPM_PACKAGE="${WORKFRAME_NPM_PACKAGE:-create-workframe}"
|
|
17
|
+
|
|
18
|
+
if [[ "${WORKFRAME_UPDATE_SKIP_NPM:-1}" == "1" ]] && [[ "${WORKFRAME_UPDATE_ALLOW_NPM:-}" != "1" ]]; then
|
|
19
|
+
echo "Skipping npm template sync (WORKFRAME_UPDATE_SKIP_NPM=1; set WORKFRAME_UPDATE_ALLOW_NPM=1 to fetch)"
|
|
20
|
+
elif command -v npm >/dev/null 2>&1; then
|
|
21
|
+
if [[ "${WORKFRAME_UPDATE_ALLOW_NPM:-}" == "1" ]] && [[ -z "$TARGET_VERSION" ]]; then
|
|
22
|
+
echo "WORKFRAME_UPDATE_VERSION is required when WORKFRAME_UPDATE_ALLOW_NPM=1" >&2
|
|
23
|
+
exit 1
|
|
24
|
+
fi
|
|
25
|
+
TMP="$(mktemp -d)"
|
|
26
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
27
|
+
echo "Fetching ${NPM_PACKAGE}@${TARGET_VERSION:-latest} from npm..."
|
|
28
|
+
(cd "$TMP" && npm pack "${NPM_PACKAGE}@${TARGET_VERSION:-latest}" --silent)
|
|
29
|
+
TARBALL="$(ls -1 "$TMP"/${NPM_PACKAGE}-*.tgz 2>/dev/null | head -n1 || true)"
|
|
30
|
+
if [[ -n "$TARBALL" ]]; then
|
|
31
|
+
EXPECTED="$(npm view "${NPM_PACKAGE}@${TARGET_VERSION:-latest}" dist.integrity --silent 2>/dev/null || true)"
|
|
32
|
+
if [[ -n "$EXPECTED" ]]; then
|
|
33
|
+
ACTUAL="sha512-$(sha512sum "$TARBALL" | awk '{print $1}' | xxd -r -p | base64 | tr -d '\n')"
|
|
34
|
+
if [[ "$ACTUAL" != "$EXPECTED" ]]; then
|
|
35
|
+
echo "integrity mismatch for ${NPM_PACKAGE}@${TARGET_VERSION:-latest}" >&2
|
|
36
|
+
exit 1
|
|
37
|
+
fi
|
|
38
|
+
echo "integrity ok: ${NPM_PACKAGE}@${TARGET_VERSION:-latest}"
|
|
39
|
+
fi
|
|
40
|
+
tar -xf "$TARBALL" -C "$TMP"
|
|
41
|
+
PKG="$TMP/package"
|
|
42
|
+
for dir in workframe-api workframe-supervisor; do
|
|
43
|
+
if [[ -d "$PKG/$dir" ]]; then
|
|
44
|
+
echo "Syncing $dir/"
|
|
45
|
+
mkdir -p "$PROJECT_ROOT/$dir"
|
|
46
|
+
cp -a "$PKG/$dir/." "$PROJECT_ROOT/$dir/"
|
|
47
|
+
fi
|
|
48
|
+
done
|
|
49
|
+
if [[ -d "$PKG/workframe-ui/public" ]]; then
|
|
50
|
+
echo "Syncing workframe-ui/public/"
|
|
51
|
+
mkdir -p "$PROJECT_ROOT/workframe-ui/public"
|
|
52
|
+
cp -a "$PKG/workframe-ui/public/." "$PROJECT_ROOT/workframe-ui/public/"
|
|
53
|
+
fi
|
|
54
|
+
for script in apply-update-hermes.sh apply-update-workframe.sh restart-gateway-hermes.sh compose-docker-host.sh update-hermes.sh; do
|
|
55
|
+
if [[ -f "$PKG/scripts/$script" ]]; then
|
|
56
|
+
cp -a "$PKG/scripts/$script" "$PROJECT_ROOT/scripts/workframe/$script"
|
|
57
|
+
chmod +x "$PROJECT_ROOT/scripts/workframe/$script" 2>/dev/null || true
|
|
58
|
+
fi
|
|
59
|
+
done
|
|
60
|
+
else
|
|
61
|
+
echo "npm pack produced no tarball — skipping template sync"
|
|
62
|
+
fi
|
|
63
|
+
else
|
|
64
|
+
echo "Skipping npm template sync (npm missing or WORKFRAME_UPDATE_SKIP_NPM=1)"
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
echo "Rebuilding workframe-api and workframe-supervisor..."
|
|
68
|
+
workframe_compose build workframe-api workframe-supervisor
|
|
69
|
+
workframe_compose up -d --build --no-deps workframe-api workframe-supervisor
|
|
70
|
+
|
|
71
|
+
if workframe_compose config --services 2>/dev/null | grep -qx workframe-ui; then
|
|
72
|
+
workframe_compose up -d --no-deps workframe-ui || workframe_compose restart workframe-ui || true
|
|
73
|
+
elif workframe_compose config --services 2>/dev/null | grep -qx workframe; then
|
|
74
|
+
workframe_compose up -d --no-deps workframe || workframe_compose restart workframe || true
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
echo "=== Workframe update complete ==="
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Hermes sets HERMES_WRITE_SAFE_ROOT=/opt/data — user artifacts must resolve under it.
|
|
3
|
+
# Bind host Files at /opt/data/workspace; keep /workspace as a symlink for agents and API.
|
|
4
|
+
mkdir -p /opt/data/workspace
|
|
5
|
+
if [ -L /workspace ] || [ ! -e /workspace ]; then
|
|
6
|
+
rm -rf /workspace 2>/dev/null || true
|
|
7
|
+
ln -sfn /opt/data/workspace /workspace
|
|
8
|
+
fi
|
|
@@ -0,0 +1,77 @@
|
|
|
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 ProjectX 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 PROJECTX_ROOT = path.resolve(PKG_ROOT, '../..');
|
|
15
|
+
const UI_SRC = path.join(PROJECTX_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
|
+
if (!fs.existsSync(UI_SRC)) {
|
|
35
|
+
console.error(`apps/web source not found: ${UI_SRC}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
console.log('Building @workframe/web...');
|
|
40
|
+
const build = spawnSync(npmCmd(), ['run', 'build'], {
|
|
41
|
+
cwd: UI_SRC,
|
|
42
|
+
stdio: 'inherit',
|
|
43
|
+
shell: process.platform === 'win32',
|
|
44
|
+
});
|
|
45
|
+
if (build.status !== 0) process.exit(build.status ?? 1);
|
|
46
|
+
|
|
47
|
+
const dist = path.join(UI_SRC, 'dist');
|
|
48
|
+
if (!fs.existsSync(path.join(dist, 'index.html'))) {
|
|
49
|
+
console.error(`Build output missing index.html in ${dist}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
console.log(`Copying ${dist} -> ${UI_DEST}`);
|
|
54
|
+
copyTree(dist, UI_DEST);
|
|
55
|
+
|
|
56
|
+
const avatarShared = path.join(PKG_ROOT, 'shared', 'agent-avatars');
|
|
57
|
+
|
|
58
|
+
function copyPresetPngs(src, dst, { keepCatalog = false } = {}) {
|
|
59
|
+
if (!fs.existsSync(src)) return;
|
|
60
|
+
fs.mkdirSync(dst, { recursive: true });
|
|
61
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
62
|
+
if (!entry.isFile() || !entry.name.endsWith('.png')) continue;
|
|
63
|
+
fs.copyFileSync(path.join(src, entry.name), path.join(dst, entry.name));
|
|
64
|
+
}
|
|
65
|
+
if (keepCatalog && fs.existsSync(path.join(src, 'catalog.json'))) {
|
|
66
|
+
fs.copyFileSync(path.join(src, 'catalog.json'), path.join(dst, 'catalog.json'));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
for (const dir of ['avatars', 'logos']) {
|
|
71
|
+
copyPresetPngs(path.join(dist, 'assets', dir), path.join(UI_DEST, 'assets', dir), { keepCatalog: true });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ponytail: shared/agent-avatars is npm-pack mirror of avatars only (legacy seed path)
|
|
75
|
+
copyPresetPngs(path.join(dist, 'assets', 'avatars'), avatarShared, { keepCatalog: true });
|
|
76
|
+
|
|
77
|
+
console.log('Workframe UI bundle ready for create-workframe.');
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Shared docker compose invocation for in-container apply (docker.sock on host).
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
workframe_compose_prepare() {
|
|
6
|
+
compose_cd=""
|
|
7
|
+
compose_files=()
|
|
8
|
+
|
|
9
|
+
# Host-bindings overlay: docker.sock apply from supervisor uses WORKFRAME_HOST_* paths.
|
|
10
|
+
if [[ -n "${WORKFRAME_HOST_COMPOSE_DIR:-}" && -n "${WORKFRAME_COMPOSE_DIR:-}" \
|
|
11
|
+
&& -f "${WORKFRAME_COMPOSE_DIR}/docker-compose.yml" \
|
|
12
|
+
&& -f "${WORKFRAME_COMPOSE_DIR}/docker-compose.host-bindings.yml" ]]; then
|
|
13
|
+
compose_cd="${WORKFRAME_COMPOSE_DIR}"
|
|
14
|
+
compose_files=(-f docker-compose.yml -f docker-compose.host-bindings.yml)
|
|
15
|
+
return 0
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# ponytail: docker Desktop resolves WORKFRAME_HOST_* via socket even when path is not visible in this container.
|
|
19
|
+
if [[ -n "${WORKFRAME_HOST_COMPOSE_DIR:-}" ]]; then
|
|
20
|
+
compose_cd="${WORKFRAME_HOST_COMPOSE_DIR}"
|
|
21
|
+
compose_files=(-f docker-compose.yml)
|
|
22
|
+
return 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
compose_cd="${WORKFRAME_COMPOSE_DIR:-${WORKFRAME_PROJECT_ROOT:-.}}"
|
|
26
|
+
compose_files=(-f docker-compose.yml)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
workframe_compose() {
|
|
30
|
+
workframe_compose_prepare
|
|
31
|
+
cd "$compose_cd"
|
|
32
|
+
if [[ ! -f docker-compose.yml ]]; then
|
|
33
|
+
echo "docker-compose.yml not found in $compose_cd" >&2
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
docker compose "${compose_files[@]}" "$@"
|
|
37
|
+
}
|