lastlight 0.1.8 → 0.2.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 +265 -118
- package/agent-context/rules.md +62 -9
- package/agent-context/security.md +69 -0
- package/config/default.yaml +89 -0
- package/deploy/.env.production.example +20 -2
- package/deploy/entrypoint.sh +16 -17
- package/deploy/native/README.md +160 -0
- package/deploy/native/install.sh +110 -0
- package/deploy/native/lastlight.env.example +95 -0
- package/deploy/native/lastlight.service +50 -0
- package/deploy/sandbox-entrypoint.sh +59 -42
- package/dist/admin/auth.d.ts +1 -1
- package/dist/admin/auth.js +3 -1
- package/dist/admin/auth.js.map +1 -1
- package/dist/admin/chat-session-reader.d.ts +11 -14
- package/dist/admin/chat-session-reader.js +27 -51
- package/dist/admin/chat-session-reader.js.map +1 -1
- package/dist/admin/docker.d.ts +37 -0
- package/dist/admin/docker.js +86 -1
- package/dist/admin/docker.js.map +1 -1
- package/dist/admin/index.js +38 -3
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/log-search.test.d.ts +1 -0
- package/dist/admin/log-search.test.js +78 -0
- package/dist/admin/log-search.test.js.map +1 -0
- package/dist/admin/routes.d.ts +52 -3
- package/dist/admin/routes.js +780 -63
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/routes.test.js +680 -14
- package/dist/admin/routes.test.js.map +1 -1
- package/dist/admin/server-logs.test.d.ts +1 -0
- package/dist/admin/server-logs.test.js +58 -0
- package/dist/admin/server-logs.test.js.map +1 -0
- package/dist/admin/sessions.d.ts +26 -39
- package/dist/admin/sessions.js +86 -310
- package/dist/admin/sessions.js.map +1 -1
- package/dist/admin/sessions.test.d.ts +1 -0
- package/dist/admin/sessions.test.js +78 -0
- package/dist/admin/sessions.test.js.map +1 -0
- package/dist/admin/version.d.ts +15 -0
- package/dist/admin/version.js +73 -0
- package/dist/admin/version.js.map +1 -0
- package/dist/admin/version.test.d.ts +1 -0
- package/dist/admin/version.test.js +71 -0
- package/dist/admin/version.test.js.map +1 -0
- package/dist/cli-config.d.ts +55 -0
- package/dist/cli-config.js +119 -0
- package/dist/cli-config.js.map +1 -0
- package/dist/cli-config.test.d.ts +1 -0
- package/dist/cli-config.test.js +92 -0
- package/dist/cli-config.test.js.map +1 -0
- package/dist/cli-format.d.ts +19 -0
- package/dist/cli-format.js +107 -0
- package/dist/cli-format.js.map +1 -0
- package/dist/cli-server.d.ts +73 -0
- package/dist/cli-server.js +347 -0
- package/dist/cli-server.js.map +1 -0
- package/dist/cli-server.test.d.ts +1 -0
- package/dist/cli-server.test.js +38 -0
- package/dist/cli-server.test.js.map +1 -0
- package/dist/cli-timeline.d.ts +35 -0
- package/dist/cli-timeline.js +373 -0
- package/dist/cli-timeline.js.map +1 -0
- package/dist/cli-timeline.test.d.ts +1 -0
- package/dist/cli-timeline.test.js +104 -0
- package/dist/cli-timeline.test.js.map +1 -0
- package/dist/cli.d.ts +0 -19
- package/dist/cli.js +910 -194
- package/dist/cli.js.map +1 -1
- package/dist/config-overlay.test.d.ts +1 -0
- package/dist/config-overlay.test.js +112 -0
- package/dist/config-overlay.test.js.map +1 -0
- package/dist/config-resolve.d.ts +28 -0
- package/dist/config-resolve.js +47 -0
- package/dist/config-resolve.js.map +1 -0
- package/dist/config-resolve.test.d.ts +1 -0
- package/dist/config-resolve.test.js +68 -0
- package/dist/config-resolve.test.js.map +1 -0
- package/dist/config.d.ts +62 -49
- package/dist/config.js +452 -76
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +201 -32
- package/dist/config.test.js.map +1 -1
- package/dist/connectors/github-webhook.js +83 -5
- package/dist/connectors/github-webhook.js.map +1 -1
- package/dist/connectors/github-webhook.test.d.ts +1 -0
- package/dist/connectors/github-webhook.test.js +156 -0
- package/dist/connectors/github-webhook.test.js.map +1 -0
- package/dist/connectors/messaging/session-manager.d.ts +18 -0
- package/dist/connectors/messaging/session-manager.js +83 -2
- package/dist/connectors/messaging/session-manager.js.map +1 -1
- package/dist/connectors/messaging/session-manager.test.d.ts +1 -0
- package/dist/connectors/messaging/session-manager.test.js +144 -0
- package/dist/connectors/messaging/session-manager.test.js.map +1 -0
- package/dist/connectors/slack/connector.d.ts +9 -0
- package/dist/connectors/slack/connector.js +15 -0
- package/dist/connectors/slack/connector.js.map +1 -1
- package/dist/connectors/slack/mrkdwn.js +81 -0
- package/dist/connectors/slack/mrkdwn.js.map +1 -1
- package/dist/connectors/slack/mrkdwn.test.js +49 -0
- package/dist/connectors/slack/mrkdwn.test.js.map +1 -1
- package/dist/connectors/types.d.ts +1 -1
- package/dist/cron/fanout.d.ts +33 -0
- package/dist/cron/fanout.js +55 -0
- package/dist/cron/fanout.js.map +1 -0
- package/dist/cron/fanout.test.d.ts +1 -0
- package/dist/cron/fanout.test.js +73 -0
- package/dist/cron/fanout.test.js.map +1 -0
- package/dist/cron/jobs.d.ts +5 -0
- package/dist/cron/jobs.js +10 -3
- package/dist/cron/jobs.js.map +1 -1
- package/dist/cron/scheduler.d.ts +12 -0
- package/dist/cron/scheduler.js +27 -1
- package/dist/cron/scheduler.js.map +1 -1
- package/dist/engine/agent-executor.d.ts +158 -0
- package/dist/engine/agent-executor.js +1140 -0
- package/dist/engine/agent-executor.js.map +1 -0
- package/dist/engine/agent-executor.test.d.ts +1 -0
- package/dist/engine/agent-executor.test.js +395 -0
- package/dist/engine/agent-executor.test.js.map +1 -0
- package/dist/engine/chat-runner.d.ts +123 -0
- package/dist/engine/chat-runner.js +379 -0
- package/dist/engine/chat-runner.js.map +1 -0
- package/dist/engine/chat-runner.test.d.ts +1 -0
- package/dist/engine/chat-runner.test.js +104 -0
- package/dist/engine/chat-runner.test.js.map +1 -0
- package/dist/engine/chat-skills.d.ts +45 -0
- package/dist/engine/chat-skills.js +184 -0
- package/dist/engine/chat-skills.js.map +1 -0
- package/dist/engine/chat-skills.test.d.ts +1 -0
- package/dist/engine/chat-skills.test.js +20 -0
- package/dist/engine/chat-skills.test.js.map +1 -0
- package/dist/engine/chat.d.ts +20 -23
- package/dist/engine/chat.js +251 -155
- package/dist/engine/chat.js.map +1 -1
- package/dist/engine/chat.test.d.ts +1 -0
- package/dist/engine/chat.test.js +42 -0
- package/dist/engine/chat.test.js.map +1 -0
- package/dist/engine/classifier.d.ts +35 -2
- package/dist/engine/classifier.js +170 -31
- package/dist/engine/classifier.js.map +1 -1
- package/dist/engine/classifier.test.d.ts +1 -0
- package/dist/engine/classifier.test.js +115 -0
- package/dist/engine/classifier.test.js.map +1 -0
- package/dist/engine/dispatcher.d.ts +60 -0
- package/dist/engine/dispatcher.js +601 -0
- package/dist/engine/dispatcher.js.map +1 -0
- package/dist/engine/dispatcher.test.d.ts +1 -0
- package/dist/engine/dispatcher.test.js +511 -0
- package/dist/engine/dispatcher.test.js.map +1 -0
- package/dist/engine/event-shim.d.ts +117 -0
- package/dist/engine/event-shim.js +435 -0
- package/dist/engine/event-shim.js.map +1 -0
- package/dist/engine/event-shim.test.d.ts +1 -0
- package/dist/engine/event-shim.test.js +194 -0
- package/dist/engine/event-shim.test.js.map +1 -0
- package/dist/engine/git-auth.d.ts +13 -17
- package/dist/engine/git-auth.js +99 -42
- package/dist/engine/git-auth.js.map +1 -1
- package/dist/engine/git-auth.test.d.ts +1 -0
- package/dist/engine/git-auth.test.js +117 -0
- package/dist/engine/git-auth.test.js.map +1 -0
- package/dist/engine/github-app-client.d.ts +7 -0
- package/dist/engine/github-app-client.js +16 -0
- package/dist/engine/github-app-client.js.map +1 -0
- package/dist/engine/github-app-client.test.d.ts +1 -0
- package/dist/engine/github-app-client.test.js +44 -0
- package/dist/engine/github-app-client.test.js.map +1 -0
- package/dist/engine/github-tools.d.ts +12 -0
- package/dist/engine/github-tools.js +261 -0
- package/dist/engine/github-tools.js.map +1 -0
- package/dist/engine/github.d.ts +1027 -43
- package/dist/engine/github.js +153 -14
- package/dist/engine/github.js.map +1 -1
- package/dist/engine/llm.d.ts +47 -0
- package/dist/engine/llm.js +221 -0
- package/dist/engine/llm.js.map +1 -0
- package/dist/engine/llm.test.d.ts +1 -0
- package/dist/engine/llm.test.js +189 -0
- package/dist/engine/llm.test.js.map +1 -0
- package/dist/engine/profiles.d.ts +249 -0
- package/dist/engine/profiles.js +42 -0
- package/dist/engine/profiles.js.map +1 -0
- package/dist/engine/router.d.ts +12 -6
- package/dist/engine/router.js +339 -81
- package/dist/engine/router.js.map +1 -1
- package/dist/engine/router.test.js +428 -78
- package/dist/engine/router.test.js.map +1 -1
- package/dist/engine/screen.d.ts +41 -0
- package/dist/engine/screen.js +93 -0
- package/dist/engine/screen.js.map +1 -0
- package/dist/engine/screen.test.d.ts +1 -0
- package/dist/engine/screen.test.js +82 -0
- package/dist/engine/screen.test.js.map +1 -0
- package/dist/index.js +423 -437
- package/dist/index.js.map +1 -1
- package/dist/managed-repos.d.ts +7 -9
- package/dist/managed-repos.js +12 -15
- package/dist/managed-repos.js.map +1 -1
- package/dist/managed-repos.test.js +24 -19
- package/dist/managed-repos.test.js.map +1 -1
- package/dist/notify/index.d.ts +15 -0
- package/dist/notify/index.js +6 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/model.d.ts +57 -0
- package/dist/notify/model.js +89 -0
- package/dist/notify/model.js.map +1 -0
- package/dist/notify/model.test.d.ts +1 -0
- package/dist/notify/model.test.js +109 -0
- package/dist/notify/model.test.js.map +1 -0
- package/dist/notify/notifier.d.ts +17 -0
- package/dist/notify/notifier.js +87 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/notify/notifier.test.d.ts +1 -0
- package/dist/notify/notifier.test.js +100 -0
- package/dist/notify/notifier.test.js.map +1 -0
- package/dist/notify/render.d.ts +21 -0
- package/dist/notify/render.js +59 -0
- package/dist/notify/render.js.map +1 -0
- package/dist/notify/render.test.d.ts +1 -0
- package/dist/notify/render.test.js +65 -0
- package/dist/notify/render.test.js.map +1 -0
- package/dist/notify/transports/github.d.ts +26 -0
- package/dist/notify/transports/github.js +26 -0
- package/dist/notify/transports/github.js.map +1 -0
- package/dist/notify/transports/slack.d.ts +26 -0
- package/dist/notify/transports/slack.js +28 -0
- package/dist/notify/transports/slack.js.map +1 -0
- package/dist/notify/transports.test.d.ts +1 -0
- package/dist/notify/transports.test.js +71 -0
- package/dist/notify/transports.test.js.map +1 -0
- package/dist/notify/types.d.ts +95 -0
- package/dist/notify/types.js +16 -0
- package/dist/notify/types.js.map +1 -0
- package/dist/sandbox/docker-compose.test.d.ts +1 -0
- package/dist/sandbox/docker-compose.test.js +128 -0
- package/dist/sandbox/docker-compose.test.js.map +1 -0
- package/dist/sandbox/docker.d.ts +97 -9
- package/dist/sandbox/docker.js +192 -41
- package/dist/sandbox/docker.js.map +1 -1
- package/dist/sandbox/docker.test.d.ts +1 -0
- package/dist/sandbox/docker.test.js +137 -0
- package/dist/sandbox/docker.test.js.map +1 -0
- package/dist/sandbox/egress-allowlist.d.ts +69 -0
- package/dist/sandbox/egress-allowlist.js +164 -0
- package/dist/sandbox/egress-allowlist.js.map +1 -0
- package/dist/sandbox/egress-allowlist.test.d.ts +1 -0
- package/dist/sandbox/egress-allowlist.test.js +65 -0
- package/dist/sandbox/egress-allowlist.test.js.map +1 -0
- package/dist/sandbox/egress-firewall-config.d.ts +127 -0
- package/dist/sandbox/egress-firewall-config.js +434 -0
- package/dist/sandbox/egress-firewall-config.js.map +1 -0
- package/dist/sandbox/egress-firewall-config.test.d.ts +1 -0
- package/dist/sandbox/egress-firewall-config.test.js +244 -0
- package/dist/sandbox/egress-firewall-config.test.js.map +1 -0
- package/dist/sandbox/images.d.ts +23 -0
- package/dist/sandbox/images.js +55 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/index.d.ts +82 -3
- package/dist/sandbox/index.js +223 -93
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/index.test.d.ts +1 -0
- package/dist/sandbox/index.test.js +157 -0
- package/dist/sandbox/index.test.js.map +1 -0
- package/dist/session-log.d.ts +63 -0
- package/dist/session-log.js +290 -0
- package/dist/session-log.js.map +1 -0
- package/dist/session-log.test.d.ts +1 -0
- package/dist/session-log.test.js +85 -0
- package/dist/session-log.test.js.map +1 -0
- package/dist/setup.d.ts +31 -12
- package/dist/setup.js +516 -174
- package/dist/setup.js.map +1 -1
- package/dist/setup.test.js +138 -6
- package/dist/setup.test.js.map +1 -1
- package/dist/state/approval-store.d.ts +86 -0
- package/dist/state/approval-store.js +140 -0
- package/dist/state/approval-store.js.map +1 -0
- package/dist/state/build-assets.d.ts +50 -0
- package/dist/state/build-assets.js +154 -0
- package/dist/state/build-assets.js.map +1 -0
- package/dist/state/build-assets.test.d.ts +1 -0
- package/dist/state/build-assets.test.js +106 -0
- package/dist/state/build-assets.test.js.map +1 -0
- package/dist/state/db.d.ts +65 -333
- package/dist/state/db.js +112 -835
- package/dist/state/db.js.map +1 -1
- package/dist/state/db.test.js +127 -91
- package/dist/state/db.test.js.map +1 -1
- package/dist/state/execution-store.d.ts +257 -0
- package/dist/state/execution-store.js +527 -0
- package/dist/state/execution-store.js.map +1 -0
- package/dist/state/migrate.d.ts +15 -0
- package/dist/state/migrate.js +175 -0
- package/dist/state/migrate.js.map +1 -0
- package/dist/state/workflow-run-store.d.ts +195 -0
- package/dist/state/workflow-run-store.js +363 -0
- package/dist/state/workflow-run-store.js.map +1 -0
- package/dist/state/workflow-run-store.test.d.ts +1 -0
- package/dist/state/workflow-run-store.test.js +264 -0
- package/dist/state/workflow-run-store.test.js.map +1 -0
- package/dist/telemetry/index.d.ts +38 -0
- package/dist/telemetry/index.js +253 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/index.test.d.ts +1 -0
- package/dist/telemetry/index.test.js +73 -0
- package/dist/telemetry/index.test.js.map +1 -0
- package/dist/telemetry/pi-events.d.ts +12 -0
- package/dist/telemetry/pi-events.js +134 -0
- package/dist/telemetry/pi-events.js.map +1 -0
- package/dist/telemetry/pi-events.test.d.ts +1 -0
- package/dist/telemetry/pi-events.test.js +69 -0
- package/dist/telemetry/pi-events.test.js.map +1 -0
- package/dist/workflows/dag.d.ts +13 -1
- package/dist/workflows/dag.js +7 -3
- package/dist/workflows/dag.js.map +1 -1
- package/dist/workflows/dag.test.js +22 -0
- package/dist/workflows/dag.test.js.map +1 -1
- package/dist/workflows/golden-build.test.d.ts +1 -0
- package/dist/workflows/golden-build.test.js +45 -0
- package/dist/workflows/golden-build.test.js.map +1 -0
- package/dist/workflows/loader-overlay.test.d.ts +1 -0
- package/dist/workflows/loader-overlay.test.js +101 -0
- package/dist/workflows/loader-overlay.test.js.map +1 -0
- package/dist/workflows/loader.d.ts +36 -11
- package/dist/workflows/loader.js +311 -87
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/loader.test.js +114 -10
- package/dist/workflows/loader.test.js.map +1 -1
- package/dist/workflows/loop-eval.js +2 -0
- package/dist/workflows/loop-eval.js.map +1 -1
- package/dist/workflows/loop-eval.test.js +14 -0
- package/dist/workflows/loop-eval.test.js.map +1 -1
- package/dist/workflows/phase-executor.d.ts +145 -0
- package/dist/workflows/phase-executor.js +691 -0
- package/dist/workflows/phase-executor.js.map +1 -0
- package/dist/workflows/phase-executor.test.d.ts +1 -0
- package/dist/workflows/phase-executor.test.js +434 -0
- package/dist/workflows/phase-executor.test.js.map +1 -0
- package/dist/workflows/phase-ref.d.ts +44 -0
- package/dist/workflows/phase-ref.js +78 -0
- package/dist/workflows/phase-ref.js.map +1 -0
- package/dist/workflows/phase-ref.test.d.ts +1 -0
- package/dist/workflows/phase-ref.test.js +24 -0
- package/dist/workflows/phase-ref.test.js.map +1 -0
- package/dist/workflows/resume.d.ts +5 -11
- package/dist/workflows/resume.js +88 -7
- package/dist/workflows/resume.js.map +1 -1
- package/dist/workflows/runner.d.ts +34 -27
- package/dist/workflows/runner.js +252 -930
- package/dist/workflows/runner.js.map +1 -1
- package/dist/workflows/runner.test.js +346 -35
- package/dist/workflows/runner.test.js.map +1 -1
- package/dist/workflows/schema.d.ts +52 -10
- package/dist/workflows/schema.js +147 -7
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/simple.d.ts +67 -3
- package/dist/workflows/simple.js +248 -87
- package/dist/workflows/simple.js.map +1 -1
- package/dist/workflows/simple.test.d.ts +1 -0
- package/dist/workflows/simple.test.js +107 -0
- package/dist/workflows/simple.test.js.map +1 -0
- package/dist/workflows/templates.d.ts +29 -0
- package/dist/workflows/templates.js +42 -4
- package/dist/workflows/templates.js.map +1 -1
- package/dist/workflows/templates.test.js +103 -0
- package/dist/workflows/templates.test.js.map +1 -1
- package/dist/workflows/triggers.d.ts +21 -0
- package/dist/workflows/triggers.js +44 -0
- package/dist/workflows/triggers.js.map +1 -0
- package/dist/workflows/verdict.d.ts +19 -0
- package/dist/workflows/verdict.js +30 -0
- package/dist/workflows/verdict.js.map +1 -0
- package/dist/workflows/verdict.test.d.ts +1 -0
- package/dist/workflows/verdict.test.js +44 -0
- package/dist/workflows/verdict.test.js.map +1 -0
- package/dist/worktree/manager.d.ts +1 -1
- package/dist/worktree/manager.js +14 -14
- package/dist/worktree/manager.js.map +1 -1
- package/dist/worktree/manager.test.d.ts +1 -0
- package/dist/worktree/manager.test.js +87 -0
- package/dist/worktree/manager.test.js.map +1 -0
- package/docker-compose.yml +206 -5
- package/package.json +19 -7
- package/sandbox.Dockerfile +97 -18
- package/skills/README.md +40 -0
- package/skills/browser-qa/SKILL.md +193 -0
- package/skills/browser-qa/scripts/agent-browser.mjs +380 -0
- package/skills/building/SKILL.md +95 -0
- package/skills/chat/SKILL.md +30 -11
- package/skills/code-review/SKILL.md +59 -0
- package/skills/debug-production/SKILL.md +108 -0
- package/skills/demo/SKILL.md +194 -0
- package/skills/demo/scripts/compose-demo.sh +205 -0
- package/skills/issue-answer/SKILL.md +90 -0
- package/skills/issue-comment/SKILL.md +38 -24
- package/skills/issue-triage/SKILL.md +103 -37
- package/skills/issue-triage/references/AGENT-BRIEF.md +61 -0
- package/skills/pr-comment/SKILL.md +64 -0
- package/skills/pr-review/SKILL.md +65 -49
- package/skills/qa-test/SKILL.md +97 -0
- package/skills/repo-health/SKILL.md +48 -45
- package/skills/security-feedback/SKILL.md +173 -0
- package/skills/security-feedback/references/templates.md +77 -0
- package/skills/security-review/SKILL.md +213 -0
- package/skills/security-review/references/issue-format.md +302 -0
- package/skills/verify/SKILL.md +118 -0
- package/workflows/answer.yaml +37 -0
- package/workflows/build.yaml +32 -22
- package/workflows/cron-security.yaml +6 -0
- package/workflows/demo.yaml +55 -0
- package/workflows/explore.yaml +9 -0
- package/workflows/pr-comment.yaml +16 -0
- package/workflows/pr-fix.yaml +3 -0
- package/workflows/pr-review.yaml +4 -1
- package/workflows/prompts/answer.md +67 -0
- package/workflows/prompts/architect.md +24 -7
- package/workflows/prompts/demo.md +100 -0
- package/workflows/prompts/executor.md +29 -20
- package/workflows/prompts/explore-ask.md +51 -22
- package/workflows/prompts/explore-publish.md +2 -2
- package/workflows/prompts/explore-read.md +24 -10
- package/workflows/prompts/explore-synthesize.md +15 -8
- package/workflows/prompts/fix.md +9 -10
- package/workflows/prompts/guardrails.md +26 -8
- package/workflows/prompts/pr-fix.md +6 -7
- package/workflows/prompts/pr.md +11 -10
- package/workflows/prompts/qa-browser.md +95 -0
- package/workflows/prompts/qa-synth.md +44 -0
- package/workflows/prompts/qa-test.md +60 -0
- package/workflows/prompts/re-reviewer.md +8 -9
- package/workflows/prompts/reviewer.md +10 -9
- package/workflows/prompts/verify-browser.md +93 -0
- package/workflows/prompts/verify-synth.md +44 -0
- package/workflows/prompts/verify.md +63 -0
- package/workflows/qa-test.yaml +87 -0
- package/workflows/security-feedback.yaml +25 -0
- package/workflows/security-review.yaml +29 -0
- package/workflows/verify.yaml +85 -0
- package/deploy/mcp-config.tmpl.json +0 -14
- package/dist/cron/rate-limits.d.ts +0 -26
- package/dist/cron/rate-limits.js +0 -193
- package/dist/cron/rate-limits.js.map +0 -1
- package/dist/engine/executor.d.ts +0 -75
- package/dist/engine/executor.js +0 -292
- package/dist/engine/executor.js.map +0 -1
- package/mcp-github-app/package.json +0 -18
- package/mcp-github-app/src/auth.js +0 -66
- package/mcp-github-app/src/github.js +0 -371
- package/mcp-github-app/src/index.js +0 -534
- package/skills/devops/webhook-subscriptions/SKILL.md +0 -180
- package/skills/github/DESCRIPTION.md +0 -3
- package/skills/github/codebase-inspection/SKILL.md +0 -115
- package/skills/github/github-auth/SKILL.md +0 -54
- package/skills/github/github-auth/scripts/gh-env.sh +0 -66
- package/skills/github/github-code-review/SKILL.md +0 -480
- package/skills/github/github-code-review/references/review-output-template.md +0 -74
- package/skills/github/github-issues/SKILL.md +0 -369
- package/skills/github/github-issues/templates/bug-report.md +0 -35
- package/skills/github/github-issues/templates/feature-request.md +0 -31
- package/skills/github/github-pr-workflow/SKILL.md +0 -395
- package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +0 -183
- package/skills/github/github-pr-workflow/references/conventional-commits.md +0 -71
- package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +0 -35
- package/skills/github/github-pr-workflow/templates/pr-body-feature.md +0 -33
- package/skills/github/github-repo-management/SKILL.md +0 -515
- package/skills/github/github-repo-management/references/github-api-cheatsheet.md +0 -161
- package/skills/github-orchestrator/SKILL.md +0 -103
- package/skills/mcp/DESCRIPTION.md +0 -3
- package/skills/mcp/mcporter/SKILL.md +0 -122
- package/skills/mcp/native-mcp/SKILL.md +0 -356
- package/skills/software-development/architect/SKILL.md +0 -154
- package/skills/software-development/assure-guardrails/SKILL.md +0 -239
- package/skills/software-development/plan/SKILL.md +0 -64
- package/skills/software-development/requesting-code-review/SKILL.md +0 -291
- package/skills/software-development/subagent-driven-development/SKILL.md +0 -433
- package/skills/software-development/systematic-debugging/SKILL.md +0 -366
- package/skills/software-development/test-driven-development/SKILL.md +0 -342
package/workflows/build.yaml
CHANGED
|
@@ -2,6 +2,10 @@ kind: build
|
|
|
2
2
|
name: build
|
|
3
3
|
description: "Architect -> Executor -> Reviewer build cycle"
|
|
4
4
|
trigger: build
|
|
5
|
+
# Render progress as a single in-place task-list comment/message that updates
|
|
6
|
+
# as phases run, instead of a new comment per phase. The per-phase
|
|
7
|
+
# `messages.on_*` below become the one-line detail on each checklist step.
|
|
8
|
+
status_checklist: true
|
|
5
9
|
|
|
6
10
|
phases:
|
|
7
11
|
- name: phase_0
|
|
@@ -12,6 +16,7 @@ phases:
|
|
|
12
16
|
label: Guardrails
|
|
13
17
|
prompt: prompts/guardrails.md
|
|
14
18
|
model: "{{models.guardrails}}"
|
|
19
|
+
variant: "{{variants.guardrails}}"
|
|
15
20
|
on_output:
|
|
16
21
|
contains_BLOCKED:
|
|
17
22
|
action: fail
|
|
@@ -27,7 +32,7 @@ phases:
|
|
|
27
32
|
contains_READY:
|
|
28
33
|
action: continue
|
|
29
34
|
messages:
|
|
30
|
-
on_success: "
|
|
35
|
+
on_success: "READY — foundational tooling verified — [guardrails-report.md]({{artifactUrl guardrails-report.md}})"
|
|
31
36
|
on_blocked: |
|
|
32
37
|
**Guardrails check: BLOCKED** — missing foundational tooling.
|
|
33
38
|
|
|
@@ -38,67 +43,72 @@ phases:
|
|
|
38
43
|
label: Architect
|
|
39
44
|
prompt: prompts/architect.md
|
|
40
45
|
model: "{{models.architect}}"
|
|
46
|
+
variant: "{{variants.architect}}"
|
|
41
47
|
approval_gate: post_architect
|
|
48
|
+
approval_artifact: architect-plan.md
|
|
42
49
|
approval_gate_message: |
|
|
43
50
|
**Architect analysis complete** — approval required before implementation.
|
|
44
51
|
|
|
45
52
|
- Branch: `{{branch}}`
|
|
46
53
|
- Plan: `{{issueDir}}/architect-plan.md`
|
|
47
54
|
|
|
48
|
-
**
|
|
49
|
-
**
|
|
55
|
+
**Review & decide:** {{approvalUrl}}
|
|
56
|
+
**Or comment:** `@last-light approve` / `@last-light reject [reason]`
|
|
50
57
|
messages:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
- Plan: `{{issueDir}}/architect-plan.md`
|
|
55
|
-
|
|
56
|
-
Starting implementation...
|
|
58
|
+
# Single-line messages become the one-line detail on the checklist step,
|
|
59
|
+
# so keep them concise and link the artifact on the branch.
|
|
60
|
+
on_success: "Plan ready — [architect-plan.md]({{artifactUrl architect-plan.md}})"
|
|
57
61
|
|
|
58
62
|
- name: executor
|
|
59
63
|
label: Executor
|
|
60
64
|
prompt: prompts/executor.md
|
|
65
|
+
skill: building
|
|
61
66
|
model: "{{models.executor}}"
|
|
67
|
+
variant: "{{variants.executor}}"
|
|
62
68
|
messages:
|
|
63
|
-
on_start: "
|
|
64
|
-
on_skipped_done: "
|
|
65
|
-
on_success:
|
|
66
|
-
**Implementation complete.** Running independent review...
|
|
67
|
-
- Branch: `{{branch}}`
|
|
68
|
-
- Summary: `{{issueDir}}/executor-summary.md`
|
|
69
|
+
on_start: "implementing the architect's plan…"
|
|
70
|
+
on_skipped_done: "already completed"
|
|
71
|
+
on_success: "Implemented — [executor-summary.md]({{artifactUrl executor-summary.md}})"
|
|
69
72
|
|
|
70
73
|
- name: reviewer
|
|
71
74
|
label: Reviewer
|
|
72
75
|
prompt: prompts/reviewer.md
|
|
76
|
+
# code-review: rubric for the review + re-review prompts.
|
|
77
|
+
# building: the fix cycle (fix.md) runs under this node and needs the gate.
|
|
78
|
+
skills: [code-review, building]
|
|
73
79
|
model: "{{models.reviewer}}"
|
|
80
|
+
variant: "{{variants.reviewer}}"
|
|
74
81
|
output_var: review
|
|
75
82
|
loop:
|
|
76
83
|
max_cycles: 2
|
|
77
84
|
on_request_changes:
|
|
78
85
|
fix_prompt: prompts/fix.md
|
|
79
86
|
fix_model: "{{models.fix}}"
|
|
87
|
+
fix_variant: "{{variants.fix}}"
|
|
80
88
|
re_review_prompt: prompts/re-reviewer.md
|
|
81
89
|
approval_gate: post_reviewer
|
|
90
|
+
approval_artifact: reviewer-verdict.md
|
|
82
91
|
messages:
|
|
83
|
-
on_cycle_start: "
|
|
84
|
-
on_approved: "
|
|
85
|
-
on_request_changes: "**Review: REQUEST_CHANGES** — fixing issues (cycle {{cycle}}/{{maxCycles}})..."
|
|
92
|
+
on_cycle_start: "independent verification (cycle {{cycle}})…"
|
|
93
|
+
on_approved: "Approved — [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}})"
|
|
94
|
+
on_request_changes: "**Review: REQUEST_CHANGES** — [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}}) — fixing issues (cycle {{cycle}}/{{maxCycles}})..."
|
|
86
95
|
on_fix_start: "**Starting fix loop** (cycle {{cycle}}/{{maxCycles}}) — addressing reviewer feedback..."
|
|
87
96
|
on_fix_failed: "Fix cycle {{cycle}} failed. Proceeding to PR with known issues."
|
|
88
|
-
on_max_cycles: "**Review: REQUEST_CHANGES** after {{maxCycles}} fix cycles. Proceeding with remaining issues noted."
|
|
97
|
+
on_max_cycles: "**Review: REQUEST_CHANGES** after {{maxCycles}} fix cycles — see [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}}). Proceeding with remaining issues noted."
|
|
89
98
|
on_pause_for_approval: |
|
|
90
99
|
**Review: REQUEST_CHANGES** — approval required before fix loop.
|
|
91
100
|
|
|
92
101
|
- Verdict: `{{issueDir}}/reviewer-verdict.md`
|
|
93
102
|
|
|
94
|
-
**
|
|
95
|
-
**
|
|
103
|
+
**Review & decide:** {{approvalUrl}}
|
|
104
|
+
**Or comment:** `@last-light approve` / `@last-light reject [reason]`
|
|
96
105
|
|
|
97
106
|
- name: pr
|
|
98
107
|
label: PR
|
|
99
108
|
prompt: prompts/pr.md
|
|
100
109
|
model: "{{models.pr}}"
|
|
110
|
+
variant: "{{variants.pr}}"
|
|
101
111
|
on_success:
|
|
102
112
|
set_phase: complete
|
|
103
113
|
messages:
|
|
104
|
-
on_start: "
|
|
114
|
+
on_start: "packaging changes for review…"
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
kind: demo
|
|
2
|
+
name: demo
|
|
3
|
+
description: |
|
|
4
|
+
Record a short demo VIDEO of a PR or feature and post it. Drives the repo's
|
|
5
|
+
web UI in a real headless browser, screen-records the session, and composites
|
|
6
|
+
a titled, size-capped mp4 with ffmpeg — delivered inline on the originating
|
|
7
|
+
issue/PR (and in the dashboard Artifacts view). Does not modify code.
|
|
8
|
+
|
|
9
|
+
This workflow's demo phase runs ENTIRELY on the docker backend with the
|
|
10
|
+
browser-QA image (Playwright + Chromium + ffmpeg baked in). On gondolin, or a
|
|
11
|
+
docker host without that image, the demo phase is silently SKIPPED (graceful
|
|
12
|
+
degradation) and the run completes without a video — it never fails the
|
|
13
|
+
trigger. Compositing is ffmpeg-only (title card, optional before/after,
|
|
14
|
+
trim/speed, size cap) — there is no Remotion / cinematic pipeline.
|
|
15
|
+
|
|
16
|
+
Delivery is a single in-place status comment (`status_checklist`): the run
|
|
17
|
+
shows its phases ticking off, then the demo phase's report — with the playable
|
|
18
|
+
video embedded — becomes the comment footer via `final_message`. The agent
|
|
19
|
+
does NOT post anything itself.
|
|
20
|
+
|
|
21
|
+
Triggered by:
|
|
22
|
+
- a `@last-light demo [notes]` comment on an issue/PR
|
|
23
|
+
- manual CLI: tsx src/cli.ts demo owner/repo#N [-- "notes"]
|
|
24
|
+
|
|
25
|
+
status_checklist: true
|
|
26
|
+
final_message: "{{demoResult}}"
|
|
27
|
+
|
|
28
|
+
phases:
|
|
29
|
+
- name: phase_0
|
|
30
|
+
label: Context
|
|
31
|
+
type: context
|
|
32
|
+
depends_on: []
|
|
33
|
+
|
|
34
|
+
# The demo phase. Gated to the docker backend AND the enriched
|
|
35
|
+
# `lastlight-sandbox-qa:latest` image (Playwright + Chromium + ffmpeg). On
|
|
36
|
+
# gondolin, or a docker host without that image, the scheduler silently skips
|
|
37
|
+
# it (the run still completes — there is no text fallback for a video).
|
|
38
|
+
- name: demo
|
|
39
|
+
label: Demo
|
|
40
|
+
depends_on: [phase_0]
|
|
41
|
+
prompt: prompts/demo.md
|
|
42
|
+
# demo: the director procedure + compose-demo.sh wrapper (primary).
|
|
43
|
+
# browser-qa: the headless driver (agent-browser.mjs) with --record-dir.
|
|
44
|
+
# building: install + run the repo's dev-server to drive.
|
|
45
|
+
skills: [demo, browser-qa, building]
|
|
46
|
+
model: "{{models.demo}}"
|
|
47
|
+
variant: "{{variants.demo}}"
|
|
48
|
+
requires_sandbox: docker
|
|
49
|
+
sandbox_image: qa
|
|
50
|
+
output_var: demoResult
|
|
51
|
+
messages:
|
|
52
|
+
on_start: "Recording a demo — installing, running the app, and capturing the UI..."
|
|
53
|
+
on_success: "Demo recorded — see the video below."
|
|
54
|
+
on_failure: "I couldn't record the demo — see the logs for details."
|
|
55
|
+
on_skipped_done: "Demo unavailable on this host (needs the docker browser-QA image)."
|
package/workflows/explore.yaml
CHANGED
|
@@ -8,6 +8,9 @@ description: |
|
|
|
8
8
|
for Slack-initiated runs).
|
|
9
9
|
|
|
10
10
|
trigger: explore
|
|
11
|
+
# Single in-place task-list comment/message instead of a comment per phase.
|
|
12
|
+
# Reply-gate questions and the published spec still post as standalone notes.
|
|
13
|
+
status_checklist: true
|
|
11
14
|
|
|
12
15
|
phases:
|
|
13
16
|
- name: phase_0
|
|
@@ -19,6 +22,8 @@ phases:
|
|
|
19
22
|
prompt: prompts/explore-read.md
|
|
20
23
|
model: "{{models.explore}}"
|
|
21
24
|
output_var: baseline
|
|
25
|
+
unrestricted_egress: true
|
|
26
|
+
web_search: true
|
|
22
27
|
messages:
|
|
23
28
|
on_start: "Cloning `{{owner}}/{{repo}}` and reading the codebase..."
|
|
24
29
|
|
|
@@ -26,6 +31,8 @@ phases:
|
|
|
26
31
|
label: Socratic questioning
|
|
27
32
|
prompt: prompts/explore-ask.md
|
|
28
33
|
model: "{{models.explore}}"
|
|
34
|
+
unrestricted_egress: true
|
|
35
|
+
web_search: true
|
|
29
36
|
generic_loop:
|
|
30
37
|
max_iterations: 8
|
|
31
38
|
until: "output.contains('READY')"
|
|
@@ -41,6 +48,8 @@ phases:
|
|
|
41
48
|
prompt: prompts/explore-synthesize.md
|
|
42
49
|
model: "{{models.architect}}"
|
|
43
50
|
output_var: spec
|
|
51
|
+
unrestricted_egress: true
|
|
52
|
+
web_search: true
|
|
44
53
|
messages:
|
|
45
54
|
on_start: "Writing up the spec from our conversation..."
|
|
46
55
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
kind: comment
|
|
2
|
+
name: pr-comment
|
|
3
|
+
description: |
|
|
4
|
+
Answer a maintainer's question about an open PR with concrete, code-cited
|
|
5
|
+
evidence. The PR-side counterpart to `issue-comment` — distinguished
|
|
6
|
+
because PR questions need the diff and a higher file-read cap.
|
|
7
|
+
|
|
8
|
+
Triggered by:
|
|
9
|
+
- issue_comment.created webhook on a PR (when classifier returns a
|
|
10
|
+
non-build intent and prNumber is set)
|
|
11
|
+
|
|
12
|
+
phases:
|
|
13
|
+
- name: respond
|
|
14
|
+
label: Respond
|
|
15
|
+
skill: pr-comment
|
|
16
|
+
model: "{{models.comment}}"
|
package/workflows/pr-fix.yaml
CHANGED
|
@@ -2,11 +2,14 @@ kind: pr-fix
|
|
|
2
2
|
name: pr-fix
|
|
3
3
|
description: "Lightweight PR fix — no architect/reviewer, just fix and push"
|
|
4
4
|
trigger: pr-fix
|
|
5
|
+
# Single in-place task-list comment/message instead of a comment per phase.
|
|
6
|
+
status_checklist: true
|
|
5
7
|
|
|
6
8
|
phases:
|
|
7
9
|
- name: fix
|
|
8
10
|
label: Fix
|
|
9
11
|
prompt: prompts/pr-fix.md
|
|
12
|
+
skill: building
|
|
10
13
|
model: "{{models.pr-fix}}"
|
|
11
14
|
messages:
|
|
12
15
|
on_start: "On it — fixing PR #{{prNumber}}..."
|
package/workflows/pr-review.yaml
CHANGED
|
@@ -13,5 +13,8 @@ description: |
|
|
|
13
13
|
phases:
|
|
14
14
|
- name: review
|
|
15
15
|
label: Review
|
|
16
|
-
|
|
16
|
+
# pr-review: the PR procedure (primary). building: install + test gate.
|
|
17
|
+
# code-review: the finding-tier + what-to-check rubric.
|
|
18
|
+
skills: [pr-review, building, code-review]
|
|
17
19
|
model: "{{models.review}}"
|
|
20
|
+
variant: "{{variants.review}}"
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
You are answering a **question** — the user wants information, an explanation,
|
|
2
|
+
or a comparison, not a code change. Read the `issue-answer` skill for the full
|
|
3
|
+
procedure and rules, then follow it. This prompt gives you the specific question
|
|
4
|
+
and how your answer is delivered.
|
|
5
|
+
|
|
6
|
+
## The question
|
|
7
|
+
|
|
8
|
+
{{#if issueTitle}}**Issue title:** {{issueTitle}}{{/if}}
|
|
9
|
+
{{#if issueBody}}
|
|
10
|
+
**Issue body:**
|
|
11
|
+
{{issueBody}}
|
|
12
|
+
{{/if}}
|
|
13
|
+
{{#if commentBody}}
|
|
14
|
+
**Question:**
|
|
15
|
+
{{commentBody}}
|
|
16
|
+
{{/if}}
|
|
17
|
+
|
|
18
|
+
Target repo: **{{owner}}/{{repo}}**
|
|
19
|
+
{{#if issueNumber}}Originating GitHub issue: **#{{issueNumber}}**{{/if}}
|
|
20
|
+
|
|
21
|
+
## Workspace
|
|
22
|
+
|
|
23
|
+
The repo is (or will be) in a `{{repo}}/` subdirectory under your cwd:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
ls -la
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If you see `{{repo}}/.git/`, the harness pre-cloned it — `cd {{repo}}`.
|
|
30
|
+
Otherwise `git clone https://github.com/{{owner}}/{{repo}}.git {{repo}}` and
|
|
31
|
+
`cd` in. Read what the question needs (`CONTEXT.md`, `README`, `docs/`,
|
|
32
|
+
`spec/`, code) — don't survey the whole tree. Use the `web_search` /
|
|
33
|
+
`web_fetch` tools for anything outside this repo (other tools, frameworks,
|
|
34
|
+
"X vs Y" comparisons); cite what you use.
|
|
35
|
+
|
|
36
|
+
## How your answer is delivered — read carefully
|
|
37
|
+
|
|
38
|
+
Your **final message is the answer**, and the harness posts it for you:
|
|
39
|
+
{{#if issueNumber}}
|
|
40
|
+
- as a comment on issue #{{issueNumber}}.
|
|
41
|
+
{{/if}}
|
|
42
|
+
{{#if !issueNumber}}
|
|
43
|
+
- back into the Slack thread this question came from.
|
|
44
|
+
{{/if}}
|
|
45
|
+
|
|
46
|
+
So make your final message the complete, self-contained answer in clean
|
|
47
|
+
markdown — no "here's what I'll do" preamble, no meta-commentary.
|
|
48
|
+
|
|
49
|
+
**Converge — don't get cut off.** Your tool budget is bounded. The moment you
|
|
50
|
+
think "I have enough" or "let me just confirm one more thing", stop researching
|
|
51
|
+
and write the answer in that same turn — do **not** fire another tool call
|
|
52
|
+
first. A reply truncated mid-research is worse than one that omits a minor
|
|
53
|
+
detail; flag anything unverified as unverified rather than chasing it with your
|
|
54
|
+
last turn.
|
|
55
|
+
|
|
56
|
+
**Do NOT post the answer yourself** (no `github_add_issue_comment`) — that would
|
|
57
|
+
double-post. The only GitHub write you make is the label:
|
|
58
|
+
|
|
59
|
+
{{#if issueNumber}}
|
|
60
|
+
- Apply the `question` label to issue #{{issueNumber}} with `github_add_labels`
|
|
61
|
+
(create it first with `github_create_label`, color `d876e3`; ignore a 422).
|
|
62
|
+
Leave the issue open.
|
|
63
|
+
{{/if}}
|
|
64
|
+
{{#if !issueNumber}}
|
|
65
|
+
- This is a Slack-initiated question — there is no issue to label. Just produce
|
|
66
|
+
the answer.
|
|
67
|
+
{{/if}}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
You are the ARCHITECT. Analyze the codebase and produce an implementation plan.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
You are already inside the {{repo}} repo at branch {{branch}} — the harness
|
|
4
|
+
pre-cloned it and your cwd is the repo root. Git is configured.
|
|
5
|
+
|
|
6
|
+
Before planning:
|
|
7
|
+
1. Read CLAUDE.md (and CONTRIBUTING.md if present) for project-specific guidance.
|
|
8
|
+
2. Read {{issueDir}}/guardrails-report.md for the test/lint/typecheck commands.
|
|
7
9
|
|
|
8
10
|
CONTEXT:
|
|
9
11
|
{{contextSnapshot}}
|
|
@@ -11,9 +13,24 @@ CONTEXT:
|
|
|
11
13
|
OUTPUT — write the plan to {{issueDir}}/architect-plan.md:
|
|
12
14
|
- Problem Statement (2-5 sentences with file:line references)
|
|
13
15
|
- Summary of what needs to change
|
|
14
|
-
- Files to modify
|
|
16
|
+
- Files to modify — an EXHAUSTIVE manifest the executor implements verbatim:
|
|
17
|
+
- List EVERY file to change, with the exact path, line/symbol anchor, and what
|
|
18
|
+
to change. The executor should not need to go hunting for files.
|
|
19
|
+
- Enumerate ALL members of any multi-file group. If a change touches one
|
|
20
|
+
member of a set, glob/`ls` the set and list them ALL — e.g. every i18n
|
|
21
|
+
locale under the locales dir, every adapter/provider variant, every test
|
|
22
|
+
file for the touched module. Name the exact keys/identifiers to add (e.g.
|
|
23
|
+
the precise i18n keys). Missing a sibling here forces the executor to
|
|
24
|
+
rediscover it mid-implementation.
|
|
25
|
+
- Commands — copy the exact test / lint / typecheck commands from
|
|
26
|
+
guardrails-report.md into the plan so the executor uses them directly.
|
|
15
27
|
- Implementation approach (step-by-step)
|
|
16
28
|
- Risks and edge cases
|
|
29
|
+
- For every input the design does NOT fully support, specify **warn-and-skip**
|
|
30
|
+
or **warn-and-surface** behaviour explicitly. A silent default, a silently
|
|
31
|
+
skipped case, or a dropped output is a correctness bug — never plan for one.
|
|
32
|
+
If an input can't be handled, the plan must say how the user is told (a
|
|
33
|
+
warning, a surfaced error), not let it disappear.
|
|
17
34
|
- Test strategy
|
|
18
35
|
- Estimated complexity: simple / medium / complex
|
|
19
36
|
|
|
@@ -21,7 +38,7 @@ AFTER WRITING:
|
|
|
21
38
|
1. mkdir -p {{issueDir}}
|
|
22
39
|
2. Write architect-plan.md
|
|
23
40
|
3. Write status.md with current_phase: architect
|
|
24
|
-
4. git add .lastlight/ && git commit -m "docs: architect plan for #{{issueNumber}}"
|
|
25
|
-
5. git push -u origin HEAD
|
|
41
|
+
{{#if !externalizeArtifacts}}4. git add .lastlight/ && git commit -m "docs: architect plan for #{{issueNumber}}"
|
|
42
|
+
5. git push -u origin HEAD{{/if}}{{#if externalizeArtifacts}}4. Do NOT git add or commit {{issueDir}}/ — the harness persists it to the Last Light server automatically.{{/if}}
|
|
26
43
|
|
|
27
44
|
OUTPUT: The branch name and a brief summary (3-5 lines).
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
You are recording a short **demo video** of a PR or feature — driving the
|
|
2
|
+
repo's web UI in a **real headless browser**, screen-recording the session, and
|
|
3
|
+
compositing a titled mp4. Read the `demo` skill for the director procedure and
|
|
4
|
+
the `compose-demo.sh` wrapper, the `browser-qa` skill for the driver contract,
|
|
5
|
+
and the `building` skill for install/run — then follow them.
|
|
6
|
+
|
|
7
|
+
**Stay in the browser.** Your deliverable is a *moving* demonstration of
|
|
8
|
+
behaviour, not a code walkthrough. Don't quote or analyse source files — show
|
|
9
|
+
what the running app does.
|
|
10
|
+
|
|
11
|
+
## What to demo
|
|
12
|
+
|
|
13
|
+
{{#if commentBody}}
|
|
14
|
+
**Request / notes:**
|
|
15
|
+
{{commentBody}}
|
|
16
|
+
{{/if}}
|
|
17
|
+
{{#if issueTitle}}**Issue/PR title:** {{issueTitle}}{{/if}}
|
|
18
|
+
{{#if issueBody}}
|
|
19
|
+
**Issue/PR body:**
|
|
20
|
+
{{issueBody}}
|
|
21
|
+
{{/if}}
|
|
22
|
+
|
|
23
|
+
Target repo: **{{owner}}/{{repo}}** at branch {{branch}}
|
|
24
|
+
{{#if issueNumber}}Target issue/PR: **#{{issueNumber}}**{{/if}}
|
|
25
|
+
|
|
26
|
+
Read the PR (description, diff, linked issue) from the context above. Decide the
|
|
27
|
+
single thing the video must prove — the moment that only happens if the change
|
|
28
|
+
works as claimed — and whether the story is a `single` walkthrough (default) or a
|
|
29
|
+
`side-by-side` before/after comparison (only for a genuine regression/refactor).
|
|
30
|
+
|
|
31
|
+
## First: confirm the browser + ffmpeg are available
|
|
32
|
+
|
|
33
|
+
Run the driver's probe before anything else (the `browser-qa` skill is staged
|
|
34
|
+
into this phase's bundle — find its absolute path from the available-skills
|
|
35
|
+
catalogue):
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
node <browser-qa skill dir>/scripts/agent-browser.mjs doctor
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
If `doctor` exits non-zero, the toolchain isn't present: say so plainly and
|
|
42
|
+
stop — **do not fake a recording.** This phase only runs on the docker QA image,
|
|
43
|
+
so `doctor` should pass.
|
|
44
|
+
|
|
45
|
+
## Workspace + run the app
|
|
46
|
+
|
|
47
|
+
You are already inside the **{{repo}}** repo at branch {{branch}} — the harness
|
|
48
|
+
pre-cloned it and your cwd is the repo root (no `cd`). Follow the `building`
|
|
49
|
+
skill to install dependencies and start the dev-server in the background; poll
|
|
50
|
+
with `curl` until it answers on `localhost:<port>`. For a before/after demo,
|
|
51
|
+
run each branch in turn and record the same scripted interaction against each.
|
|
52
|
+
|
|
53
|
+
## Capture and compose
|
|
54
|
+
|
|
55
|
+
Author a `flow.json` (shape in the `browser-qa` skill) that scripts the
|
|
56
|
+
interaction like a director — record the baseline first, hold after state
|
|
57
|
+
changes, verify between steps. Record with `--record-dir`:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
node <browser-qa skill dir>/scripts/agent-browser.mjs run flow.json \
|
|
61
|
+
--base-url http://localhost:<port> --record-dir /tmp/demo-cap
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Then composite the raw webm into the final mp4 with the `demo` skill's wrapper,
|
|
65
|
+
writing it into **`{{issueDir}}/demo.mp4`** (the harness harvests that dir):
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
<demo skill dir>/scripts/compose-demo.sh \
|
|
69
|
+
--output {{issueDir}}/demo.mp4 --title "<PR # — what it does>" \
|
|
70
|
+
--subtitle "<one line>" --layout single --speed 1.5 --target-size-mb 5 \
|
|
71
|
+
/tmp/demo-cap/session.webm
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Self-check the result with `ffprobe` (the wrapper prints a summary): resolution
|
|
75
|
+
sane, duration watchable (~15–90s), and **size ≤ 5 MB** so GitHub embeds it. If
|
|
76
|
+
it's over, re-run with a lower `--target-size-mb` or a higher `--speed`.
|
|
77
|
+
|
|
78
|
+
## How your report is delivered — read carefully
|
|
79
|
+
|
|
80
|
+
Your **final message is the report**, and the harness posts it for you{{#if issueNumber}} as a
|
|
81
|
+
comment on **#{{issueNumber}}**{{/if}}{{#if !issueNumber}} back into the thread this request came from{{/if}}.
|
|
82
|
+
Use the `demo` skill's report shape — a one-line environment summary, a sentence
|
|
83
|
+
on what the video shows and the moment to watch, the video, and a one-line
|
|
84
|
+
"not covered". **Keep it tight.**
|
|
85
|
+
|
|
86
|
+
**Embed the video inline so it plays in the comment.**
|
|
87
|
+
{{#if artifactBaseUrl}}Your `{{issueDir}}/demo.mp4` is served publicly at
|
|
88
|
+
`{{artifactBaseUrl}}/demo.mp4`. Include a raw HTML video tag on its own line —
|
|
89
|
+
`<video src="{{artifactBaseUrl}}/demo.mp4" controls></video>` — plus a plain
|
|
90
|
+
link beneath it as a fallback: `[demo.mp4]({{artifactBaseUrl}}/demo.mp4)`. GitHub
|
|
91
|
+
renders `<video>` in comments. Do **NOT** wrap the tag in backticks or a code
|
|
92
|
+
fence (inside a code span it shows as literal text instead of playing).{{/if}}{{#if !artifactBaseUrl}}No
|
|
93
|
+
public URL is configured, so reference the video by filename (`demo.mp4`) and
|
|
94
|
+
note it's in the run's Artifacts view.{{/if}}
|
|
95
|
+
|
|
96
|
+
**Do NOT post it yourself** with `github_add_issue_comment` — that would
|
|
97
|
+
double-post. Never stage or fabricate a result the feature didn't produce; if
|
|
98
|
+
something doesn't work, the honest demo shows it. If the video couldn't be
|
|
99
|
+
recorded or persisted (no server-mode build assets), say so plainly and describe
|
|
100
|
+
what you observed instead of pretending a clip exists.
|
|
@@ -1,27 +1,36 @@
|
|
|
1
1
|
You are the EXECUTOR. Implement precisely what the architect's plan requires.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
3
|
+
You are already inside the {{repo}} repo at branch {{branch}} — the harness
|
|
4
|
+
pre-cloned it and your cwd is the repo root. Git is configured.
|
|
5
|
+
|
|
6
|
+
Start by reading {{issueDir}}/architect-plan.md.
|
|
7
|
+
|
|
8
|
+
WORK FROM THE PLAN — it contains an exhaustive file manifest and the exact
|
|
9
|
+
commands:
|
|
10
|
+
- Implement the plan's file manifest directly. Read a file only immediately
|
|
11
|
+
before you edit it; do NOT re-explore areas the plan already mapped.
|
|
12
|
+
- Use grep/find only to fill genuine gaps the plan didn't cover (if the plan
|
|
13
|
+
is missing a sibling file, fix it there and proceed).
|
|
14
|
+
- Use the test/lint/typecheck commands the plan copied from the guardrails
|
|
15
|
+
report — no need to re-open guardrails-report.md unless the plan omitted them.
|
|
16
|
+
|
|
17
|
+
Follow the **building** skill for the mechanics: install dependencies first,
|
|
18
|
+
write the failing test before implementing (TDD), and run the full
|
|
19
|
+
test/lint/typecheck gate once before committing — all of it must pass before you
|
|
20
|
+
commit or claim done.
|
|
21
|
+
|
|
22
|
+
Before committing, also honour the building skill's **decomposition budget** and
|
|
23
|
+
**type-safety** rules: keep functions under ~15 cyclomatic complexity (a
|
|
24
|
+
function that parses, validates, and emits is three functions — extract helpers),
|
|
25
|
+
and never use `as any` or other compiler-silencing assertions to pass the gate or
|
|
26
|
+
to skip a validator the same code defines. If the repo's only test path needs an
|
|
27
|
+
unavailable external service, add a runnable unit/CLI test with in-memory
|
|
28
|
+
fixtures rather than declaring the change unverified.
|
|
29
|
+
|
|
30
|
+
AFTER THE GATE PASSES:
|
|
20
31
|
1. Write {{issueDir}}/executor-summary.md:
|
|
21
32
|
- What was done, files changed
|
|
22
|
-
- Test results (paste actual output)
|
|
23
|
-
- Lint results (paste actual output)
|
|
24
|
-
- Typecheck results (paste actual output)
|
|
33
|
+
- Test / lint / typecheck results (paste actual output)
|
|
25
34
|
- Any deviations from the plan, known issues
|
|
26
35
|
2. Update {{issueDir}}/status.md: current_phase = executor
|
|
27
36
|
3. git add -A && git commit -m "feat: implement #{{issueNumber}}
|
|
@@ -2,11 +2,12 @@ You are running a socratic questioning loop to help a maintainer shape a
|
|
|
2
2
|
half-formed idea into a detailed spec. This is iteration {{iteration}} of
|
|
3
3
|
{{maxIterations}}.
|
|
4
4
|
|
|
5
|
-
The **{{owner}}/{{repo}}** repo is
|
|
5
|
+
The **{{owner}}/{{repo}}** repo is checked out at `{{repo}}/` (a
|
|
6
|
+
subdirectory of your cwd) — the previous read phase ensured it.
|
|
6
7
|
|
|
7
|
-
**Important paths** (
|
|
8
|
-
- Repo root:
|
|
9
|
-
- Context doc:
|
|
8
|
+
**Important paths** (relative to the workspace cwd):
|
|
9
|
+
- Repo root: `{{repo}}/` (cd into it to use git)
|
|
10
|
+
- Context doc: `{{issueDir}}/explore-context.md`
|
|
10
11
|
|
|
11
12
|
Start by reading the context doc for architecture, key code excerpts, and
|
|
12
13
|
existing patterns. Only read additional source files if the context doc
|
|
@@ -34,24 +35,46 @@ good spec:
|
|
|
34
35
|
|
|
35
36
|
### If you DON'T have enough signal yet
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
38
|
+
Walk down the design tree one branch at a time, resolving dependencies
|
|
39
|
+
between decisions in order — answering an upstream decision often changes
|
|
40
|
+
what the downstream questions even are.
|
|
41
|
+
|
|
42
|
+
**First, try to answer the question yourself.** If reading the code would
|
|
43
|
+
settle it, read the code instead of asking. Only put a question to the user
|
|
44
|
+
when the codebase genuinely can't decide it.
|
|
45
|
+
|
|
46
|
+
**Then, of the questions that remain, only ASK about the high-stakes ones**
|
|
47
|
+
— decisions where guessing wrong would be costly or hard to reverse, or
|
|
48
|
+
where the design genuinely forks. **Low-stakes decisions you decide
|
|
49
|
+
yourself**: pick the sensible default (usually "follow the existing
|
|
50
|
+
pattern"), and record it in `{{issueDir}}/explore-context.md` under a
|
|
51
|
+
`## Decisions made during exploration` section (create it if absent), as
|
|
52
|
+
`<decision> → <what you chose> (<one-line why>)`. The user can override
|
|
53
|
+
any of these later; surfacing them in the spec is enough.
|
|
54
|
+
|
|
55
|
+
When you do ask, ask **one primary question per turn**, and **always give
|
|
56
|
+
your recommended answer** with a one-line rationale grounded in the code
|
|
57
|
+
you read. If a second question is trivially coupled to the first (you can't
|
|
58
|
+
sensibly answer one without the other), you may tack it on as a short
|
|
59
|
+
follow-up — but never a flat list of unrelated questions. Keep it
|
|
60
|
+
conversational; the user replies in the same thread.
|
|
61
|
+
|
|
62
|
+
Shape of a good turn:
|
|
63
|
+
|
|
64
|
+
> I see `FooService` already handles this today. I'd **extend** it rather
|
|
65
|
+
> than add a parallel service — it already owns the auth path. Sound right?
|
|
66
|
+
> ↳ If we extend, I'd reuse its existing 5-min cache rather than add a new
|
|
67
|
+
> one (assuming that's fine).
|
|
68
|
+
|
|
69
|
+
Good questions pin down scope ("only X, or also Y?"), surface hidden
|
|
70
|
+
constraints ("must this stay backwards-compatible with Z?"), flush out
|
|
71
|
+
users / success criteria ("who uses this, and what makes them say it
|
|
72
|
+
worked?"), and reference specific code you found.
|
|
49
73
|
|
|
50
74
|
If you discover new relevant code, **append it to
|
|
51
|
-
|
|
52
|
-
synthesize phase has it too.
|
|
75
|
+
`{{issueDir}}/explore-context.md`** so the synthesize phase has it too.
|
|
53
76
|
|
|
54
|
-
**Do NOT output the word READY** on this path. Just the
|
|
77
|
+
**Do NOT output the word READY** on this path. Just the question.
|
|
55
78
|
|
|
56
79
|
### If you DO have enough signal
|
|
57
80
|
|
|
@@ -63,8 +86,14 @@ advances to the synthesis phase.
|
|
|
63
86
|
## Rules
|
|
64
87
|
|
|
65
88
|
- Never ask the same question twice — check the accumulated Q&A first.
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
|
|
89
|
+
- Ask **one** primary question per turn (plus an optional tightly-coupled
|
|
90
|
+
follow-up). Never dump a list of unrelated questions.
|
|
91
|
+
- Every question carries your recommended answer — never ask open-endedly
|
|
92
|
+
without saying what you'd do.
|
|
93
|
+
- Prefer deciding low-stakes items yourself (recorded in the context doc)
|
|
94
|
+
over asking. Only escalate genuinely high-stakes / forking decisions.
|
|
95
|
+
- If the user says "we're done", "just write it up", or "your
|
|
96
|
+
recommendations look good" in their most recent answer, output READY
|
|
97
|
+
immediately.
|
|
69
98
|
- Don't preamble or recap — the user can see the thread already.
|
|
70
99
|
- Use the cloned repo to make your questions specific and grounded.
|