@desplega.ai/agent-swarm 1.20.0 → 1.51.2
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 +271 -169
- package/openapi.json +5015 -0
- package/package.json +40 -7
- package/plugin/commands/close-issue.md +7 -3
- package/plugin/commands/create-pr.md +18 -12
- package/plugin/commands/implement-issue.md +7 -3
- package/plugin/commands/respond-github.md +8 -4
- package/plugin/commands/review-pr.md +44 -10
- package/plugin/commands/start-leader.md +1 -3
- package/plugin/commands/start-worker.md +1 -3
- package/plugin/commands/work-on-task.md +22 -3
- package/plugin/pi-skills/close-issue/SKILL.md +90 -0
- package/plugin/pi-skills/create-pr/SKILL.md +99 -0
- package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
- package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
- package/plugin/pi-skills/respond-github/SKILL.md +98 -0
- package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
- package/plugin/pi-skills/review-pr/SKILL.md +261 -0
- package/plugin/pi-skills/start-leader/SKILL.md +121 -0
- package/plugin/pi-skills/start-worker/SKILL.md +60 -0
- package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
- package/plugin/pi-skills/todos/SKILL.md +66 -0
- package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
- package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
- package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
- package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
- package/plugin/skills/artifacts/examples/static-report.sh +17 -0
- package/plugin/skills/artifacts/skill.md +71 -0
- package/src/agentmail/app.ts +65 -0
- package/src/agentmail/handlers.ts +262 -0
- package/src/agentmail/index.ts +9 -0
- package/src/agentmail/templates.ts +111 -0
- package/src/agentmail/types.ts +51 -0
- package/src/artifact-sdk/browser-sdk.ts +30 -0
- package/src/artifact-sdk/index.ts +2 -0
- package/src/artifact-sdk/localtunnel.d.ts +20 -0
- package/src/artifact-sdk/port.ts +12 -0
- package/src/artifact-sdk/server.ts +156 -0
- package/src/artifact-sdk/tunnel.ts +19 -0
- package/src/be/chunking.ts +193 -0
- package/src/be/db-queries/oauth.ts +90 -0
- package/src/be/db-queries/tracker.ts +182 -0
- package/src/be/db.ts +3327 -784
- package/src/be/embedding.ts +80 -0
- package/src/be/migrations/001_initial.sql +409 -0
- package/src/be/migrations/002_one_time_schedules.sql +59 -0
- package/src/be/migrations/003_workflows.sql +51 -0
- package/src/be/migrations/004_workflow_source.sql +81 -0
- package/src/be/migrations/005_epic_next_steps.sql +2 -0
- package/src/be/migrations/006_vcs_provider.sql +94 -0
- package/src/be/migrations/007_task_dir.sql +2 -0
- package/src/be/migrations/008_workflow_redesign.sql +85 -0
- package/src/be/migrations/009_tracker_integration.sql +144 -0
- package/src/be/migrations/010_step_diagnostics.sql +1 -0
- package/src/be/migrations/011_step_next_port.sql +1 -0
- package/src/be/migrations/012_trigger_schema.sql +1 -0
- package/src/be/migrations/013_task_output_schema.sql +2 -0
- package/src/be/migrations/014_prompt_templates.sql +33 -0
- package/src/be/migrations/015_workflow_workspace.sql +3 -0
- package/src/be/migrations/016_active_session_runner_session.sql +4 -0
- package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
- package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
- package/src/be/migrations/runner.ts +188 -0
- package/src/be/seed.ts +62 -0
- package/src/cli.tsx +231 -299
- package/src/commands/artifact.ts +241 -0
- package/src/commands/onboard/compose-generator.ts +169 -0
- package/src/commands/onboard/env-generator.ts +79 -0
- package/src/commands/onboard/manifest.ts +37 -0
- package/src/commands/onboard/presets.ts +85 -0
- package/src/commands/onboard/service-names.ts +47 -0
- package/src/commands/onboard/steps/core-credentials.tsx +111 -0
- package/src/commands/onboard/steps/custom-templates.tsx +168 -0
- package/src/commands/onboard/steps/generate.tsx +154 -0
- package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
- package/src/commands/onboard/steps/harness.tsx +21 -0
- package/src/commands/onboard/steps/health-check.tsx +171 -0
- package/src/commands/onboard/steps/integration-github.tsx +105 -0
- package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
- package/src/commands/onboard/steps/integration-menu.tsx +58 -0
- package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
- package/src/commands/onboard/steps/integration-slack.tsx +165 -0
- package/src/commands/onboard/steps/post-connect.tsx +145 -0
- package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
- package/src/commands/onboard/steps/post-task.tsx +103 -0
- package/src/commands/onboard/steps/prereq-check.tsx +178 -0
- package/src/commands/onboard/steps/review.tsx +82 -0
- package/src/commands/onboard/steps/start.tsx +97 -0
- package/src/commands/onboard/templates.ts +34 -0
- package/src/commands/onboard/types.ts +259 -0
- package/src/commands/onboard.tsx +425 -0
- package/src/commands/runner.ts +1540 -630
- package/src/commands/setup.tsx +23 -38
- package/src/commands/shared/client-config.ts +41 -0
- package/src/commands/templates.ts +172 -0
- package/src/github/app.ts +8 -0
- package/src/github/handlers.ts +384 -151
- package/src/github/index.ts +1 -0
- package/src/github/mentions-aliases.test.ts +73 -0
- package/src/github/mentions.test.ts +3 -3
- package/src/github/mentions.ts +32 -6
- package/src/github/templates.ts +398 -0
- package/src/github/types.ts +1 -0
- package/src/gitlab/auth.ts +63 -0
- package/src/gitlab/handlers.ts +368 -0
- package/src/gitlab/index.ts +19 -0
- package/src/gitlab/reactions.ts +104 -0
- package/src/gitlab/templates.ts +140 -0
- package/src/gitlab/types.ts +130 -0
- package/src/heartbeat/heartbeat.ts +434 -0
- package/src/heartbeat/index.ts +1 -0
- package/src/heartbeat/templates.ts +30 -0
- package/src/hooks/hook.ts +555 -4
- package/src/hooks/tool-loop-detection.test.ts +158 -0
- package/src/hooks/tool-loop-detection.ts +167 -0
- package/src/http/active-sessions.ts +199 -0
- package/src/http/agents.ts +328 -0
- package/src/http/config.ts +191 -0
- package/src/http/core.ts +309 -0
- package/src/http/db-query.ts +91 -0
- package/src/http/ecosystem.ts +63 -0
- package/src/http/epics.ts +460 -0
- package/src/http/index.ts +216 -0
- package/src/http/mcp.ts +77 -0
- package/src/http/memory.ts +168 -0
- package/src/http/openapi.ts +109 -0
- package/src/http/poll.ts +299 -0
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/repos.ts +195 -0
- package/src/http/route-def.ts +123 -0
- package/src/http/schedules.ts +426 -0
- package/src/http/session-data.ts +241 -0
- package/src/http/stats.ts +174 -0
- package/src/http/tasks.ts +468 -0
- package/src/http/trackers/index.ts +10 -0
- package/src/http/trackers/linear.ts +187 -0
- package/src/http/types.ts +12 -0
- package/src/http/utils.ts +87 -0
- package/src/http/webhooks.ts +432 -0
- package/src/http/workflows.ts +530 -0
- package/src/http.ts +1 -1890
- package/src/linear/README.md +65 -0
- package/src/linear/app.ts +48 -0
- package/src/linear/client.ts +18 -0
- package/src/linear/index.ts +1 -0
- package/src/linear/oauth.ts +35 -0
- package/src/linear/outbound.ts +212 -0
- package/src/linear/sync.ts +567 -0
- package/src/linear/templates.ts +47 -0
- package/src/linear/types.ts +7 -0
- package/src/linear/webhook.ts +104 -0
- package/src/oauth/README.md +66 -0
- package/src/oauth/index.ts +6 -0
- package/src/oauth/wrapper.ts +204 -0
- package/src/prompts/base-prompt.ts +150 -265
- package/src/prompts/defaults.ts +196 -0
- package/src/prompts/registry.ts +57 -0
- package/src/prompts/resolver.ts +296 -0
- package/src/prompts/session-templates.ts +604 -0
- package/src/providers/claude-adapter.ts +442 -0
- package/src/providers/index.ts +24 -0
- package/src/providers/pi-mono-adapter.ts +442 -0
- package/src/providers/pi-mono-extension.ts +624 -0
- package/src/providers/pi-mono-mcp-client.ts +124 -0
- package/src/providers/types.ts +75 -0
- package/src/scheduler/scheduler.test.ts +2 -0
- package/src/scheduler/scheduler.ts +231 -40
- package/src/server.ts +97 -6
- package/src/slack/HEURISTICS.md +105 -0
- package/src/slack/actions.ts +133 -0
- package/src/slack/app.ts +7 -0
- package/src/slack/assistant.ts +118 -0
- package/src/slack/blocks.ts +233 -0
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/commands.ts +31 -17
- package/src/slack/files.ts +1 -1
- package/src/slack/handlers.test.ts +114 -1
- package/src/slack/handlers.ts +230 -55
- package/src/slack/responses.ts +120 -67
- package/src/slack/router.ts +17 -99
- package/src/slack/templates.ts +55 -0
- package/src/slack/thread-buffer.ts +213 -0
- package/src/slack/watcher.ts +119 -4
- package/src/tests/agent-activity.test.ts +247 -0
- package/src/tests/agentmail-filters.test.ts +97 -0
- package/src/tests/artifact-sdk.test.ts +800 -0
- package/src/tests/base-prompt.test.ts +264 -0
- package/src/tests/build-pi-skills.test.ts +127 -0
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/claude-adapter.test.ts +126 -0
- package/src/tests/context-versioning.test.ts +425 -0
- package/src/tests/db-queries-oauth.test.ts +197 -0
- package/src/tests/db-queries-tracker.test.ts +230 -0
- package/src/tests/epics.test.ts +3 -3
- package/src/tests/error-tracker.test.ts +368 -0
- package/src/tests/fetch-resolved-env.test.ts +167 -0
- package/src/tests/generate-default-claude-md.test.ts +9 -1
- package/src/tests/generate-identity-templates.test.ts +124 -0
- package/src/tests/gitlab-auth.test.ts +109 -0
- package/src/tests/gitlab-handlers.test.ts +691 -0
- package/src/tests/gitlab-vcs-db.test.ts +177 -0
- package/src/tests/heartbeat.test.ts +364 -0
- package/src/tests/http-api-integration.test.ts +1698 -0
- package/src/tests/linear-outbound-sync.test.ts +200 -0
- package/src/tests/linear-webhook.test.ts +406 -0
- package/src/tests/match-route.test.ts +187 -0
- package/src/tests/memory.test.ts +737 -0
- package/src/tests/migration-runner-regressions.test.ts +86 -0
- package/src/tests/model-control.test.ts +338 -0
- package/src/tests/oauth-wrapper.test.ts +147 -0
- package/src/tests/onboard-compose.test.ts +138 -0
- package/src/tests/onboard-env.test.ts +174 -0
- package/src/tests/onboard-manifest.test.ts +137 -0
- package/src/tests/pi-mono-adapter.test.ts +234 -0
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/progress-dedup.test.ts +98 -0
- package/src/tests/prompt-template-github.test.ts +682 -0
- package/src/tests/prompt-template-remaining.test.ts +504 -0
- package/src/tests/prompt-template-resolver.test.ts +621 -0
- package/src/tests/prompt-template-session.test.ts +363 -0
- package/src/tests/prompt-templates-db.test.ts +616 -0
- package/src/tests/provider-adapter.test.ts +122 -0
- package/src/tests/provider-command-format.test.ts +98 -0
- package/src/tests/reload-config.test.ts +170 -0
- package/src/tests/runner-polling-api.test.ts +25 -20
- package/src/tests/scheduled-tasks.test.ts +104 -0
- package/src/tests/scheduler-backoff.test.ts +166 -0
- package/src/tests/self-improvement.test.ts +541 -0
- package/src/tests/session-attach.test.ts +536 -0
- package/src/tests/session-costs.test.ts +267 -1
- package/src/tests/slack-actions.test.ts +133 -0
- package/src/tests/slack-assistant.test.ts +136 -0
- package/src/tests/slack-blocks.test.ts +246 -0
- package/src/tests/slack-metadata-inheritance.test.ts +243 -0
- package/src/tests/slack-queue-offline.test.ts +174 -0
- package/src/tests/slack-router.test.ts +181 -0
- package/src/tests/slack-thread-buffer.test.ts +305 -0
- package/src/tests/slack-thread-followups.test.ts +298 -0
- package/src/tests/slack-watcher.test.ts +101 -0
- package/src/tests/structured-output.test.ts +307 -0
- package/src/tests/swarm-repos.test.ts +198 -0
- package/src/tests/task-cancellation.test.ts +6 -4
- package/src/tests/task-working-dir.test.ts +176 -0
- package/src/tests/template-fetch.test.ts +490 -0
- package/src/tests/tool-annotations.test.ts +371 -0
- package/src/tests/tracker-tools.test.ts +184 -0
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-api.test.ts +143 -3
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/validation-adapters.test.ts +86 -0
- package/src/tests/vcs-provider.test.ts +27 -0
- package/src/tests/workflow-agent-task.test.ts +196 -0
- package/src/tests/workflow-async-v2.test.ts +508 -0
- package/src/tests/workflow-convergence.test.ts +541 -0
- package/src/tests/workflow-definition-validation.test.ts +366 -0
- package/src/tests/workflow-engine-v2.test.ts +691 -0
- package/src/tests/workflow-executors.test.ts +736 -0
- package/src/tests/workflow-http-v2.test.ts +599 -0
- package/src/tests/workflow-integration-io.test.ts +902 -0
- package/src/tests/workflow-io-schemas.test.ts +624 -0
- package/src/tests/workflow-registry.test.ts +592 -0
- package/src/tests/workflow-retry-v2.test.ts +401 -0
- package/src/tests/workflow-retry-validation.test.ts +282 -0
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-template.test.ts +288 -0
- package/src/tests/workflow-trigger-schema.test.ts +359 -0
- package/src/tests/workflow-triggers-v2.test.ts +264 -0
- package/src/tests/workflow-versions.test.ts +208 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tests/x402-client.test.ts +117 -0
- package/src/tests/x402-config.test.ts +182 -0
- package/src/tests/x402-spending-tracker.test.ts +185 -0
- package/src/tools/cancel-task.ts +2 -0
- package/src/tools/context-diff.ts +171 -0
- package/src/tools/context-history.ts +138 -0
- package/src/tools/create-channel.ts +1 -0
- package/src/tools/db-query.ts +78 -0
- package/src/tools/delete-channel.ts +132 -0
- package/src/tools/epics/assign-task-to-epic.ts +1 -0
- package/src/tools/epics/create-epic.ts +3 -2
- package/src/tools/epics/delete-epic.ts +2 -0
- package/src/tools/epics/get-epic-details.ts +2 -0
- package/src/tools/epics/list-epics.ts +2 -0
- package/src/tools/epics/unassign-task-from-epic.ts +1 -0
- package/src/tools/epics/update-epic.ts +7 -4
- package/src/tools/get-swarm.ts +2 -0
- package/src/tools/get-task-details.ts +2 -0
- package/src/tools/get-tasks.ts +27 -1
- package/src/tools/inject-learning.ts +106 -0
- package/src/tools/join-swarm.ts +17 -7
- package/src/tools/list-channels.ts +2 -0
- package/src/tools/list-services.ts +2 -0
- package/src/tools/memory-get.ts +56 -0
- package/src/tools/memory-search.ts +131 -0
- package/src/tools/my-agent-info.ts +2 -0
- package/src/tools/poll-task.ts +2 -20
- package/src/tools/post-message.ts +1 -0
- package/src/tools/prompt-templates/delete.ts +86 -0
- package/src/tools/prompt-templates/get.ts +89 -0
- package/src/tools/prompt-templates/index.ts +5 -0
- package/src/tools/prompt-templates/list.ts +95 -0
- package/src/tools/prompt-templates/preview.ts +84 -0
- package/src/tools/prompt-templates/set.ts +117 -0
- package/src/tools/read-messages.ts +2 -0
- package/src/tools/register-agentmail-inbox.ts +166 -0
- package/src/tools/register-service.ts +2 -0
- package/src/tools/schedules/create-schedule.ts +134 -24
- package/src/tools/schedules/delete-schedule.ts +2 -0
- package/src/tools/schedules/list-schedules.ts +20 -4
- package/src/tools/schedules/run-schedule-now.ts +1 -0
- package/src/tools/schedules/update-schedule.ts +49 -17
- package/src/tools/send-task.ts +132 -10
- package/src/tools/slack-download-file.ts +4 -2
- package/src/tools/slack-list-channels.ts +2 -0
- package/src/tools/slack-post.ts +2 -0
- package/src/tools/slack-read.ts +2 -0
- package/src/tools/slack-reply.ts +2 -0
- package/src/tools/slack-upload-file.ts +2 -0
- package/src/tools/store-progress.ts +205 -4
- package/src/tools/swarm-config/delete-config.ts +87 -0
- package/src/tools/swarm-config/get-config.ts +108 -0
- package/src/tools/swarm-config/index.ts +4 -0
- package/src/tools/swarm-config/list-config.ts +99 -0
- package/src/tools/swarm-config/set-config.ts +118 -0
- package/src/tools/task-action.ts +50 -5
- package/src/tools/task-dedup.ts +97 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +124 -0
- package/src/tools/tracker/index.ts +6 -0
- package/src/tools/tracker/tracker-link-epic.ts +64 -0
- package/src/tools/tracker/tracker-link-task.ts +64 -0
- package/src/tools/tracker/tracker-map-agent.ts +57 -0
- package/src/tools/tracker/tracker-status.ts +56 -0
- package/src/tools/tracker/tracker-sync-status.ts +42 -0
- package/src/tools/tracker/tracker-unlink.ts +41 -0
- package/src/tools/unregister-service.ts +2 -0
- package/src/tools/update-profile.ts +172 -17
- package/src/tools/update-service-status.ts +2 -0
- package/src/tools/utils.ts +10 -1
- package/src/tools/workflows/create-workflow.ts +129 -0
- package/src/tools/workflows/delete-workflow.ts +42 -0
- package/src/tools/workflows/get-workflow-run.ts +59 -0
- package/src/tools/workflows/get-workflow.ts +53 -0
- package/src/tools/workflows/index.ts +9 -0
- package/src/tools/workflows/list-workflow-runs.ts +48 -0
- package/src/tools/workflows/list-workflows.ts +42 -0
- package/src/tools/workflows/retry-workflow-run.ts +40 -0
- package/src/tools/workflows/trigger-workflow.ts +96 -0
- package/src/tools/workflows/update-workflow.ts +133 -0
- package/src/tracker/types.ts +51 -0
- package/src/types.ts +530 -14
- package/src/utils/credentials.test.ts +156 -0
- package/src/utils/credentials.ts +50 -0
- package/src/utils/error-tracker.ts +190 -0
- package/src/vcs/index.ts +15 -0
- package/src/vcs/types.ts +5 -0
- package/src/workflows/checkpoint.ts +121 -0
- package/src/workflows/cooldown.ts +28 -0
- package/src/workflows/definition.ts +235 -0
- package/src/workflows/engine.ts +580 -0
- package/src/workflows/event-bus.ts +29 -0
- package/src/workflows/executors/agent-task.ts +103 -0
- package/src/workflows/executors/base.ts +86 -0
- package/src/workflows/executors/code-match.ts +88 -0
- package/src/workflows/executors/index.ts +16 -0
- package/src/workflows/executors/notify.ts +93 -0
- package/src/workflows/executors/property-match.ts +104 -0
- package/src/workflows/executors/raw-llm.ts +83 -0
- package/src/workflows/executors/registry.ts +76 -0
- package/src/workflows/executors/script.ts +103 -0
- package/src/workflows/executors/validate.ts +215 -0
- package/src/workflows/executors/vcs.ts +58 -0
- package/src/workflows/index.ts +61 -0
- package/src/workflows/input.ts +46 -0
- package/src/workflows/json-schema-validator.ts +118 -0
- package/src/workflows/recovery.ts +139 -0
- package/src/workflows/resume.ts +229 -0
- package/src/workflows/retry-poller.ts +216 -0
- package/src/workflows/template.ts +74 -0
- package/src/workflows/templates.ts +86 -0
- package/src/workflows/triggers.ts +124 -0
- package/src/workflows/validation.ts +104 -0
- package/src/workflows/version.ts +44 -0
- package/src/x402/cli.ts +140 -0
- package/src/x402/client.ts +192 -0
- package/src/x402/config.ts +131 -0
- package/src/x402/index.ts +37 -0
- package/src/x402/openfort-signer.ts +83 -0
- package/src/x402/spending-tracker.ts +109 -0
- package/templates/official/coder/CLAUDE.md +49 -0
- package/templates/official/coder/IDENTITY.md +28 -0
- package/templates/official/coder/SOUL.md +43 -0
- package/templates/official/coder/TOOLS.md +40 -0
- package/templates/official/coder/config.json +23 -0
- package/templates/official/coder/start-up.sh +23 -0
- package/templates/official/content-reviewer/CLAUDE.md +68 -0
- package/templates/official/content-reviewer/IDENTITY.md +28 -0
- package/templates/official/content-reviewer/SOUL.md +44 -0
- package/templates/official/content-reviewer/TOOLS.md +37 -0
- package/templates/official/content-reviewer/config.json +23 -0
- package/templates/official/content-reviewer/start-up.sh +23 -0
- package/templates/official/content-strategist/CLAUDE.md +63 -0
- package/templates/official/content-strategist/IDENTITY.md +33 -0
- package/templates/official/content-strategist/SOUL.md +48 -0
- package/templates/official/content-strategist/TOOLS.md +47 -0
- package/templates/official/content-strategist/config.json +23 -0
- package/templates/official/content-strategist/start-up.sh +23 -0
- package/templates/official/content-writer/CLAUDE.md +72 -0
- package/templates/official/content-writer/IDENTITY.md +30 -0
- package/templates/official/content-writer/SOUL.md +46 -0
- package/templates/official/content-writer/TOOLS.md +44 -0
- package/templates/official/content-writer/config.json +23 -0
- package/templates/official/content-writer/start-up.sh +23 -0
- package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
- package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
- package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
- package/templates/official/forward-deployed-engineer/config.json +21 -0
- package/templates/official/lead/CLAUDE.md +33 -0
- package/templates/official/lead/IDENTITY.md +36 -0
- package/templates/official/lead/SOUL.md +51 -0
- package/templates/official/lead/config.json +22 -0
- package/templates/official/researcher/CLAUDE.md +46 -0
- package/templates/official/researcher/IDENTITY.md +28 -0
- package/templates/official/researcher/SOUL.md +43 -0
- package/templates/official/researcher/config.json +21 -0
- package/templates/official/reviewer/CLAUDE.md +63 -0
- package/templates/official/reviewer/IDENTITY.md +28 -0
- package/templates/official/reviewer/SOUL.md +45 -0
- package/templates/official/reviewer/config.json +21 -0
- package/templates/official/tester/CLAUDE.md +53 -0
- package/templates/official/tester/IDENTITY.md +28 -0
- package/templates/official/tester/SOUL.md +55 -0
- package/templates/official/tester/config.json +21 -0
- package/templates/schema.ts +35 -0
- package/.claude/settings.local.json +0 -115
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.env.docker.example +0 -39
- package/.env.example +0 -40
- package/.github/workflows/ci.yml +0 -76
- package/.github/workflows/docker-and-deploy.yml +0 -117
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -102
- package/CLAUDE.md +0 -104
- package/CONTRIBUTING.md +0 -270
- package/DEPLOYMENT.md +0 -605
- package/Dockerfile +0 -57
- package/Dockerfile.worker +0 -157
- package/FAQ.md +0 -19
- package/MCP.md +0 -406
- package/UI.md +0 -40
- package/assets/agent-swarm-logo-orange.png +0 -0
- package/assets/agent-swarm-logo.png +0 -0
- package/assets/agent-swarm.mp4 +0 -0
- package/assets/agent-swarm.png +0 -0
- package/biome.json +0 -39
- package/deploy/DEPLOY.md +0 -60
- package/deploy/agent-swarm.service +0 -17
- package/deploy/docker-push.ts +0 -30
- package/deploy/install.ts +0 -85
- package/deploy/prod-db.ts +0 -42
- package/deploy/uninstall.ts +0 -12
- package/deploy/update.ts +0 -21
- package/docker-compose.example.yml +0 -159
- package/docker-entrypoint.sh +0 -352
- package/ecosystem.config.cjs +0 -66
- package/plugin/README.md +0 -1
- package/plugin/hooks/hooks.json +0 -71
- package/pyproject.toml +0 -9
- package/scripts/generate-mcp-docs.ts +0 -415
- package/slack-manifest.json +0 -71
- package/src/tests/get-inbox-message.test.ts +0 -145
- package/src/tools/get-inbox-message.ts +0 -89
- package/src/tools/inbox-delegate.ts +0 -113
- package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
- package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
- package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
- package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
- package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
- package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
- package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
- package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
- package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
- package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
- package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
- package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
- package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
- package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
- package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
- package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
- package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
- package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
- package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
- package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
- package/thoughts/shared/research/.gitkeep +0 -0
- package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
- package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
- package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
- package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
- package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
- package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
- package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
- package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
- package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
- package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
- package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
- package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
- package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
- package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
- package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
- package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
- package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
- package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
- package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
- package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
- package/tsconfig.json +0 -37
- package/ui/CLAUDE.md +0 -49
- package/ui/bun.lock +0 -771
- package/ui/index.html +0 -22
- package/ui/package-lock.json +0 -5290
- package/ui/package.json +0 -33
- package/ui/pnpm-lock.yaml +0 -3341
- package/ui/postcss.config.js +0 -6
- package/ui/public/logo.png +0 -0
- package/ui/src/App.tsx +0 -63
- package/ui/src/components/ActivityFeed.tsx +0 -440
- package/ui/src/components/AgentDetailPanel.tsx +0 -733
- package/ui/src/components/AgentsPanel.tsx +0 -815
- package/ui/src/components/ChatPanel.tsx +0 -1920
- package/ui/src/components/ConfigModal.tsx +0 -253
- package/ui/src/components/Dashboard.tsx +0 -832
- package/ui/src/components/EditAgentProfileModal.tsx +0 -433
- package/ui/src/components/EpicDetailPage.tsx +0 -741
- package/ui/src/components/EpicsPanel.tsx +0 -566
- package/ui/src/components/Header.tsx +0 -160
- package/ui/src/components/JsonViewer.tsx +0 -171
- package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
- package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
- package/ui/src/components/ServicesPanel.tsx +0 -622
- package/ui/src/components/SessionLogPanel.tsx +0 -1219
- package/ui/src/components/StatsBar.tsx +0 -321
- package/ui/src/components/StatusBadge.tsx +0 -168
- package/ui/src/components/TaskDetailPanel.tsx +0 -903
- package/ui/src/components/TasksPanel.tsx +0 -614
- package/ui/src/components/UsageCharts.tsx +0 -216
- package/ui/src/components/UsageTab.tsx +0 -394
- package/ui/src/hooks/queries.ts +0 -353
- package/ui/src/hooks/useAutoScroll.ts +0 -83
- package/ui/src/index.css +0 -257
- package/ui/src/lib/api.ts +0 -268
- package/ui/src/lib/config.ts +0 -35
- package/ui/src/lib/contentPreview.ts +0 -208
- package/ui/src/lib/theme.ts +0 -214
- package/ui/src/lib/utils.ts +0 -88
- package/ui/src/main.tsx +0 -28
- package/ui/src/types/api.ts +0 -323
- package/ui/src/vite-env.d.ts +0 -1
- package/ui/tailwind.config.js +0 -37
- package/ui/tsconfig.json +0 -31
- package/ui/vite.config.ts +0 -35
- /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { type BasePromptArgs, getBasePrompt } from "../prompts/base-prompt";
|
|
3
|
+
|
|
4
|
+
/** Minimal valid args to reduce boilerplate */
|
|
5
|
+
const minimalArgs: BasePromptArgs = {
|
|
6
|
+
role: "worker",
|
|
7
|
+
agentId: "agent-abc-123",
|
|
8
|
+
swarmUrl: "swarm.example.com",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Basic fields
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
describe("getBasePrompt — basic fields", () => {
|
|
15
|
+
test("includes role and agentId", async () => {
|
|
16
|
+
const result = await getBasePrompt(minimalArgs);
|
|
17
|
+
expect(result).toContain("worker");
|
|
18
|
+
expect(result).toContain("agent-abc-123");
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("lead role gets lead prompt", async () => {
|
|
22
|
+
const result = await getBasePrompt({ ...minimalArgs, role: "lead" });
|
|
23
|
+
expect(result).toContain("lead agent");
|
|
24
|
+
expect(result).toContain("coordinator");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("worker role gets worker prompt", async () => {
|
|
28
|
+
const result = await getBasePrompt(minimalArgs);
|
|
29
|
+
expect(result).toContain("worker agent");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("includes swarmUrl and agentId in services section", async () => {
|
|
33
|
+
const result = await getBasePrompt(minimalArgs);
|
|
34
|
+
expect(result).toContain("swarm.example.com");
|
|
35
|
+
expect(result).toContain(`https://agent-abc-123.swarm.example.com`);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Identity fields (name, description, soulMd, identityMd)
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
describe("getBasePrompt — identity fields", () => {
|
|
43
|
+
test("includes name when provided", async () => {
|
|
44
|
+
const result = await getBasePrompt({ ...minimalArgs, name: "TestAgent" });
|
|
45
|
+
expect(result).toContain("**Name:** TestAgent");
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("includes description when name provided", async () => {
|
|
49
|
+
const result = await getBasePrompt({
|
|
50
|
+
...minimalArgs,
|
|
51
|
+
name: "TestAgent",
|
|
52
|
+
description: "A helpful agent",
|
|
53
|
+
});
|
|
54
|
+
expect(result).toContain("**Description:** A helpful agent");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("does not include description without name", async () => {
|
|
58
|
+
const result = await getBasePrompt({
|
|
59
|
+
...minimalArgs,
|
|
60
|
+
description: "A helpful agent",
|
|
61
|
+
});
|
|
62
|
+
expect(result).not.toContain("**Description:**");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("includes soulMd content", async () => {
|
|
66
|
+
const result = await getBasePrompt({
|
|
67
|
+
...minimalArgs,
|
|
68
|
+
soulMd: "I am a creative soul.",
|
|
69
|
+
});
|
|
70
|
+
expect(result).toContain("## Your Identity");
|
|
71
|
+
expect(result).toContain("I am a creative soul.");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("includes identityMd content", async () => {
|
|
75
|
+
const result = await getBasePrompt({
|
|
76
|
+
...minimalArgs,
|
|
77
|
+
identityMd: "Identity content here.",
|
|
78
|
+
});
|
|
79
|
+
expect(result).toContain("## Your Identity");
|
|
80
|
+
expect(result).toContain("Identity content here.");
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("no identity section when none provided", async () => {
|
|
84
|
+
const result = await getBasePrompt(minimalArgs);
|
|
85
|
+
expect(result).not.toContain("## Your Identity");
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// claudeMd and toolsMd injection
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
describe("getBasePrompt — claudeMd and toolsMd injection", () => {
|
|
93
|
+
test("includes claudeMd under Agent Instructions", async () => {
|
|
94
|
+
const result = await getBasePrompt({
|
|
95
|
+
...minimalArgs,
|
|
96
|
+
claudeMd: "Follow these rules.",
|
|
97
|
+
});
|
|
98
|
+
expect(result).toContain("## Agent Instructions");
|
|
99
|
+
expect(result).toContain("Follow these rules.");
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("includes toolsMd under Tools & Capabilities", async () => {
|
|
103
|
+
const result = await getBasePrompt({
|
|
104
|
+
...minimalArgs,
|
|
105
|
+
toolsMd: "You can use curl.",
|
|
106
|
+
});
|
|
107
|
+
expect(result).toContain("## Your Tools & Capabilities");
|
|
108
|
+
expect(result).toContain("You can use curl.");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("both claudeMd and toolsMd coexist", async () => {
|
|
112
|
+
const result = await getBasePrompt({
|
|
113
|
+
...minimalArgs,
|
|
114
|
+
claudeMd: "Agent instructions content",
|
|
115
|
+
toolsMd: "Tools content",
|
|
116
|
+
});
|
|
117
|
+
expect(result).toContain("## Agent Instructions");
|
|
118
|
+
expect(result).toContain("Agent instructions content");
|
|
119
|
+
expect(result).toContain("## Your Tools & Capabilities");
|
|
120
|
+
expect(result).toContain("Tools content");
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("neither present when not provided", async () => {
|
|
124
|
+
const result = await getBasePrompt(minimalArgs);
|
|
125
|
+
expect(result).not.toContain("## Agent Instructions");
|
|
126
|
+
expect(result).not.toContain("## Your Tools & Capabilities");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// repoContext
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
describe("getBasePrompt — repoContext", () => {
|
|
134
|
+
test("includes repo claudeMd with clone path", async () => {
|
|
135
|
+
const result = await getBasePrompt({
|
|
136
|
+
...minimalArgs,
|
|
137
|
+
repoContext: {
|
|
138
|
+
claudeMd: "Repo-specific rules here.",
|
|
139
|
+
clonePath: "/workspace/my-repo",
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
expect(result).toContain("IMPORTANT: These instructions apply ONLY");
|
|
143
|
+
expect(result).toContain("/workspace/my-repo");
|
|
144
|
+
expect(result).toContain("Repo-specific rules here.");
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("shows warning when provided", async () => {
|
|
148
|
+
const result = await getBasePrompt({
|
|
149
|
+
...minimalArgs,
|
|
150
|
+
repoContext: {
|
|
151
|
+
claudeMd: "Rules",
|
|
152
|
+
clonePath: "/workspace/my-repo",
|
|
153
|
+
warning: "Repo is stale",
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
expect(result).toContain("WARNING: Repo is stale");
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("shows 'no CLAUDE.md' message when claudeMd is null and no warning", async () => {
|
|
160
|
+
const result = await getBasePrompt({
|
|
161
|
+
...minimalArgs,
|
|
162
|
+
repoContext: {
|
|
163
|
+
claudeMd: null,
|
|
164
|
+
clonePath: "/workspace/my-repo",
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
expect(result).toContain("but has no CLAUDE.md file");
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// Capabilities
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
describe("getBasePrompt — capabilities", () => {
|
|
175
|
+
test("services section included by default", async () => {
|
|
176
|
+
const result = await getBasePrompt(minimalArgs);
|
|
177
|
+
expect(result).toContain("Service Registry");
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test("services section excluded when capabilities don't include services", async () => {
|
|
181
|
+
const result = await getBasePrompt({
|
|
182
|
+
...minimalArgs,
|
|
183
|
+
capabilities: ["artifacts"],
|
|
184
|
+
});
|
|
185
|
+
expect(result).not.toContain("Service Registry");
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test("capabilities list rendered", async () => {
|
|
189
|
+
const result = await getBasePrompt({
|
|
190
|
+
...minimalArgs,
|
|
191
|
+
capabilities: ["services", "artifacts"],
|
|
192
|
+
});
|
|
193
|
+
expect(result).toContain("### Capabilities enabled");
|
|
194
|
+
expect(result).toContain("- services");
|
|
195
|
+
expect(result).toContain("- artifacts");
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
// Truncation (tests truncateSection indirectly)
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
describe("getBasePrompt — truncation", () => {
|
|
203
|
+
const bigString = (n: number) => "x".repeat(n);
|
|
204
|
+
|
|
205
|
+
test("claudeMd truncated when exceeding per-section limit (20k chars)", async () => {
|
|
206
|
+
const result = await getBasePrompt({
|
|
207
|
+
...minimalArgs,
|
|
208
|
+
claudeMd: bigString(25_000),
|
|
209
|
+
});
|
|
210
|
+
expect(result).toContain("[...truncated, see /workspace/CLAUDE.md");
|
|
211
|
+
// The full 25k content should NOT be present
|
|
212
|
+
expect(result).not.toContain(bigString(25_000));
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test("toolsMd truncated when exceeding per-section limit", async () => {
|
|
216
|
+
const result = await getBasePrompt({
|
|
217
|
+
...minimalArgs,
|
|
218
|
+
toolsMd: bigString(25_000),
|
|
219
|
+
});
|
|
220
|
+
expect(result).toContain("[...truncated, see /workspace/TOOLS.md");
|
|
221
|
+
expect(result).not.toContain(bigString(25_000));
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("total budget respected — tools truncated before claudeMd", async () => {
|
|
225
|
+
// Use soulMd to eat up most of the 150k total budget so that
|
|
226
|
+
// truncatable sections (claudeMd, toolsMd) must compete for the remainder.
|
|
227
|
+
// soulMd is part of `prompt` which counts toward protectedLength.
|
|
228
|
+
const baseResult = await getBasePrompt(minimalArgs);
|
|
229
|
+
const staticLength = baseResult.length; // ~12-13k for static content
|
|
230
|
+
|
|
231
|
+
// Leave exactly enough budget for claudeMd but not toolsMd.
|
|
232
|
+
// Total budget = 150k - protectedLength.
|
|
233
|
+
// We want: protectedLength ≈ 150k - 18k = 132k, so claudeMd (15k) fits but toolsMd doesn't.
|
|
234
|
+
const soulSize = 132_000 - staticLength;
|
|
235
|
+
const result = await getBasePrompt({
|
|
236
|
+
...minimalArgs,
|
|
237
|
+
soulMd: bigString(Math.max(0, soulSize)),
|
|
238
|
+
claudeMd: bigString(15_000),
|
|
239
|
+
toolsMd: bigString(15_000),
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// claudeMd (higher priority, injected first) should be present
|
|
243
|
+
expect(result).toContain("## Agent Instructions");
|
|
244
|
+
// toolsMd (lower priority) should be truncated or absent
|
|
245
|
+
const hasToolsTruncation = result.includes("[...truncated, see /workspace/TOOLS.md");
|
|
246
|
+
const hasToolsHeader = result.includes("## Your Tools & Capabilities");
|
|
247
|
+
// Tools is either truncated or entirely omitted (budget <= 0)
|
|
248
|
+
expect(hasToolsTruncation || !hasToolsHeader).toBe(true);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("repo context never truncated", async () => {
|
|
252
|
+
const hugeRepoClaudeMd = bigString(30_000);
|
|
253
|
+
const result = await getBasePrompt({
|
|
254
|
+
...minimalArgs,
|
|
255
|
+
repoContext: {
|
|
256
|
+
claudeMd: hugeRepoClaudeMd,
|
|
257
|
+
clonePath: "/workspace/big-repo",
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
// The full repo content should be present (never truncated)
|
|
261
|
+
expect(result).toContain(hugeRepoClaudeMd);
|
|
262
|
+
expect(result).not.toContain("[...truncated");
|
|
263
|
+
});
|
|
264
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
|
|
6
|
+
const PLUGIN_DIR = join(import.meta.dir, "../../plugin");
|
|
7
|
+
const COMMANDS_DIR = join(PLUGIN_DIR, "commands");
|
|
8
|
+
const PI_SKILLS_DIR = join(PLUGIN_DIR, "pi-skills");
|
|
9
|
+
|
|
10
|
+
describe("build-pi-skills", () => {
|
|
11
|
+
// Run the build script once before all tests
|
|
12
|
+
const buildOutput = execSync("bun run plugin/build-pi-skills.ts", {
|
|
13
|
+
cwd: join(import.meta.dir, "../.."),
|
|
14
|
+
encoding: "utf-8",
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const commandFiles = readdirSync(COMMANDS_DIR)
|
|
18
|
+
.filter((f) => f.endsWith(".md"))
|
|
19
|
+
.map((f) => f.replace(".md", ""));
|
|
20
|
+
|
|
21
|
+
const piSkillDirs = readdirSync(PI_SKILLS_DIR, { withFileTypes: true })
|
|
22
|
+
.filter((d) => d.isDirectory())
|
|
23
|
+
.map((d) => d.name);
|
|
24
|
+
|
|
25
|
+
test("build script runs successfully", () => {
|
|
26
|
+
expect(buildOutput).toContain("Converted 12 skills");
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("every command has a corresponding pi-skill", () => {
|
|
30
|
+
for (const cmd of commandFiles) {
|
|
31
|
+
expect(piSkillDirs).toContain(cmd);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("every pi-skill has a SKILL.md file", () => {
|
|
36
|
+
for (const dir of piSkillDirs) {
|
|
37
|
+
const skillPath = join(PI_SKILLS_DIR, dir, "SKILL.md");
|
|
38
|
+
const content = readFileSync(skillPath, "utf-8");
|
|
39
|
+
expect(content.length).toBeGreaterThan(0);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
describe("frontmatter conversion", () => {
|
|
44
|
+
for (const skill of piSkillDirs) {
|
|
45
|
+
test(`${skill} has correct pi-mono frontmatter`, () => {
|
|
46
|
+
const content = readFileSync(join(PI_SKILLS_DIR, skill, "SKILL.md"), "utf-8");
|
|
47
|
+
expect(content).toStartWith("---\n");
|
|
48
|
+
expect(content).toContain(`name: ${skill}`);
|
|
49
|
+
expect(content).toContain("description: ");
|
|
50
|
+
// Should NOT have claude-specific frontmatter
|
|
51
|
+
expect(content).not.toContain("argument-hint:");
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
describe("no claude-specific references", () => {
|
|
57
|
+
for (const skill of piSkillDirs) {
|
|
58
|
+
test(`${skill} has no /desplega: references`, () => {
|
|
59
|
+
const content = readFileSync(join(PI_SKILLS_DIR, skill, "SKILL.md"), "utf-8");
|
|
60
|
+
expect(content).not.toContain("/desplega:");
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test(`${skill} has no claude-only markers`, () => {
|
|
64
|
+
const content = readFileSync(join(PI_SKILLS_DIR, skill, "SKILL.md"), "utf-8");
|
|
65
|
+
expect(content).not.toContain("<!-- claude-only -->");
|
|
66
|
+
expect(content).not.toContain("<!-- /claude-only -->");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test(`${skill} has no pi-only markers`, () => {
|
|
70
|
+
const content = readFileSync(join(PI_SKILLS_DIR, skill, "SKILL.md"), "utf-8");
|
|
71
|
+
expect(content).not.toContain("<!-- pi-only -->");
|
|
72
|
+
expect(content).not.toContain("<!-- /pi-only -->");
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe("slash command syntax", () => {
|
|
78
|
+
const skillsWithCrossRefs = [
|
|
79
|
+
"work-on-task",
|
|
80
|
+
"start-worker",
|
|
81
|
+
"start-leader",
|
|
82
|
+
"review-offered-task",
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
for (const skill of skillsWithCrossRefs) {
|
|
86
|
+
test(`${skill} uses /skill: prefix for cross-references`, () => {
|
|
87
|
+
const content = readFileSync(join(PI_SKILLS_DIR, skill, "SKILL.md"), "utf-8");
|
|
88
|
+
// Should not have bare /work-on-task, /swarm-chat etc. (outside of code blocks)
|
|
89
|
+
// Check that known skill references use /skill: prefix
|
|
90
|
+
const lines = content
|
|
91
|
+
.split("\n")
|
|
92
|
+
.filter((l) => !l.startsWith("```") && !l.startsWith(" "));
|
|
93
|
+
for (const line of lines) {
|
|
94
|
+
if (line.includes("/work-on-task") && !line.includes("/skill:work-on-task")) {
|
|
95
|
+
throw new Error(`${skill}: bare /work-on-task reference found: ${line}`);
|
|
96
|
+
}
|
|
97
|
+
if (line.includes("/swarm-chat") && !line.includes("/skill:swarm-chat")) {
|
|
98
|
+
throw new Error(`${skill}: bare /swarm-chat reference found: ${line}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe("no trailing whitespace", () => {
|
|
106
|
+
for (const skill of piSkillDirs) {
|
|
107
|
+
test(`${skill} has no trailing whitespace`, () => {
|
|
108
|
+
const content = readFileSync(join(PI_SKILLS_DIR, skill, "SKILL.md"), "utf-8");
|
|
109
|
+
const lines = content.split("\n");
|
|
110
|
+
for (let i = 0; i < lines.length; i++) {
|
|
111
|
+
if (lines[i] !== lines[i].trimEnd()) {
|
|
112
|
+
throw new Error(`${skill} line ${i + 1} has trailing whitespace: "${lines[i]}"`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("no triple+ blank lines in any skill", () => {
|
|
120
|
+
for (const skill of piSkillDirs) {
|
|
121
|
+
const content = readFileSync(join(PI_SKILLS_DIR, skill, "SKILL.md"), "utf-8");
|
|
122
|
+
if (content.includes("\n\n\n")) {
|
|
123
|
+
throw new Error(`${skill} has triple blank lines`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
});
|