crewly 1.15.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -5
- package/config/roles/developer/prompt.md +1 -1
- package/config/roles/orchestrator/prompt.md +20 -5
- package/config/runtime_scripts/runtime-config.json +7 -0
- package/config/skills/agent/core/calendar-create/SKILL.md +62 -0
- package/config/skills/agent/core/calendar-create/execute.sh +91 -0
- package/config/skills/agent/core/calendar-create/execute.test.sh +80 -0
- package/config/skills/agent/core/calendar-list/SKILL.md +58 -0
- package/config/skills/agent/core/calendar-list/execute.sh +88 -0
- package/config/skills/agent/core/calendar-list/execute.test.sh +71 -0
- package/config/skills/agent/core/count-json/SKILL.md +61 -0
- package/config/skills/agent/core/count-json/execute.sh +52 -0
- package/config/skills/agent/core/count-json/execute.test.sh +35 -0
- package/config/skills/agent/core/gmail-read/SKILL.md +61 -0
- package/config/skills/agent/core/gmail-read/execute.sh +62 -0
- package/config/skills/agent/core/gmail-read/execute.test.sh +68 -0
- package/config/skills/agent/core/gmail-search/SKILL.md +64 -0
- package/config/skills/agent/core/gmail-search/execute.sh +70 -0
- package/config/skills/agent/core/gmail-search/execute.test.sh +67 -0
- package/config/skills/agent/core/gmail-send/SKILL.md +69 -0
- package/config/skills/agent/core/gmail-send/execute.sh +114 -0
- package/config/skills/agent/core/gmail-send/execute.test.sh +83 -0
- package/config/skills/agent/core/record-prediction/SKILL.md +61 -0
- package/config/skills/agent/core/record-prediction/execute.sh +90 -0
- package/config/skills/agent/core/record-prediction/execute.test.sh +67 -0
- package/config/skills/agent/core/resolve-prediction/SKILL.md +61 -0
- package/config/skills/agent/core/resolve-prediction/execute.sh +87 -0
- package/config/skills/agent/core/resolve-prediction/execute.test.sh +74 -0
- package/config/skills/agent/core/set-focus/SKILL.md +64 -0
- package/config/skills/agent/core/set-focus/execute.sh +73 -0
- package/config/skills/agent/core/set-focus/execute.test.sh +67 -0
- package/config/skills/agent/core/suppress-noise/SKILL.md +59 -0
- package/config/skills/agent/core/suppress-noise/execute.sh +68 -0
- package/config/skills/agent/core/suppress-noise/execute.test.sh +58 -0
- package/config/skills/orchestrator/list-missions/SKILL.md +47 -0
- package/config/skills/orchestrator/list-missions/execute.sh +34 -0
- package/config/skills/orchestrator/list-missions/execute.test.sh +33 -0
- package/config/slack-master-app-manifest.json +64 -0
- package/dist/backend/backend/src/constants.d.ts +186 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +196 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts +76 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js +262 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +3 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +100 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js +293 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts +26 -0
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.routes.js +38 -0
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js +31 -0
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +6 -2
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +209 -2
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +4 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +92 -8
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +10 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -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 +32 -4
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.js +185 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +22 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +45 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +2 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts +137 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js +216 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +4 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js +3 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +25 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/google/calendar.service.d.ts +98 -0
- package/dist/backend/backend/src/services/google/calendar.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/calendar.service.js +125 -0
- package/dist/backend/backend/src/services/google/calendar.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts +165 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/gmail.service.js +296 -0
- package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-api.client.d.ts +44 -0
- package/dist/backend/backend/src/services/google/google-api.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-api.client.js +104 -0
- package/dist/backend/backend/src/services/google/google-api.client.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +159 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js +274 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -0
- package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts +10 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.js +12 -1
- package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +30 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts +186 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +409 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +95 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +284 -4
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts +178 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js +392 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +76 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +234 -47
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts +78 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js +129 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts +117 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js +214 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +6 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +33 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts +116 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js +254 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js.map +1 -0
- package/dist/backend/backend/src/types/index.d.ts +11 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +7 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +141 -2
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.d.ts +2 -0
- package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +2 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js +14 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +186 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +196 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +10 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +32 -4
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.js +185 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +22 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js +45 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +2 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts +74 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js +132 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts +107 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js +183 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +100 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js +130 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.js +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +30 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +76 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +234 -47
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +11 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +7 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +141 -2
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.d.ts +2 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +2 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js +14 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +2 -2
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +15 -7
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/frontend/dist/assets/{index-203224f9.js → index-c87332bf.js} +278 -278
- package/frontend/dist/assets/index-f6b4230e.css +42 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-dcaf6c88.css +0 -42
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Set Focus
|
|
3
|
+
description: Replace your current focus list — the topics you should prioritise until further notice. Injected into your prompt on the next session.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: memory
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- developer
|
|
9
|
+
- qa
|
|
10
|
+
- tpm
|
|
11
|
+
- designer
|
|
12
|
+
- frontend-developer
|
|
13
|
+
- backend-developer
|
|
14
|
+
- fullstack-dev
|
|
15
|
+
- qa-engineer
|
|
16
|
+
- product-manager
|
|
17
|
+
- architect
|
|
18
|
+
- generalist
|
|
19
|
+
- sales
|
|
20
|
+
- support
|
|
21
|
+
- orchestrator
|
|
22
|
+
triggers:
|
|
23
|
+
- set focus
|
|
24
|
+
- focus on
|
|
25
|
+
- prioritise
|
|
26
|
+
- prioritize
|
|
27
|
+
tags:
|
|
28
|
+
- memory
|
|
29
|
+
- attention
|
|
30
|
+
- self-improvement
|
|
31
|
+
execution:
|
|
32
|
+
type: script
|
|
33
|
+
script:
|
|
34
|
+
file: execute.sh
|
|
35
|
+
interpreter: bash
|
|
36
|
+
timeoutMs: 15000
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
# Set Focus
|
|
40
|
+
|
|
41
|
+
Replace your focus list with a new set of topics. Focus items are the things you should keep front of mind — an active incident, a deadline, a recurring mistake you are correcting. They show up in your prompt (up to 5) and are pruned automatically after two weeks without an update, so refresh them when they still matter.
|
|
42
|
+
|
|
43
|
+
Setting focus **replaces** the whole list. To drop a single distraction instead, use `suppress-noise`.
|
|
44
|
+
|
|
45
|
+
## Parameters
|
|
46
|
+
|
|
47
|
+
| Flag | JSON Field | Required | Description |
|
|
48
|
+
|------|-----------|----------|-------------|
|
|
49
|
+
| `--item` / `-i` (repeatable) | `items` (array) | Yes | Focus items, one per flag (or a JSON array) |
|
|
50
|
+
| `--session` / `-s` | `sessionName` | No | Your session name — defaults to `$CREWLY_SESSION_NAME` |
|
|
51
|
+
|
|
52
|
+
## Examples
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# CLI flags (preferred)
|
|
56
|
+
bash execute.sh --item "ship checkout v2 by Friday" --item "flaky payment e2e"
|
|
57
|
+
|
|
58
|
+
# Legacy JSON
|
|
59
|
+
bash execute.sh '{"items":["ship checkout v2 by Friday","flaky payment e2e"]}'
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Output
|
|
63
|
+
|
|
64
|
+
`{ "success": true, "focus": [...], "suppressed": [...] }` — the attention state after the update.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# set-focus — Replace the agent's focus list (attention management)
|
|
4
|
+
#
|
|
5
|
+
# Backed by POST /api/agents/:sessionName/self-improvement/attention/focus.
|
|
6
|
+
# Focus items are injected into the agent's prompt (≤5) and pruned after two
|
|
7
|
+
# weeks without an update.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# bash execute.sh --item "ship v2" --item "flaky CI" [--session crewly-dev-1]
|
|
11
|
+
# bash execute.sh '{"items":["ship v2","flaky CI"],"sessionName":"crewly-dev-1"}'
|
|
12
|
+
# =============================================================================
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
16
|
+
|
|
17
|
+
print_usage() {
|
|
18
|
+
cat <<'EOF_USAGE'
|
|
19
|
+
Usage:
|
|
20
|
+
bash execute.sh --item "ship v2" --item "flaky CI" [--session crewly-dev-1]
|
|
21
|
+
bash execute.sh '{"items":["ship v2","flaky CI"]}'
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--item | -i Focus item (repeat for several; at least one required)
|
|
25
|
+
--session | -s Session name (defaults to $CREWLY_SESSION_NAME)
|
|
26
|
+
--help | -h Show this help
|
|
27
|
+
EOF_USAGE
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
INPUT_JSON=""
|
|
31
|
+
SESSION_NAME=""
|
|
32
|
+
ITEMS_JSON='[]'
|
|
33
|
+
|
|
34
|
+
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
35
|
+
INPUT_JSON="$1"
|
|
36
|
+
shift || true
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
while [[ $# -gt 0 ]]; do
|
|
40
|
+
case "$1" in
|
|
41
|
+
--item|-i)
|
|
42
|
+
[ $# -ge 2 ] || error_exit "--item requires a value"
|
|
43
|
+
ITEMS_JSON=$(jq -cn --argjson arr "$ITEMS_JSON" --arg v "$2" '$arr + [$v]')
|
|
44
|
+
shift 2 ;;
|
|
45
|
+
--session|-s)
|
|
46
|
+
[ $# -ge 2 ] || error_exit "--session requires a value"
|
|
47
|
+
SESSION_NAME="$2"; shift 2 ;;
|
|
48
|
+
--help|-h) print_usage; exit 0 ;;
|
|
49
|
+
*) error_exit "Unknown option: $1" ;;
|
|
50
|
+
esac
|
|
51
|
+
done
|
|
52
|
+
|
|
53
|
+
if [ -n "$INPUT_JSON" ]; then
|
|
54
|
+
INPUT=$(read_json_input "$INPUT_JSON")
|
|
55
|
+
[ -z "$SESSION_NAME" ] && SESSION_NAME=$(printf '%s' "$INPUT" | jq -r '.sessionName // .agentId // empty')
|
|
56
|
+
if [ "$(printf '%s' "$ITEMS_JSON" | jq 'length')" -eq 0 ]; then
|
|
57
|
+
ITEMS_JSON=$(printf '%s' "$INPUT" | jq -c '(.items // []) | if type == "string" then [.] else . end')
|
|
58
|
+
fi
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
[ -z "$SESSION_NAME" ] && SESSION_NAME="${CREWLY_SESSION_NAME:-}"
|
|
62
|
+
require_param "sessionName (--session or CREWLY_SESSION_NAME)" "$SESSION_NAME"
|
|
63
|
+
[ "$(printf '%s' "$ITEMS_JSON" | jq 'length')" -gt 0 ] || error_exit "Missing required parameter: items (--item)"
|
|
64
|
+
|
|
65
|
+
BODY=$(jq -cn --argjson items "$ITEMS_JSON" '{items: $items}')
|
|
66
|
+
|
|
67
|
+
RESPONSE=$(api_call POST "/agents/${SESSION_NAME}/self-improvement/attention/focus" "$BODY" 2>&1) || {
|
|
68
|
+
ERROR_MSG=$(printf '%s' "$RESPONSE" | jq -r '.details.error // .details // .error // "Unknown error"' 2>/dev/null || echo "$RESPONSE")
|
|
69
|
+
jq -n --arg reason "$ERROR_MSG" '{success: false, reason: $reason}'
|
|
70
|
+
exit 1
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
printf '%s' "$RESPONSE" | jq -c '{success: (.success // false), focus: (.data.focus // []), suppressed: (.data.suppressed // [])}'
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for set-focus — run with: bash execute.test.sh
|
|
3
|
+
# Spins up a python HTTP stub as the backend, asserts the request path/body
|
|
4
|
+
# the skill sends and the JSON it prints. Exit 0 on pass.
|
|
5
|
+
set -u
|
|
6
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
EXEC="$HERE/execute.sh"
|
|
8
|
+
PASS=0; FAIL=0
|
|
9
|
+
check() {
|
|
10
|
+
local name="$1"; local got="$2"; local want="$3"
|
|
11
|
+
if [ "$got" = "$want" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); echo "FAIL: $name"; echo " want: $want"; echo " got: $got"; fi
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
PORT=18791
|
|
15
|
+
STUB_LOG="$(mktemp)"; export STUB_LOG; export STUB_PORT="$PORT"
|
|
16
|
+
python3 -u <<'PY' >/dev/null 2>&1 &
|
|
17
|
+
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
18
|
+
import json, os
|
|
19
|
+
LOG = os.environ['STUB_LOG']; PORT = int(os.environ['STUB_PORT'])
|
|
20
|
+
class H(BaseHTTPRequestHandler):
|
|
21
|
+
def do_POST(self):
|
|
22
|
+
n = int(self.headers.get('content-length', '0')); body = self.rfile.read(n).decode() if n else ''
|
|
23
|
+
open(LOG, 'w').write(json.dumps({'path': self.path, 'body': json.loads(body or '{}')}))
|
|
24
|
+
items = json.loads(body).get('items', [])
|
|
25
|
+
if '__reject__' in items:
|
|
26
|
+
self.send_response(400); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
27
|
+
self.wfile.write(b'{"success":false,"error":"items must be an array of non-empty strings"}'); return
|
|
28
|
+
self.send_response(200); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
29
|
+
self.wfile.write(json.dumps({'success': True, 'data': {'focus': items, 'suppressed': ['old']}}).encode())
|
|
30
|
+
def log_message(self, *a, **k): pass
|
|
31
|
+
HTTPServer(('127.0.0.1', PORT), H).serve_forever()
|
|
32
|
+
PY
|
|
33
|
+
STUB_PID=$!
|
|
34
|
+
disown "$STUB_PID" 2>/dev/null || true
|
|
35
|
+
trap 'kill "$STUB_PID" >/dev/null 2>&1; rm -f "$STUB_LOG"' EXIT
|
|
36
|
+
for i in $(seq 1 30); do curl -s -o /dev/null -m 0.2 "http://127.0.0.1:${PORT}/" 2>/dev/null && break; sleep 0.1; done
|
|
37
|
+
|
|
38
|
+
run() { CREWLY_API_URL="http://127.0.0.1:${PORT}" CREWLY_SESSION_NAME="crewly-dev-1" bash "$EXEC" "$@" 2>/dev/null; }
|
|
39
|
+
run_err() { CREWLY_API_URL="http://127.0.0.1:${PORT}" CREWLY_SESSION_NAME="" bash "$EXEC" "$@" 2>&1 >/dev/null | jq -r '.error' 2>/dev/null; }
|
|
40
|
+
|
|
41
|
+
# --- flags ---
|
|
42
|
+
OUT=$(run --item "ship v2" --item "flaky CI")
|
|
43
|
+
check "flags: output" "$OUT" '{"success":true,"focus":["ship v2","flaky CI"],"suppressed":["old"]}'
|
|
44
|
+
check "flags: path uses CREWLY_SESSION_NAME" "$(jq -r .path "$STUB_LOG")" "/api/agents/crewly-dev-1/self-improvement/attention/focus"
|
|
45
|
+
check "flags: body" "$(jq -c .body "$STUB_LOG")" '{"items":["ship v2","flaky CI"]}'
|
|
46
|
+
|
|
47
|
+
# --- legacy JSON with explicit session ---
|
|
48
|
+
OUT=$(run '{"items":["a"],"sessionName":"crewly-qa-9"}')
|
|
49
|
+
check "json: output" "$OUT" '{"success":true,"focus":["a"],"suppressed":["old"]}'
|
|
50
|
+
check "json: explicit session in path" "$(jq -r .path "$STUB_LOG")" "/api/agents/crewly-qa-9/self-improvement/attention/focus"
|
|
51
|
+
|
|
52
|
+
# --- json string coerced to array ---
|
|
53
|
+
run '{"items":"solo"}' >/dev/null
|
|
54
|
+
check "json: string items coerced to array" "$(jq -c .body "$STUB_LOG")" '{"items":["solo"]}'
|
|
55
|
+
|
|
56
|
+
# --- backend error surfaces as success:false and exit 1 ---
|
|
57
|
+
OUT=$(CREWLY_API_URL="http://127.0.0.1:${PORT}" CREWLY_SESSION_NAME="crewly-dev-1" bash "$EXEC" --item __reject__ 2>/dev/null); RC=$?
|
|
58
|
+
check "backend 400: exit code" "$RC" "1"
|
|
59
|
+
check "backend 400: reason" "$(printf '%s' "$OUT" | jq -r .reason)" "items must be an array of non-empty strings"
|
|
60
|
+
|
|
61
|
+
# --- validation ---
|
|
62
|
+
check "missing items errors" "$(run_err --session s1)" "Missing required parameter: items (--item)"
|
|
63
|
+
check "missing session errors" "$(run_err --item x)" "Missing required parameter: sessionName (--session or CREWLY_SESSION_NAME)"
|
|
64
|
+
check "unknown option errors" "$(run_err --bogus 1)" "Unknown option: --bogus"
|
|
65
|
+
|
|
66
|
+
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
67
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Suppress Noise
|
|
3
|
+
description: Mark a topic as noise so you stop giving it attention. Suppressed topics are listed in your prompt and removed from your focus list.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: memory
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- developer
|
|
9
|
+
- qa
|
|
10
|
+
- tpm
|
|
11
|
+
- designer
|
|
12
|
+
- frontend-developer
|
|
13
|
+
- backend-developer
|
|
14
|
+
- fullstack-dev
|
|
15
|
+
- qa-engineer
|
|
16
|
+
- product-manager
|
|
17
|
+
- architect
|
|
18
|
+
- generalist
|
|
19
|
+
- sales
|
|
20
|
+
- support
|
|
21
|
+
- orchestrator
|
|
22
|
+
triggers:
|
|
23
|
+
- suppress
|
|
24
|
+
- ignore topic
|
|
25
|
+
- stop tracking
|
|
26
|
+
- that's noise
|
|
27
|
+
tags:
|
|
28
|
+
- memory
|
|
29
|
+
- attention
|
|
30
|
+
- self-improvement
|
|
31
|
+
execution:
|
|
32
|
+
type: script
|
|
33
|
+
script:
|
|
34
|
+
file: execute.sh
|
|
35
|
+
interpreter: bash
|
|
36
|
+
timeoutMs: 15000
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
# Suppress Noise
|
|
40
|
+
|
|
41
|
+
Add one topic to your suppressed list. Use it when past context keeps pulling you toward something that no longer matters (a retired service, a resolved incident, a stale request). The item is removed from your focus list if it was there, and shows up in your prompt under "Ignore" (up to 5).
|
|
42
|
+
|
|
43
|
+
## Parameters
|
|
44
|
+
|
|
45
|
+
| Flag | JSON Field | Required | Description |
|
|
46
|
+
|------|-----------|----------|-------------|
|
|
47
|
+
| `--item` / `-i` | `item` | Yes | The topic to suppress |
|
|
48
|
+
| `--session` / `-s` | `sessionName` | No | Your session name — defaults to `$CREWLY_SESSION_NAME` |
|
|
49
|
+
|
|
50
|
+
## Examples
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
bash execute.sh --item "legacy webhook retries"
|
|
54
|
+
bash execute.sh '{"item":"legacy webhook retries"}'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Output
|
|
58
|
+
|
|
59
|
+
`{ "success": true, "focus": [...], "suppressed": [...] }` — the attention state after the update.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# suppress-noise — Add a topic to the agent's suppressed list
|
|
4
|
+
#
|
|
5
|
+
# Backed by POST /api/agents/:sessionName/self-improvement/attention/suppress.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# bash execute.sh --item "legacy webhooks" [--session crewly-dev-1]
|
|
9
|
+
# bash execute.sh '{"item":"legacy webhooks","sessionName":"crewly-dev-1"}'
|
|
10
|
+
# =============================================================================
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
|
+
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
14
|
+
|
|
15
|
+
print_usage() {
|
|
16
|
+
cat <<'EOF_USAGE'
|
|
17
|
+
Usage:
|
|
18
|
+
bash execute.sh --item "legacy webhooks" [--session crewly-dev-1]
|
|
19
|
+
bash execute.sh '{"item":"legacy webhooks"}'
|
|
20
|
+
|
|
21
|
+
Options:
|
|
22
|
+
--item | -i Topic to suppress (required)
|
|
23
|
+
--session | -s Session name (defaults to $CREWLY_SESSION_NAME)
|
|
24
|
+
--help | -h Show this help
|
|
25
|
+
EOF_USAGE
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
INPUT_JSON=""
|
|
29
|
+
SESSION_NAME=""
|
|
30
|
+
ITEM=""
|
|
31
|
+
|
|
32
|
+
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
33
|
+
INPUT_JSON="$1"
|
|
34
|
+
shift || true
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
while [[ $# -gt 0 ]]; do
|
|
38
|
+
case "$1" in
|
|
39
|
+
--item|-i)
|
|
40
|
+
[ $# -ge 2 ] || error_exit "--item requires a value"
|
|
41
|
+
ITEM="$2"; shift 2 ;;
|
|
42
|
+
--session|-s)
|
|
43
|
+
[ $# -ge 2 ] || error_exit "--session requires a value"
|
|
44
|
+
SESSION_NAME="$2"; shift 2 ;;
|
|
45
|
+
--help|-h) print_usage; exit 0 ;;
|
|
46
|
+
*) error_exit "Unknown option: $1" ;;
|
|
47
|
+
esac
|
|
48
|
+
done
|
|
49
|
+
|
|
50
|
+
if [ -n "$INPUT_JSON" ]; then
|
|
51
|
+
INPUT=$(read_json_input "$INPUT_JSON")
|
|
52
|
+
[ -z "$SESSION_NAME" ] && SESSION_NAME=$(printf '%s' "$INPUT" | jq -r '.sessionName // .agentId // empty')
|
|
53
|
+
[ -z "$ITEM" ] && ITEM=$(printf '%s' "$INPUT" | jq -r '.item // empty')
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
[ -z "$SESSION_NAME" ] && SESSION_NAME="${CREWLY_SESSION_NAME:-}"
|
|
57
|
+
require_param "sessionName (--session or CREWLY_SESSION_NAME)" "$SESSION_NAME"
|
|
58
|
+
require_param "item (--item)" "$ITEM"
|
|
59
|
+
|
|
60
|
+
BODY=$(jq -cn --arg item "$ITEM" '{item: $item}')
|
|
61
|
+
|
|
62
|
+
RESPONSE=$(api_call POST "/agents/${SESSION_NAME}/self-improvement/attention/suppress" "$BODY" 2>&1) || {
|
|
63
|
+
ERROR_MSG=$(printf '%s' "$RESPONSE" | jq -r '.details.error // .details // .error // "Unknown error"' 2>/dev/null || echo "$RESPONSE")
|
|
64
|
+
jq -n --arg reason "$ERROR_MSG" '{success: false, reason: $reason}'
|
|
65
|
+
exit 1
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
printf '%s' "$RESPONSE" | jq -c '{success: (.success // false), focus: (.data.focus // []), suppressed: (.data.suppressed // [])}'
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for suppress-noise — run with: bash execute.test.sh
|
|
3
|
+
# Spins up a python HTTP stub as the backend, asserts the request path/body
|
|
4
|
+
# the skill sends and the JSON it prints. Exit 0 on pass.
|
|
5
|
+
set -u
|
|
6
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
EXEC="$HERE/execute.sh"
|
|
8
|
+
PASS=0; FAIL=0
|
|
9
|
+
check() {
|
|
10
|
+
local name="$1"; local got="$2"; local want="$3"
|
|
11
|
+
if [ "$got" = "$want" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); echo "FAIL: $name"; echo " want: $want"; echo " got: $got"; fi
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
PORT=18792
|
|
15
|
+
STUB_LOG="$(mktemp)"; export STUB_LOG; export STUB_PORT="$PORT"
|
|
16
|
+
python3 -u <<'PY' >/dev/null 2>&1 &
|
|
17
|
+
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
18
|
+
import json, os
|
|
19
|
+
LOG = os.environ['STUB_LOG']; PORT = int(os.environ['STUB_PORT'])
|
|
20
|
+
class H(BaseHTTPRequestHandler):
|
|
21
|
+
def do_POST(self):
|
|
22
|
+
n = int(self.headers.get('content-length', '0')); body = self.rfile.read(n).decode() if n else ''
|
|
23
|
+
data = json.loads(body or '{}')
|
|
24
|
+
open(LOG, 'w').write(json.dumps({'path': self.path, 'body': data}))
|
|
25
|
+
if data.get('item') == '__reject__':
|
|
26
|
+
self.send_response(400); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
27
|
+
self.wfile.write(b'{"success":false,"error":"item must be a non-empty string"}'); return
|
|
28
|
+
self.send_response(200); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
29
|
+
self.wfile.write(json.dumps({'success': True, 'data': {'focus': ['keep'], 'suppressed': [data.get('item')]}}).encode())
|
|
30
|
+
def log_message(self, *a, **k): pass
|
|
31
|
+
HTTPServer(('127.0.0.1', PORT), H).serve_forever()
|
|
32
|
+
PY
|
|
33
|
+
STUB_PID=$!
|
|
34
|
+
disown "$STUB_PID" 2>/dev/null || true
|
|
35
|
+
trap 'kill "$STUB_PID" >/dev/null 2>&1; rm -f "$STUB_LOG"' EXIT
|
|
36
|
+
for i in $(seq 1 30); do curl -s -o /dev/null -m 0.2 "http://127.0.0.1:${PORT}/" 2>/dev/null && break; sleep 0.1; done
|
|
37
|
+
|
|
38
|
+
run() { CREWLY_API_URL="http://127.0.0.1:${PORT}" CREWLY_SESSION_NAME="crewly-dev-1" bash "$EXEC" "$@" 2>/dev/null; }
|
|
39
|
+
run_err() { CREWLY_API_URL="http://127.0.0.1:${PORT}" CREWLY_SESSION_NAME="" bash "$EXEC" "$@" 2>&1 >/dev/null | jq -r '.error' 2>/dev/null; }
|
|
40
|
+
|
|
41
|
+
OUT=$(run --item "legacy webhooks")
|
|
42
|
+
check "flags: output" "$OUT" '{"success":true,"focus":["keep"],"suppressed":["legacy webhooks"]}'
|
|
43
|
+
check "flags: path" "$(jq -r .path "$STUB_LOG")" "/api/agents/crewly-dev-1/self-improvement/attention/suppress"
|
|
44
|
+
check "flags: body" "$(jq -c .body "$STUB_LOG")" '{"item":"legacy webhooks"}'
|
|
45
|
+
|
|
46
|
+
OUT=$(run '{"item":"noise (with) \"quotes\"","sessionName":"crewly-qa-9"}')
|
|
47
|
+
check "json: special characters survive" "$(jq -r .body.item "$STUB_LOG")" 'noise (with) "quotes"'
|
|
48
|
+
check "json: explicit session in path" "$(jq -r .path "$STUB_LOG")" "/api/agents/crewly-qa-9/self-improvement/attention/suppress"
|
|
49
|
+
|
|
50
|
+
OUT=$(CREWLY_API_URL="http://127.0.0.1:${PORT}" CREWLY_SESSION_NAME="crewly-dev-1" bash "$EXEC" --item __reject__ 2>/dev/null); RC=$?
|
|
51
|
+
check "backend 400: exit code" "$RC" "1"
|
|
52
|
+
check "backend 400: reason" "$(printf '%s' "$OUT" | jq -r .reason)" "item must be a non-empty string"
|
|
53
|
+
|
|
54
|
+
check "missing item errors" "$(run_err --session s1)" "Missing required parameter: item (--item)"
|
|
55
|
+
check "missing session errors" "$(run_err --item x)" "Missing required parameter: sessionName (--session or CREWLY_SESSION_NAME)"
|
|
56
|
+
|
|
57
|
+
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
58
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: List Missions
|
|
3
|
+
description: List the company / team / project OKRs (Missions) with their approval state and Key Result progress. Use it at registration and whenever the owner asks "what are we working towards".
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: management
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- orchestrator
|
|
9
|
+
- team-leader
|
|
10
|
+
triggers:
|
|
11
|
+
- list missions
|
|
12
|
+
- what are our goals
|
|
13
|
+
- okr status
|
|
14
|
+
tags:
|
|
15
|
+
- okr
|
|
16
|
+
- mission
|
|
17
|
+
- goals
|
|
18
|
+
execution:
|
|
19
|
+
type: script
|
|
20
|
+
script:
|
|
21
|
+
file: execute.sh
|
|
22
|
+
interpreter: bash
|
|
23
|
+
timeoutMs: 15000
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# List Missions
|
|
27
|
+
|
|
28
|
+
Compact view of every Mission: id, level, objective, approval state, status,
|
|
29
|
+
parent, and the Key Results (current → target, status). Use `--full` for the
|
|
30
|
+
raw `GET /api/missions` payload.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/list-missions/execute.sh
|
|
34
|
+
bash {{ORCHESTRATOR_SKILLS_PATH}}/list-missions/execute.sh --pending # only proposals awaiting the owner
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## What to do with the result
|
|
38
|
+
|
|
39
|
+
- **Pending proposals** (`approval.state = pending_approval`): mention them to
|
|
40
|
+
the owner the next time you talk. Do not execute, remind or decompose them.
|
|
41
|
+
- **No missions at all** and the teams have completed work in the last week:
|
|
42
|
+
draft ONE company-level OKR from that work (objective + 2–3 Key Results
|
|
43
|
+
that can be measured from something in the system — a ticket board, a
|
|
44
|
+
build log, a folder count) and ask the owner whether to create it. Do not
|
|
45
|
+
create it yourself.
|
|
46
|
+
- **Live missions with off-track KRs**: the hourly sweep already alerts the
|
|
47
|
+
owner; you only act when a review WorkItem lands in your queue.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# list-missions — compact view of Missions (OKRs) with approval + KR progress.
|
|
3
|
+
# Usage: execute.sh [--pending] [--full]
|
|
4
|
+
set -uo pipefail
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
7
|
+
|
|
8
|
+
PENDING="false"; FULL="false"
|
|
9
|
+
for arg in "$@"; do
|
|
10
|
+
case "$arg" in
|
|
11
|
+
--pending) PENDING="true" ;;
|
|
12
|
+
--full) FULL="true" ;;
|
|
13
|
+
esac
|
|
14
|
+
done
|
|
15
|
+
|
|
16
|
+
RAW=$(api_call GET "/missions") || exit 1
|
|
17
|
+
if [ "$FULL" = "true" ]; then printf '%s\n' "$RAW"; exit 0; fi
|
|
18
|
+
|
|
19
|
+
printf '%s' "$RAW" | jq --arg pending "$PENDING" '
|
|
20
|
+
def kr: {title, current, target, unit, status, measurementSource};
|
|
21
|
+
def compact: {
|
|
22
|
+
id, level, objective, status,
|
|
23
|
+
approval: (.approval.state // "approved"),
|
|
24
|
+
parentMissionId,
|
|
25
|
+
keyResults: [(.keyResults // [])[] | kr]
|
|
26
|
+
};
|
|
27
|
+
(.data // .) as $all
|
|
28
|
+
| ($all | map(compact)) as $items
|
|
29
|
+
| (if $pending == "true" then ($items | map(select(.approval == "pending_approval"))) else $items end) as $shown
|
|
30
|
+
| {
|
|
31
|
+
count: ($shown | length),
|
|
32
|
+
pendingApproval: ($items | map(select(.approval == "pending_approval")) | length),
|
|
33
|
+
missions: $shown
|
|
34
|
+
}'
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for list-missions — run with: bash execute.test.sh
|
|
3
|
+
set -u
|
|
4
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
PASS=0; FAIL=0
|
|
6
|
+
check() { local name="$1"; local got="$2"; local want="$3"; if [ "$got" = "$want" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); echo "FAIL: $name"; echo " want: $want"; echo " got: $got"; fi; }
|
|
7
|
+
|
|
8
|
+
TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
|
|
9
|
+
# Stand-in for api_call: a shell function defined in a wrapper lib.
|
|
10
|
+
mkdir -p "$TMP/skills/orchestrator/list-missions" "$TMP/skills/orchestrator/_common"
|
|
11
|
+
cp "$HERE/execute.sh" "$TMP/skills/orchestrator/list-missions/execute.sh"
|
|
12
|
+
cat > "$TMP/skills/orchestrator/_common/lib.sh" <<'EOF'
|
|
13
|
+
api_call() {
|
|
14
|
+
cat <<'JSON'
|
|
15
|
+
{"success":true,"data":[
|
|
16
|
+
{"id":"m-company","level":"company","objective":"Q4 stable delivery","status":"active","approval":{"state":"approved"},"keyResults":[]},
|
|
17
|
+
{"id":"m-team","level":"team","objective":"Portal team flow","status":"active","approval":{"state":"pending_approval"},"parentMissionId":"m-company",
|
|
18
|
+
"keyResults":[{"id":"k1","title":"KR1 review backlog","current":3,"target":2,"unit":"tickets","status":"on_track","measurementSource":"skill_output","measurements":[]}]}
|
|
19
|
+
]}
|
|
20
|
+
JSON
|
|
21
|
+
}
|
|
22
|
+
EOF
|
|
23
|
+
OUT=$(bash "$TMP/skills/orchestrator/list-missions/execute.sh")
|
|
24
|
+
check "count" "$(printf '%s' "$OUT" | jq '.count')" "2"
|
|
25
|
+
check "pending count" "$(printf '%s' "$OUT" | jq '.pendingApproval')" "1"
|
|
26
|
+
check "approval defaulted for legacy" "$(printf '%s' "$OUT" | jq -r '.missions[0].approval')" "approved"
|
|
27
|
+
check "KR compacted" "$(printf '%s' "$OUT" | jq -c '.missions[1].keyResults[0]')" '{"title":"KR1 review backlog","current":3,"target":2,"unit":"tickets","status":"on_track","measurementSource":"skill_output"}'
|
|
28
|
+
OUT=$(bash "$TMP/skills/orchestrator/list-missions/execute.sh" --pending)
|
|
29
|
+
check "--pending filters" "$(printf '%s' "$OUT" | jq -r '.missions | map(.id) | join(",")')" "m-team"
|
|
30
|
+
OUT=$(bash "$TMP/skills/orchestrator/list-missions/execute.sh" --full)
|
|
31
|
+
check "--full is raw" "$(printf '%s' "$OUT" | jq -r '.success')" "true"
|
|
32
|
+
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
33
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"display_information": {
|
|
3
|
+
"name": "Crewly",
|
|
4
|
+
"description": "Your AI team in Slack \u2014 each Crewly agent talks as itself.",
|
|
5
|
+
"background_color": "#23407a"
|
|
6
|
+
},
|
|
7
|
+
"features": {
|
|
8
|
+
"bot_user": {
|
|
9
|
+
"display_name": "Crewly",
|
|
10
|
+
"always_online": true
|
|
11
|
+
},
|
|
12
|
+
"app_home": {
|
|
13
|
+
"messages_tab_enabled": true,
|
|
14
|
+
"messages_tab_read_only_enabled": false
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"oauth_config": {
|
|
18
|
+
"redirect_urls": [
|
|
19
|
+
"https://api.crewlyai.com/api/cloud/slack/install/callback"
|
|
20
|
+
],
|
|
21
|
+
"scopes": {
|
|
22
|
+
"bot": [
|
|
23
|
+
"app_mentions:read",
|
|
24
|
+
"channels:history",
|
|
25
|
+
"channels:join",
|
|
26
|
+
"channels:manage",
|
|
27
|
+
"channels:read",
|
|
28
|
+
"chat:write",
|
|
29
|
+
"chat:write.customize",
|
|
30
|
+
"chat:write.public",
|
|
31
|
+
"files:read",
|
|
32
|
+
"files:write",
|
|
33
|
+
"groups:history",
|
|
34
|
+
"groups:read",
|
|
35
|
+
"groups:write",
|
|
36
|
+
"im:history",
|
|
37
|
+
"im:read",
|
|
38
|
+
"im:write",
|
|
39
|
+
"mpim:history",
|
|
40
|
+
"mpim:read",
|
|
41
|
+
"mpim:write",
|
|
42
|
+
"reactions:read",
|
|
43
|
+
"reactions:write",
|
|
44
|
+
"users:read",
|
|
45
|
+
"users:read.email"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"settings": {
|
|
50
|
+
"event_subscriptions": {
|
|
51
|
+
"request_url": "https://api.crewlyai.com/api/cloud/slack/events",
|
|
52
|
+
"bot_events": [
|
|
53
|
+
"app_mention",
|
|
54
|
+
"message.channels",
|
|
55
|
+
"message.groups",
|
|
56
|
+
"message.im",
|
|
57
|
+
"message.mpim"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
"org_deploy_enabled": false,
|
|
61
|
+
"socket_mode_enabled": false,
|
|
62
|
+
"token_rotation_enabled": false
|
|
63
|
+
}
|
|
64
|
+
}
|