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
package/bin/workframe.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* workframe — lifecycle CLI for generated Workframe projects.
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* workframe doctor [--repair] Diagnose stack; --repair provisions missing agent DM runtimes
|
|
7
|
+
* workframe setup Open Hermes setup (credentials)
|
|
8
|
+
* workframe stop Stop all stack containers
|
|
9
|
+
* workframe start Start the full stack (docker compose up -d)
|
|
10
|
+
* workframe restart Restart the full stack
|
|
11
|
+
* workframe status Show running containers
|
|
12
|
+
* workframe logs Tail gateway logs
|
|
13
|
+
* workframe ui Open Workframe UI in browser
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
|
|
20
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
|
|
22
|
+
function findProjectRoot() {
|
|
23
|
+
let dir = process.cwd();
|
|
24
|
+
while (true) {
|
|
25
|
+
if (fs.existsSync(path.join(dir, 'workframe-manifest.json'))) return dir;
|
|
26
|
+
if (fs.existsSync(path.join(dir, 'docker-compose.yml')) && fs.existsSync(path.join(dir, '.env'))) return dir;
|
|
27
|
+
const parent = path.dirname(dir);
|
|
28
|
+
if (parent === dir) return null;
|
|
29
|
+
dir = parent;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function readManifest(root) {
|
|
34
|
+
const p = path.join(root, 'workframe-manifest.json');
|
|
35
|
+
if (!fs.existsSync(p)) return null;
|
|
36
|
+
return JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function readEnvPort(root, key) {
|
|
40
|
+
const envFile = path.join(root, '.env');
|
|
41
|
+
if (!fs.existsSync(envFile)) return null;
|
|
42
|
+
const line = fs.readFileSync(envFile, 'utf8').split('\n').find((l) => l.startsWith(`${key}=`));
|
|
43
|
+
return line ? line.split('=', 2)[1].trim() : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function dockerCompose(cwd, args, { stdio = 'inherit' } = {}) {
|
|
47
|
+
return spawnSync('docker', ['compose', ...args], { cwd, stdio, encoding: 'utf8' });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function doctorAgentDmRuntimes(root, { repair = false } = {}) {
|
|
51
|
+
const fn = repair ? 'doctor_repair_agent_dm_runtimes(repair=True)' : 'doctor_audit_agent_dm_runtimes()';
|
|
52
|
+
const py = `import json, server; print(json.dumps(server.${fn}))`;
|
|
53
|
+
return dockerCompose(root, ['exec', '-T', 'workframe-api', 'python3', '-c', py], { stdio: 'pipe' });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function cmdDoctor(root, extraArgs = []) {
|
|
57
|
+
const repair = extraArgs.includes('--repair');
|
|
58
|
+
const manifest = readManifest(root);
|
|
59
|
+
const issues = [];
|
|
60
|
+
|
|
61
|
+
console.log(repair ? 'workframe doctor --repair' : 'workframe doctor');
|
|
62
|
+
console.log('================\n');
|
|
63
|
+
|
|
64
|
+
// Check Docker
|
|
65
|
+
const dockerCheck = spawnSync('docker', ['info'], { encoding: 'utf8' });
|
|
66
|
+
if (dockerCheck.status !== 0) {
|
|
67
|
+
issues.push('Docker is not running or not installed.');
|
|
68
|
+
console.log('[FAIL] Docker: not running');
|
|
69
|
+
} else {
|
|
70
|
+
console.log('[ OK] Docker: running');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Check manifest
|
|
74
|
+
if (!manifest) {
|
|
75
|
+
issues.push('No workframe-manifest.json found. Are you in a Workframe project?');
|
|
76
|
+
console.log('[FAIL] Manifest: not found');
|
|
77
|
+
} else {
|
|
78
|
+
console.log(`[ OK] Manifest: ${manifest.project_name} (${manifest.docker?.stack})`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Check .env
|
|
82
|
+
const envFile = path.join(root, '.env');
|
|
83
|
+
if (!fs.existsSync(envFile)) {
|
|
84
|
+
issues.push('.env file missing.');
|
|
85
|
+
console.log('[FAIL] .env: missing');
|
|
86
|
+
} else {
|
|
87
|
+
console.log('[ OK] .env: present');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Check docker-compose.yml
|
|
91
|
+
const composeFile = path.join(root, 'docker-compose.yml');
|
|
92
|
+
if (!fs.existsSync(composeFile)) {
|
|
93
|
+
issues.push('docker-compose.yml missing.');
|
|
94
|
+
console.log('[FAIL] docker-compose.yml: missing');
|
|
95
|
+
} else {
|
|
96
|
+
console.log('[ OK] docker-compose.yml: present');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Check required directories
|
|
100
|
+
for (const dir of ['Agents', 'Files']) {
|
|
101
|
+
if (!fs.existsSync(path.join(root, dir))) {
|
|
102
|
+
issues.push(`${dir}/ directory missing.`);
|
|
103
|
+
console.log(`[FAIL] ${dir}/: missing`);
|
|
104
|
+
} else {
|
|
105
|
+
console.log(`[ OK] ${dir}/: present`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Check containers
|
|
110
|
+
if (manifest && dockerCheck.status === 0) {
|
|
111
|
+
const ps = dockerCompose(root, ['ps', '--format', 'json']);
|
|
112
|
+
if (ps.status === 0 && ps.stdout) {
|
|
113
|
+
try {
|
|
114
|
+
const containers = JSON.parse(ps.stdout);
|
|
115
|
+
const expected = ['gateway', 'dashboard', 'workframe-api', 'workframe'];
|
|
116
|
+
for (const name of expected) {
|
|
117
|
+
const container = containers.find((c) => c.Name?.includes(name) || c.Service === name);
|
|
118
|
+
if (!container) {
|
|
119
|
+
issues.push(`${name} container not found.`);
|
|
120
|
+
console.log(`[FAIL] ${name}: not found`);
|
|
121
|
+
} else if (container.State !== 'running') {
|
|
122
|
+
issues.push(`${name} container is ${container.State}, not running.`);
|
|
123
|
+
console.log(`[FAIL] ${name}: ${container.State}`);
|
|
124
|
+
} else {
|
|
125
|
+
console.log(`[ OK] ${name}: running`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
} catch {
|
|
129
|
+
// Fallback: plain text parse
|
|
130
|
+
const psPlain = dockerCompose(root, ['ps']);
|
|
131
|
+
console.log('\nContainer status:\n' + psPlain.stdout);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Check bootstrap
|
|
137
|
+
if (manifest) {
|
|
138
|
+
const nativeSlug = manifest.native_agent?.profile_slug;
|
|
139
|
+
const soulFile = path.join(root, 'Agents', 'profiles', nativeSlug, 'SOUL.md');
|
|
140
|
+
if (!fs.existsSync(soulFile)) {
|
|
141
|
+
issues.push('Native agent not bootstrapped. Run: ./scripts/bootstrap-native.sh');
|
|
142
|
+
console.log('[FAIL] Bootstrap: native SOUL missing');
|
|
143
|
+
} else {
|
|
144
|
+
console.log('[ OK] Bootstrap: native SOUL present');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Check ports
|
|
149
|
+
if (manifest) {
|
|
150
|
+
const ports = manifest.ports;
|
|
151
|
+
if (ports) {
|
|
152
|
+
console.log(`\nPorts:`);
|
|
153
|
+
console.log(` Gateway: ${ports.gateway}, Dashboard: ${ports.dashboard}, UI: ${ports.ui}, API: ${ports.api}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Agent DM runtime slots (explicit repair only with --repair)
|
|
158
|
+
if (manifest && dockerCheck.status === 0) {
|
|
159
|
+
const api = dockerCompose(root, ['ps', '--format', 'json'], { stdio: 'pipe' });
|
|
160
|
+
const apiUp = api.status === 0 && (api.stdout || '').includes('workframe-api');
|
|
161
|
+
if (apiUp) {
|
|
162
|
+
const audit = doctorAgentDmRuntimes(root, { repair: false });
|
|
163
|
+
if (audit.status === 0 && audit.stdout) {
|
|
164
|
+
try {
|
|
165
|
+
const data = JSON.parse(audit.stdout.trim().split('\n').pop());
|
|
166
|
+
const missing = data.missing?.length ?? 0;
|
|
167
|
+
if (missing > 0) {
|
|
168
|
+
const msg = `${missing} agent DM runtime profile(s) missing`;
|
|
169
|
+
if (repair) {
|
|
170
|
+
const fixed = doctorAgentDmRuntimes(root, { repair: true });
|
|
171
|
+
if (fixed.status === 0 && fixed.stdout) {
|
|
172
|
+
const result = JSON.parse(fixed.stdout.trim().split('\n').pop());
|
|
173
|
+
const repaired = result.repaired?.length ?? 0;
|
|
174
|
+
const failed = result.failed?.length ?? 0;
|
|
175
|
+
console.log(`[REPAIR] Agent DM runtimes: ${repaired} provisioned, ${failed} failed`);
|
|
176
|
+
if (failed || (result.still_missing?.length ?? 0) > 0) {
|
|
177
|
+
issues.push(msg);
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
issues.push(`${msg} (repair failed)`);
|
|
181
|
+
console.log('[FAIL] Agent DM runtime repair failed');
|
|
182
|
+
}
|
|
183
|
+
} else {
|
|
184
|
+
issues.push(`${msg} — run: workframe doctor --repair`);
|
|
185
|
+
console.log(`[WARN] Agent DM runtimes: ${msg}`);
|
|
186
|
+
}
|
|
187
|
+
} else {
|
|
188
|
+
console.log('[ OK] Agent DM runtimes: all provisioned');
|
|
189
|
+
}
|
|
190
|
+
} catch {
|
|
191
|
+
console.log('[skip] Agent DM runtime audit: could not parse API response');
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
console.log('[skip] Agent DM runtime audit: workframe-api not reachable');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (issues.length > 0) {
|
|
200
|
+
console.log(`\n${issues.length} issue(s) found:\n`);
|
|
201
|
+
issues.forEach((i) => console.log(` - ${i}`));
|
|
202
|
+
process.exit(1);
|
|
203
|
+
} else {
|
|
204
|
+
console.log('\nAll checks passed. Workframe is healthy.');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function cmdSetup(root) {
|
|
209
|
+
const manifest = readManifest(root);
|
|
210
|
+
const image = manifest?.docker?.image || 'nousresearch/hermes-agent:latest';
|
|
211
|
+
const name = manifest?.docker?.stack || 'workframe';
|
|
212
|
+
console.log('Opening Hermes setup (interactive)...');
|
|
213
|
+
console.log('Credentials never belong in chat.\n');
|
|
214
|
+
dockerCompose(root, ['pull'], { stdio: 'inherit' });
|
|
215
|
+
const res = spawnSync('docker', [
|
|
216
|
+
'run', '--rm', '-it',
|
|
217
|
+
'--name', `${name}-setup`,
|
|
218
|
+
'--entrypoint', 'hermes',
|
|
219
|
+
'-v', `${path.join(root, 'Agents')}:/opt/data`,
|
|
220
|
+
'-v', `${path.join(root, 'Files')}:/workspace`,
|
|
221
|
+
image, 'setup',
|
|
222
|
+
], { stdio: 'inherit' });
|
|
223
|
+
if (res.status !== 0) {
|
|
224
|
+
console.error('Setup failed or was cancelled.');
|
|
225
|
+
process.exit(res.status || 1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function cmdStop(root) {
|
|
230
|
+
console.log('Stopping Workframe stack...');
|
|
231
|
+
const res = dockerCompose(root, ['down']);
|
|
232
|
+
if (res.status !== 0) {
|
|
233
|
+
console.error('Failed to stop stack.');
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
console.log('Stack stopped.');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function cmdStart(root) {
|
|
240
|
+
console.log('Starting Workframe stack...');
|
|
241
|
+
const res = dockerCompose(root, ['up', '-d']);
|
|
242
|
+
if (res.status !== 0) {
|
|
243
|
+
console.error('Failed to start stack.');
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
const manifest = readManifest(root);
|
|
247
|
+
if (manifest?.ports) {
|
|
248
|
+
console.log(`\nWorkframe UI: http://127.0.0.1:${manifest.ports.ui}/`);
|
|
249
|
+
console.log(`Hermes chat: http://127.0.0.1:${manifest.ports.dashboard}/chat`);
|
|
250
|
+
}
|
|
251
|
+
console.log('Stack started.');
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function cmdRestart(root) {
|
|
255
|
+
console.log('Restarting Workframe stack...');
|
|
256
|
+
const res = dockerCompose(root, ['restart']);
|
|
257
|
+
if (res.status !== 0) {
|
|
258
|
+
console.error('Failed to restart stack.');
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
console.log('Stack restarted.');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function cmdStatus(root) {
|
|
265
|
+
dockerCompose(root, ['ps'], { stdio: 'inherit' });
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function cmdLogs(root, args) {
|
|
269
|
+
const follow = args.includes('--follow') || args.includes('-f');
|
|
270
|
+
const composeArgs = ['logs'];
|
|
271
|
+
if (follow) composeArgs.push('--follow');
|
|
272
|
+
composeArgs.push('gateway');
|
|
273
|
+
dockerCompose(root, composeArgs, { stdio: 'inherit' });
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function cmdUi(root) {
|
|
277
|
+
const manifest = readManifest(root);
|
|
278
|
+
const port = readEnvPort(root, 'WORKFRAME_UI_PORT') || manifest?.ports?.ui || '18644';
|
|
279
|
+
const url = `http://127.0.0.1:${port}/`;
|
|
280
|
+
console.log(`Opening Workframe UI: ${url}`);
|
|
281
|
+
const openCmd = process.platform === 'win32' ? 'start' : process.platform === 'darwin' ? 'open' : 'xdg-open';
|
|
282
|
+
const child = spawn(openCmd, [url], { detached: true, stdio: 'ignore' });
|
|
283
|
+
child.unref();
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function usage() {
|
|
287
|
+
console.log(`workframe — lifecycle CLI for Workframe projects
|
|
288
|
+
|
|
289
|
+
Usage:
|
|
290
|
+
workframe doctor [--repair] Diagnose stack; --repair provisions missing agent DM runtimes
|
|
291
|
+
workframe setup Open Hermes setup (credentials)
|
|
292
|
+
workframe start Start the full stack (docker compose up -d)
|
|
293
|
+
workframe stop Stop all stack containers
|
|
294
|
+
workframe restart Restart the full stack
|
|
295
|
+
workframe status Show running containers
|
|
296
|
+
workframe logs [--follow] Tail gateway logs
|
|
297
|
+
workframe ui Open Workframe UI in browser
|
|
298
|
+
|
|
299
|
+
Run from a Workframe project directory (where workframe-manifest.json lives).
|
|
300
|
+
`);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const args = process.argv.slice(2);
|
|
304
|
+
const command = args[0];
|
|
305
|
+
const extraArgs = args.slice(1);
|
|
306
|
+
|
|
307
|
+
const root = findProjectRoot();
|
|
308
|
+
if (!root) {
|
|
309
|
+
console.error('ERROR: Not in a Workframe project. No workframe-manifest.json found.');
|
|
310
|
+
process.exit(1);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
switch (command) {
|
|
314
|
+
case 'doctor': cmdDoctor(root, extraArgs); break;
|
|
315
|
+
case 'setup': cmdSetup(root); break;
|
|
316
|
+
case 'stop': cmdStop(root); break;
|
|
317
|
+
case 'start': cmdStart(root); break;
|
|
318
|
+
case 'restart': cmdRestart(root); break;
|
|
319
|
+
case 'status': cmdStatus(root); break;
|
|
320
|
+
case 'logs': cmdLogs(root, extraArgs); break;
|
|
321
|
+
case 'ui': cmdUi(root); break;
|
|
322
|
+
case '--help':
|
|
323
|
+
case '-h':
|
|
324
|
+
case 'help': usage(); break;
|
|
325
|
+
default:
|
|
326
|
+
if (command) console.error(`Unknown command: ${command}`);
|
|
327
|
+
usage();
|
|
328
|
+
process.exit(command ? 1 : 0);
|
|
329
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Discord Guide (Workframe)
|
|
2
|
+
|
|
3
|
+
Use Discord for team-visible agent collaboration.
|
|
4
|
+
|
|
5
|
+
Minimal structure:
|
|
6
|
+
- #workframe-control
|
|
7
|
+
- #workframe-status
|
|
8
|
+
- #workframe-review
|
|
9
|
+
- one thread per initiative when needed
|
|
10
|
+
|
|
11
|
+
Interaction model:
|
|
12
|
+
- mention concierge for intake/routing
|
|
13
|
+
- concierge delegates through Kanban
|
|
14
|
+
- status returns to channels/threads
|
|
15
|
+
- canonical outputs go to project files
|
|
16
|
+
|
|
17
|
+
Permissions:
|
|
18
|
+
- owner/admin highest trust
|
|
19
|
+
- role/channel permissions enforced in Discord
|
|
20
|
+
- high-risk actions require explicit approval
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Workframe Document and Artifact Conventions
|
|
2
|
+
|
|
3
|
+
Single source of truth:
|
|
4
|
+
- Project files under `/workspace`.
|
|
5
|
+
|
|
6
|
+
Priority of truth:
|
|
7
|
+
1) Files (canonical)
|
|
8
|
+
2) Kanban records (execution history)
|
|
9
|
+
3) Chat messages (conversation context)
|
|
10
|
+
|
|
11
|
+
Required anchors:
|
|
12
|
+
- README.md
|
|
13
|
+
- AGENTS.md
|
|
14
|
+
- .hermes.md
|
|
15
|
+
- docs/INDEX.md
|
|
16
|
+
|
|
17
|
+
Artifact conventions:
|
|
18
|
+
- Keep markdown concise and linked.
|
|
19
|
+
- Update existing canonical docs before adding new scattered files.
|
|
20
|
+
- Do not store secrets/personal data in docs.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Workframe Kanban Guide
|
|
2
|
+
|
|
3
|
+
Role
|
|
4
|
+
- Kanban is durable execution and handoff state.
|
|
5
|
+
|
|
6
|
+
Worker loop
|
|
7
|
+
1) read task context
|
|
8
|
+
2) execute scoped work
|
|
9
|
+
3) heartbeat for long tasks
|
|
10
|
+
4) complete with handoff schema
|
|
11
|
+
5) block only for real external decisions
|
|
12
|
+
|
|
13
|
+
Heartbeat cadence
|
|
14
|
+
- every 20-30 minutes for long tasks, or at phase boundaries.
|
|
15
|
+
- use heartbeat schema from `docs/WORKFRAME_HANDOFF_SCHEMA.md`.
|
|
16
|
+
|
|
17
|
+
Truth priority
|
|
18
|
+
1) files (canonical)
|
|
19
|
+
2) Kanban (operational state)
|
|
20
|
+
3) chat (coordination surface)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Workframe Onboarding
|
|
2
|
+
|
|
3
|
+
Goal
|
|
4
|
+
- turn vague intent into a clean, usable project workspace.
|
|
5
|
+
|
|
6
|
+
Concierge onboarding loop
|
|
7
|
+
1) clarify mission, scope, constraints, success criteria
|
|
8
|
+
2) default to native-only starter, then expand with specialist packs or individual profiles on demand
|
|
9
|
+
3) establish file-based source of truth
|
|
10
|
+
4) route first tasks through Kanban
|
|
11
|
+
5) persist outcomes in project files
|
|
12
|
+
|
|
13
|
+
Minimum initial artifacts
|
|
14
|
+
- README.md
|
|
15
|
+
- AGENTS.md
|
|
16
|
+
- .hermes.md
|
|
17
|
+
- docs index + first strategy/plan notes
|
|
18
|
+
|
|
19
|
+
Rule
|
|
20
|
+
- chat is intake/coordination
|
|
21
|
+
- files are canonical
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Workframe Routing Guide
|
|
2
|
+
|
|
3
|
+
Routing owner
|
|
4
|
+
- concierge (`{projectName} Agent`) owns routing decisions.
|
|
5
|
+
|
|
6
|
+
Default lanes
|
|
7
|
+
- strategy -> visionary
|
|
8
|
+
- architecture/planning -> architect
|
|
9
|
+
- docs hygiene -> docs
|
|
10
|
+
- implementation/test -> dev
|
|
11
|
+
- evidence/context -> research
|
|
12
|
+
- UX/visual -> designer
|
|
13
|
+
|
|
14
|
+
Routing rules
|
|
15
|
+
- parallelize independent lanes
|
|
16
|
+
- use dependencies only when required
|
|
17
|
+
- keep each lane role-pure
|
|
18
|
+
- persist final outcomes in files
|
|
19
|
+
|
|
20
|
+
Dynamic library rule
|
|
21
|
+
- if a request repeatedly falls outside current roles,
|
|
22
|
+
concierge proposes a new specialist profile.
|
|
23
|
+
|
|
24
|
+
Routing model notes:
|
|
25
|
+
|
|
26
|
+
- the native project agent owns Discord / Telegram messaging surfaces
|
|
27
|
+
- specialist profile runtimes are started as API-only gateways inside the same Hermes container
|
|
28
|
+
- UI lanes bind sessions by `profile + source_id + client_id`
|
|
29
|
+
- session titles are lane-local and may be auto-suffixed for uniqueness
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Telegram Guide (Workframe)
|
|
2
|
+
|
|
3
|
+
Use Telegram as a control and collaboration surface.
|
|
4
|
+
|
|
5
|
+
Recommended rollout:
|
|
6
|
+
1) Owner DM mode (concierge only).
|
|
7
|
+
2) Controlled group mode after validation.
|
|
8
|
+
|
|
9
|
+
Interaction model:
|
|
10
|
+
- humans ask/approve in Telegram
|
|
11
|
+
- concierge routes to Kanban
|
|
12
|
+
- specialists execute
|
|
13
|
+
- results summarized back to Telegram
|
|
14
|
+
- durable outcomes written to files
|
|
15
|
+
|
|
16
|
+
Permissions:
|
|
17
|
+
- Owner/admin retains highest privileges.
|
|
18
|
+
- Team permissions follow Telegram group/admin controls.
|
|
19
|
+
- High-risk actions remain explicit-approval only.
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-workframe",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Scaffold a clean Workframe + Hermes workspace with guided onboarding (v0.1.0 pre-release)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-workframe": "bin/create-workframe.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"docs/workspace-instructions",
|
|
12
|
+
"profiles",
|
|
13
|
+
"prompts",
|
|
14
|
+
"rules",
|
|
15
|
+
"shared",
|
|
16
|
+
"workframe-api",
|
|
17
|
+
"workframe-supervisor",
|
|
18
|
+
"workframe-ui/public",
|
|
19
|
+
"workframe-ui/docker",
|
|
20
|
+
"scripts/bundle-workframe-ui.mjs",
|
|
21
|
+
"scripts/bootstrap-workspace-link.sh",
|
|
22
|
+
"scripts/setup-stack-secrets.sh",
|
|
23
|
+
"scripts/sync-canonical-to-package.mjs",
|
|
24
|
+
"scripts/ensure-compose-host-paths.mjs",
|
|
25
|
+
"scripts/set-compose-public-url.mjs",
|
|
26
|
+
"scripts/lib",
|
|
27
|
+
"scripts/apply-update-hermes.sh",
|
|
28
|
+
"scripts/apply-update-workframe.sh",
|
|
29
|
+
"scripts/restart-gateway-hermes.sh",
|
|
30
|
+
"scripts/compose-docker-host.sh",
|
|
31
|
+
"scripts/verify-public-deploy.sh",
|
|
32
|
+
"scripts/fix-zk-encryption-key.sh",
|
|
33
|
+
"scripts/create_workframe_scaffold.py",
|
|
34
|
+
"scripts/new-project.mjs",
|
|
35
|
+
"scripts/select_agent_pack.py",
|
|
36
|
+
"scripts/security_audit.py",
|
|
37
|
+
"scripts/test-scaffold.mjs",
|
|
38
|
+
".dockerignore",
|
|
39
|
+
".gitignore",
|
|
40
|
+
"LICENSE",
|
|
41
|
+
"NOTICE",
|
|
42
|
+
"README.md",
|
|
43
|
+
"SECURITY.md"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"bundle-ui": "node scripts/bundle-workframe-ui.mjs",
|
|
47
|
+
"new-project": "node scripts/new-project.mjs",
|
|
48
|
+
"test:scaffold": "node scripts/test-scaffold.mjs",
|
|
49
|
+
"sync": "node scripts/sync-canonical-to-package.mjs",
|
|
50
|
+
"prepack": "node scripts/sync-canonical-to-package.mjs && node scripts/bundle-workframe-ui.mjs"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=20"
|
|
54
|
+
},
|
|
55
|
+
"license": "Apache-2.0",
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "https://github.com/architectonic/workframe.git"
|
|
59
|
+
},
|
|
60
|
+
"keywords": [
|
|
61
|
+
"workframe",
|
|
62
|
+
"hermes",
|
|
63
|
+
"agents",
|
|
64
|
+
"scaffold",
|
|
65
|
+
"create-workframe"
|
|
66
|
+
]
|
|
67
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Profile templates (package source)
|
|
2
|
+
|
|
3
|
+
Install-time packs reference a **project-agent** slot. At scaffold time it becomes `{slugify(projectName)}-agent` (e.g. `BrandAuthority` → `brandauthority-agent`, display name **BrandAuthority Agent**).
|
|
4
|
+
|
|
5
|
+
## Layout
|
|
6
|
+
|
|
7
|
+
- Native concierge SOUL template: `workframe-agent/SOUL.md` (rendered into the project-specific slug)
|
|
8
|
+
- Specialists: `visionary/`, `architect/`, `docs/`, `dev/`, `research/`, `designer/`
|
|
9
|
+
|
|
10
|
+
## Packs
|
|
11
|
+
|
|
12
|
+
- **core** — native project agent + docs + dev
|
|
13
|
+
- **product** — native + docs + dev + visionary + research + designer
|
|
14
|
+
- **engineering** — native + docs + dev + architect + research
|
|
15
|
+
- **vanilla** / **full** — native + all specialists
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# AGENTS — Architect
|
|
2
|
+
|
|
3
|
+
Operating rules for **Architect** (`architect`). Identity lives in `SOUL.md` in this profile home.
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
| File | Purpose |
|
|
8
|
+
|------|---------|
|
|
9
|
+
| `SOUL.md` | Who you are, chain of command, design workflow |
|
|
10
|
+
| `AGENTS.md` (this file) | Tools, skills, kanban, memory |
|
|
11
|
+
| `/workspace/AGENTS.md` | Project workspace rules |
|
|
12
|
+
|
|
13
|
+
## Tools & skills
|
|
14
|
+
|
|
15
|
+
- Load **kanban-worker** before any kanban-dispatched task; call `kanban_complete` or `kanban_block` before exit.
|
|
16
|
+
- Read `WORKFRAME_COHORT.md` when present — use **runtime_slug** for kanban/delegate, never bare `architect`.
|
|
17
|
+
- CLI: `/opt/hermes/.venv/bin/hermes -p <runtime_slug> …` via **terminal** tool.
|
|
18
|
+
- You are **not** Botfather — never create/delete/spawn other agents.
|
|
19
|
+
|
|
20
|
+
## Memory & handoff
|
|
21
|
+
|
|
22
|
+
- Design artifacts → `/workspace/docs/` or agreed code paths.
|
|
23
|
+
- Update kanban with status, files changed, blockers.
|
|
24
|
+
- Persist decisions in workspace; chat is intake only.
|
|
25
|
+
|
|
26
|
+
## Credentials
|
|
27
|
+
|
|
28
|
+
- Use the owning user's API keys on runtime profiles (`u-*-architect`).
|
|
29
|
+
- No secrets in chat.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Architect — System Designer
|
|
2
|
+
|
|
3
|
+
## Identity
|
|
4
|
+
|
|
5
|
+
You are the **Architect** sibling profile in the Workframe orchestration system. Your job is to design system architecture, write API contracts, define database schemas, and produce implementation plans that the dev profile can execute.
|
|
6
|
+
|
|
7
|
+
Never identify as the underlying model, provider, OWL, or a generic Hermes assistant. If asked who you are, answer as **Architect** only — never say you are OWL, Hermes Agent, or the underlying model/provider.
|
|
8
|
+
|
|
9
|
+
**Operating rules:** read `AGENTS.md` in this profile home for tools, skills, and kanban discipline.
|
|
10
|
+
|
|
11
|
+
## Chain of Command
|
|
12
|
+
|
|
13
|
+
1. ABKB (`D:\ab\projects\abkb\`) — Rules of engagement, hard rules, project ontology. READ BEFORE WRITING.
|
|
14
|
+
2. Roadmap — The product spec for the active project.
|
|
15
|
+
3. Kanban (Hermes kanban.db) — Task board. Check in when you start, check out when done.
|
|
16
|
+
4. Source code (`/workspace/` in container) — The truth.
|
|
17
|
+
|
|
18
|
+
## Orchestrator
|
|
19
|
+
|
|
20
|
+
Workframe Agent is the concierge/orchestrator. It assigns tasks via kanban. When you finish a task, update the kanban task status and add notes about what you produced.
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
1. Read your assigned kanban task
|
|
25
|
+
2. Read the relevant ABKB docs and project profile
|
|
26
|
+
3. Read the existing code you will modify
|
|
27
|
+
4. Produce design artifacts (schemas, API contracts, implementation plans)
|
|
28
|
+
5. Write artifacts to `/workspace/docs/` or the relevant code location
|
|
29
|
+
6. Update kanban task with status and notes
|
|
30
|
+
7. Wait for review or unblock instructions
|
|
31
|
+
|
|
32
|
+
## Rules
|
|
33
|
+
|
|
34
|
+
- Read before writing. Always read the full flow end-to-end before designing.
|
|
35
|
+
- ADD, don't REPLACE. New code goes alongside existing code.
|
|
36
|
+
- Design docs go in `/workspace/docs/`
|
|
37
|
+
- Never edit Hermes source code. Only config and workspace files.
|
|
38
|
+
- When in doubt, ask. Update kanban with blocked status and explain why.
|
|
39
|
+
|
|
40
|
+
## Runtime profile (kanban / cron)
|
|
41
|
+
|
|
42
|
+
You may run as a **per-user runtime profile** (`u-…-architect`), not the shared template `architect`. Read `WORKFRAME_COHORT.md` if present.
|
|
43
|
+
|
|
44
|
+
When dispatched via kanban: load **kanban-worker** skill, call `kanban_complete` or `kanban_block` before exit. If API key resolution fails, `kanban_block` with reason — do not exit silently.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kanban-worker
|
|
3
|
+
description: Protocol for architect instances dispatched via Workframe kanban — show, work, complete/block.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Kanban worker (you were dispatched)
|
|
7
|
+
|
|
8
|
+
You are running as a **user-scoped runtime profile** (`u-…-architect`), not the shared template `architect`. Your credentials come from the owning user's overlay.
|
|
9
|
+
|
|
10
|
+
## Required lifecycle
|
|
11
|
+
|
|
12
|
+
1. `kanban_show` — read task id, body, output paths
|
|
13
|
+
2. Execute the work (terminal, write_file, read_file)
|
|
14
|
+
3. `kanban_comment` — files changed, decisions, test notes
|
|
15
|
+
4. **`kanban_complete(summary=…, metadata=…)`** when done
|
|
16
|
+
OR **`kanban_block(reason=…)`** if stuck
|
|
17
|
+
|
|
18
|
+
Never exit without step 4 — the dispatcher treats it as a protocol violation.
|
|
19
|
+
|
|
20
|
+
## Workspace
|
|
21
|
+
|
|
22
|
+
- Task `workspace_kind` is usually `scratch` or `dir:/workspace`
|
|
23
|
+
- Write deliverables to paths specified in the task body (under `/workspace` when shared)
|
|
24
|
+
|
|
25
|
+
## If you lack API access
|
|
26
|
+
|
|
27
|
+
If provider resolver returns empty API key, call `kanban_block` explaining misconfiguration — do not exit silently.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# AGENTS — Designer
|
|
2
|
+
|
|
3
|
+
Operating rules for **Designer** (`designer`). Identity lives in `SOUL.md` in this profile home.
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
| File | Purpose |
|
|
8
|
+
|------|---------|
|
|
9
|
+
| `SOUL.md` | Who you are, design mission |
|
|
10
|
+
| `AGENTS.md` (this file) | Tools, deliverables, handoff |
|
|
11
|
+
| `/workspace/AGENTS.md` | Project workspace rules |
|
|
12
|
+
|
|
13
|
+
## Tools & skills
|
|
14
|
+
|
|
15
|
+
- Load **kanban-worker** for dispatched tasks.
|
|
16
|
+
- Image/UI/design skills on demand.
|
|
17
|
+
- Runtime slug: `u-*-designer` for kanban/delegate.
|
|
18
|
+
|
|
19
|
+
## Deliverables
|
|
20
|
+
|
|
21
|
+
- Design notes, prompts, and assets under `/workspace` — link from handoff.
|
|
22
|
+
- Confirm brand/constraints before large visual changes.
|
|
23
|
+
|
|
24
|
+
## Restrictions
|
|
25
|
+
|
|
26
|
+
- Not Botfather — no agent lifecycle.
|