crewly 1.0.7 → 1.0.8
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/LICENSE +1 -1
- package/README.md +50 -3
- package/config/roles/architect/prompt.md +11 -0
- package/config/roles/backend-developer/prompt.md +11 -0
- package/config/roles/designer/prompt.md +11 -0
- package/config/roles/developer/prompt.md +18 -4
- package/config/roles/frontend-developer/prompt.md +11 -0
- package/config/roles/fullstack-dev/prompt.md +11 -0
- package/config/roles/generalist/prompt.md +11 -0
- package/config/roles/orchestrator/prompt.md +27 -0
- package/config/roles/product-manager/prompt.md +18 -4
- package/config/roles/qa/prompt.md +11 -0
- package/config/roles/qa-engineer/prompt.md +11 -0
- package/config/roles/sales/prompt.md +11 -0
- package/config/roles/support/prompt.md +11 -0
- package/config/roles/tpm/prompt.md +11 -0
- package/config/skills/orchestrator/complete-task/execute.sh +1 -0
- package/config/templates/agent-claude-md.md +16 -0
- package/config/templates/research-team.json +22 -0
- package/config/templates/startup-team.json +22 -0
- package/config/templates/web-dev-team.json +22 -0
- package/dist/backend/backend/src/constants.d.ts +61 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +65 -7
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +7 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +174 -4
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +34 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.js +2 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +8 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +75 -17
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts +222 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +621 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/index.d.ts +3 -0
- package/dist/backend/backend/src/services/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/index.js +5 -0
- package/dist/backend/backend/src/services/index.js.map +1 -1
- package/dist/backend/backend/src/services/mcp-client.d.ts +233 -0
- package/dist/backend/backend/src/services/mcp-client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/mcp-client.js +297 -0
- package/dist/backend/backend/src/services/mcp-client.js.map +1 -0
- package/dist/backend/backend/src/services/mcp-server.d.ts +167 -0
- package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -0
- package/dist/backend/backend/src/services/mcp-server.js +586 -0
- package/dist/backend/backend/src/services/mcp-server.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts +2 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +6 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +10 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +94 -38
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/quality/index.d.ts +1 -0
- package/dist/backend/backend/src/services/quality/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/quality/index.js +1 -0
- package/dist/backend/backend/src/services/quality/index.js.map +1 -1
- package/dist/backend/backend/src/services/quality/task-output-validator.service.d.ts +84 -0
- package/dist/backend/backend/src/services/quality/task-output-validator.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/quality/task-output-validator.service.js +163 -0
- package/dist/backend/backend/src/services/quality/task-output-validator.service.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-adapter.d.ts +234 -0
- package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-adapter.js +180 -0
- package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -0
- package/dist/backend/backend/src/types/event-bus.types.d.ts +2 -2
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +2 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +1 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js +2 -0
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.d.ts +9 -6
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.js +10 -3
- package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
- package/dist/backend/backend/src/types/task-output.types.d.ts +78 -0
- package/dist/backend/backend/src/types/task-output.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/task-output.types.js +27 -0
- package/dist/backend/backend/src/types/task-output.types.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +13 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +12 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +751 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -0
- package/dist/cli/backend/src/constants.js +550 -0
- package/dist/cli/backend/src/constants.js.map +1 -0
- package/dist/cli/backend/src/models/Project.d.ts +18 -0
- package/dist/cli/backend/src/models/Project.d.ts.map +1 -0
- package/dist/cli/backend/src/models/Project.js +70 -0
- package/dist/cli/backend/src/models/Project.js.map +1 -0
- package/dist/cli/backend/src/models/ScheduledMessage.d.ts +27 -0
- package/dist/cli/backend/src/models/ScheduledMessage.d.ts.map +1 -0
- package/dist/cli/backend/src/models/ScheduledMessage.js +50 -0
- package/dist/cli/backend/src/models/ScheduledMessage.js.map +1 -0
- package/dist/cli/backend/src/models/Team.d.ts +20 -0
- package/dist/cli/backend/src/models/Team.d.ts.map +1 -0
- package/dist/cli/backend/src/models/Team.js +120 -0
- package/dist/cli/backend/src/models/Team.js.map +1 -0
- package/dist/cli/backend/src/models/Ticket.d.ts +24 -0
- package/dist/cli/backend/src/models/Ticket.d.ts.map +1 -0
- package/dist/cli/backend/src/models/Ticket.js +102 -0
- package/dist/cli/backend/src/models/Ticket.js.map +1 -0
- package/dist/cli/backend/src/models/index.d.ts +5 -0
- package/dist/cli/backend/src/models/index.d.ts.map +1 -0
- package/dist/cli/backend/src/models/index.js +5 -0
- package/dist/cli/backend/src/models/index.js.map +1 -0
- package/dist/cli/backend/src/services/core/config.service.d.ts +91 -0
- package/dist/cli/backend/src/services/core/config.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/config.service.js +246 -0
- package/dist/cli/backend/src/services/core/config.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/logger.service.d.ts +70 -0
- package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/logger.service.js +350 -0
- package/dist/cli/backend/src/services/core/logger.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts +269 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.js +1406 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.d.ts +92 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.js +120 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +125 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +247 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +153 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js +409 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +1 -0
- package/dist/cli/backend/src/services/mcp-server.d.ts +167 -0
- package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -0
- package/dist/cli/backend/src/services/mcp-server.js +586 -0
- package/dist/cli/backend/src/services/mcp-server.js.map +1 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts +259 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.js +539 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/memory.service.d.ts +306 -0
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/memory.service.js +517 -0
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +252 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.js +600 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -0
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
- package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
- package/dist/cli/backend/src/types/budget.types.d.ts +217 -0
- package/dist/cli/backend/src/types/budget.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/budget.types.js +82 -0
- package/dist/cli/backend/src/types/budget.types.js.map +1 -0
- package/dist/cli/backend/src/types/chat.types.d.ts +550 -0
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/chat.types.js +743 -0
- package/dist/cli/backend/src/types/chat.types.js.map +1 -0
- package/dist/cli/backend/src/types/continuation.types.d.ts +237 -0
- package/dist/cli/backend/src/types/continuation.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/continuation.types.js +10 -0
- package/dist/cli/backend/src/types/continuation.types.js.map +1 -0
- package/dist/cli/backend/src/types/index.d.ts +164 -0
- package/dist/cli/backend/src/types/index.d.ts.map +1 -0
- package/dist/cli/backend/src/types/index.js +25 -0
- package/dist/cli/backend/src/types/index.js.map +1 -0
- package/dist/cli/backend/src/types/knowledge.types.d.ts +195 -0
- package/dist/cli/backend/src/types/knowledge.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/knowledge.types.js +38 -0
- package/dist/cli/backend/src/types/knowledge.types.js.map +1 -0
- package/dist/cli/backend/src/types/memory.types.d.ts +587 -0
- package/dist/cli/backend/src/types/memory.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/memory.types.js +47 -0
- package/dist/cli/backend/src/types/memory.types.js.map +1 -0
- package/dist/cli/backend/src/types/quality-gate.types.d.ts +171 -0
- package/dist/cli/backend/src/types/quality-gate.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/quality-gate.types.js +42 -0
- package/dist/cli/backend/src/types/quality-gate.types.js.map +1 -0
- package/dist/cli/backend/src/types/role.types.d.ts +260 -0
- package/dist/cli/backend/src/types/role.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/role.types.js +238 -0
- package/dist/cli/backend/src/types/role.types.js.map +1 -0
- package/dist/cli/backend/src/types/scheduler.types.d.ts +254 -0
- package/dist/cli/backend/src/types/scheduler.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/scheduler.types.js +32 -0
- package/dist/cli/backend/src/types/scheduler.types.js.map +1 -0
- package/dist/cli/backend/src/types/settings.types.d.ts +178 -0
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/settings.types.js +206 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -0
- package/dist/cli/backend/src/types/skill.types.d.ts +515 -0
- package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/skill.types.js +481 -0
- package/dist/cli/backend/src/types/skill.types.js.map +1 -0
- package/dist/cli/backend/src/types/sop.types.d.ts +224 -0
- package/dist/cli/backend/src/types/sop.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/sop.types.js +85 -0
- package/dist/cli/backend/src/types/sop.types.js.map +1 -0
- package/dist/cli/backend/src/types/task-output.types.d.ts +78 -0
- package/dist/cli/backend/src/types/task-output.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/task-output.types.js +27 -0
- package/dist/cli/backend/src/types/task-output.types.js.map +1 -0
- package/dist/cli/backend/src/utils/file-io.utils.d.ts +102 -0
- package/dist/cli/backend/src/utils/file-io.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/file-io.utils.js +214 -0
- package/dist/cli/backend/src/utils/file-io.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.d.ts +54 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.js +97 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.js.map +1 -0
- package/dist/cli/cli/src/commands/mcp-server.d.ts +38 -0
- package/dist/cli/cli/src/commands/mcp-server.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/mcp-server.js +49 -0
- package/dist/cli/cli/src/commands/mcp-server.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +61 -7
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +192 -19
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/publish.d.ts +27 -0
- package/dist/cli/cli/src/commands/publish.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/publish.js +69 -0
- package/dist/cli/cli/src/commands/publish.js.map +1 -0
- package/dist/cli/cli/src/index.js +14 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/archive-creator.d.ts +82 -0
- package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/archive-creator.js +105 -0
- package/dist/cli/cli/src/utils/archive-creator.js.map +1 -0
- package/dist/cli/cli/src/utils/package-validator.d.ts +62 -0
- package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/package-validator.js +122 -0
- package/dist/cli/cli/src/utils/package-validator.js.map +1 -0
- package/dist/cli/cli/src/utils/templates.d.ts +71 -0
- package/dist/cli/cli/src/utils/templates.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/templates.js +91 -0
- package/dist/cli/cli/src/utils/templates.js.map +1 -0
- package/frontend/dist/assets/{index-523c7fce.js → index-68d1eb5a.js} +71 -71
- package/frontend/dist/assets/{index-4c050f52.css → index-c5043a83.css} +1 -1
- package/frontend/dist/assets/nunito-cyrillic-400-normal-e44e669f.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-400-normal-ff8e8bdd.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-500-normal-2159679b.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-500-normal-61a3b80e.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-600-normal-ac046097.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-600-normal-e61eb97b.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-700-normal-8fcefcc9.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-700-normal-b9684104.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-800-normal-40253beb.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-800-normal-d80292de.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-400-normal-20d73ae7.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-400-normal-d48c37c9.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-500-normal-16197abd.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-500-normal-9dcfe9b5.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-600-normal-d53e9851.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-600-normal-e3d0201f.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-700-normal-5936f6ac.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-700-normal-c8c02775.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-800-normal-217b8f51.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-800-normal-796cf7bd.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-400-normal-a5906e15.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-400-normal-b51e7635.woff +0 -0
- package/frontend/dist/assets/nunito-latin-500-normal-23ae3083.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-500-normal-be14dbc6.woff +0 -0
- package/frontend/dist/assets/nunito-latin-600-normal-06a9c8b3.woff +0 -0
- package/frontend/dist/assets/nunito-latin-600-normal-45f437de.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-700-normal-ce9107dc.woff +0 -0
- package/frontend/dist/assets/nunito-latin-700-normal-fa89300b.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-800-normal-0ca02785.woff +0 -0
- package/frontend/dist/assets/nunito-latin-800-normal-2363d3ed.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-400-normal-67250a41.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-400-normal-d7e2415e.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-500-normal-06f35d1c.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-500-normal-343e7adc.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-600-normal-5a8efd17.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-600-normal-a7ba5f4f.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-700-normal-0a4e4a02.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-700-normal-0c607961.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-800-normal-39f54b55.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-800-normal-466d0211.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-400-normal-2a755616.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-400-normal-9c01ea9f.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-500-normal-452e5e08.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-500-normal-dc98d965.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-600-normal-2ffbb85f.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-600-normal-cf95b95d.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-700-normal-0e29c28c.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-700-normal-7793b75e.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-800-normal-5baf507e.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-800-normal-fac6740e.woff2 +0 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +15 -5
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Service
|
|
3
|
+
*
|
|
4
|
+
* Manages Company Knowledge documents — markdown files with YAML frontmatter
|
|
5
|
+
* stored at global (~/.crewly/docs/) or project ({projectPath}/.crewly/docs/) scope.
|
|
6
|
+
* Provides CRUD operations with a JSON index for fast listing.
|
|
7
|
+
*
|
|
8
|
+
* @module services/knowledge/knowledge.service
|
|
9
|
+
*/
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import * as fs from 'fs/promises';
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { parse as parseYAML, stringify as stringifyYAML } from 'yaml';
|
|
14
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
15
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
16
|
+
import { atomicWriteFile, safeReadJson } from '../../utils/file-io.utils.js';
|
|
17
|
+
import { CREWLY_CONSTANTS } from '../../constants.js';
|
|
18
|
+
import { DEFAULT_KNOWLEDGE_CATEGORIES, KNOWLEDGE_CONSTANTS, } from '../../types/knowledge.types.js';
|
|
19
|
+
/** Separator between YAML frontmatter and markdown content */
|
|
20
|
+
const FRONTMATTER_SEPARATOR = '---';
|
|
21
|
+
/**
|
|
22
|
+
* Build an empty index structure.
|
|
23
|
+
*
|
|
24
|
+
* @returns A fresh KnowledgeIndex
|
|
25
|
+
*/
|
|
26
|
+
function emptyIndex() {
|
|
27
|
+
return { version: 1, updatedAt: new Date().toISOString(), entries: [] };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Knowledge Service singleton.
|
|
31
|
+
*
|
|
32
|
+
* Follows the same singleton + filesystem pattern used by SOPService.
|
|
33
|
+
*/
|
|
34
|
+
export class KnowledgeService {
|
|
35
|
+
static instance = null;
|
|
36
|
+
logger;
|
|
37
|
+
constructor() {
|
|
38
|
+
this.logger = LoggerService.getInstance().createComponentLogger('KnowledgeService');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the singleton instance.
|
|
42
|
+
*
|
|
43
|
+
* @returns KnowledgeService instance
|
|
44
|
+
*/
|
|
45
|
+
static getInstance() {
|
|
46
|
+
if (!KnowledgeService.instance) {
|
|
47
|
+
KnowledgeService.instance = new KnowledgeService();
|
|
48
|
+
}
|
|
49
|
+
return KnowledgeService.instance;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reset the singleton (for testing).
|
|
53
|
+
*/
|
|
54
|
+
static resetInstance() {
|
|
55
|
+
KnowledgeService.instance = null;
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Path helpers
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
/**
|
|
61
|
+
* Resolve the docs directory for a given scope.
|
|
62
|
+
*
|
|
63
|
+
* @param scope - 'global' or 'project'
|
|
64
|
+
* @param projectPath - Required when scope is 'project'
|
|
65
|
+
* @returns Absolute path to the docs directory
|
|
66
|
+
*/
|
|
67
|
+
docsDir(scope, projectPath) {
|
|
68
|
+
if (scope === 'project') {
|
|
69
|
+
if (!projectPath) {
|
|
70
|
+
throw new Error('projectPath is required for project scope');
|
|
71
|
+
}
|
|
72
|
+
return path.join(projectPath, CREWLY_CONSTANTS.PATHS.CREWLY_HOME, CREWLY_CONSTANTS.PATHS.DOCS_DIR);
|
|
73
|
+
}
|
|
74
|
+
const home = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
75
|
+
return path.join(home, CREWLY_CONSTANTS.PATHS.CREWLY_HOME, CREWLY_CONSTANTS.PATHS.DOCS_DIR);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolve the index file path for a given scope.
|
|
79
|
+
*
|
|
80
|
+
* @param scope - 'global' or 'project'
|
|
81
|
+
* @param projectPath - Required when scope is 'project'
|
|
82
|
+
* @returns Absolute path to the index JSON file
|
|
83
|
+
*/
|
|
84
|
+
indexPath(scope, projectPath) {
|
|
85
|
+
if (scope === 'project') {
|
|
86
|
+
if (!projectPath) {
|
|
87
|
+
throw new Error('projectPath is required for project scope');
|
|
88
|
+
}
|
|
89
|
+
return path.join(projectPath, CREWLY_CONSTANTS.PATHS.CREWLY_HOME, CREWLY_CONSTANTS.PATHS.DOCS_INDEX_FILE);
|
|
90
|
+
}
|
|
91
|
+
const home = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
92
|
+
return path.join(home, CREWLY_CONSTANTS.PATHS.CREWLY_HOME, CREWLY_CONSTANTS.PATHS.DOCS_INDEX_FILE);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Resolve the file path for a specific document.
|
|
96
|
+
*
|
|
97
|
+
* @param id - Document identifier
|
|
98
|
+
* @param scope - Document scope
|
|
99
|
+
* @param projectPath - Project path for project-scoped docs
|
|
100
|
+
* @returns Absolute path to the .md file
|
|
101
|
+
*/
|
|
102
|
+
docFilePath(id, scope, projectPath) {
|
|
103
|
+
return path.join(this.docsDir(scope, projectPath), `${id}.md`);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Ensure the docs directory exists.
|
|
107
|
+
*
|
|
108
|
+
* @param scope - Document scope
|
|
109
|
+
* @param projectPath - Project path for project-scoped docs
|
|
110
|
+
*/
|
|
111
|
+
async ensureDocsDir(scope, projectPath) {
|
|
112
|
+
const dir = this.docsDir(scope, projectPath);
|
|
113
|
+
if (!existsSync(dir)) {
|
|
114
|
+
await fs.mkdir(dir, { recursive: true });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Index helpers
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/**
|
|
121
|
+
* Read the knowledge index, returning an empty index if the file doesn't exist.
|
|
122
|
+
*
|
|
123
|
+
* @param scope - Document scope
|
|
124
|
+
* @param projectPath - Project path for project-scoped docs
|
|
125
|
+
* @returns The knowledge index
|
|
126
|
+
*/
|
|
127
|
+
async readIndex(scope, projectPath) {
|
|
128
|
+
const indexFile = this.indexPath(scope, projectPath);
|
|
129
|
+
return safeReadJson(indexFile, emptyIndex());
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Write the knowledge index atomically.
|
|
133
|
+
*
|
|
134
|
+
* @param scope - Document scope
|
|
135
|
+
* @param projectPath - Project path for project-scoped docs
|
|
136
|
+
* @param index - The index data to write
|
|
137
|
+
*/
|
|
138
|
+
async writeIndex(scope, projectPath, index) {
|
|
139
|
+
const indexFile = this.indexPath(scope, projectPath);
|
|
140
|
+
const dir = path.dirname(indexFile);
|
|
141
|
+
if (!existsSync(dir)) {
|
|
142
|
+
await fs.mkdir(dir, { recursive: true });
|
|
143
|
+
}
|
|
144
|
+
const data = index || emptyIndex();
|
|
145
|
+
data.updatedAt = new Date().toISOString();
|
|
146
|
+
await atomicWriteFile(indexFile, JSON.stringify(data, null, 2));
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// File I/O helpers
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
/**
|
|
152
|
+
* Parse a knowledge document from its markdown file content.
|
|
153
|
+
*
|
|
154
|
+
* @param raw - Raw file content with YAML frontmatter
|
|
155
|
+
* @param scope - Document scope
|
|
156
|
+
* @param projectPath - Optional project path
|
|
157
|
+
* @returns Parsed KnowledgeDocument or null if parsing fails
|
|
158
|
+
*/
|
|
159
|
+
parseDocumentFile(raw, scope, projectPath) {
|
|
160
|
+
try {
|
|
161
|
+
const parts = raw.split(FRONTMATTER_SEPARATOR);
|
|
162
|
+
if (parts.length < 3) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
// parts[0] is empty (before first ---), parts[1] is YAML, parts[2..] is content
|
|
166
|
+
const yamlStr = parts[1];
|
|
167
|
+
const content = parts.slice(2).join(FRONTMATTER_SEPARATOR).trim();
|
|
168
|
+
const frontmatter = parseYAML(yamlStr);
|
|
169
|
+
if (!frontmatter || !frontmatter.id || !frontmatter.title) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
id: frontmatter.id,
|
|
174
|
+
title: frontmatter.title,
|
|
175
|
+
category: frontmatter.category || 'General',
|
|
176
|
+
tags: frontmatter.tags || [],
|
|
177
|
+
content,
|
|
178
|
+
scope,
|
|
179
|
+
projectPath: scope === 'project' ? projectPath : undefined,
|
|
180
|
+
createdBy: frontmatter.createdBy || 'unknown',
|
|
181
|
+
updatedBy: frontmatter.updatedBy || frontmatter.createdBy || 'unknown',
|
|
182
|
+
createdAt: frontmatter.createdAt || new Date().toISOString(),
|
|
183
|
+
updatedAt: frontmatter.updatedAt || new Date().toISOString(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
this.logger.error('Failed to parse document file', {
|
|
188
|
+
error: error instanceof Error ? error.message : String(error),
|
|
189
|
+
});
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Serialize a knowledge document to markdown with YAML frontmatter.
|
|
195
|
+
*
|
|
196
|
+
* @param doc - The document to serialize
|
|
197
|
+
* @returns Markdown string with frontmatter
|
|
198
|
+
*/
|
|
199
|
+
serializeDocument(doc) {
|
|
200
|
+
const frontmatter = {
|
|
201
|
+
id: doc.id,
|
|
202
|
+
title: doc.title,
|
|
203
|
+
category: doc.category,
|
|
204
|
+
tags: doc.tags,
|
|
205
|
+
createdBy: doc.createdBy,
|
|
206
|
+
updatedBy: doc.updatedBy,
|
|
207
|
+
createdAt: doc.createdAt,
|
|
208
|
+
updatedAt: doc.updatedAt,
|
|
209
|
+
};
|
|
210
|
+
const yamlStr = stringifyYAML(frontmatter).trim();
|
|
211
|
+
return `${FRONTMATTER_SEPARATOR}\n${yamlStr}\n${FRONTMATTER_SEPARATOR}\n${doc.content}`;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Build an index entry from a knowledge document.
|
|
215
|
+
*
|
|
216
|
+
* @param doc - The document
|
|
217
|
+
* @returns Index entry with preview
|
|
218
|
+
*/
|
|
219
|
+
buildIndexEntry(doc) {
|
|
220
|
+
return {
|
|
221
|
+
id: doc.id,
|
|
222
|
+
title: doc.title,
|
|
223
|
+
category: doc.category,
|
|
224
|
+
tags: doc.tags,
|
|
225
|
+
preview: doc.content.slice(0, KNOWLEDGE_CONSTANTS.PREVIEW_LENGTH),
|
|
226
|
+
createdBy: doc.createdBy,
|
|
227
|
+
updatedBy: doc.updatedBy,
|
|
228
|
+
createdAt: doc.createdAt,
|
|
229
|
+
updatedAt: doc.updatedAt,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
// Public API
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
/**
|
|
236
|
+
* List all documents for a given scope, optionally filtered.
|
|
237
|
+
*
|
|
238
|
+
* @param scope - 'global' or 'project'
|
|
239
|
+
* @param projectPath - Required when scope is 'project'
|
|
240
|
+
* @param filters - Optional category/search filters
|
|
241
|
+
* @returns Array of document summaries
|
|
242
|
+
*/
|
|
243
|
+
async listDocuments(scope, projectPath, filters) {
|
|
244
|
+
const index = await this.readIndex(scope, projectPath);
|
|
245
|
+
let entries = index.entries;
|
|
246
|
+
if (filters?.category) {
|
|
247
|
+
entries = entries.filter((e) => e.category === filters.category);
|
|
248
|
+
}
|
|
249
|
+
if (filters?.search) {
|
|
250
|
+
const query = filters.search.toLowerCase();
|
|
251
|
+
entries = entries.filter((e) => e.title.toLowerCase().includes(query) ||
|
|
252
|
+
e.tags.some((t) => t.toLowerCase().includes(query)) ||
|
|
253
|
+
e.preview.toLowerCase().includes(query));
|
|
254
|
+
}
|
|
255
|
+
return entries.map((e) => ({
|
|
256
|
+
...e,
|
|
257
|
+
scope,
|
|
258
|
+
}));
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get a single document by ID.
|
|
262
|
+
*
|
|
263
|
+
* @param id - Document identifier
|
|
264
|
+
* @param scope - Document scope
|
|
265
|
+
* @param projectPath - Required when scope is 'project'
|
|
266
|
+
* @returns Full document or null if not found
|
|
267
|
+
*/
|
|
268
|
+
async getDocument(id, scope, projectPath) {
|
|
269
|
+
const filePath = this.docFilePath(id, scope, projectPath);
|
|
270
|
+
try {
|
|
271
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
272
|
+
return this.parseDocumentFile(raw, scope, projectPath);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create a new knowledge document.
|
|
280
|
+
*
|
|
281
|
+
* @param params - Document creation parameters
|
|
282
|
+
* @returns The generated document ID
|
|
283
|
+
* @throws Error if validation fails
|
|
284
|
+
*/
|
|
285
|
+
async createDocument(params) {
|
|
286
|
+
const { title, content, category, scope, projectPath, tags = [], createdBy } = params;
|
|
287
|
+
// Validation
|
|
288
|
+
if (!title || title.length > KNOWLEDGE_CONSTANTS.MAX_TITLE_LENGTH) {
|
|
289
|
+
throw new Error(`Title is required and must be at most ${KNOWLEDGE_CONSTANTS.MAX_TITLE_LENGTH} characters`);
|
|
290
|
+
}
|
|
291
|
+
if (content.length > KNOWLEDGE_CONSTANTS.MAX_CONTENT_LENGTH) {
|
|
292
|
+
throw new Error(`Content must be at most ${KNOWLEDGE_CONSTANTS.MAX_CONTENT_LENGTH} characters`);
|
|
293
|
+
}
|
|
294
|
+
if (tags.length > KNOWLEDGE_CONSTANTS.MAX_TAGS) {
|
|
295
|
+
throw new Error(`Maximum ${KNOWLEDGE_CONSTANTS.MAX_TAGS} tags allowed`);
|
|
296
|
+
}
|
|
297
|
+
if (scope === 'project' && !projectPath) {
|
|
298
|
+
throw new Error('projectPath is required for project scope');
|
|
299
|
+
}
|
|
300
|
+
await this.ensureDocsDir(scope, projectPath);
|
|
301
|
+
const id = uuidv4();
|
|
302
|
+
const now = new Date().toISOString();
|
|
303
|
+
const doc = {
|
|
304
|
+
id,
|
|
305
|
+
title,
|
|
306
|
+
content,
|
|
307
|
+
category: category || 'General',
|
|
308
|
+
tags,
|
|
309
|
+
scope,
|
|
310
|
+
projectPath: scope === 'project' ? projectPath : undefined,
|
|
311
|
+
createdBy: createdBy || 'user',
|
|
312
|
+
updatedBy: createdBy || 'user',
|
|
313
|
+
createdAt: now,
|
|
314
|
+
updatedAt: now,
|
|
315
|
+
};
|
|
316
|
+
// Write document file
|
|
317
|
+
const filePath = this.docFilePath(id, scope, projectPath);
|
|
318
|
+
await atomicWriteFile(filePath, this.serializeDocument(doc));
|
|
319
|
+
// Update index
|
|
320
|
+
const index = await this.readIndex(scope, projectPath);
|
|
321
|
+
index.entries.push(this.buildIndexEntry(doc));
|
|
322
|
+
await this.writeIndex(scope, projectPath, index);
|
|
323
|
+
this.logger.info('Document created', { id, title, scope });
|
|
324
|
+
return id;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Update an existing knowledge document.
|
|
328
|
+
*
|
|
329
|
+
* @param id - Document identifier
|
|
330
|
+
* @param params - Update parameters
|
|
331
|
+
* @throws Error if document not found or validation fails
|
|
332
|
+
*/
|
|
333
|
+
async updateDocument(id, params) {
|
|
334
|
+
const { scope, projectPath, updatedBy } = params;
|
|
335
|
+
const existing = await this.getDocument(id, scope, projectPath);
|
|
336
|
+
if (!existing) {
|
|
337
|
+
throw new Error(`Document '${id}' not found`);
|
|
338
|
+
}
|
|
339
|
+
if (params.title !== undefined && params.title.length > KNOWLEDGE_CONSTANTS.MAX_TITLE_LENGTH) {
|
|
340
|
+
throw new Error(`Title must be at most ${KNOWLEDGE_CONSTANTS.MAX_TITLE_LENGTH} characters`);
|
|
341
|
+
}
|
|
342
|
+
if (params.content !== undefined && params.content.length > KNOWLEDGE_CONSTANTS.MAX_CONTENT_LENGTH) {
|
|
343
|
+
throw new Error(`Content must be at most ${KNOWLEDGE_CONSTANTS.MAX_CONTENT_LENGTH} characters`);
|
|
344
|
+
}
|
|
345
|
+
if (params.tags !== undefined && params.tags.length > KNOWLEDGE_CONSTANTS.MAX_TAGS) {
|
|
346
|
+
throw new Error(`Maximum ${KNOWLEDGE_CONSTANTS.MAX_TAGS} tags allowed`);
|
|
347
|
+
}
|
|
348
|
+
const updated = {
|
|
349
|
+
...existing,
|
|
350
|
+
title: params.title ?? existing.title,
|
|
351
|
+
content: params.content ?? existing.content,
|
|
352
|
+
category: params.category ?? existing.category,
|
|
353
|
+
tags: params.tags ?? existing.tags,
|
|
354
|
+
updatedBy,
|
|
355
|
+
updatedAt: new Date().toISOString(),
|
|
356
|
+
};
|
|
357
|
+
// Write updated document file
|
|
358
|
+
const filePath = this.docFilePath(id, scope, projectPath);
|
|
359
|
+
await atomicWriteFile(filePath, this.serializeDocument(updated));
|
|
360
|
+
// Update index entry
|
|
361
|
+
const index = await this.readIndex(scope, projectPath);
|
|
362
|
+
const entryIdx = index.entries.findIndex((e) => e.id === id);
|
|
363
|
+
const newEntry = this.buildIndexEntry(updated);
|
|
364
|
+
if (entryIdx >= 0) {
|
|
365
|
+
index.entries[entryIdx] = newEntry;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
index.entries.push(newEntry);
|
|
369
|
+
}
|
|
370
|
+
await this.writeIndex(scope, projectPath, index);
|
|
371
|
+
this.logger.info('Document updated', { id, scope });
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Delete a knowledge document.
|
|
375
|
+
*
|
|
376
|
+
* @param id - Document identifier
|
|
377
|
+
* @param scope - Document scope
|
|
378
|
+
* @param projectPath - Required when scope is 'project'
|
|
379
|
+
* @throws Error if document not found
|
|
380
|
+
*/
|
|
381
|
+
async deleteDocument(id, scope, projectPath) {
|
|
382
|
+
const filePath = this.docFilePath(id, scope, projectPath);
|
|
383
|
+
try {
|
|
384
|
+
await fs.unlink(filePath);
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
throw new Error(`Document '${id}' not found`);
|
|
388
|
+
}
|
|
389
|
+
// Remove from index
|
|
390
|
+
const index = await this.readIndex(scope, projectPath);
|
|
391
|
+
index.entries = index.entries.filter((e) => e.id !== id);
|
|
392
|
+
await this.writeIndex(scope, projectPath, index);
|
|
393
|
+
this.logger.info('Document deleted', { id, scope });
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* List all categories in use for a given scope, merged with defaults.
|
|
397
|
+
*
|
|
398
|
+
* @param scope - Document scope
|
|
399
|
+
* @param projectPath - Required when scope is 'project'
|
|
400
|
+
* @returns Array of category names (defaults + custom in-use)
|
|
401
|
+
*/
|
|
402
|
+
async listCategories(scope, projectPath) {
|
|
403
|
+
const index = await this.readIndex(scope, projectPath);
|
|
404
|
+
const inUse = new Set(index.entries.map((e) => e.category));
|
|
405
|
+
const all = new Set([...DEFAULT_KNOWLEDGE_CATEGORIES, ...inUse]);
|
|
406
|
+
return [...all].sort();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=knowledge.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/knowledge.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crewly MCP Server Service
|
|
3
|
+
*
|
|
4
|
+
* Exposes Crewly capabilities as MCP (Model Context Protocol) tools so that
|
|
5
|
+
* external AI tools — Claude Code, Cursor, Windsurf, etc. — can manage
|
|
6
|
+
* Crewly teams via the standard MCP protocol.
|
|
7
|
+
*
|
|
8
|
+
* This is Crewly's unique differentiator: no competitor offers a
|
|
9
|
+
* "team management backend" controllable via MCP.
|
|
10
|
+
*
|
|
11
|
+
* Supported tools:
|
|
12
|
+
* - crewly_get_teams — List all teams and their members/status
|
|
13
|
+
* - crewly_create_team — Create a new team with members
|
|
14
|
+
* - crewly_assign_task — Assign a task to a specific agent
|
|
15
|
+
* - crewly_get_status — Get agent/team status
|
|
16
|
+
* - crewly_recall_memory — Search team memory/knowledge
|
|
17
|
+
* - crewly_send_message — Send a message to an agent
|
|
18
|
+
*
|
|
19
|
+
* @module services/mcp-server
|
|
20
|
+
*/
|
|
21
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
22
|
+
/**
|
|
23
|
+
* MCP Server configuration constants.
|
|
24
|
+
*/
|
|
25
|
+
export declare const MCP_SERVER_CONSTANTS: {
|
|
26
|
+
/** Server identification sent during MCP handshake */
|
|
27
|
+
readonly SERVER_INFO: {
|
|
28
|
+
readonly NAME: "crewly-mcp-server";
|
|
29
|
+
readonly VERSION: "1.0.0";
|
|
30
|
+
};
|
|
31
|
+
/** Tool name prefix for namespacing */
|
|
32
|
+
readonly TOOL_PREFIX: "crewly";
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Configuration for the Crewly MCP Server.
|
|
36
|
+
*/
|
|
37
|
+
export interface CrewlyMcpServerConfig {
|
|
38
|
+
/** Path to the crewly home directory (default: ~/.crewly) */
|
|
39
|
+
crewlyHome?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* CrewlyMcpServer exposes Crewly team management capabilities as MCP tools.
|
|
43
|
+
*
|
|
44
|
+
* External AI tools can connect to this server via stdio transport and use
|
|
45
|
+
* the provided tools to create teams, assign tasks, check status, search
|
|
46
|
+
* memory, and send messages — all through the standard MCP protocol.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const mcpServer = new CrewlyMcpServer();
|
|
51
|
+
* await mcpServer.start(); // Starts on stdio
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @example Claude Code configuration (~/.claude/claude_desktop_config.json):
|
|
55
|
+
* ```json
|
|
56
|
+
* {
|
|
57
|
+
* "mcpServers": {
|
|
58
|
+
* "crewly": {
|
|
59
|
+
* "command": "npx",
|
|
60
|
+
* "args": ["crewly", "mcp-server"]
|
|
61
|
+
* }
|
|
62
|
+
* }
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class CrewlyMcpServer {
|
|
67
|
+
private server;
|
|
68
|
+
private storage;
|
|
69
|
+
private memory;
|
|
70
|
+
private transport;
|
|
71
|
+
/**
|
|
72
|
+
* Creates a new CrewlyMcpServer instance.
|
|
73
|
+
*
|
|
74
|
+
* @param config - Optional server configuration
|
|
75
|
+
*/
|
|
76
|
+
constructor(config?: CrewlyMcpServerConfig);
|
|
77
|
+
/**
|
|
78
|
+
* Register MCP request handlers for tool listing and tool calling.
|
|
79
|
+
*/
|
|
80
|
+
private registerHandlers;
|
|
81
|
+
/**
|
|
82
|
+
* Route a tool call to the appropriate handler.
|
|
83
|
+
*
|
|
84
|
+
* @param name - Tool name
|
|
85
|
+
* @param args - Tool arguments
|
|
86
|
+
* @returns Tool result with content blocks
|
|
87
|
+
*/
|
|
88
|
+
private handleToolCall;
|
|
89
|
+
/**
|
|
90
|
+
* Handle crewly_get_teams: list all teams and their members.
|
|
91
|
+
*
|
|
92
|
+
* @param args - Optional { teamId } to filter
|
|
93
|
+
* @returns Formatted team list
|
|
94
|
+
*/
|
|
95
|
+
private handleGetTeams;
|
|
96
|
+
/**
|
|
97
|
+
* Handle crewly_create_team: create a new team with members.
|
|
98
|
+
*
|
|
99
|
+
* @param args - { name, description?, members: [{name, role, runtimeType?}] }
|
|
100
|
+
* @returns Created team info
|
|
101
|
+
*/
|
|
102
|
+
private handleCreateTeam;
|
|
103
|
+
/**
|
|
104
|
+
* Handle crewly_assign_task: assign a task to a specific agent.
|
|
105
|
+
*
|
|
106
|
+
* This stores the task description on the member's currentTickets field
|
|
107
|
+
* so the orchestrator or dashboard can pick it up. For direct delivery,
|
|
108
|
+
* use crewly_send_message to the orchestrator with task instructions.
|
|
109
|
+
*
|
|
110
|
+
* @param args - { teamId, memberId, task }
|
|
111
|
+
* @returns Assignment confirmation
|
|
112
|
+
*/
|
|
113
|
+
private handleAssignTask;
|
|
114
|
+
/**
|
|
115
|
+
* Handle crewly_get_status: get status for teams/agents.
|
|
116
|
+
*
|
|
117
|
+
* @param args - Optional { teamId, memberId } filters
|
|
118
|
+
* @returns Status information
|
|
119
|
+
*/
|
|
120
|
+
private handleGetStatus;
|
|
121
|
+
/**
|
|
122
|
+
* Handle crewly_recall_memory: search team memory/knowledge.
|
|
123
|
+
*
|
|
124
|
+
* @param args - { query, agentId?, projectPath?, scope? }
|
|
125
|
+
* @returns Search results
|
|
126
|
+
*/
|
|
127
|
+
private handleRecallMemory;
|
|
128
|
+
/**
|
|
129
|
+
* Handle crewly_send_message: send a message to the orchestrator.
|
|
130
|
+
*
|
|
131
|
+
* @param args - { message, conversationId? }
|
|
132
|
+
* @returns Confirmation with message ID
|
|
133
|
+
*/
|
|
134
|
+
private handleSendMessage;
|
|
135
|
+
/**
|
|
136
|
+
* Create a success result with JSON-serialized content.
|
|
137
|
+
*
|
|
138
|
+
* @param data - Data to serialize as the result
|
|
139
|
+
* @returns ToolResult with text content
|
|
140
|
+
*/
|
|
141
|
+
private successResult;
|
|
142
|
+
/**
|
|
143
|
+
* Create an error result.
|
|
144
|
+
*
|
|
145
|
+
* @param message - Error message
|
|
146
|
+
* @returns ToolResult with isError flag
|
|
147
|
+
*/
|
|
148
|
+
private errorResult;
|
|
149
|
+
/**
|
|
150
|
+
* Start the MCP server on stdio transport.
|
|
151
|
+
*
|
|
152
|
+
* This connects stdin/stdout for MCP protocol communication.
|
|
153
|
+
* The process will stay alive until the client disconnects.
|
|
154
|
+
*/
|
|
155
|
+
start(): Promise<void>;
|
|
156
|
+
/**
|
|
157
|
+
* Stop the MCP server and clean up resources.
|
|
158
|
+
*/
|
|
159
|
+
stop(): Promise<void>;
|
|
160
|
+
/**
|
|
161
|
+
* Get the underlying MCP Server instance (for testing).
|
|
162
|
+
*
|
|
163
|
+
* @returns The Server instance
|
|
164
|
+
*/
|
|
165
|
+
getServer(): Server;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../../../../backend/src/services/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAenE;;GAEG;AACH,eAAO,MAAM,oBAAoB;IAC/B,sDAAsD;;;;;IAKtD,uCAAuC;;CAE/B,CAAC;AAIX;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0KD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAqC;IAEtD;;;;OAIG;gBACS,MAAM,CAAC,EAAE,qBAAqB;IAmB1C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;OAMG;YACW,cAAc;IA6B5B;;;;;OAKG;YACW,cAAc;IAoC5B;;;;;OAKG;YACW,gBAAgB;IA0D9B;;;;;;;;;OASG;YACW,gBAAgB;IA2C9B;;;;;OAKG;YACW,eAAe;IAiE7B;;;;;OAKG;YACW,kBAAkB;IAiChC;;;;;OAKG;YACW,iBAAiB;IAwB/B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAMrB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IASnB;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;;OAIG;IACH,SAAS,IAAI,MAAM;CAGpB"}
|