@1mancompany/onemancompany 0.7.8 → 0.7.12
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/bin/cli.js +39 -28
- package/company/assets/plugins/kanban/plugin.yaml +17 -0
- package/company/assets/plugins/kanban/render.js +41 -0
- package/company/assets/plugins/kanban/style.css +25 -0
- package/company/assets/plugins/kanban/transform.py +49 -0
- package/company/assets/plugins/timeline/plugin.yaml +17 -0
- package/company/assets/plugins/timeline/render.js +130 -0
- package/company/assets/plugins/timeline/style.css +58 -0
- package/company/assets/plugins/timeline/transform.py +35 -0
- package/company/assets/rooms/all_hands_room.yaml +7 -0
- package/company/assets/rooms/meeting_room_a.yaml +7 -0
- package/company/assets/rooms/project_room_1.yaml +7 -0
- package/company/assets/rooms/project_room_2.yaml +6 -0
- package/company/assets/rooms/project_room_3.yaml +6 -0
- package/company/assets/tools/README.md +205 -0
- package/company/assets/tools/background_removal/background_removal.py +158 -0
- package/company/assets/tools/background_removal/tool.yaml +9 -0
- package/company/assets/tools/gmail/gmail.py +372 -0
- package/company/assets/tools/gmail/mcp_server.py +294 -0
- package/company/assets/tools/gmail/templates/meeting_reminder.md +26 -0
- package/company/assets/tools/gmail/templates/weekly_report.md +31 -0
- package/company/assets/tools/gmail/tool.yaml +25 -0
- package/company/assets/tools/image_generation/image_generation.py +281 -0
- package/company/assets/tools/image_generation/tool.yaml +26 -0
- package/company/assets/tools/launch_template.sh +99 -0
- package/company/assets/tools/video_generation/tool.yaml +15 -0
- package/company/assets/tools/video_generation/video_generation.py +267 -0
- package/company/assets/tools/web_search/tool.yaml +12 -0
- package/company/assets/tools/web_search/web_search.py +90 -0
- package/company/company_culture.yaml +10 -0
- package/company/human_resource/avatars/angry_cactus.png +0 -0
- package/company/human_resource/avatars/ceo_boss.png +0 -0
- package/company/human_resource/avatars/chef_pig.png +0 -0
- package/company/human_resource/avatars/cool_penguin.png +0 -0
- package/company/human_resource/avatars/derpy_cat.png +0 -0
- package/company/human_resource/avatars/dizzy_ghost.png +0 -0
- package/company/human_resource/avatars/hazy_meerkat.png +0 -0
- package/company/human_resource/avatars/nerd_fox.png +0 -0
- package/company/human_resource/avatars/party_octopus.png +0 -0
- package/company/human_resource/avatars/shocked_robot.png +0 -0
- package/company/human_resource/avatars/sleepy_panda.png +0 -0
- package/company/human_resource/employees/00001/profile.yaml +25 -0
- package/company/human_resource/employees/00002/launch.sh +159 -0
- package/company/human_resource/employees/00002/manifest.json +88 -0
- package/company/human_resource/employees/00002/profile.yaml +26 -0
- package/company/human_resource/employees/00002/role_guide.md +28 -0
- package/company/human_resource/employees/00002/skills/hiring/SKILL.md +53 -0
- package/company/human_resource/employees/00002/skills/ontology/SKILL.md +226 -0
- package/company/human_resource/employees/00002/skills/ontology/references/queries.md +211 -0
- package/company/human_resource/employees/00002/skills/ontology/references/schema.md +322 -0
- package/company/human_resource/employees/00002/skills/ontology/scripts/ontology.py +374 -0
- package/company/human_resource/employees/00002/skills/people_management/SKILL.md +18 -0
- package/company/human_resource/employees/00002/skills/proactive-agent/SKILL.md +499 -0
- package/company/human_resource/employees/00002/skills/reviews/SKILL.md +50 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/README.md +136 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/SKILL.md +408 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/references/appendix.md +131 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/templates/correction-template.md +11 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/company/human_resource/employees/00002/skills/self-improving-agent/templates/validation-template.md +14 -0
- package/company/human_resource/employees/00002/skills/work-principles/SKILL.md +21 -0
- package/company/human_resource/employees/00002/work_principles.md +11 -0
- package/company/human_resource/employees/00003/guidance.yaml +16 -0
- package/company/human_resource/employees/00003/launch.sh +159 -0
- package/company/human_resource/employees/00003/manifest.json +69 -0
- package/company/human_resource/employees/00003/profile.yaml +26 -0
- package/company/human_resource/employees/00003/role_guide.md +38 -0
- package/company/human_resource/employees/00003/skills/ontology/SKILL.md +226 -0
- package/company/human_resource/employees/00003/skills/ontology/references/queries.md +211 -0
- package/company/human_resource/employees/00003/skills/ontology/references/schema.md +322 -0
- package/company/human_resource/employees/00003/skills/ontology/scripts/ontology.py +374 -0
- package/company/human_resource/employees/00003/skills/operations/SKILL.md +17 -0
- package/company/human_resource/employees/00003/skills/proactive-agent/SKILL.md +499 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/README.md +136 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/SKILL.md +408 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/references/appendix.md +131 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/templates/correction-template.md +11 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/company/human_resource/employees/00003/skills/self-improving-agent/templates/validation-template.md +14 -0
- package/company/human_resource/employees/00003/skills/strategy/SKILL.md +17 -0
- package/company/human_resource/employees/00003/skills/tool_management/SKILL.md +21 -0
- package/company/human_resource/employees/00003/skills/work-principles/SKILL.md +10 -0
- package/company/human_resource/employees/00003/work_principles.md +11 -0
- package/company/human_resource/employees/00004/launch.sh +159 -0
- package/company/human_resource/employees/00004/manifest.json +69 -0
- package/company/human_resource/employees/00004/profile.yaml +25 -0
- package/company/human_resource/employees/00004/role_guide.md +33 -0
- package/company/human_resource/employees/00004/skills/ontology/SKILL.md +226 -0
- package/company/human_resource/employees/00004/skills/ontology/references/queries.md +211 -0
- package/company/human_resource/employees/00004/skills/ontology/references/schema.md +322 -0
- package/company/human_resource/employees/00004/skills/ontology/scripts/ontology.py +374 -0
- package/company/human_resource/employees/00004/skills/proactive-agent/SKILL.md +499 -0
- package/company/human_resource/employees/00004/skills/project_management/SKILL.md +7 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/README.md +136 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/SKILL.md +408 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/references/appendix.md +131 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/templates/correction-template.md +11 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/company/human_resource/employees/00004/skills/self-improving-agent/templates/validation-template.md +14 -0
- package/company/human_resource/employees/00004/skills/task_analysis/SKILL.md +7 -0
- package/company/human_resource/employees/00004/skills/task_routing/SKILL.md +7 -0
- package/company/human_resource/employees/00004/skills/work-principles/SKILL.md +14 -0
- package/company/human_resource/employees/00004/work_principles.md +11 -0
- package/company/human_resource/employees/00005/launch.sh +159 -0
- package/company/human_resource/employees/00005/manifest.json +69 -0
- package/company/human_resource/employees/00005/profile.yaml +26 -0
- package/company/human_resource/employees/00005/role_guide.md +27 -0
- package/company/human_resource/employees/00005/skills/client_relations/SKILL.md +7 -0
- package/company/human_resource/employees/00005/skills/contract_review/SKILL.md +7 -0
- package/company/human_resource/employees/00005/skills/ontology/SKILL.md +226 -0
- package/company/human_resource/employees/00005/skills/ontology/references/queries.md +211 -0
- package/company/human_resource/employees/00005/skills/ontology/references/schema.md +322 -0
- package/company/human_resource/employees/00005/skills/ontology/scripts/ontology.py +374 -0
- package/company/human_resource/employees/00005/skills/proactive-agent/SKILL.md +499 -0
- package/company/human_resource/employees/00005/skills/sales_management/SKILL.md +7 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/README.md +136 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/SKILL.md +408 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/references/appendix.md +131 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/templates/correction-template.md +11 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/company/human_resource/employees/00005/skills/self-improving-agent/templates/validation-template.md +14 -0
- package/company/human_resource/employees/00005/skills/work-principles/SKILL.md +13 -0
- package/company/human_resource/employees/00005/work_principles.md +11 -0
- package/company/human_resource/employees/profile_template.yaml +52 -0
- package/company/human_resource/nicknames.txt +1000 -0
- package/company/human_resource/piggy.jpg +0 -0
- package/company/human_resource/sops/hr_operations_sop.md +42 -0
- package/company/human_resource/workflows/hiring_workflow.md +65 -0
- package/company/human_resource/workflows/offboarding_workflow.md +45 -0
- package/company/human_resource/workflows/onboarding_workflow.md +46 -0
- package/company/human_resource/workflows/project_intake_workflow.md +77 -0
- package/company/human_resource/workflows/project_retrospective_workflow.md +136 -0
- package/company/operations/sops/coo_delegation_sop.md +29 -0
- package/company/operations/sops/cso_sales_operations_sop.md +27 -0
- package/company/operations/sops/ea_dispatch_authority_sop.md +80 -0
- package/company/operations/sops/project_execution_sop.md +51 -0
- package/company/operations/sops/project_intake_sop.md +50 -0
- package/company/operations/sops/project_management_tracking.md +8 -0
- package/company/operations/sops/role_archetype_templates.md +34 -0
- package/company/operations/sops/self_verification_sop.md +18 -0
- package/company/operations/sops/task_dispatch_and_acceptance_sop.md +20 -0
- package/company/operations/sops/task_lifecycle_states.md +33 -0
- package/company/operations/sops/workflow_schema.md +66 -0
- package/company/sales/playbooks/external_comms/changelog.md +14 -0
- package/company/sales/playbooks/external_comms/external_comms_playbook.md +168 -0
- package/company/shared_prompts/Anti_Cloud_Acceptance_Training_v1.md +62 -0
- package/company/shared_prompts/Risk_Monitoring_and_Early_Warning_Guide.md +60 -0
- package/company/shared_prompts/code_engineering_standards.md +5 -0
- package/company/shared_prompts/efficiency.md +8 -0
- package/company/shared_prompts/frontend_code_engineering_standards.md +3 -0
- package/company/shared_prompts/model_downgrade_strategy.md +3 -0
- package/company/shared_prompts/oneonone_workspace_policy.md +6 -0
- package/company/shared_prompts/roblox_game_design.md.md +29 -0
- package/company/shared_prompts/task_flow_tracking_and_anomaly_monitoring.md +3 -0
- package/company/shared_prompts/tool_usage.md +39 -0
- package/company/shared_prompts/work_approach.md +29 -0
- package/config.yaml +19 -0
- package/frontend/app.js +9450 -0
- package/frontend/assets/office/tilesets/Modern tiles_Free/Interiors_free/32x32/Room_Builder_free_32x32.png +0 -0
- package/frontend/assets/office/tilesets/Modern_Office_Revamped_v1.2/1_Room_Builder_Office/Room_Builder_Office_32x32.png +0 -0
- package/frontend/assets/office/tilesets/Modern_Office_Revamped_v1.2/Modern_Office_32x32.png +0 -0
- package/frontend/assets/office/tilesets/generated/generated_overview.png +0 -0
- package/frontend/assets/office/tilesets/generated/generated_tiles_32x32.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/1_Interiors/32x32/Interiors_32x32.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/1_Interiors/32x32/Room_Builder_32x32.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_01.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_02.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_03.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_04.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_05.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_06.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_07.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_08.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_09.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_10.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_11.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_12.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_13.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_14.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_15.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_16.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_17.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_18.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_19.png +0 -0
- package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_20.png +0 -0
- package/frontend/ceo-terminal.js +324 -0
- package/frontend/conversation.js +219 -0
- package/frontend/floor-picker.html +745 -0
- package/frontend/index.html +748 -0
- package/frontend/office-camera.js +256 -0
- package/frontend/office-map.js +178 -0
- package/frontend/office-minimap.js +154 -0
- package/frontend/office-preview.html +467 -0
- package/frontend/office-tileatlas.js +309 -0
- package/frontend/office.js +1338 -0
- package/frontend/plugin-loader.js +99 -0
- package/frontend/resize-handler.js +160 -0
- package/frontend/screenshot.js +278 -0
- package/frontend/style.css +6256 -0
- package/frontend/task-tree-g6.js +924 -0
- package/frontend/trace-viewer.css +33 -0
- package/frontend/trace-viewer.js +97 -0
- package/frontend/types/events.d.ts +174 -0
- package/frontend/vendor/canvas2svg.js +394 -0
- package/frontend/xterm-log.js +322 -0
- package/package.json +9 -3
- package/pyproject.toml +74 -0
- package/src/onemancompany/__init__.py +0 -0
- package/src/onemancompany/agents/__init__.py +0 -0
- package/src/onemancompany/agents/base.py +1238 -0
- package/src/onemancompany/agents/common_tools.py +1928 -0
- package/src/onemancompany/agents/coo_agent.py +928 -0
- package/src/onemancompany/agents/cso_agent.py +273 -0
- package/src/onemancompany/agents/ea_agent.py +58 -0
- package/src/onemancompany/agents/hr_agent.py +450 -0
- package/src/onemancompany/agents/onboarding.py +1116 -0
- package/src/onemancompany/agents/product_tools.py +312 -0
- package/src/onemancompany/agents/prompt_builder.py +63 -0
- package/src/onemancompany/agents/recruitment.py +748 -0
- package/src/onemancompany/agents/termination.py +137 -0
- package/src/onemancompany/agents/tool_results.py +59 -0
- package/src/onemancompany/agents/tree_tools.py +833 -0
- package/src/onemancompany/api/__init__.py +0 -0
- package/src/onemancompany/api/routes.py +7401 -0
- package/src/onemancompany/api/websocket.py +65 -0
- package/src/onemancompany/core/__init__.py +0 -0
- package/src/onemancompany/core/agent_loop.py +45 -0
- package/src/onemancompany/core/announcements.py +65 -0
- package/src/onemancompany/core/async_utils.py +36 -0
- package/src/onemancompany/core/auth_apply/__init__.py +74 -0
- package/src/onemancompany/core/auth_apply/api_key.py +79 -0
- package/src/onemancompany/core/auth_choices.py +118 -0
- package/src/onemancompany/core/auth_verify.py +124 -0
- package/src/onemancompany/core/automation.py +579 -0
- package/src/onemancompany/core/background_tasks.py +377 -0
- package/src/onemancompany/core/ceo_executor.py +98 -0
- package/src/onemancompany/core/claude_session.py +900 -0
- package/src/onemancompany/core/config.py +1133 -0
- package/src/onemancompany/core/conversation.py +702 -0
- package/src/onemancompany/core/conversation_adapters.py +305 -0
- package/src/onemancompany/core/conversation_hooks.py +191 -0
- package/src/onemancompany/core/default_vessel.yaml +23 -0
- package/src/onemancompany/core/drift_detector.py +91 -0
- package/src/onemancompany/core/errors.py +145 -0
- package/src/onemancompany/core/event_models.py +161 -0
- package/src/onemancompany/core/events.py +70 -0
- package/src/onemancompany/core/file_editor.py +206 -0
- package/src/onemancompany/core/heartbeat.py +327 -0
- package/src/onemancompany/core/interval.py +30 -0
- package/src/onemancompany/core/journal.py +111 -0
- package/src/onemancompany/core/layout.py +426 -0
- package/src/onemancompany/core/llm_trace.py +220 -0
- package/src/onemancompany/core/llm_utils.py +56 -0
- package/src/onemancompany/core/meeting_minutes.py +82 -0
- package/src/onemancompany/core/model_costs.py +89 -0
- package/src/onemancompany/core/models.py +333 -0
- package/src/onemancompany/core/oauth.py +459 -0
- package/src/onemancompany/core/plugin_registry.py +139 -0
- package/src/onemancompany/core/product.py +799 -0
- package/src/onemancompany/core/product_triggers.py +620 -0
- package/src/onemancompany/core/project_archive.py +958 -0
- package/src/onemancompany/core/resolutions.py +327 -0
- package/src/onemancompany/core/routine.py +2736 -0
- package/src/onemancompany/core/runtime_context.py +20 -0
- package/src/onemancompany/core/safe_execute.py +81 -0
- package/src/onemancompany/core/self_hosted.py +27 -0
- package/src/onemancompany/core/skill_hooks.py +540 -0
- package/src/onemancompany/core/snapshot.py +136 -0
- package/src/onemancompany/core/standalone_runner.py +312 -0
- package/src/onemancompany/core/state.py +381 -0
- package/src/onemancompany/core/store.py +772 -0
- package/src/onemancompany/core/subprocess_executor.py +153 -0
- package/src/onemancompany/core/sync_tick.py +46 -0
- package/src/onemancompany/core/system_cron.py +579 -0
- package/src/onemancompany/core/system_tasks.py +66 -0
- package/src/onemancompany/core/task_contract.py +41 -0
- package/src/onemancompany/core/task_lifecycle.py +200 -0
- package/src/onemancompany/core/task_persistence.py +188 -0
- package/src/onemancompany/core/task_tree.py +639 -0
- package/src/onemancompany/core/task_verification.py +228 -0
- package/src/onemancompany/core/tool_limits.py +69 -0
- package/src/onemancompany/core/tool_registry.py +382 -0
- package/src/onemancompany/core/tree_manager.py +148 -0
- package/src/onemancompany/core/update_checker.py +82 -0
- package/src/onemancompany/core/vessel.py +3783 -0
- package/src/onemancompany/core/vessel_config.py +217 -0
- package/src/onemancompany/core/vessel_harness.py +122 -0
- package/src/onemancompany/core/workflow_engine.py +347 -0
- package/src/onemancompany/default_skills/ontology/SKILL.md +227 -0
- package/src/onemancompany/default_skills/ontology/references/queries.md +211 -0
- package/src/onemancompany/default_skills/ontology/references/schema.md +322 -0
- package/src/onemancompany/default_skills/ontology/scripts/ontology.py +374 -0
- package/src/onemancompany/default_skills/proactive-agent/SKILL.md +500 -0
- package/src/onemancompany/default_skills/product-review/SKILL.md +39 -0
- package/src/onemancompany/default_skills/project-brainstorming/SKILL.md +133 -0
- package/src/onemancompany/default_skills/self-improving-agent/README.md +136 -0
- package/src/onemancompany/default_skills/self-improving-agent/SKILL.md +409 -0
- package/src/onemancompany/default_skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/src/onemancompany/default_skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/src/onemancompany/default_skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/src/onemancompany/default_skills/self-improving-agent/hooks/session-logger.sh +31 -0
- package/src/onemancompany/default_skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/src/onemancompany/default_skills/self-improving-agent/references/appendix.md +131 -0
- package/src/onemancompany/default_skills/self-improving-agent/templates/correction-template.md +11 -0
- package/src/onemancompany/default_skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/src/onemancompany/default_skills/self-improving-agent/templates/validation-template.md +14 -0
- package/src/onemancompany/default_skills/task_lifecycle/SKILL.md +35 -0
- package/src/onemancompany/main.py +723 -0
- package/src/onemancompany/onboard.py +1109 -0
- package/src/onemancompany/talent_market/AI_CODER_GUIDE.md +453 -0
- package/src/onemancompany/talent_market/README.md +763 -0
- package/src/onemancompany/talent_market/__init__.py +0 -0
- package/src/onemancompany/talent_market/default_skills/ontology/SKILL.md +226 -0
- package/src/onemancompany/talent_market/default_skills/ontology/references/queries.md +211 -0
- package/src/onemancompany/talent_market/default_skills/ontology/references/schema.md +322 -0
- package/src/onemancompany/talent_market/default_skills/ontology/scripts/ontology.py +374 -0
- package/src/onemancompany/talent_market/default_skills/proactive-agent/SKILL.md +499 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/README.md +136 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/SKILL.md +408 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/references/appendix.md +131 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/templates/correction-template.md +11 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/src/onemancompany/talent_market/default_skills/self-improving-agent/templates/validation-template.md +14 -0
- package/src/onemancompany/talent_market/remote_protocol.py +63 -0
- package/src/onemancompany/talent_market/remote_worker_base.py +166 -0
- package/src/onemancompany/talent_market/standalone_runner.py +276 -0
- package/src/onemancompany/talent_market/talent_spec.py +342 -0
- package/src/onemancompany/talent_market/talents/__init__.py +0 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/DESCRIPTION.md +27 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/avatar.svg +4 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/launch.sh +79 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/profile.yaml +28 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/SKILL.md +226 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/references/queries.md +211 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/references/schema.md +322 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/scripts/ontology.py +374 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/proactive-agent/SKILL.md +499 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/README.md +136 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/SKILL.md +408 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/references/appendix.md +131 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/templates/correction-template.md +11 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/templates/validation-template.md +14 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/tools/.mcp.json +11 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/tools/bash-executor/TOOL.md +15 -0
- package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/tools/filesystem/TOOL.md +15 -0
- package/src/onemancompany/talent_market/talents/general-assistant/launch.sh +79 -0
- package/src/onemancompany/talent_market/talents/general-assistant/profile.yaml +27 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/SKILL.md +226 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/references/queries.md +211 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/references/schema.md +322 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/scripts/ontology.py +374 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/proactive-agent/SKILL.md +499 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/README.md +136 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/SKILL.md +408 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/hooks/post-bash.sh +10 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/hooks/session-end.sh +4 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/references/appendix.md +131 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/templates/correction-template.md +11 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/templates/pattern-template.md +15 -0
- package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/templates/validation-template.md +14 -0
- package/src/onemancompany/talent_market/talents/general-assistant/tools/manifest.yaml +12 -0
- package/src/onemancompany/talent_market/talents/openclaw/launch.sh +159 -0
- package/src/onemancompany/talent_market/talents/openclaw/manifest.json +45 -0
- package/src/onemancompany/talent_market/talents/openclaw/profile.yaml +30 -0
- package/src/onemancompany/talent_market/talents/openclaw/skills/multi-channel-comms/SKILL.md +34 -0
- package/src/onemancompany/tools/__init__.py +3 -0
- package/src/onemancompany/tools/mcp/__init__.py +1 -0
- package/src/onemancompany/tools/mcp/config_builder.py +94 -0
- package/src/onemancompany/tools/mcp/server.py +168 -0
- package/src/onemancompany/tools/sandbox/__init__.py +392 -0
- package/src/utils/trace_visualizer.py +718 -0
- package/uv.lock +2206 -0
package/bin/cli.js
CHANGED
|
@@ -289,11 +289,15 @@ ${green("What gets installed automatically:")}
|
|
|
289
289
|
let cliVersion = "unknown";
|
|
290
290
|
try {
|
|
291
291
|
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf-8"));
|
|
292
|
-
if (pkg.version) cliVersion = pkg.version;
|
|
293
|
-
} catch {}
|
|
294
|
-
|
|
295
|
-
// ── Check
|
|
296
|
-
if (
|
|
292
|
+
if (pkg.version && /^\d+\.\d+\.\d+$/.test(pkg.version)) cliVersion = pkg.version;
|
|
293
|
+
} catch { warn("Failed to read package version"); }
|
|
294
|
+
|
|
295
|
+
// ── Check prerequisites ────────────────────────────────────────────────
|
|
296
|
+
// Git is only needed if bundled source is missing (fallback clone path)
|
|
297
|
+
const npmPkgRoot = path.join(__dirname, "..");
|
|
298
|
+
const sourceIsBundled = fs.existsSync(path.join(npmPkgRoot, "pyproject.toml"))
|
|
299
|
+
&& fs.existsSync(path.join(npmPkgRoot, "src"));
|
|
300
|
+
if (!sourceIsBundled && !commandExists("git")) {
|
|
297
301
|
fail(
|
|
298
302
|
"Git is required but not found.\n" +
|
|
299
303
|
(isWindows
|
|
@@ -320,39 +324,46 @@ ${green("What gets installed automatically:")}
|
|
|
320
324
|
}
|
|
321
325
|
}
|
|
322
326
|
|
|
323
|
-
// ──
|
|
327
|
+
// ── Install or update ──────────────────────────────────────────────────
|
|
328
|
+
// The npm package bundles the full source. Copy it to installDir.
|
|
329
|
+
// Only fall back to git clone if source is missing (shouldn't happen).
|
|
330
|
+
const SOURCE_ITEMS = ["src", "frontend", "company", "pyproject.toml", "config.yaml", "uv.lock"];
|
|
324
331
|
const wantUpdate = passthrough.includes("--update");
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
+
|
|
333
|
+
function copyItems(items, destRoot) {
|
|
334
|
+
for (const item of items) {
|
|
335
|
+
const src = path.join(npmPkgRoot, item);
|
|
336
|
+
const dest = path.join(destRoot, item);
|
|
337
|
+
if (fs.existsSync(src)) {
|
|
338
|
+
if (fs.existsSync(dest)) fs.rmSync(dest, { recursive: true, force: true });
|
|
339
|
+
fs.cpSync(src, dest, { recursive: true });
|
|
332
340
|
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (fs.existsSync(installDir)) {
|
|
345
|
+
if (wantUpdate && sourceIsBundled) {
|
|
346
|
+
info(`Updating installation to v${cliVersion}...`);
|
|
347
|
+
copyItems(SOURCE_ITEMS, installDir);
|
|
348
|
+
} else if (wantUpdate && !sourceIsBundled) {
|
|
349
|
+
warn("Update requested but bundled source not found — cannot update");
|
|
333
350
|
} else {
|
|
334
351
|
info(`Using existing installation at ${installDir}`);
|
|
335
352
|
}
|
|
336
|
-
} else if (
|
|
337
|
-
info(`
|
|
353
|
+
} else if (sourceIsBundled) {
|
|
354
|
+
info(`Installing OneManCompany v${cliVersion} into ${installDir}...`);
|
|
355
|
+
fs.mkdirSync(installDir, { recursive: true });
|
|
356
|
+
copyItems(SOURCE_ITEMS, installDir);
|
|
338
357
|
} else {
|
|
358
|
+
// Fallback: no bundled source (broken package?) — clone from git
|
|
339
359
|
info(`Cloning OneManCompany into ${installDir}...`);
|
|
340
|
-
// Skip LFS files (demo videos etc.) — not needed for running the app
|
|
341
360
|
const cloneEnv = { ...process.env, GIT_LFS_SKIP_SMUDGE: "1" };
|
|
342
361
|
run(`git clone --depth 1 ${REPO_URL} "${installDir}"`, { env: cloneEnv });
|
|
343
362
|
}
|
|
344
363
|
|
|
345
|
-
// ── Read actual version from repo (may differ from npm package) ──────
|
|
346
|
-
let appVersion = cliVersion;
|
|
347
|
-
try {
|
|
348
|
-
const pyproject = fs.readFileSync(path.join(installDir, "pyproject.toml"), "utf-8");
|
|
349
|
-
const verMatch = pyproject.match(/^version\s*=\s*"([^"]+)"/m);
|
|
350
|
-
if (verMatch) appVersion = verMatch[1];
|
|
351
|
-
} catch {}
|
|
352
|
-
|
|
353
364
|
// ── Banner (after real version is known) ───────────────────────────
|
|
354
365
|
console.log();
|
|
355
|
-
const verTag = `v${
|
|
366
|
+
const verTag = `v${cliVersion}`;
|
|
356
367
|
const title = `OneManCompany — AI Company OS ${verTag}`;
|
|
357
368
|
const pad = Math.max(0, 44 - title.length);
|
|
358
369
|
console.log(cyan("╔═══════════════════════════════════════════════╗"));
|
|
@@ -531,7 +542,7 @@ ${green("What gets installed automatically:")}
|
|
|
531
542
|
|
|
532
543
|
if (debugMode) {
|
|
533
544
|
// ── Foreground mode: show logs, Ctrl+C to kill ──────────────────
|
|
534
|
-
info(`Starting OneManCompany v${
|
|
545
|
+
info(`Starting OneManCompany v${cliVersion} in debug mode (Ctrl+C to stop)...\n`);
|
|
535
546
|
const child = spawn(pythonBin, ["-m", "onemancompany.main", ...launchArgs], {
|
|
536
547
|
cwd: installDir,
|
|
537
548
|
stdio: "inherit",
|
|
@@ -547,7 +558,7 @@ ${green("What gets installed automatically:")}
|
|
|
547
558
|
process.on("SIGTERM", () => { child.kill("SIGTERM"); });
|
|
548
559
|
} else {
|
|
549
560
|
// ── Background mode: detach and exit CLI ────────────────────────
|
|
550
|
-
info(`Starting OneManCompany v${
|
|
561
|
+
info(`Starting OneManCompany v${cliVersion} in background...`);
|
|
551
562
|
const logFile = path.join(installDir, ".onemancompany", "server.log");
|
|
552
563
|
// Ensure log directory exists
|
|
553
564
|
const logDir = path.dirname(logFile);
|
|
@@ -570,7 +581,7 @@ ${green("What gets installed automatically:")}
|
|
|
570
581
|
await new Promise((r) => setTimeout(r, 5000));
|
|
571
582
|
if (isProcessRunning(child.pid)) {
|
|
572
583
|
console.log();
|
|
573
|
-
console.log(green(` ✓ OneManCompany v${
|
|
584
|
+
console.log(green(` ✓ OneManCompany v${cliVersion} is running!`));
|
|
574
585
|
console.log();
|
|
575
586
|
console.log(` ${cyan("→")} Open ${cyan("http://localhost:8000")} in your browser`);
|
|
576
587
|
console.log(` ${dim(" Logs:")} ${logFile}`);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
id: kanban
|
|
2
|
+
name: "Kanban"
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: "Kanban board view"
|
|
5
|
+
author: "OneManCompany"
|
|
6
|
+
builtin: true
|
|
7
|
+
view_type: project_tab
|
|
8
|
+
order: 10
|
|
9
|
+
icon: "📋"
|
|
10
|
+
backend:
|
|
11
|
+
module: transform
|
|
12
|
+
function: transform
|
|
13
|
+
frontend:
|
|
14
|
+
script: render.js
|
|
15
|
+
style: style.css
|
|
16
|
+
render_function: renderKanban
|
|
17
|
+
data_requires: [dispatches, employees]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kanban board plugin — render function
|
|
3
|
+
*/
|
|
4
|
+
function renderKanban(container, data, ctx) {
|
|
5
|
+
const escHtml = ctx.escHtml;
|
|
6
|
+
const columns = data.columns || {};
|
|
7
|
+
const phases = data.phases || [];
|
|
8
|
+
|
|
9
|
+
// Phase summary
|
|
10
|
+
let phaseHtml = '';
|
|
11
|
+
if (phases.length > 0) {
|
|
12
|
+
phaseHtml = '<div style="margin-bottom:4px;font-size:5px;color:var(--text-dim);">';
|
|
13
|
+
for (const p of phases) {
|
|
14
|
+
const pctDone = p.total > 0 ? Math.round((p.completed / p.total) * 100) : 0;
|
|
15
|
+
phaseHtml += `<span style="margin-right:6px;">P${p.phase}: ${p.completed}/${p.total} (${pctDone}%)</span>`;
|
|
16
|
+
}
|
|
17
|
+
phaseHtml += '</div>';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const statusLabels = { pending: 'Pending', in_progress: 'In Progress', completed: 'Completed' };
|
|
21
|
+
let boardHtml = '<div class="kanban-board">';
|
|
22
|
+
for (const status of ['pending', 'in_progress', 'completed']) {
|
|
23
|
+
const cards = columns[status] || [];
|
|
24
|
+
boardHtml += `<div class="kanban-column">`;
|
|
25
|
+
boardHtml += `<div class="kanban-column-title">${statusLabels[status]} (${cards.length})</div>`;
|
|
26
|
+
if (cards.length === 0) {
|
|
27
|
+
boardHtml += `<div style="font-size:4px;color:var(--text-dim);text-align:center;padding:4px;">-</div>`;
|
|
28
|
+
}
|
|
29
|
+
for (const card of cards) {
|
|
30
|
+
boardHtml += `<div class="kanban-card" data-phase="${card.phase}">`;
|
|
31
|
+
boardHtml += `<div class="card-employee">${escHtml(card.employee_name)}</div>`;
|
|
32
|
+
boardHtml += `<div class="card-desc">${escHtml(card.description)}</div>`;
|
|
33
|
+
boardHtml += `<span class="card-phase">P${card.phase}</span>`;
|
|
34
|
+
boardHtml += `</div>`;
|
|
35
|
+
}
|
|
36
|
+
boardHtml += `</div>`;
|
|
37
|
+
}
|
|
38
|
+
boardHtml += '</div>';
|
|
39
|
+
|
|
40
|
+
container.innerHTML = phaseHtml + boardHtml;
|
|
41
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* Kanban Board Plugin */
|
|
2
|
+
.kanban-board { display: flex; gap: 6px; min-height: 100px; }
|
|
3
|
+
.kanban-column { flex: 1; background: var(--bg-panel); padding: 6px; border-radius: 3px; }
|
|
4
|
+
.kanban-column-title {
|
|
5
|
+
font-size: 8px; color: var(--text-dim);
|
|
6
|
+
text-align: center; margin-bottom: 6px;
|
|
7
|
+
padding-bottom: 4px; border-bottom: 1px solid var(--border);
|
|
8
|
+
}
|
|
9
|
+
.kanban-card {
|
|
10
|
+
background: var(--bg-dark);
|
|
11
|
+
padding: 4px 5px; margin-bottom: 4px;
|
|
12
|
+
border-radius: 2px; font-size: 7px;
|
|
13
|
+
border-left: 3px solid var(--pixel-cyan);
|
|
14
|
+
}
|
|
15
|
+
.kanban-card .card-employee { color: var(--pixel-cyan); font-weight: bold; }
|
|
16
|
+
.kanban-card .card-desc { color: var(--pixel-white); margin-top: 2px; }
|
|
17
|
+
.kanban-card .card-phase {
|
|
18
|
+
display: inline-block; background: var(--pixel-cyan);
|
|
19
|
+
color: var(--bg-dark); padding: 1px 3px;
|
|
20
|
+
font-size: 6px; border-radius: 2px; margin-top: 2px;
|
|
21
|
+
}
|
|
22
|
+
.kanban-card[data-phase="1"] { border-left-color: #00ddff; }
|
|
23
|
+
.kanban-card[data-phase="2"] { border-left-color: #ffdd00; }
|
|
24
|
+
.kanban-card[data-phase="3"] { border-left-color: #ff4455; }
|
|
25
|
+
.kanban-card[data-phase="4"] { border-left-color: #51cf66; }
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Kanban board data transformer."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def transform(dispatches: list[dict], context: dict) -> dict:
|
|
7
|
+
"""Transform dispatches into kanban board columns + phase summary.
|
|
8
|
+
|
|
9
|
+
Returns:
|
|
10
|
+
{"columns": {status: [cards]}, "phases": [{phase, total, completed}]}
|
|
11
|
+
"""
|
|
12
|
+
employees = context.get("employees", {})
|
|
13
|
+
|
|
14
|
+
# Group by status
|
|
15
|
+
columns: dict[str, list[dict]] = {"pending": [], "in_progress": [], "completed": []}
|
|
16
|
+
for d in dispatches:
|
|
17
|
+
status = d.get("status", "in_progress")
|
|
18
|
+
emp_id = d.get("employee_id", "")
|
|
19
|
+
emp = employees.get(emp_id, {})
|
|
20
|
+
emp_name = emp.get("nickname") or emp.get("name") or emp_id
|
|
21
|
+
|
|
22
|
+
card = {
|
|
23
|
+
"dispatch_id": d.get("dispatch_id", ""),
|
|
24
|
+
"employee_id": emp_id,
|
|
25
|
+
"employee_name": emp_name,
|
|
26
|
+
"description": d.get("description", "")[:100],
|
|
27
|
+
"phase": d.get("phase", 1),
|
|
28
|
+
"dispatched_at": d.get("dispatched_at"),
|
|
29
|
+
"completed_at": d.get("completed_at"),
|
|
30
|
+
}
|
|
31
|
+
if status in columns:
|
|
32
|
+
columns[status].append(card)
|
|
33
|
+
else:
|
|
34
|
+
columns.setdefault(status, []).append(card)
|
|
35
|
+
|
|
36
|
+
# Phase summary
|
|
37
|
+
phases: dict[int, dict] = {}
|
|
38
|
+
for d in dispatches:
|
|
39
|
+
p = d.get("phase", 1)
|
|
40
|
+
if p not in phases:
|
|
41
|
+
phases[p] = {"total": 0, "completed": 0}
|
|
42
|
+
phases[p]["total"] += 1
|
|
43
|
+
if d.get("status") == "completed":
|
|
44
|
+
phases[p]["completed"] += 1
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
"columns": columns,
|
|
48
|
+
"phases": [{"phase": p, **v} for p, v in sorted(phases.items())],
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
id: timeline
|
|
2
|
+
name: "Timeline"
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: "Timeline view"
|
|
5
|
+
author: "OneManCompany"
|
|
6
|
+
builtin: true
|
|
7
|
+
view_type: project_tab
|
|
8
|
+
order: 20
|
|
9
|
+
icon: "⏱"
|
|
10
|
+
backend:
|
|
11
|
+
module: transform
|
|
12
|
+
function: transform
|
|
13
|
+
frontend:
|
|
14
|
+
script: render.js
|
|
15
|
+
style: style.css
|
|
16
|
+
render_function: renderTimeline
|
|
17
|
+
data_requires: [dispatches, employees]
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeline view plugin — render function
|
|
3
|
+
* Enhanced: task type coloring, status indication, dependency arrows, estimated duration
|
|
4
|
+
*/
|
|
5
|
+
function renderTimeline(container, data, ctx) {
|
|
6
|
+
const escHtml = ctx.escHtml;
|
|
7
|
+
const timeline = data.timeline || [];
|
|
8
|
+
|
|
9
|
+
if (timeline.length === 0) {
|
|
10
|
+
container.innerHTML = '<div style="color:var(--text-dim);font-size:6px;padding:8px;">No dispatches with timing data yet</div>';
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Task type color map
|
|
15
|
+
const typeColors = {
|
|
16
|
+
execution: '#00ddff',
|
|
17
|
+
acceptance: '#ffdd00',
|
|
18
|
+
ea_review: '#ff9900',
|
|
19
|
+
rectification: '#ff4455',
|
|
20
|
+
hiring: '#51cf66',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const typeLabels = {
|
|
24
|
+
execution: 'Exec',
|
|
25
|
+
acceptance: 'Accept',
|
|
26
|
+
ea_review: 'EA',
|
|
27
|
+
rectification: 'Fix',
|
|
28
|
+
hiring: 'Hire',
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Calculate time range
|
|
32
|
+
const starts = timeline.map(t => new Date(t.start).getTime());
|
|
33
|
+
const ends = timeline.map(t => t.end ? new Date(t.end).getTime() : Date.now());
|
|
34
|
+
const minTime = Math.min(...starts);
|
|
35
|
+
const maxTime = Math.max(...ends);
|
|
36
|
+
const range = maxTime - minTime || 1;
|
|
37
|
+
|
|
38
|
+
// Build a dispatch_id -> index map for dependency arrows
|
|
39
|
+
const idxMap = {};
|
|
40
|
+
timeline.forEach((t, i) => { if (t.dispatch_id) idxMap[t.dispatch_id] = i; });
|
|
41
|
+
|
|
42
|
+
let html = '<div class="timeline-view" style="position:relative;">';
|
|
43
|
+
|
|
44
|
+
// SVG overlay for dependency arrows
|
|
45
|
+
const rowHeight = 22; // must match CSS .timeline-row height + margin
|
|
46
|
+
const svgHeight = timeline.length * rowHeight;
|
|
47
|
+
html += `<svg class="timeline-dep-arrows" style="position:absolute;top:0;left:60px;right:35px;height:${svgHeight}px;pointer-events:none;overflow:visible;">`;
|
|
48
|
+
|
|
49
|
+
// Collect arrow data
|
|
50
|
+
const arrows = [];
|
|
51
|
+
timeline.forEach((t, i) => {
|
|
52
|
+
const deps = t.depends_on || [];
|
|
53
|
+
for (const depId of deps) {
|
|
54
|
+
if (depId in idxMap) {
|
|
55
|
+
arrows.push({ from: idxMap[depId], to: i });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
for (const arrow of arrows) {
|
|
61
|
+
const fromT = timeline[arrow.from];
|
|
62
|
+
const toT = timeline[arrow.to];
|
|
63
|
+
const fromEndMs = fromT.end ? new Date(fromT.end).getTime() : Date.now();
|
|
64
|
+
const toStartMs = new Date(toT.start).getTime();
|
|
65
|
+
const x1Pct = ((fromEndMs - minTime) / range) * 100;
|
|
66
|
+
const x2Pct = ((toStartMs - minTime) / range) * 100;
|
|
67
|
+
const y1 = arrow.from * rowHeight + rowHeight / 2;
|
|
68
|
+
const y2 = arrow.to * rowHeight + rowHeight / 2;
|
|
69
|
+
html += `<line x1="${x1Pct}%" y1="${y1}" x2="${x2Pct}%" y2="${y2}" class="dep-arrow-line"/>`;
|
|
70
|
+
// Arrowhead
|
|
71
|
+
html += `<circle cx="${x2Pct}%" cy="${y2}" r="2" class="dep-arrow-head"/>`;
|
|
72
|
+
}
|
|
73
|
+
html += '</svg>';
|
|
74
|
+
|
|
75
|
+
for (const t of timeline) {
|
|
76
|
+
const startMs = new Date(t.start).getTime();
|
|
77
|
+
const endMs = t.end ? new Date(t.end).getTime() : Date.now();
|
|
78
|
+
const left = ((startMs - minTime) / range) * 100;
|
|
79
|
+
const width = Math.max(((endMs - startMs) / range) * 100, 2);
|
|
80
|
+
const durationMin = Math.round((endMs - startMs) / 60000);
|
|
81
|
+
const durationStr = durationMin < 60 ? `${durationMin}m` : `${Math.round(durationMin / 60)}h`;
|
|
82
|
+
|
|
83
|
+
const taskType = t.task_type || 'execution';
|
|
84
|
+
const color = typeColors[taskType] || '#00ddff';
|
|
85
|
+
const status = t.status || (t.end ? 'completed' : 'in_progress');
|
|
86
|
+
|
|
87
|
+
// Status CSS class
|
|
88
|
+
let statusClass = '';
|
|
89
|
+
if (status === 'in_progress') statusClass = ' timeline-bar--running';
|
|
90
|
+
else if (status === 'pending') statusClass = ' timeline-bar--pending';
|
|
91
|
+
|
|
92
|
+
// Build bar tooltip
|
|
93
|
+
const typeLabel = typeLabels[taskType] || taskType;
|
|
94
|
+
const tooltip = `[${typeLabel}] ${t.description}`;
|
|
95
|
+
|
|
96
|
+
html += `<div class="timeline-row">`;
|
|
97
|
+
html += `<div class="timeline-label" title="${escHtml(t.employee_name)}">${escHtml(t.employee_name)}</div>`;
|
|
98
|
+
html += `<div class="timeline-bar-container">`;
|
|
99
|
+
|
|
100
|
+
// Estimated duration bar (ghost/comparison)
|
|
101
|
+
if (t.estimated_duration_min && t.estimated_duration_min > 0) {
|
|
102
|
+
const estMs = t.estimated_duration_min * 60000;
|
|
103
|
+
const estWidth = Math.max(((estMs) / range) * 100, 2);
|
|
104
|
+
html += `<div class="timeline-bar timeline-bar--estimated" style="left:${left.toFixed(1)}%;width:${estWidth.toFixed(1)}%;background:${color};" title="Estimated: ${t.estimated_duration_min}min"></div>`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Actual bar
|
|
108
|
+
html += `<div class="timeline-bar${statusClass}" data-type="${taskType}" style="left:${left.toFixed(1)}%;width:${width.toFixed(1)}%;background:${color};" title="${escHtml(tooltip)}"></div>`;
|
|
109
|
+
html += `</div>`;
|
|
110
|
+
|
|
111
|
+
const statusText = status === 'in_progress' ? 'running' : (t.end ? durationStr : 'pending');
|
|
112
|
+
html += `<div class="timeline-duration">${statusText}</div>`;
|
|
113
|
+
html += `</div>`;
|
|
114
|
+
}
|
|
115
|
+
html += '</div>';
|
|
116
|
+
|
|
117
|
+
// Task type legend
|
|
118
|
+
const usedTypes = [...new Set(timeline.map(t => t.task_type || 'execution'))];
|
|
119
|
+
if (usedTypes.length > 0) {
|
|
120
|
+
html += '<div style="font-size:4px;color:var(--text-dim);margin-top:4px;">';
|
|
121
|
+
for (const tt of usedTypes) {
|
|
122
|
+
const c = typeColors[tt] || '#888';
|
|
123
|
+
const label = typeLabels[tt] || tt;
|
|
124
|
+
html += `<span style="margin-right:6px;"><span style="display:inline-block;width:6px;height:4px;background:${c};margin-right:2px;vertical-align:middle;"></span>${label}</span>`;
|
|
125
|
+
}
|
|
126
|
+
html += '</div>';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
container.innerHTML = html;
|
|
130
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/* Timeline View Plugin */
|
|
2
|
+
.timeline-view { padding: 6px; position: relative; }
|
|
3
|
+
.timeline-row { display: flex; align-items: center; margin-bottom: 4px; font-size: 8px; height: 18px; }
|
|
4
|
+
.timeline-label { width: 60px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
5
|
+
.timeline-bar-container { flex: 1; height: 14px; background: var(--bg-panel); position: relative; border-radius: 2px; }
|
|
6
|
+
.timeline-bar {
|
|
7
|
+
position: absolute; height: 100%; border-radius: 2px;
|
|
8
|
+
min-width: 3px;
|
|
9
|
+
}
|
|
10
|
+
.timeline-duration { width: 35px; text-align: right; color: var(--text-dim); font-size: 7px; }
|
|
11
|
+
|
|
12
|
+
/* Task type colors (via data-type attribute) */
|
|
13
|
+
.timeline-bar[data-type="execution"] { background: #00ddff; }
|
|
14
|
+
.timeline-bar[data-type="acceptance"] { background: #ffdd00; }
|
|
15
|
+
.timeline-bar[data-type="ea_review"] { background: #ff9900; }
|
|
16
|
+
.timeline-bar[data-type="rectification"] { background: #ff4455; }
|
|
17
|
+
.timeline-bar[data-type="hiring"] { background: #51cf66; }
|
|
18
|
+
|
|
19
|
+
/* Legacy phase colors (fallback) */
|
|
20
|
+
.timeline-bar[data-phase="1"] { background: #00ddff; }
|
|
21
|
+
.timeline-bar[data-phase="2"] { background: #ffdd00; }
|
|
22
|
+
.timeline-bar[data-phase="3"] { background: #ff4455; }
|
|
23
|
+
.timeline-bar[data-phase="4"] { background: #51cf66; }
|
|
24
|
+
|
|
25
|
+
/* Status: running — pulsing animation */
|
|
26
|
+
.timeline-bar--running {
|
|
27
|
+
animation: timeline-pulse 1.5s ease-in-out infinite;
|
|
28
|
+
}
|
|
29
|
+
@keyframes timeline-pulse {
|
|
30
|
+
0%, 100% { opacity: 1; }
|
|
31
|
+
50% { opacity: 0.5; }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Status: pending — dashed outline, no fill */
|
|
35
|
+
.timeline-bar--pending {
|
|
36
|
+
background: transparent !important;
|
|
37
|
+
border: 1px dashed currentColor;
|
|
38
|
+
opacity: 0.5;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Estimated duration ghost bar */
|
|
42
|
+
.timeline-bar--estimated {
|
|
43
|
+
opacity: 0.15;
|
|
44
|
+
z-index: 0;
|
|
45
|
+
pointer-events: none;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Dependency arrows (SVG) */
|
|
49
|
+
.dep-arrow-line {
|
|
50
|
+
stroke: var(--text-dim, #666);
|
|
51
|
+
stroke-width: 1;
|
|
52
|
+
stroke-dasharray: 3 2;
|
|
53
|
+
opacity: 0.6;
|
|
54
|
+
}
|
|
55
|
+
.dep-arrow-head {
|
|
56
|
+
fill: var(--text-dim, #666);
|
|
57
|
+
opacity: 0.6;
|
|
58
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Timeline view data transformer."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def transform(dispatches: list[dict], context: dict) -> dict:
|
|
7
|
+
"""Transform dispatches into timeline data.
|
|
8
|
+
|
|
9
|
+
Returns:
|
|
10
|
+
{"timeline": [{dispatch_id, employee_name, description, phase, start, end}]}
|
|
11
|
+
"""
|
|
12
|
+
employees = context.get("employees", {})
|
|
13
|
+
|
|
14
|
+
timeline = []
|
|
15
|
+
for d in dispatches:
|
|
16
|
+
if d.get("dispatched_at"):
|
|
17
|
+
emp_id = d.get("employee_id", "")
|
|
18
|
+
emp = employees.get(emp_id, {})
|
|
19
|
+
emp_name = emp.get("nickname") or emp.get("name") or emp_id
|
|
20
|
+
timeline.append({
|
|
21
|
+
"dispatch_id": d.get("dispatch_id", ""),
|
|
22
|
+
"employee_id": emp_id,
|
|
23
|
+
"employee_name": emp_name,
|
|
24
|
+
"description": d.get("description", "")[:60],
|
|
25
|
+
"phase": d.get("phase", 1),
|
|
26
|
+
"start": d.get("dispatched_at"),
|
|
27
|
+
"end": d.get("completed_at"),
|
|
28
|
+
"task_type": d.get("task_type", "execution"),
|
|
29
|
+
"status": d.get("status", "completed"),
|
|
30
|
+
"depends_on": d.get("depends_on", []),
|
|
31
|
+
"estimated_duration_min": d.get("estimated_duration_min", 0),
|
|
32
|
+
"scheduled_start": d.get("scheduled_start"),
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return {"timeline": timeline}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Large Meeting Hall — dedicated for CEO all-hands meetings
|
|
2
|
+
name: "All-Hands Hall"
|
|
3
|
+
type: "meeting_room"
|
|
4
|
+
description: "A large meeting hall that seats 100 people, equipped with a big screen and sound system. Used for CEO company-wide announcements and guidance; all attendees must absorb and summarize the meeting takeaways afterward. Cannot be used for project or department meetings."
|
|
5
|
+
capacity: 100
|
|
6
|
+
position: [5, 10]
|
|
7
|
+
sprite: "meeting_room"
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Project Meeting Room 1 — dedicated for project wrap-up meetings
|
|
2
|
+
name: "Project Meeting Room 1"
|
|
3
|
+
type: "meeting_room"
|
|
4
|
+
description: "A project meeting room seating 30 people, used for project wrap-up meetings and retrospectives."
|
|
5
|
+
capacity: 30
|
|
6
|
+
position: [10, 10]
|
|
7
|
+
sprite: "meeting_room"
|