lastlight 0.16.0 → 0.16.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 +71 -692
- package/dist/cli-config.js.map +1 -0
- package/dist/cli-format.js.map +1 -0
- package/dist/{cli/cli-server.d.ts → cli-server.d.ts} +39 -1
- package/dist/{cli/cli-server.js → cli-server.js} +105 -5
- package/dist/cli-server.js.map +1 -0
- package/dist/cli-timeline.js.map +1 -0
- package/dist/{cli/cli.js → cli.js} +9 -7
- package/dist/cli.js.map +1 -0
- package/dist/{cli/fork-cli.d.ts → fork-cli.d.ts} +3 -3
- package/dist/{cli/fork-cli.js → fork-cli.js} +28 -27
- package/dist/fork-cli.js.map +1 -0
- package/dist/{cli/oauth-cli.js → oauth-cli.js} +1 -1
- package/dist/oauth-cli.js.map +1 -0
- package/dist/{cli/setup.js → setup.js} +10 -4
- package/dist/setup.js.map +1 -0
- package/dist/{cli/skills-install.d.ts → skills-install.d.ts} +6 -0
- package/dist/{cli/skills-install.js → skills-install.js} +6 -2
- package/dist/skills-install.js.map +1 -0
- package/package.json +20 -65
- package/plugins/lastlight/.claude-plugin/plugin.json +1 -1
- package/agent-context/rules.md +0 -80
- package/agent-context/security.md +0 -69
- package/agent-context/soul.md +0 -21
- package/config/default.yaml +0 -119
- package/deploy/.env.production.example +0 -100
- package/deploy/entrypoint.sh +0 -82
- package/deploy/native/README.md +0 -160
- package/deploy/native/install.sh +0 -110
- package/deploy/native/lastlight.env.example +0 -95
- package/deploy/native/lastlight.service +0 -50
- package/deploy/sandbox-entrypoint.sh +0 -93
- package/dist/admin/auth.d.ts +0 -51
- package/dist/admin/auth.js +0 -121
- package/dist/admin/auth.js.map +0 -1
- package/dist/admin/chat-session-reader.d.ts +0 -39
- package/dist/admin/chat-session-reader.js +0 -84
- package/dist/admin/chat-session-reader.js.map +0 -1
- package/dist/admin/docker.d.ts +0 -61
- package/dist/admin/docker.js +0 -187
- package/dist/admin/docker.js.map +0 -1
- package/dist/admin/index.d.ts +0 -9
- package/dist/admin/index.js +0 -59
- package/dist/admin/index.js.map +0 -1
- package/dist/admin/routes.d.ts +0 -81
- package/dist/admin/routes.js +0 -1381
- package/dist/admin/routes.js.map +0 -1
- package/dist/admin/sessions.d.ts +0 -89
- package/dist/admin/sessions.js +0 -204
- package/dist/admin/sessions.js.map +0 -1
- package/dist/admin/tail.d.ts +0 -12
- package/dist/admin/tail.js +0 -145
- package/dist/admin/tail.js.map +0 -1
- package/dist/admin/version.d.ts +0 -22
- package/dist/admin/version.js +0 -92
- package/dist/admin/version.js.map +0 -1
- package/dist/cli/cli-config.js.map +0 -1
- package/dist/cli/cli-format.js.map +0 -1
- package/dist/cli/cli-server.js.map +0 -1
- package/dist/cli/cli-timeline.js.map +0 -1
- package/dist/cli/cli.js.map +0 -1
- package/dist/cli/fork-cli.js.map +0 -1
- package/dist/cli/oauth-cli.js.map +0 -1
- package/dist/cli/setup.js.map +0 -1
- package/dist/cli/skills-install.js.map +0 -1
- package/dist/config/config-resolve.d.ts +0 -28
- package/dist/config/config-resolve.js +0 -47
- package/dist/config/config-resolve.js.map +0 -1
- package/dist/config/config.d.ts +0 -157
- package/dist/config/config.js +0 -581
- package/dist/config/config.js.map +0 -1
- package/dist/config/core-pin.d.ts +0 -16
- package/dist/config/core-pin.js +0 -85
- package/dist/config/core-pin.js.map +0 -1
- package/dist/config/overlay-assets.d.ts +0 -20
- package/dist/config/overlay-assets.js +0 -114
- package/dist/config/overlay-assets.js.map +0 -1
- package/dist/config/overlay-bootstrap.d.ts +0 -44
- package/dist/config/overlay-bootstrap.js +0 -304
- package/dist/config/overlay-bootstrap.js.map +0 -1
- package/dist/connectors/github-webhook.d.ts +0 -45
- package/dist/connectors/github-webhook.js +0 -321
- package/dist/connectors/github-webhook.js.map +0 -1
- package/dist/connectors/index.d.ts +0 -18
- package/dist/connectors/index.js +0 -41
- package/dist/connectors/index.js.map +0 -1
- package/dist/connectors/messaging/base.d.ts +0 -42
- package/dist/connectors/messaging/base.js +0 -139
- package/dist/connectors/messaging/base.js.map +0 -1
- package/dist/connectors/messaging/delivery.d.ts +0 -14
- package/dist/connectors/messaging/delivery.js +0 -38
- package/dist/connectors/messaging/delivery.js.map +0 -1
- package/dist/connectors/messaging/index.d.ts +0 -4
- package/dist/connectors/messaging/index.js +0 -4
- package/dist/connectors/messaging/index.js.map +0 -1
- package/dist/connectors/messaging/session-manager.d.ts +0 -53
- package/dist/connectors/messaging/session-manager.js +0 -255
- package/dist/connectors/messaging/session-manager.js.map +0 -1
- package/dist/connectors/messaging/types.d.ts +0 -58
- package/dist/connectors/messaging/types.js +0 -7
- package/dist/connectors/messaging/types.js.map +0 -1
- package/dist/connectors/slack/connector.d.ts +0 -142
- package/dist/connectors/slack/connector.js +0 -494
- package/dist/connectors/slack/connector.js.map +0 -1
- package/dist/connectors/slack/index.d.ts +0 -2
- package/dist/connectors/slack/index.js +0 -3
- package/dist/connectors/slack/index.js.map +0 -1
- package/dist/connectors/slack/mrkdwn.d.ts +0 -19
- package/dist/connectors/slack/mrkdwn.js +0 -240
- package/dist/connectors/slack/mrkdwn.js.map +0 -1
- package/dist/connectors/types.d.ts +0 -61
- package/dist/connectors/types.js +0 -2
- package/dist/connectors/types.js.map +0 -1
- package/dist/cron/fanout.d.ts +0 -33
- package/dist/cron/fanout.js +0 -55
- package/dist/cron/fanout.js.map +0 -1
- package/dist/cron/jobs.d.ts +0 -18
- package/dist/cron/jobs.js +0 -37
- package/dist/cron/jobs.js.map +0 -1
- package/dist/cron/scheduler.d.ts +0 -45
- package/dist/cron/scheduler.js +0 -105
- package/dist/cron/scheduler.js.map +0 -1
- package/dist/engine/agent-executor.d.ts +0 -34
- package/dist/engine/agent-executor.js +0 -246
- package/dist/engine/agent-executor.js.map +0 -1
- package/dist/engine/chat/chat-runner.d.ts +0 -132
- package/dist/engine/chat/chat-runner.js +0 -424
- package/dist/engine/chat/chat-runner.js.map +0 -1
- package/dist/engine/chat/chat-skills.d.ts +0 -45
- package/dist/engine/chat/chat-skills.js +0 -184
- package/dist/engine/chat/chat-skills.js.map +0 -1
- package/dist/engine/chat/chat.d.ts +0 -54
- package/dist/engine/chat/chat.js +0 -316
- package/dist/engine/chat/chat.js.map +0 -1
- package/dist/engine/chat/message-batcher.d.ts +0 -32
- package/dist/engine/chat/message-batcher.js +0 -109
- package/dist/engine/chat/message-batcher.js.map +0 -1
- package/dist/engine/dispatcher.d.ts +0 -73
- package/dist/engine/dispatcher.js +0 -663
- package/dist/engine/dispatcher.js.map +0 -1
- package/dist/engine/event-shim.d.ts +0 -117
- package/dist/engine/event-shim.js +0 -435
- package/dist/engine/event-shim.js.map +0 -1
- package/dist/engine/executors/orchestrator.d.ts +0 -81
- package/dist/engine/executors/orchestrator.js +0 -365
- package/dist/engine/executors/orchestrator.js.map +0 -1
- package/dist/engine/executors/shared.d.ts +0 -189
- package/dist/engine/executors/shared.js +0 -616
- package/dist/engine/executors/shared.js.map +0 -1
- package/dist/engine/github/git-auth.d.ts +0 -62
- package/dist/engine/github/git-auth.js +0 -161
- package/dist/engine/github/git-auth.js.map +0 -1
- package/dist/engine/github/github-app-client.d.ts +0 -23
- package/dist/engine/github/github-app-client.js +0 -33
- package/dist/engine/github/github-app-client.js.map +0 -1
- package/dist/engine/github/github-tools.d.ts +0 -18
- package/dist/engine/github/github-tools.js +0 -263
- package/dist/engine/github/github-tools.js.map +0 -1
- package/dist/engine/github/github.d.ts +0 -1193
- package/dist/engine/github/github.js +0 -357
- package/dist/engine/github/github.js.map +0 -1
- package/dist/engine/github/profiles.d.ts +0 -279
- package/dist/engine/github/profiles.js +0 -42
- package/dist/engine/github/profiles.js.map +0 -1
- package/dist/engine/github/review-poster.d.ts +0 -98
- package/dist/engine/github/review-poster.js +0 -177
- package/dist/engine/github/review-poster.js.map +0 -1
- package/dist/engine/llm.d.ts +0 -79
- package/dist/engine/llm.js +0 -269
- package/dist/engine/llm.js.map +0 -1
- package/dist/engine/oauth.d.ts +0 -43
- package/dist/engine/oauth.js +0 -103
- package/dist/engine/oauth.js.map +0 -1
- package/dist/engine/router.d.ts +0 -29
- package/dist/engine/router.js +0 -680
- package/dist/engine/router.js.map +0 -1
- package/dist/engine/screen/classifier.d.ts +0 -93
- package/dist/engine/screen/classifier.js +0 -215
- package/dist/engine/screen/classifier.js.map +0 -1
- package/dist/engine/screen/screen.d.ts +0 -41
- package/dist/engine/screen/screen.js +0 -93
- package/dist/engine/screen/screen.js.map +0 -1
- package/dist/evals-api.d.ts +0 -24
- package/dist/evals-api.js +0 -22
- package/dist/evals-api.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -940
- package/dist/index.js.map +0 -1
- package/dist/managed-repos.d.ts +0 -30
- package/dist/managed-repos.js +0 -72
- package/dist/managed-repos.js.map +0 -1
- package/dist/notify/blocks.d.ts +0 -23
- package/dist/notify/blocks.js +0 -118
- package/dist/notify/blocks.js.map +0 -1
- package/dist/notify/index.d.ts +0 -17
- package/dist/notify/index.js +0 -7
- package/dist/notify/index.js.map +0 -1
- package/dist/notify/model.d.ts +0 -57
- package/dist/notify/model.js +0 -89
- package/dist/notify/model.js.map +0 -1
- package/dist/notify/notifier.d.ts +0 -18
- package/dist/notify/notifier.js +0 -100
- package/dist/notify/notifier.js.map +0 -1
- package/dist/notify/render.d.ts +0 -21
- package/dist/notify/render.js +0 -59
- package/dist/notify/render.js.map +0 -1
- package/dist/notify/transports/github.d.ts +0 -26
- package/dist/notify/transports/github.js +0 -27
- package/dist/notify/transports/github.js.map +0 -1
- package/dist/notify/transports/slack.d.ts +0 -27
- package/dist/notify/transports/slack.js +0 -37
- package/dist/notify/transports/slack.js.map +0 -1
- package/dist/notify/types.d.ts +0 -119
- package/dist/notify/types.js +0 -16
- package/dist/notify/types.js.map +0 -1
- package/dist/providers.d.ts +0 -125
- package/dist/providers.js +0 -279
- package/dist/providers.js.map +0 -1
- package/dist/sandbox/docker.d.ts +0 -180
- package/dist/sandbox/docker.js +0 -517
- package/dist/sandbox/docker.js.map +0 -1
- package/dist/sandbox/egress-allowlist.d.ts +0 -74
- package/dist/sandbox/egress-allowlist.js +0 -164
- package/dist/sandbox/egress-allowlist.js.map +0 -1
- package/dist/sandbox/egress-firewall-config.d.ts +0 -127
- package/dist/sandbox/egress-firewall-config.js +0 -434
- package/dist/sandbox/egress-firewall-config.js.map +0 -1
- package/dist/sandbox/images.d.ts +0 -23
- package/dist/sandbox/images.js +0 -55
- package/dist/sandbox/images.js.map +0 -1
- package/dist/sandbox/index.d.ts +0 -112
- package/dist/sandbox/index.js +0 -332
- package/dist/sandbox/index.js.map +0 -1
- package/dist/sandbox/sandbox.d.ts +0 -214
- package/dist/sandbox/sandbox.js +0 -453
- package/dist/sandbox/sandbox.js.map +0 -1
- package/dist/sandbox/smol.d.ts +0 -162
- package/dist/sandbox/smol.js +0 -485
- package/dist/sandbox/smol.js.map +0 -1
- package/dist/session-log.d.ts +0 -63
- package/dist/session-log.js +0 -290
- package/dist/session-log.js.map +0 -1
- package/dist/state/approval-store.d.ts +0 -88
- package/dist/state/approval-store.js +0 -149
- package/dist/state/approval-store.js.map +0 -1
- package/dist/state/build-assets.d.ts +0 -50
- package/dist/state/build-assets.js +0 -154
- package/dist/state/build-assets.js.map +0 -1
- package/dist/state/db.d.ts +0 -81
- package/dist/state/db.js +0 -155
- package/dist/state/db.js.map +0 -1
- package/dist/state/execution-store.d.ts +0 -257
- package/dist/state/execution-store.js +0 -527
- package/dist/state/execution-store.js.map +0 -1
- package/dist/state/migrate.d.ts +0 -15
- package/dist/state/migrate.js +0 -175
- package/dist/state/migrate.js.map +0 -1
- package/dist/state/workflow-run-store.d.ts +0 -216
- package/dist/state/workflow-run-store.js +0 -403
- package/dist/state/workflow-run-store.js.map +0 -1
- package/dist/telemetry/index.d.ts +0 -38
- package/dist/telemetry/index.js +0 -253
- package/dist/telemetry/index.js.map +0 -1
- package/dist/telemetry/pi-events.d.ts +0 -12
- package/dist/telemetry/pi-events.js +0 -134
- package/dist/telemetry/pi-events.js.map +0 -1
- package/dist/workflows/dag.d.ts +0 -37
- package/dist/workflows/dag.js +0 -118
- package/dist/workflows/dag.js.map +0 -1
- package/dist/workflows/loader.d.ts +0 -53
- package/dist/workflows/loader.js +0 -421
- package/dist/workflows/loader.js.map +0 -1
- package/dist/workflows/loop-eval.d.ts +0 -28
- package/dist/workflows/loop-eval.js +0 -74
- package/dist/workflows/loop-eval.js.map +0 -1
- package/dist/workflows/phase-executor.d.ts +0 -222
- package/dist/workflows/phase-executor.js +0 -1153
- package/dist/workflows/phase-executor.js.map +0 -1
- package/dist/workflows/phase-ref.d.ts +0 -50
- package/dist/workflows/phase-ref.js +0 -91
- package/dist/workflows/phase-ref.js.map +0 -1
- package/dist/workflows/resume.d.ts +0 -58
- package/dist/workflows/resume.js +0 -313
- package/dist/workflows/resume.js.map +0 -1
- package/dist/workflows/runner.d.ts +0 -63
- package/dist/workflows/runner.js +0 -381
- package/dist/workflows/runner.js.map +0 -1
- package/dist/workflows/schema.d.ts +0 -344
- package/dist/workflows/schema.js +0 -460
- package/dist/workflows/schema.js.map +0 -1
- package/dist/workflows/simple.d.ts +0 -90
- package/dist/workflows/simple.js +0 -393
- package/dist/workflows/simple.js.map +0 -1
- package/dist/workflows/target-policy.d.ts +0 -74
- package/dist/workflows/target-policy.js +0 -80
- package/dist/workflows/target-policy.js.map +0 -1
- package/dist/workflows/templates.d.ts +0 -88
- package/dist/workflows/templates.js +0 -127
- package/dist/workflows/templates.js.map +0 -1
- package/dist/workflows/triggers.d.ts +0 -21
- package/dist/workflows/triggers.js +0 -45
- package/dist/workflows/triggers.js.map +0 -1
- package/dist/workflows/verdict.d.ts +0 -19
- package/dist/workflows/verdict.js +0 -30
- package/dist/workflows/verdict.js.map +0 -1
- package/dist/worktree/manager.d.ts +0 -43
- package/dist/worktree/manager.js +0 -127
- package/dist/worktree/manager.js.map +0 -1
- package/docker-compose.yml +0 -274
- package/sandbox.Dockerfile +0 -68
- package/skills/README.md +0 -42
- package/skills/browser-qa/SKILL.md +0 -208
- package/skills/browser-qa/scripts/agent-browser.mjs +0 -531
- package/skills/building/SKILL.md +0 -95
- package/skills/chat/SKILL.md +0 -36
- package/skills/code-review/SKILL.md +0 -82
- package/skills/debug-production/SKILL.md +0 -108
- package/skills/demo/SKILL.md +0 -228
- package/skills/demo/scripts/compose-demo.sh +0 -243
- package/skills/issue-answer/SKILL.md +0 -91
- package/skills/issue-comment/SKILL.md +0 -49
- package/skills/issue-triage/SKILL.md +0 -149
- package/skills/issue-triage/references/AGENT-BRIEF.md +0 -65
- package/skills/pr-comment/SKILL.md +0 -64
- package/skills/pr-review/SKILL.md +0 -148
- package/skills/pr-review/references/findings-schema.md +0 -89
- package/skills/qa-test/SKILL.md +0 -97
- package/skills/repo-health/SKILL.md +0 -67
- package/skills/security-feedback/SKILL.md +0 -173
- package/skills/security-feedback/references/templates.md +0 -77
- package/skills/security-review/SKILL.md +0 -215
- package/skills/security-review/references/issue-format.md +0 -302
- package/skills/verify/SKILL.md +0 -118
- package/workflows/answer.yaml +0 -44
- package/workflows/build.yaml +0 -129
- package/workflows/cron-health.yaml +0 -6
- package/workflows/cron-review.yaml +0 -8
- package/workflows/cron-security.yaml +0 -6
- package/workflows/cron-triage.yaml +0 -8
- package/workflows/demo.yaml +0 -62
- package/workflows/examples/bash-smoke.yaml +0 -41
- package/workflows/examples/parallel-review.yaml +0 -36
- package/workflows/examples/tdd-loop.yaml +0 -17
- package/workflows/explore.yaml +0 -80
- package/workflows/issue-comment.yaml +0 -15
- package/workflows/issue-triage.yaml +0 -22
- package/workflows/pr-comment.yaml +0 -16
- package/workflows/pr-fix.yaml +0 -17
- package/workflows/pr-review.yaml +0 -50
- package/workflows/prompts/answer.md +0 -68
- package/workflows/prompts/architect.md +0 -44
- package/workflows/prompts/classifier.md +0 -60
- package/workflows/prompts/classify-adds-info.md +0 -17
- package/workflows/prompts/demo.md +0 -125
- package/workflows/prompts/executor.md +0 -42
- package/workflows/prompts/explore-ask.md +0 -99
- package/workflows/prompts/explore-publish.md +0 -31
- package/workflows/prompts/explore-read.md +0 -120
- package/workflows/prompts/explore-synthesize.md +0 -88
- package/workflows/prompts/fix.md +0 -18
- package/workflows/prompts/guardrails.md +0 -96
- package/workflows/prompts/pr-fix.md +0 -26
- package/workflows/prompts/pr.md +0 -39
- package/workflows/prompts/qa-browser.md +0 -95
- package/workflows/prompts/qa-synth.md +0 -44
- package/workflows/prompts/qa-test.md +0 -60
- package/workflows/prompts/re-reviewer.md +0 -33
- package/workflows/prompts/reviewer.md +0 -60
- package/workflows/prompts/verify-browser.md +0 -93
- package/workflows/prompts/verify-synth.md +0 -44
- package/workflows/prompts/verify.md +0 -63
- package/workflows/qa-test.yaml +0 -94
- package/workflows/repo-health.yaml +0 -15
- package/workflows/security-feedback.yaml +0 -25
- package/workflows/security-review.yaml +0 -37
- package/workflows/verify.yaml +0 -93
- /package/dist/{cli/cli-config.d.ts → cli-config.d.ts} +0 -0
- /package/dist/{cli/cli-config.js → cli-config.js} +0 -0
- /package/dist/{cli/cli-format.d.ts → cli-format.d.ts} +0 -0
- /package/dist/{cli/cli-format.js → cli-format.js} +0 -0
- /package/dist/{cli/cli-timeline.d.ts → cli-timeline.d.ts} +0 -0
- /package/dist/{cli/cli-timeline.js → cli-timeline.js} +0 -0
- /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
- /package/dist/{cli/oauth-cli.d.ts → oauth-cli.d.ts} +0 -0
- /package/dist/{cli/setup.d.ts → setup.d.ts} +0 -0
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
# § Issue format
|
|
2
|
-
|
|
3
|
-
This is the **contract** between `security-review` (producer) and
|
|
4
|
-
`security-feedback` (consumer). Every rule here is machine-parsed; do not
|
|
5
|
-
deviate. `security-feedback` is staged into a separate workspace and cannot read
|
|
6
|
-
this file, so it keeps its own copy of the row/severity grammar — **if you change
|
|
7
|
-
the grammar here, update `skills/security-feedback/SKILL.md` in lockstep.**
|
|
8
|
-
|
|
9
|
-
## Title
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
Security scan — YYYY-MM-DD
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
- Exactly one em-dash (` — `, U+2014), surrounded by single spaces.
|
|
16
|
-
- Date is the scan's UTC date in ISO form.
|
|
17
|
-
- Same-day re-scans produce a second issue with the same title. GitHub disambiguates by issue number; the scanner never edits a prior-run issue.
|
|
18
|
-
|
|
19
|
-
## Body
|
|
20
|
-
|
|
21
|
-
The body is assembled from eight blocks, in this exact order, separated by blank lines:
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
{header comments}
|
|
25
|
-
|
|
26
|
-
{intro paragraph}
|
|
27
|
-
|
|
28
|
-
{how-to-respond section}
|
|
29
|
-
|
|
30
|
-
{summary table}
|
|
31
|
-
|
|
32
|
-
{suppression note}
|
|
33
|
-
|
|
34
|
-
{scope note}
|
|
35
|
-
|
|
36
|
-
{overflow note — omitted when overflow == 0}
|
|
37
|
-
|
|
38
|
-
{findings sections}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Block 1 — header comments
|
|
42
|
-
|
|
43
|
-
Three HTML comments, each on its own line, in this exact order:
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
<!-- lastlight-security-scan-version: 1 -->
|
|
47
|
-
<!-- lastlight-security-scan-date: YYYY-MM-DD -->
|
|
48
|
-
<!-- lastlight-security-scan-ts: YYYY-MM-DDTHH:MM:SSZ -->
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
- `version` is a format version. Bump if the structure changes incompatibly — `security-feedback` will check this and refuse to parse unknown versions.
|
|
52
|
-
- `date` matches the title.
|
|
53
|
-
- `ts` is an ISO-8601 UTC timestamp with second precision (no milliseconds).
|
|
54
|
-
|
|
55
|
-
### Block 2 — intro paragraph
|
|
56
|
-
|
|
57
|
-
Exactly one paragraph, with the commit count and short-SHA range substituted:
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
Reviewing {N} commits since {priorScanDate} ({firstShortSha}..{lastShortSha}). Findings here focus on SDLC and workflow changes — Dependabot, GitHub Code Scanning, and Renovate handle the rest. Tick the box once the underlying issue is resolved or recorded in `SECURITY.md`.
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
`{N}` is the size of `commitsReviewed`. `{priorScanDate}` is the YYYY-MM-DD of the prior scan (or the bootstrap floor). When `N == 1`, both short SHAs are the same — render as `({onlyShortSha})` rather than `({sha}..{sha})`.
|
|
64
|
-
|
|
65
|
-
### Block 3 — how-to-respond section
|
|
66
|
-
|
|
67
|
-
Verbatim, including the heading:
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
## How to respond
|
|
71
|
-
|
|
72
|
-
**Preferred flow** — tick the boxes on the findings you want broken out, then comment:
|
|
73
|
-
|
|
74
|
-
- `@last-light create issues` — files one issue per **ticked** finding (default)
|
|
75
|
-
|
|
76
|
-
**Other shortcuts:**
|
|
77
|
-
|
|
78
|
-
- `@last-light create issues for the criticals` — every Critical finding (ticked or not)
|
|
79
|
-
- `@last-light create issues for the highs` — same, for High
|
|
80
|
-
- `@last-light create issues for items 1, 3, 5` — specific items by number (1-based, top to bottom)
|
|
81
|
-
- `@last-light create issues for all` — every finding in this scan
|
|
82
|
-
- `@last-light accept-risk for item N: <reason>` — suppress this finding in future scans
|
|
83
|
-
- `@last-light false-positive for item N: <reason>` — suppress this finding in future scans
|
|
84
|
-
- Comment freely to ask questions or discuss
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
(Item positions in commands map to the `item:N` HTML-comment markers defined below. Ticking a box in GitHub's UI rewrites the row from `[ ]` to `[x]` — the feedback skill treats that as your selection.)
|
|
88
|
-
|
|
89
|
-
### Block 4 — summary table
|
|
90
|
-
|
|
91
|
-
Verbatim header, with numbers substituted. Always include all four severity rows, even when the count is 0.
|
|
92
|
-
|
|
93
|
-
`{nC}`, `{nH}`, `{nM}`, `{nL}` and `{nTotal}` are **TRUE counts** (post-filtering, pre-cap) — i.e. how many findings of each severity actually survived the SECURITY.md filtering, regardless of whether each individual row is listed below the cap. The same numbers appear in the `### 🔴 Critical ({nC})` etc. section headers. The overflow note (Block 6) communicates how many of those counts were truncated from the listed rows.
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
## Summary
|
|
97
|
-
|
|
98
|
-
| Severity | Count |
|
|
99
|
-
|----------|------:|
|
|
100
|
-
| Critical | {nC} |
|
|
101
|
-
| High | {nH} |
|
|
102
|
-
| Medium | {nM} |
|
|
103
|
-
| Low | {nL} |
|
|
104
|
-
| **Total**| **{nTotal}** |
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Block 5 — suppression note
|
|
108
|
-
|
|
109
|
-
A single line:
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
Suppressed by `SECURITY.md`: {nSuppressed} (accepted: {nA}, false-positives: {nFP}). Below severity floor: {nFloor}.
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
Set each count to 0 when N/A. Emit the line unconditionally so the structure is stable.
|
|
116
|
-
|
|
117
|
-
### Block 6 — scope note
|
|
118
|
-
|
|
119
|
-
Always emit, immediately after the suppression note. Lists the human (non-bot) commits actually reviewed, so a maintainer can see what diff produced these findings:
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
> Commits reviewed: {short-sha-1} {subject-1}, {short-sha-2} {subject-2}, …
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
Cap at 10 entries; if there are more, append ` +{N} more` after the last item. Subjects are truncated to 60 chars with `…` if longer. Renovate/Dependabot commits are filtered out at § 1.5 and never appear here.
|
|
126
|
-
|
|
127
|
-
### Block 7 — overflow note
|
|
128
|
-
|
|
129
|
-
Emit **only** when `overflow > 0`:
|
|
130
|
-
|
|
131
|
-
```
|
|
132
|
-
> **Note** — {overflow} lower-severity findings are not listed here. The cap is: ALL critical and high, plus the first 10 medium/low (after sort). Tighten `SECURITY.md` severity floors or break out items from this scan, then re-run to surface the rest.
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Block 8 — findings sections
|
|
136
|
-
|
|
137
|
-
Four sections, in this **exact order** (Critical → High → Medium → Low). Always emit all four headers, even when a section has zero findings — the feedback skill relies on stable anchors.
|
|
138
|
-
|
|
139
|
-
The header counts (`{nC}` etc.) are the **true** post-filter counts, identical to those in Block 4's summary table. The rows listed under each header are subject to the § 7 cap: critical and high are always complete; medium + low are truncated to the first 10 combined. When a section is partially listed, append `(showing first N of {nM})` after the marker — see the per-section header rule below.
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
## Findings
|
|
143
|
-
|
|
144
|
-
### 🔴 Critical ({nC})
|
|
145
|
-
|
|
146
|
-
{rows or "_No findings._"}
|
|
147
|
-
|
|
148
|
-
### 🟠 High ({nH})
|
|
149
|
-
|
|
150
|
-
{rows or "_No findings._"}
|
|
151
|
-
|
|
152
|
-
### 🟡 Medium ({nM}){if truncated: " (showing first {kM} of {nM})"}
|
|
153
|
-
|
|
154
|
-
{rows or "_No findings._"}
|
|
155
|
-
|
|
156
|
-
### 🟢 Low ({nL}){if truncated: " (showing first {kL} of {nL})"}
|
|
157
|
-
|
|
158
|
-
{rows or "_No findings._"}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
Where `kM` and `kL` are the actual rows listed in this issue (sum of the two ≤ 10). When `kM == nM` or `kL == nL` (no truncation in that section), omit the parenthetical.
|
|
162
|
-
|
|
163
|
-
### Finding-row grammar
|
|
164
|
-
|
|
165
|
-
Every finding is exactly two lines: a task-list row, then a `<details>` block (one blank line between rows within a section).
|
|
166
|
-
|
|
167
|
-
The task-list row is **one physical line** with this exact shape:
|
|
168
|
-
|
|
169
|
-
```
|
|
170
|
-
- [ ] <!-- item:N fp:FINGERPRINT --> **TITLE** — `FILE:LINE` (TOOL · `RULE`)
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Matched by this canonical regex (multiline, case-sensitive) — covers all three row states:
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
/^- \[([ x])\] <!-- item:(\d+) fp:([0-9a-f]{8,}) --> (?:~~)?\*\*(.+?)\*\* — `([^`]+):(\d+)` \(([a-z][a-z0-9-]*) · `([^`]+)`\)(?:~~ → #(\d+))?$/m
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
Capture groups, in order:
|
|
180
|
-
|
|
181
|
-
1. `checkbox` — `" "` (unticked) or `"x"` (ticked or broken-out)
|
|
182
|
-
2. `itemNumber` (1-based across all severities)
|
|
183
|
-
3. `fingerprint` (lowercase hex, ≥ 8 chars)
|
|
184
|
-
4. `title` (plain text; no backticks, no asterisks)
|
|
185
|
-
5. `file` (no backticks, forward-slash path)
|
|
186
|
-
6. `line` (integer; use `0` when not line-scoped)
|
|
187
|
-
7. `tool` (lowercase, hyphenated — e.g. `npm-audit`, `semgrep`, `gitleaks`, `claude`)
|
|
188
|
-
8. `rule` (the tool's native rule id; may contain dots, hyphens)
|
|
189
|
-
9. `subIssueNumber` — present **only** when the row has been broken out to a sub-issue; `undefined` otherwise
|
|
190
|
-
|
|
191
|
-
Derived state (the feedback skill computes these from the captures):
|
|
192
|
-
|
|
193
|
-
| State | Written as | `checkbox` | `subIssueNumber` |
|
|
194
|
-
|-------|------------|------------|------------------|
|
|
195
|
-
| **pending** | `- [ ] <!-- item:N fp:FP --> **TITLE** — …` | `" "` | `undefined` |
|
|
196
|
-
| **user-ticked** (maintainer clicked the box in GitHub's UI) | `- [x] <!-- item:N fp:FP --> **TITLE** — …` | `"x"` | `undefined` |
|
|
197
|
-
| **broken-out** (feedback skill created a sub-issue) | `- [x] <!-- item:N fp:FP --> ~~**TITLE** — …~~ → #SUBISSUE` | `"x"` | the sub-issue number |
|
|
198
|
-
|
|
199
|
-
Rules:
|
|
200
|
-
|
|
201
|
-
- `alreadyBrokenOut` ≡ `subIssueNumber != null`. Broken-out rows are immutable — the feedback skill never re-opens them, never touches their checkbox, never re-creates sub-issues from them.
|
|
202
|
-
- `userTicked` ≡ `checkbox === "x" && subIssueNumber == null`. These are the candidates the default `@last-light create issues` command selects.
|
|
203
|
-
- When creating sub-issues from ticked rows, the feedback skill transitions each row from **user-ticked** → **broken-out** by wrapping the visible text in `~~…~~` and appending ` → #{subIssueNumber}`. The checkbox stays `[x]`; the strikethrough + link is the canonical broken-out marker.
|
|
204
|
-
- Un-ticking (moving a user-ticked row back to `[ ]`) is fine — the row just becomes pending again. The scanner doesn't police this.
|
|
205
|
-
|
|
206
|
-
The per-finding detail block follows immediately on the next line:
|
|
207
|
-
|
|
208
|
-
````
|
|
209
|
-
<details><summary>Details</summary>
|
|
210
|
-
|
|
211
|
-
```{LANGUAGE}
|
|
212
|
-
{SNIPPET}
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
{EXPLANATION}
|
|
216
|
-
|
|
217
|
-
**Suggested fix:** {SUGGESTED_FIX}
|
|
218
|
-
|
|
219
|
-
</details>
|
|
220
|
-
````
|
|
221
|
-
|
|
222
|
-
Rules:
|
|
223
|
-
- `LANGUAGE` is the fenced-code language tag; empty string when unknown.
|
|
224
|
-
- `SNIPPET` is the code excerpt; no surrounding fences, no trailing blank line inside the fence.
|
|
225
|
-
- `EXPLANATION` and `SUGGESTED_FIX` are markdown strings; they may contain their own fenced code blocks and line breaks.
|
|
226
|
-
- The `<details>` block ends with `</details>` on its own line.
|
|
227
|
-
|
|
228
|
-
## Worked example
|
|
229
|
-
|
|
230
|
-
A scan with 1 critical + 1 high finding renders like:
|
|
231
|
-
|
|
232
|
-
````markdown
|
|
233
|
-
<!-- lastlight-security-scan-version: 1 -->
|
|
234
|
-
<!-- lastlight-security-scan-date: 2026-04-21 -->
|
|
235
|
-
<!-- lastlight-security-scan-ts: 2026-04-21T10:00:00Z -->
|
|
236
|
-
|
|
237
|
-
Reviewing 3 commits since 2026-04-14 (a1b2c3d..f9e8d7c). Findings here focus on SDLC and workflow changes — Dependabot, GitHub Code Scanning, and Renovate handle the rest. Tick the box once the underlying issue is resolved or recorded in `SECURITY.md`.
|
|
238
|
-
|
|
239
|
-
## How to respond
|
|
240
|
-
|
|
241
|
-
- `@last-light create issues for the criticals` — file individual issues for every Critical finding
|
|
242
|
-
- `@last-light create issues for the highs` — same, for High
|
|
243
|
-
- `@last-light create issues for items 1, 3, 5` — file issues for specific items by number (1-based, top to bottom)
|
|
244
|
-
- `@last-light create issues for all` — every finding in this scan
|
|
245
|
-
- `@last-light accept-risk for item N: <reason>` — suppress this finding in future scans
|
|
246
|
-
- `@last-light false-positive for item N: <reason>` — suppress this finding in future scans
|
|
247
|
-
- Comment freely to ask questions or discuss
|
|
248
|
-
|
|
249
|
-
## Summary
|
|
250
|
-
|
|
251
|
-
| Severity | Count |
|
|
252
|
-
|----------|------:|
|
|
253
|
-
| Critical | 1 |
|
|
254
|
-
| High | 1 |
|
|
255
|
-
| Medium | 0 |
|
|
256
|
-
| Low | 0 |
|
|
257
|
-
| **Total**| **2** |
|
|
258
|
-
|
|
259
|
-
Suppressed by `SECURITY.md`: 0 (accepted: 0, false-positives: 0). Below severity floor: 0.
|
|
260
|
-
|
|
261
|
-
> Commits reviewed: a1b2c3d wire user-supplied repo into git clone, e5f6a7b add admin shell endpoint, f9e8d7c rotate webhook secret
|
|
262
|
-
|
|
263
|
-
## Findings
|
|
264
|
-
|
|
265
|
-
### 🔴 Critical (1)
|
|
266
|
-
|
|
267
|
-
- [ ] <!-- item:1 fp:abc123def4567890 --> **Command injection in git clone** — `mcp-github-app/src/index.js:42` (semgrep · `javascript.lang.security.exec-shell-command`)
|
|
268
|
-
<details><summary>Details</summary>
|
|
269
|
-
|
|
270
|
-
```javascript
|
|
271
|
-
execSync(`git clone ${userInput}`)
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
`userInput` originates from an HTTP request and is concatenated directly into a shell command, allowing arbitrary command execution.
|
|
275
|
-
|
|
276
|
-
**Suggested fix:** use `execFileSync('git', ['clone', userInput])` so arguments aren't re-parsed by a shell.
|
|
277
|
-
|
|
278
|
-
</details>
|
|
279
|
-
|
|
280
|
-
### 🟠 High (1)
|
|
281
|
-
|
|
282
|
-
- [ ] <!-- item:2 fp:def456abc7890123 --> **Hardcoded API key in config** — `src/config.ts:18` (gitleaks · `generic-api-key`)
|
|
283
|
-
<details><summary>Details</summary>
|
|
284
|
-
|
|
285
|
-
```typescript
|
|
286
|
-
const API_KEY = "sk_live_abc123..."
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
A live API key is committed to the repo. Anyone with read access to the repo (or the git history of a former branch) can use it.
|
|
290
|
-
|
|
291
|
-
**Suggested fix:** move the key to an environment variable (`process.env.API_KEY`) and rotate the exposed one immediately.
|
|
292
|
-
|
|
293
|
-
</details>
|
|
294
|
-
|
|
295
|
-
### 🟡 Medium (0)
|
|
296
|
-
|
|
297
|
-
_No findings._
|
|
298
|
-
|
|
299
|
-
### 🟢 Low (0)
|
|
300
|
-
|
|
301
|
-
_No findings._
|
|
302
|
-
````
|
package/skills/verify/SKILL.md
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: verify
|
|
3
|
-
description: Test a behaviour claim as an investigator and report whether the evidence confirms or refutes it — CONFIRMED / REFUTED / INCONCLUSIVE with bash-captured evidence. Use when asked to verify a claim, prove a fix works, or check that a PR does what it says.
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
tags: [github, verify, testing, evidence]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Verify
|
|
9
|
-
|
|
10
|
-
Test a specific claim about behaviour and report whether the evidence supports
|
|
11
|
-
or refutes it. The deliverable is a **verdict with evidence**, not an opinion.
|
|
12
|
-
|
|
13
|
-
This skill uses the **building** skill for installing dependencies and running
|
|
14
|
-
the repo's build/test commands in the sandbox.
|
|
15
|
-
|
|
16
|
-
> **Scope (text-evidence path).** In the default text phase the sandbox agent
|
|
17
|
-
> has bash, file read, and the github tools — no browser, no screenshots, no
|
|
18
|
-
> video. Prove claims with what bash can capture: test output, command
|
|
19
|
-
> stdout/stderr, `curl` against a dev-server you start, log excerpts, file
|
|
20
|
-
> contents, exit codes. Driving a real browser and attaching screenshots is the
|
|
21
|
-
> separate `browser-qa` skill, which is staged only in the gated browser phase
|
|
22
|
-
> running on the docker QA image (Playwright + Chromium). If that skill isn't in
|
|
23
|
-
> your catalogue and a claim genuinely can only be shown in a rendered UI, say
|
|
24
|
-
> so under **INCONCLUSIVE** rather than guessing — the browser phase will pick
|
|
25
|
-
> it up when available.
|
|
26
|
-
|
|
27
|
-
## Ground rule — investigator, not advocate
|
|
28
|
-
|
|
29
|
-
Your job is to find out whether the claim is **true**, not to make it look true.
|
|
30
|
-
A conclusive "this is broken" with clear evidence is exactly as valuable as a
|
|
31
|
-
"this works". Specifically:
|
|
32
|
-
|
|
33
|
-
- **Never fabricate, hardcode, mock, or stage evidence** to match an expected
|
|
34
|
-
outcome. Do not edit the code under test to make a result appear.
|
|
35
|
-
- If the behaviour you observe **contradicts** the claim, that is the result —
|
|
36
|
-
report it as REFUTED with the evidence inline. Don't bury it.
|
|
37
|
-
- **Don't retry a failing test hoping for a different answer.** Retry only after
|
|
38
|
-
*changing* the environment or procedure (wrong branch, missing build step),
|
|
39
|
-
and only when you have reason to believe the test setup — not the code — was
|
|
40
|
-
wrong. One unexpected result that reproduces is a finding.
|
|
41
|
-
|
|
42
|
-
## Parse the target
|
|
43
|
-
|
|
44
|
-
The Context block gives you the claim and (usually) a PR or issue. The claim may
|
|
45
|
-
arrive as:
|
|
46
|
-
|
|
47
|
-
- A **direct claim** — "ESC cancels streaming in bash mode", "the `--fork` flag
|
|
48
|
-
creates a new session".
|
|
49
|
-
- A **PR reference + claim** — verify the claim against that PR's head.
|
|
50
|
-
- A **PR reference only** — read the PR description + diff and identify the most
|
|
51
|
-
important, most testable claim it makes; state which claim you chose.
|
|
52
|
-
|
|
53
|
-
When a PR/issue is given, read its description and diff for context (from the
|
|
54
|
-
local checkout — see the **building** skill's workspace notes; don't pull the
|
|
55
|
-
diff through the API).
|
|
56
|
-
|
|
57
|
-
## Decide what would convince a skeptic
|
|
58
|
-
|
|
59
|
-
Name the single behaviour to observe and the evidence that settles it:
|
|
60
|
-
|
|
61
|
-
- **Functional claim** (a feature works, a flow completes) → run it and capture
|
|
62
|
-
the output / exit code / resulting state.
|
|
63
|
-
- **Regression / fix claim** ("no longer clears the screen", "stops erroring") →
|
|
64
|
-
show the **before and after**: reproduce on the base ref, then show it gone on
|
|
65
|
-
the head ref. Both states must appear in the evidence — an off-camera "it's
|
|
66
|
-
fixed" doesn't count.
|
|
67
|
-
- **Output/encoding claim** → capture the exact bytes/text (`xxd`, `od -c`, raw
|
|
68
|
-
stdout) rather than describing them.
|
|
69
|
-
|
|
70
|
-
## Run the test
|
|
71
|
-
|
|
72
|
-
Follow the **building** skill to install and build. Then exercise the claim with
|
|
73
|
-
the minimal sequence that demonstrates it, capturing evidence at the decisive
|
|
74
|
-
step. Start a dev-server in the background and `curl` it when the claim is about
|
|
75
|
-
a running service; run the CLI directly when it's a CLI claim; run the targeted
|
|
76
|
-
test when the repo already encodes the behaviour as a test.
|
|
77
|
-
|
|
78
|
-
If the environment blocks a clean test (missing dependency the sandbox can't
|
|
79
|
-
provide, build failure you can't resolve, infra that won't run), capture what
|
|
80
|
-
blocked it — that drives an **INCONCLUSIVE** result, not a guess.
|
|
81
|
-
|
|
82
|
-
## Report
|
|
83
|
-
|
|
84
|
-
Produce your report as your **final message** in this shape — the workflow posts
|
|
85
|
-
it for you (don't `github_add_issue_comment` yourself; that would double-post).
|
|
86
|
-
**Keep it concise**: a one-line environment summary, the decisive evidence
|
|
87
|
-
(commands + key output, not every line), and a one-paragraph conclusion — not an
|
|
88
|
-
exhaustive walkthrough.
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
## Verify: <claim>
|
|
92
|
-
|
|
93
|
-
**Environment:** <branch / commit, package manager, how the app was run>
|
|
94
|
-
|
|
95
|
-
### Evidence
|
|
96
|
-
<commands run + their captured output — fenced. Include both states for a
|
|
97
|
-
before/after claim.>
|
|
98
|
-
|
|
99
|
-
### Conclusion
|
|
100
|
-
**CONFIRMED** | **REFUTED** | **INCONCLUSIVE**
|
|
101
|
-
|
|
102
|
-
<one paragraph: what the evidence shows and why it settles the claim.>
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
- **REFUTED** — state the expected behaviour (from the claim), the observed
|
|
106
|
-
behaviour (from the evidence), include the evidence inline, and note any
|
|
107
|
-
environmental factors (branch, commit, OS). This is a valuable finding, not a
|
|
108
|
-
failed run.
|
|
109
|
-
- **INCONCLUSIVE** — report exactly what blocked the test and what would be
|
|
110
|
-
needed to resolve it. Do not guess at the outcome.
|
|
111
|
-
|
|
112
|
-
## Do NOT
|
|
113
|
-
|
|
114
|
-
- Retry a failing test more than once without changing the environment/procedure.
|
|
115
|
-
- Hardcode expected output, mock responses, or edit the code under test to force
|
|
116
|
-
a result.
|
|
117
|
-
- Assume unexpected behaviour means *you* made a mistake — it may be a real bug.
|
|
118
|
-
- Omit evidence that contradicts the claim.
|
package/workflows/answer.yaml
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
kind: answer
|
|
2
|
-
name: answer
|
|
3
|
-
classification:
|
|
4
|
-
intent: question
|
|
5
|
-
description: |
|
|
6
|
-
QUESTION — The user is asking a substantive INFORMATIONAL question that warrants research to answer well: "how does X work?", "what's the difference between X and Y?", "how does <repo> compare to <other tool>?", "is it possible to do Z?", "why does X happen?". The deliverable is an ANSWER, not code and not a spec. QUESTION is for real questions that benefit from reading docs/code or searching the web — NOT casual chat, thanks, or one-word replies (those stay CHAT). EXPLORE shapes a NEW idea into a spec; QUESTION answers an EXISTING question about how something works or compares.
|
|
7
|
-
examples:
|
|
8
|
-
- '"how does cliftonc/lastlight compare to Vercel''s Eve framework?" → INTENT: QUESTION, REPO: cliftonc/lastlight, ISSUE: NONE, REASON: NONE'
|
|
9
|
-
- '"what''s the difference between a sandbox phase and a chat session in cliftonc/lastlight?" → INTENT: QUESTION, REPO: cliftonc/lastlight, ISSUE: NONE, REASON: NONE'
|
|
10
|
-
description: |
|
|
11
|
-
Answer a question issue directly. Used when a newly-opened issue asks for
|
|
12
|
-
information, an explanation, or a comparison rather than a code change — the
|
|
13
|
-
bot researches (repo docs + web search) and posts a single sourced answer
|
|
14
|
-
comment, labels the issue `question`, and leaves it open. No agent brief, no
|
|
15
|
-
ready-for-agent, no PR.
|
|
16
|
-
|
|
17
|
-
Delivery is uniform: the agent's final message (the answer) is captured as
|
|
18
|
-
`answerResult` and posted by the harness via `postComment` — as a comment on
|
|
19
|
-
the originating issue for GitHub-initiated runs, or into the Slack thread for
|
|
20
|
-
Slack-initiated runs. The skill therefore does NOT post the answer itself; it
|
|
21
|
-
only applies the `question` label when answering a GitHub issue.
|
|
22
|
-
|
|
23
|
-
Triggered by:
|
|
24
|
-
- issue.opened webhook when the router classifies the issue as a question
|
|
25
|
-
- a Slack message classified as a question against a managed repo
|
|
26
|
-
- manual override via routes.github.issue_answer / routes.slack.answer
|
|
27
|
-
|
|
28
|
-
phases:
|
|
29
|
-
- name: phase_0
|
|
30
|
-
label: Context
|
|
31
|
-
type: context
|
|
32
|
-
|
|
33
|
-
- name: answer
|
|
34
|
-
label: Answer
|
|
35
|
-
prompt: prompts/answer.md
|
|
36
|
-
skill: issue-answer
|
|
37
|
-
model: "{{models.answer}}"
|
|
38
|
-
web_search: true
|
|
39
|
-
unrestricted_egress: true
|
|
40
|
-
output_var: answerResult
|
|
41
|
-
messages:
|
|
42
|
-
on_start: "Researching and drafting an answer..."
|
|
43
|
-
on_success: "{{answerResult}}"
|
|
44
|
-
on_failure: "I couldn't put together an answer — see the logs for details."
|
package/workflows/build.yaml
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
kind: build
|
|
2
|
-
name: build
|
|
3
|
-
classification:
|
|
4
|
-
intent: build
|
|
5
|
-
description: |
|
|
6
|
-
BUILD — The user is ASKING YOU (the bot) to make code changes NOW in a GitHub repo: implement a feature, fix a bug, create/send a PR, resolve an issue with code. BUILD requires a GitHub target — either an explicit repo reference (owner/name or github.com URL) in the message, OR an ISSUE TITLE context line indicating the comment is a reply on an existing issue/PR. If neither is present, classify as CHAT — local filesystem operations ("delete files in ~/foo", "clean up my downloads"), shell-style commands, or vague "build something" with no target are NOT BUILD.
|
|
7
|
-
BUILD is a REQUEST for NEW work directed at you. A comment that merely REPORTS work the human has ALREADY done is NOT BUILD — it is CHAT. Tells: past-tense ("fixed", "done", "implemented", "added a test", "pushed a fix", "handled it"), a reference to a commit the human made ("addressed in <sha>", "see commit abc123"), thanking you, or explaining/justifying a change they made in response to your review. These are status reports, not requests — classify them CHAT even when the comment is on a PR and even when it @-mentions you. Only classify BUILD when the human asks you to do NEW work (imperative request: "fix X", "now also handle Y", "can you update Z").
|
|
8
|
-
examples:
|
|
9
|
-
- '"build cliftonc/drizzle-cube#42" → INTENT: BUILD, REPO: cliftonc/drizzle-cube, ISSUE: 42, REASON: NONE'
|
|
10
|
-
- '"lets build this!" with ISSUE TITLE "Security Review" → INTENT: BUILD, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
11
|
-
- '"go ahead" with ISSUE TITLE "Add CSV export" → INTENT: BUILD, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
12
|
-
- '"now also handle the GET /sql case please" with ISSUE TITLE "Port adapters" → INTENT: BUILD, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
13
|
-
- '"Thanks @last-light — addressed in 49ccadf. Fixed the nested body in the core and added a regression test; point 3 is intentional, confirmed with the maintainer." with ISSUE TITLE "Port fastify/hono/nextjs adapters" → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
14
|
-
- '"done, pushed a fix for the type error in 1a2b3c4" with ISSUE TITLE "Fix build" → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
15
|
-
- '"delete any files in ~/work/lastlight/docs" → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
16
|
-
- '"can you remove the old docs folder for me" (no ISSUE TITLE, no repo) → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
17
|
-
- '"build something cool" (no repo, no ISSUE TITLE) → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
|
|
18
|
-
description: "Architect -> Executor -> Reviewer build cycle"
|
|
19
|
-
trigger: build
|
|
20
|
-
# Render progress as a single in-place task-list comment/message that updates
|
|
21
|
-
# as phases run, instead of a new comment per phase. The per-phase
|
|
22
|
-
# `messages.on_*` below become the one-line detail on each checklist step.
|
|
23
|
-
status_checklist: true
|
|
24
|
-
|
|
25
|
-
phases:
|
|
26
|
-
- name: phase_0
|
|
27
|
-
label: Context
|
|
28
|
-
type: context
|
|
29
|
-
|
|
30
|
-
- name: guardrails
|
|
31
|
-
label: Guardrails
|
|
32
|
-
prompt: prompts/guardrails.md
|
|
33
|
-
model: "{{models.guardrails}}"
|
|
34
|
-
variant: "{{variants.guardrails}}"
|
|
35
|
-
on_output:
|
|
36
|
-
contains_BLOCKED:
|
|
37
|
-
action: fail
|
|
38
|
-
message: "Guardrails check: BLOCKED"
|
|
39
|
-
unless_label: "lastlight:bootstrap"
|
|
40
|
-
unless_title_matches: "^(guardrails:|\\[guardrails\\])"
|
|
41
|
-
bypass_message: |
|
|
42
|
-
**Guardrails check: BLOCKED** — but this is a bootstrap task
|
|
43
|
-
(label `lastlight:bootstrap` or "guardrails:" title prefix detected).
|
|
44
|
-
Proceeding with the build cycle so the architect can plan, and the
|
|
45
|
-
executor can install, the missing tooling. The guardrails report at
|
|
46
|
-
`{{issueDir}}/guardrails-report.md` lists what's missing.
|
|
47
|
-
contains_READY:
|
|
48
|
-
action: continue
|
|
49
|
-
messages:
|
|
50
|
-
on_success: "READY — foundational tooling verified — [guardrails-report.md]({{artifactUrl guardrails-report.md}})"
|
|
51
|
-
on_blocked: |
|
|
52
|
-
**Guardrails check: BLOCKED** — missing foundational tooling.
|
|
53
|
-
|
|
54
|
-
See the guardrails report on branch `{{branch}}` at `{{issueDir}}/guardrails-report.md`.
|
|
55
|
-
Once you've added the missing tooling, ask me to build this issue again — the check will re-run against the current repo state.
|
|
56
|
-
|
|
57
|
-
- name: architect
|
|
58
|
-
label: Architect
|
|
59
|
-
prompt: prompts/architect.md
|
|
60
|
-
model: "{{models.architect}}"
|
|
61
|
-
variant: "{{variants.architect}}"
|
|
62
|
-
approval_gate: post_architect
|
|
63
|
-
approval_artifact: architect-plan.md
|
|
64
|
-
approval_gate_message: |
|
|
65
|
-
**Architect analysis complete** — approval required before implementation.
|
|
66
|
-
|
|
67
|
-
- Branch: `{{branch}}`
|
|
68
|
-
- Plan: `{{issueDir}}/architect-plan.md`
|
|
69
|
-
|
|
70
|
-
**Review & decide:** {{approvalUrl}}
|
|
71
|
-
**Or comment:** `{{botMention}} approve` / `{{botMention}} reject [reason]`
|
|
72
|
-
messages:
|
|
73
|
-
# Single-line messages become the one-line detail on the checklist step,
|
|
74
|
-
# so keep them concise and link the artifact on the branch.
|
|
75
|
-
on_success: "Plan ready — [architect-plan.md]({{artifactUrl architect-plan.md}})"
|
|
76
|
-
|
|
77
|
-
- name: executor
|
|
78
|
-
label: Executor
|
|
79
|
-
prompt: prompts/executor.md
|
|
80
|
-
skill: building
|
|
81
|
-
model: "{{models.executor}}"
|
|
82
|
-
variant: "{{variants.executor}}"
|
|
83
|
-
messages:
|
|
84
|
-
on_start: "implementing the architect's plan…"
|
|
85
|
-
on_skipped_done: "already completed"
|
|
86
|
-
on_success: "Implemented — [executor-summary.md]({{artifactUrl executor-summary.md}})"
|
|
87
|
-
|
|
88
|
-
- name: reviewer
|
|
89
|
-
label: Reviewer
|
|
90
|
-
prompt: prompts/reviewer.md
|
|
91
|
-
# code-review: rubric for the review + re-review prompts.
|
|
92
|
-
# building: the fix cycle (fix.md) runs under this node and needs the gate.
|
|
93
|
-
skills: [code-review, building]
|
|
94
|
-
model: "{{models.reviewer}}"
|
|
95
|
-
variant: "{{variants.reviewer}}"
|
|
96
|
-
output_var: review
|
|
97
|
-
loop:
|
|
98
|
-
max_cycles: 2
|
|
99
|
-
on_request_changes:
|
|
100
|
-
fix_prompt: prompts/fix.md
|
|
101
|
-
fix_model: "{{models.fix}}"
|
|
102
|
-
fix_variant: "{{variants.fix}}"
|
|
103
|
-
re_review_prompt: prompts/re-reviewer.md
|
|
104
|
-
approval_gate: post_reviewer
|
|
105
|
-
approval_artifact: reviewer-verdict.md
|
|
106
|
-
messages:
|
|
107
|
-
on_cycle_start: "independent verification (cycle {{cycle}})…"
|
|
108
|
-
on_approved: "Approved — [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}})"
|
|
109
|
-
on_request_changes: "**Review: REQUEST_CHANGES** — [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}}) — fixing issues (cycle {{cycle}}/{{maxCycles}})..."
|
|
110
|
-
on_fix_start: "**Starting fix loop** (cycle {{cycle}}/{{maxCycles}}) — addressing reviewer feedback..."
|
|
111
|
-
on_fix_failed: "Fix cycle {{cycle}} failed. Proceeding to PR with known issues."
|
|
112
|
-
on_max_cycles: "**Review: REQUEST_CHANGES** after {{maxCycles}} fix cycles — see [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}}). Proceeding with remaining issues noted."
|
|
113
|
-
on_pause_for_approval: |
|
|
114
|
-
**Review: REQUEST_CHANGES** — approval required before fix loop.
|
|
115
|
-
|
|
116
|
-
- Verdict: `{{issueDir}}/reviewer-verdict.md`
|
|
117
|
-
|
|
118
|
-
**Review & decide:** {{approvalUrl}}
|
|
119
|
-
**Or comment:** `{{botMention}} approve` / `{{botMention}} reject [reason]`
|
|
120
|
-
|
|
121
|
-
- name: pr
|
|
122
|
-
label: PR
|
|
123
|
-
prompt: prompts/pr.md
|
|
124
|
-
model: "{{models.pr}}"
|
|
125
|
-
variant: "{{variants.pr}}"
|
|
126
|
-
on_success:
|
|
127
|
-
set_phase: complete
|
|
128
|
-
messages:
|
|
129
|
-
on_start: "packaging changes for review…"
|