lastlight 0.1.15 → 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 +377 -432
- 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 +30 -1
- package/dist/setup.js +241 -25
- 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 +17 -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
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { SessionLog, projectSlugForCwd } from "../session-log.js";
|
|
6
|
+
import { AgenticShim } from "./event-shim.js";
|
|
7
|
+
const tmpDirs = [];
|
|
8
|
+
afterEach(async () => {
|
|
9
|
+
for (const d of tmpDirs.splice(0)) {
|
|
10
|
+
await fs.rm(d, { recursive: true, force: true });
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
async function makeShim(initialPrompt = "do the thing") {
|
|
14
|
+
const homeDir = await fs.mkdtemp(path.join(os.tmpdir(), "shim-test-"));
|
|
15
|
+
tmpDirs.push(homeDir);
|
|
16
|
+
const cwd = "/home/agent/workspace";
|
|
17
|
+
const projectSlug = projectSlugForCwd(cwd);
|
|
18
|
+
const shim = new AgenticShim({
|
|
19
|
+
homeDir,
|
|
20
|
+
projectSlug,
|
|
21
|
+
model: "openai/gpt-5.5",
|
|
22
|
+
initialPrompt,
|
|
23
|
+
});
|
|
24
|
+
const filePath = new SessionLog(homeDir).pathForProject(projectSlug, "sess1", { requireExists: false });
|
|
25
|
+
if (!filePath)
|
|
26
|
+
throw new Error("expected valid session path");
|
|
27
|
+
return { shim, filePath };
|
|
28
|
+
}
|
|
29
|
+
async function readEnvelopes(filePath) {
|
|
30
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
31
|
+
return raw
|
|
32
|
+
.split("\n")
|
|
33
|
+
.filter((l) => l.trim().length > 0)
|
|
34
|
+
.map((l) => JSON.parse(l));
|
|
35
|
+
}
|
|
36
|
+
describe("AgenticShim per-message usage", () => {
|
|
37
|
+
it("writes Claude-shaped usage onto the assistant envelope", async () => {
|
|
38
|
+
const { shim, filePath } = await makeShim();
|
|
39
|
+
shim.feed({ type: "session", id: "sess1" });
|
|
40
|
+
shim.feed({
|
|
41
|
+
type: "message_end",
|
|
42
|
+
sessionId: "sess1",
|
|
43
|
+
message: {
|
|
44
|
+
role: "assistant",
|
|
45
|
+
content: [{ type: "text", text: "hello" }],
|
|
46
|
+
usage: {
|
|
47
|
+
input: 1200,
|
|
48
|
+
output: 340,
|
|
49
|
+
cacheRead: 5000,
|
|
50
|
+
cacheWrite: 10,
|
|
51
|
+
cost: { total: 0.07 },
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
await shim.flush();
|
|
56
|
+
const envelopes = await readEnvelopes(filePath);
|
|
57
|
+
const assistant = envelopes.find((e) => e.type === "assistant");
|
|
58
|
+
expect(assistant).toBeDefined();
|
|
59
|
+
const message = assistant?.message;
|
|
60
|
+
expect(message.usage).toEqual({
|
|
61
|
+
input_tokens: 1200,
|
|
62
|
+
output_tokens: 340,
|
|
63
|
+
cache_read_input_tokens: 5000,
|
|
64
|
+
cache_creation_input_tokens: 10,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
it("writes an extension_status event as a system envelope line", async () => {
|
|
68
|
+
const { shim, filePath } = await makeShim();
|
|
69
|
+
shim.feed({ type: "session", id: "sess1" });
|
|
70
|
+
shim.feed({
|
|
71
|
+
type: "extension_status",
|
|
72
|
+
sessionId: "sess1",
|
|
73
|
+
extension: "file-search",
|
|
74
|
+
status: "configured",
|
|
75
|
+
mode: "override",
|
|
76
|
+
toolCount: 3,
|
|
77
|
+
});
|
|
78
|
+
await shim.flush();
|
|
79
|
+
const envelopes = await readEnvelopes(filePath);
|
|
80
|
+
const sys = envelopes.find((e) => e.type === "system" && e.subtype === "extension_status");
|
|
81
|
+
expect(sys).toBeDefined();
|
|
82
|
+
expect(sys).toMatchObject({
|
|
83
|
+
extension: "file-search",
|
|
84
|
+
status: "configured",
|
|
85
|
+
mode: "override",
|
|
86
|
+
toolCount: 3,
|
|
87
|
+
});
|
|
88
|
+
// The initial user (prompt) line precedes it — extension status lands near
|
|
89
|
+
// the top of the session log.
|
|
90
|
+
expect(envelopes[0]?.type).toBe("user");
|
|
91
|
+
});
|
|
92
|
+
it("omits the usage block when the message carries no usage", async () => {
|
|
93
|
+
const { shim, filePath } = await makeShim();
|
|
94
|
+
shim.feed({ type: "session", id: "sess1" });
|
|
95
|
+
shim.feed({
|
|
96
|
+
type: "message_end",
|
|
97
|
+
sessionId: "sess1",
|
|
98
|
+
message: { role: "assistant", content: [{ type: "text", text: "hi" }] },
|
|
99
|
+
});
|
|
100
|
+
await shim.flush();
|
|
101
|
+
const envelopes = await readEnvelopes(filePath);
|
|
102
|
+
const assistant = envelopes.find((e) => e.type === "assistant");
|
|
103
|
+
const message = assistant?.message;
|
|
104
|
+
expect(message.usage).toBeUndefined();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe("AgenticShim thinking blocks", () => {
|
|
108
|
+
it("preserves thinking blocks on the assistant envelope and the reader extracts reasoning", async () => {
|
|
109
|
+
const { shim, filePath } = await makeShim();
|
|
110
|
+
shim.feed({ type: "session", id: "sess1" });
|
|
111
|
+
shim.feed({
|
|
112
|
+
type: "message_end",
|
|
113
|
+
sessionId: "sess1",
|
|
114
|
+
message: {
|
|
115
|
+
role: "assistant",
|
|
116
|
+
content: [
|
|
117
|
+
{ type: "thinking", thinking: "Let me reason about this..." },
|
|
118
|
+
{ type: "text", text: "Here is the answer." },
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
await shim.flush();
|
|
123
|
+
const envelopes = await readEnvelopes(filePath);
|
|
124
|
+
const assistant = envelopes.find((e) => e.type === "assistant");
|
|
125
|
+
const content = (assistant?.message).content;
|
|
126
|
+
expect(content).toEqual([
|
|
127
|
+
{ type: "thinking", thinking: "Let me reason about this..." },
|
|
128
|
+
{ type: "text", text: "Here is the answer." },
|
|
129
|
+
]);
|
|
130
|
+
// Round-trip through the reader the dashboard uses: reasoning is surfaced.
|
|
131
|
+
const normalized = await new SessionLog("").readNormalizedFile(filePath);
|
|
132
|
+
const asst = normalized.find((n) => n.msg.role === "assistant");
|
|
133
|
+
expect(asst?.msg.reasoning).toBe("Let me reason about this...");
|
|
134
|
+
expect(asst?.msg.content).toBe("Here is the answer.");
|
|
135
|
+
});
|
|
136
|
+
it("skips empty/redacted thinking blocks", async () => {
|
|
137
|
+
const { shim, filePath } = await makeShim();
|
|
138
|
+
shim.feed({ type: "session", id: "sess1" });
|
|
139
|
+
shim.feed({
|
|
140
|
+
type: "message_end",
|
|
141
|
+
sessionId: "sess1",
|
|
142
|
+
message: {
|
|
143
|
+
role: "assistant",
|
|
144
|
+
content: [
|
|
145
|
+
{ type: "thinking", thinking: "" },
|
|
146
|
+
{ type: "text", text: "answer" },
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
await shim.flush();
|
|
151
|
+
const envelopes = await readEnvelopes(filePath);
|
|
152
|
+
const assistant = envelopes.find((e) => e.type === "assistant");
|
|
153
|
+
const content = (assistant?.message).content;
|
|
154
|
+
expect(content).toEqual([{ type: "text", text: "answer" }]);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe("AgenticShim auto-retry breadcrumbs", () => {
|
|
158
|
+
it("emits a renderable system line on auto_retry_start", async () => {
|
|
159
|
+
const { shim, filePath } = await makeShim();
|
|
160
|
+
shim.feed({ type: "session", id: "sess1" });
|
|
161
|
+
shim.feed({
|
|
162
|
+
type: "auto_retry_start",
|
|
163
|
+
sessionId: "sess1",
|
|
164
|
+
attempt: 1,
|
|
165
|
+
maxAttempts: 3,
|
|
166
|
+
delayMs: 10000,
|
|
167
|
+
errorMessage: "429 RATE_LIMIT_EXCEEDED",
|
|
168
|
+
});
|
|
169
|
+
await shim.flush();
|
|
170
|
+
const envelopes = await readEnvelopes(filePath);
|
|
171
|
+
const sys = envelopes.find((e) => e.role === "system" && e.subtype === "auto_retry_start");
|
|
172
|
+
expect(sys).toBeDefined();
|
|
173
|
+
expect(String(sys?.content)).toContain("Auto-retry 1/3 in 10s");
|
|
174
|
+
expect(String(sys?.content)).toContain("429 RATE_LIMIT_EXCEEDED");
|
|
175
|
+
// Role-based line renders as a system message in the timeline reader.
|
|
176
|
+
const normalized = await new SessionLog("").readNormalizedFile(filePath);
|
|
177
|
+
const sysMsg = normalized.find((n) => n.msg.role === "system");
|
|
178
|
+
expect(sysMsg?.msg.content).toContain("Auto-retry 1/3 in 10s");
|
|
179
|
+
});
|
|
180
|
+
it("distinguishes recovery from give-up on auto_retry_end", async () => {
|
|
181
|
+
const { shim, filePath } = await makeShim();
|
|
182
|
+
shim.feed({ type: "session", id: "sess1" });
|
|
183
|
+
shim.feed({ type: "auto_retry_end", sessionId: "sess1", attempt: 2 });
|
|
184
|
+
shim.feed({ type: "auto_retry_end", sessionId: "sess1", attempt: 3, finalError: "still 429" });
|
|
185
|
+
await shim.flush();
|
|
186
|
+
const envelopes = await readEnvelopes(filePath);
|
|
187
|
+
const ends = envelopes.filter((e) => e.role === "system" && e.subtype === "auto_retry_end");
|
|
188
|
+
expect(ends).toHaveLength(2);
|
|
189
|
+
expect(String(ends[0]?.content)).toContain("recovered after 2 attempt");
|
|
190
|
+
expect(String(ends[1]?.content)).toContain("gave up after 3 attempt");
|
|
191
|
+
expect(String(ends[1]?.content)).toContain("still 429");
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
//# sourceMappingURL=event-shim.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-shim.test.js","sourceRoot":"","sources":["../../src/engine/event-shim.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,19 +10,17 @@ export type GitHubTokenPermissions = Partial<{
|
|
|
10
10
|
metadata: GitHubPermissionLevel;
|
|
11
11
|
}>;
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* Mint a GitHub App installation token; OPTIONALLY also write the bot
|
|
14
|
+
* identity + credential helper to the user's global git config.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* The default is to leave `~/.gitconfig` alone — every agent run happens
|
|
17
|
+
* inside a Docker sandbox where `sandbox-entrypoint.sh` configures git at
|
|
18
|
+
* the container's `--system` scope using the `GIT_TOKEN` env var the
|
|
19
|
+
* harness forwards. The harness process itself does not need git
|
|
20
|
+
* credentials for normal operation.
|
|
19
21
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* In local dev mode (LASTLIGHT_LOCAL_DEV=1) the global git config is NOT
|
|
23
|
-
* modified — the host's identity and credential helper are left alone. The
|
|
24
|
-
* token is still returned and propagates to sandboxes via env, where the
|
|
25
|
-
* sandbox-entrypoint.sh sets up its own per-container credential helper.
|
|
22
|
+
* Set `LASTLIGHT_WRITE_GLOBAL_GIT=1` only if you have a non-sandboxed
|
|
23
|
+
* code path that needs the harness user to be able to push as the bot.
|
|
26
24
|
*/
|
|
27
25
|
export declare function configureGitAuth(config: {
|
|
28
26
|
appId: string;
|
|
@@ -41,12 +39,10 @@ export declare function configureGitAuth(config: {
|
|
|
41
39
|
expiresAt: string;
|
|
42
40
|
}>;
|
|
43
41
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* returned to the caller (executor.ts) which forwards it to the sandbox via
|
|
49
|
-
* env so the in-container credential helper picks it up.
|
|
42
|
+
* Mint a fresh installation token. Same opt-in rule as configureGitAuth:
|
|
43
|
+
* `LASTLIGHT_WRITE_GLOBAL_GIT=1` is required before this rotates the
|
|
44
|
+
* credential helper in the user's `~/.gitconfig`. Otherwise the token is
|
|
45
|
+
* just returned (executor.ts forwards it to the sandbox via env).
|
|
50
46
|
*/
|
|
51
47
|
export declare function refreshGitAuth(config: {
|
|
52
48
|
appId: string;
|
package/dist/engine/git-auth.js
CHANGED
|
@@ -1,65 +1,122 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { execFileSync } from "child_process";
|
|
2
2
|
import { createSign } from "crypto";
|
|
3
|
-
import { readFileSync } from "fs";
|
|
4
|
-
import {
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { dirname, join, resolve } from "path";
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `
|
|
10
|
-
*
|
|
7
|
+
* Whether to write the bot identity + credential helper to the user's
|
|
8
|
+
* GLOBAL git config (`~/.gitconfig`). Defaults to **false** — the harness
|
|
9
|
+
* still mints installation tokens and forwards them to sandboxes via the
|
|
10
|
+
* `GIT_TOKEN` env var, where `sandbox-entrypoint.sh` configures git at the
|
|
11
|
+
* container's `--system` scope. The host's `~/.gitconfig` is left
|
|
12
|
+
* untouched.
|
|
13
|
+
*
|
|
14
|
+
* Set `LASTLIGHT_WRITE_GLOBAL_GIT=1` only when the harness itself runs git
|
|
15
|
+
* commands against your real filesystem (e.g. a non-sandboxed direct
|
|
16
|
+
* execution path). Production Docker doesn't need this — the entrypoint
|
|
17
|
+
* sets `--system` config inside the container.
|
|
18
|
+
*
|
|
19
|
+
* `LASTLIGHT_LOCAL_DEV=1` is accepted as a compat alias for the inverse
|
|
20
|
+
* (legacy meaning: "skip global writes") and silently ignored; that is
|
|
21
|
+
* now the default. The flag is harmless if left in place but the
|
|
22
|
+
* intentional opt-in is `LASTLIGHT_WRITE_GLOBAL_GIT=1`.
|
|
11
23
|
*/
|
|
12
|
-
function
|
|
13
|
-
return process.env.
|
|
24
|
+
function shouldWriteGlobalGitConfig() {
|
|
25
|
+
return process.env.LASTLIGHT_WRITE_GLOBAL_GIT === "1";
|
|
14
26
|
}
|
|
15
27
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
28
|
+
* Conservative shape check on a GitHub installation token. The credentials
|
|
29
|
+
* file we write contains a single URL of the form
|
|
30
|
+
* `https://x-access-token:${token}@github.com` — any `@`, `:`, `/`, or
|
|
31
|
+
* newline in the token would break URL parsing or inject extra entries.
|
|
32
|
+
* Real GitHub tokens are alphanumeric (plus `_`); this assertion catches
|
|
33
|
+
* any future format change before we write a malformed credentials file.
|
|
34
|
+
*/
|
|
35
|
+
function assertSafeToken(token) {
|
|
36
|
+
if (!/^[A-Za-z0-9_-]+$/.test(token)) {
|
|
37
|
+
throw new Error("Refusing to embed a token containing characters outside [A-Za-z0-9_-] into git credentials file");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve the path of the shared credentials file used by `credential.helper
|
|
42
|
+
* store`. Honors `LASTLIGHT_GIT_CREDENTIALS` so the sandbox entrypoint and
|
|
43
|
+
* the MCP server can agree on a path; falls back to `~/.config/lastlight/
|
|
44
|
+
* git-credentials` for the opt-in host write.
|
|
18
45
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
46
|
+
* Whitespace in the path would break git's helper-arg splitting (the
|
|
47
|
+
* `store --file=<path>` value is shell-split on spaces, not exec'd), so
|
|
48
|
+
* reject any whitespace defensively.
|
|
49
|
+
*/
|
|
50
|
+
function credentialsFilePath() {
|
|
51
|
+
const fromEnv = process.env.LASTLIGHT_GIT_CREDENTIALS?.trim();
|
|
52
|
+
const path = fromEnv || join(homedir(), ".config", "lastlight", "git-credentials");
|
|
53
|
+
if (/\s/.test(path)) {
|
|
54
|
+
throw new Error(`LASTLIGHT_GIT_CREDENTIALS contains whitespace; git's helper-arg parsing would break: ${path}`);
|
|
55
|
+
}
|
|
56
|
+
return path;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Write the credentials file consumed by `credential.helper store`. One
|
|
60
|
+
* line: `https://x-access-token:${token}@github.com`. File is mode 600,
|
|
61
|
+
* parent dir mode 700. Returns the absolute path.
|
|
62
|
+
*/
|
|
63
|
+
function writeCredentialsFile(token) {
|
|
64
|
+
assertSafeToken(token);
|
|
65
|
+
const credPath = credentialsFilePath();
|
|
66
|
+
mkdirSync(dirname(credPath), { recursive: true, mode: 0o700 });
|
|
67
|
+
writeFileSync(credPath, `https://x-access-token:${token}@github.com\n`, { mode: 0o600 });
|
|
68
|
+
return credPath;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Mint a GitHub App installation token; OPTIONALLY also write the bot
|
|
72
|
+
* identity + credential helper to the user's global git config.
|
|
22
73
|
*
|
|
23
|
-
*
|
|
74
|
+
* The default is to leave `~/.gitconfig` alone — every agent run happens
|
|
75
|
+
* inside a Docker sandbox where `sandbox-entrypoint.sh` configures git at
|
|
76
|
+
* the container's `--system` scope using the `GIT_TOKEN` env var the
|
|
77
|
+
* harness forwards. The harness process itself does not need git
|
|
78
|
+
* credentials for normal operation.
|
|
24
79
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* token is still returned and propagates to sandboxes via env, where the
|
|
28
|
-
* sandbox-entrypoint.sh sets up its own per-container credential helper.
|
|
80
|
+
* Set `LASTLIGHT_WRITE_GLOBAL_GIT=1` only if you have a non-sandboxed
|
|
81
|
+
* code path that needs the harness user to be able to push as the bot.
|
|
29
82
|
*/
|
|
30
83
|
export async function configureGitAuth(config) {
|
|
31
84
|
const token = await getInstallationToken(config);
|
|
32
|
-
if (
|
|
33
|
-
console.log(`[git-auth]
|
|
34
|
-
`
|
|
85
|
+
if (!shouldWriteGlobalGitConfig()) {
|
|
86
|
+
console.log(`[git-auth] Minted GitHub App token (expires: ${token.expiresAt}). ` +
|
|
87
|
+
`Global git config left untouched; sandboxes receive the token via GIT_TOKEN. ` +
|
|
88
|
+
`Set LASTLIGHT_WRITE_GLOBAL_GIT=1 to also write ~/.gitconfig.`);
|
|
35
89
|
return token;
|
|
36
90
|
}
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
//
|
|
91
|
+
// Opt-in path: write the token to a 600-mode credentials file and point
|
|
92
|
+
// git's built-in `store` helper at it. No shell interpolation anywhere
|
|
93
|
+
// along the way — git invokes `credential-store --file=<path>` as
|
|
94
|
+
// argv-array, not through a shell.
|
|
95
|
+
const credPath = writeCredentialsFile(token.token);
|
|
96
|
+
execGit(["config", "--global", "credential.helper", `store --file=${credPath}`]);
|
|
41
97
|
const botName = config.botName || "last-light";
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
console.log(`[git-auth] Configured git with GitHub App token (expires: ${token.expiresAt})`);
|
|
98
|
+
execGit(["config", "--global", "user.name", `${botName}[bot]`]);
|
|
99
|
+
execGit(["config", "--global", "user.email", `${botName}[bot]@users.noreply.github.com`]);
|
|
100
|
+
console.log(`[git-auth] Configured GLOBAL git with GitHub App token (file: ${credPath}, expires: ${token.expiresAt})`);
|
|
45
101
|
return token;
|
|
46
102
|
}
|
|
47
103
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* returned to the caller (executor.ts) which forwards it to the sandbox via
|
|
53
|
-
* env so the in-container credential helper picks it up.
|
|
104
|
+
* Mint a fresh installation token. Same opt-in rule as configureGitAuth:
|
|
105
|
+
* `LASTLIGHT_WRITE_GLOBAL_GIT=1` is required before this rotates the
|
|
106
|
+
* credential helper in the user's `~/.gitconfig`. Otherwise the token is
|
|
107
|
+
* just returned (executor.ts forwards it to the sandbox via env).
|
|
54
108
|
*/
|
|
55
109
|
export async function refreshGitAuth(config) {
|
|
56
110
|
const token = await getInstallationToken(config);
|
|
57
|
-
if (
|
|
111
|
+
if (!shouldWriteGlobalGitConfig()) {
|
|
58
112
|
return token;
|
|
59
113
|
}
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
114
|
+
const credPath = writeCredentialsFile(token.token);
|
|
115
|
+
// The credential.helper config already points at this path from the
|
|
116
|
+
// initial configureGitAuth call, but set it again so refreshGitAuth is
|
|
117
|
+
// safe to call standalone (idempotent).
|
|
118
|
+
execGit(["config", "--global", "credential.helper", `store --file=${credPath}`]);
|
|
119
|
+
console.log(`[git-auth] Refreshed token in GLOBAL git config (file: ${credPath}, expires: ${token.expiresAt})`);
|
|
63
120
|
return token;
|
|
64
121
|
}
|
|
65
122
|
// ── Internal ────────────────────────────────────────────────────────
|
|
@@ -98,7 +155,7 @@ async function getInstallationToken(config) {
|
|
|
98
155
|
const data = await res.json();
|
|
99
156
|
return { token: data.token, expiresAt: data.expires_at };
|
|
100
157
|
}
|
|
101
|
-
function
|
|
102
|
-
|
|
158
|
+
function execGit(args) {
|
|
159
|
+
execFileSync("git", args, { stdio: "pipe" });
|
|
103
160
|
}
|
|
104
161
|
//# sourceMappingURL=git-auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-auth.js","sourceRoot":"","sources":["../../src/engine/git-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"git-auth.js","sourceRoot":"","sources":["../../src/engine/git-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
vi.mock("child_process", () => ({
|
|
3
|
+
execSync: vi.fn(),
|
|
4
|
+
execFileSync: vi.fn(),
|
|
5
|
+
}));
|
|
6
|
+
vi.mock("fs", async (importOriginal) => {
|
|
7
|
+
const actual = await importOriginal();
|
|
8
|
+
return {
|
|
9
|
+
...actual,
|
|
10
|
+
readFileSync: vi.fn().mockReturnValue("fake-pem"),
|
|
11
|
+
writeFileSync: vi.fn(),
|
|
12
|
+
mkdirSync: vi.fn(),
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
vi.mock("crypto", async (importOriginal) => {
|
|
16
|
+
const actual = await importOriginal();
|
|
17
|
+
return {
|
|
18
|
+
...actual,
|
|
19
|
+
createSign: vi.fn().mockReturnValue({
|
|
20
|
+
update: vi.fn(),
|
|
21
|
+
sign: vi.fn().mockReturnValue("fakesig"),
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
import { execSync, execFileSync } from "child_process";
|
|
26
|
+
import * as fs from "fs";
|
|
27
|
+
import { configureGitAuth, refreshGitAuth } from "./git-auth.js";
|
|
28
|
+
const mockExecSync = vi.mocked(execSync);
|
|
29
|
+
const mockExecFileSync = vi.mocked(execFileSync);
|
|
30
|
+
function mockFetchToken(token = "ghs_testtoken123") {
|
|
31
|
+
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
|
|
32
|
+
ok: true,
|
|
33
|
+
json: async () => ({ token, expires_at: "2099-01-01T00:00:00Z" }),
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
const baseConfig = {
|
|
37
|
+
appId: "12345",
|
|
38
|
+
privateKeyPath: "/fake/key.pem",
|
|
39
|
+
installationId: "67890",
|
|
40
|
+
};
|
|
41
|
+
describe("git-auth — global ~/.gitconfig writes are opt-in", () => {
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
vi.clearAllMocks();
|
|
44
|
+
mockFetchToken();
|
|
45
|
+
// Default: NOT opted in — must not touch global git config.
|
|
46
|
+
delete process.env.LASTLIGHT_WRITE_GLOBAL_GIT;
|
|
47
|
+
});
|
|
48
|
+
it("configureGitAuth does NOT touch ~/.gitconfig by default", async () => {
|
|
49
|
+
await configureGitAuth(baseConfig);
|
|
50
|
+
expect(mockExecFileSync).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it("refreshGitAuth does NOT touch ~/.gitconfig by default", async () => {
|
|
53
|
+
await refreshGitAuth(baseConfig);
|
|
54
|
+
expect(mockExecFileSync).not.toHaveBeenCalled();
|
|
55
|
+
});
|
|
56
|
+
it("configureGitAuth still returns the minted token when opted out", async () => {
|
|
57
|
+
const out = await configureGitAuth(baseConfig);
|
|
58
|
+
expect(out.token).toBe("ghs_testtoken123");
|
|
59
|
+
expect(out.expiresAt).toBe("2099-01-01T00:00:00Z");
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe("git-auth — opt-in global writes use execFileSync safely", () => {
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
vi.clearAllMocks();
|
|
65
|
+
mockFetchToken();
|
|
66
|
+
process.env.LASTLIGHT_WRITE_GLOBAL_GIT = "1";
|
|
67
|
+
});
|
|
68
|
+
it("configureGitAuth does not use execSync", async () => {
|
|
69
|
+
await configureGitAuth(baseConfig);
|
|
70
|
+
expect(mockExecSync).not.toHaveBeenCalled();
|
|
71
|
+
});
|
|
72
|
+
it("configureGitAuth calls execFileSync with git array args", async () => {
|
|
73
|
+
await configureGitAuth(baseConfig);
|
|
74
|
+
expect(mockExecFileSync).toHaveBeenCalled();
|
|
75
|
+
for (const call of mockExecFileSync.mock.calls) {
|
|
76
|
+
expect(call[0]).toBe("git");
|
|
77
|
+
expect(Array.isArray(call[1])).toBe(true);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
it("configureGitAuth writes the token to a 600-mode credentials file (no shell interp)", async () => {
|
|
81
|
+
const token = "ghs_testtoken123";
|
|
82
|
+
mockFetchToken(token);
|
|
83
|
+
await configureGitAuth(baseConfig);
|
|
84
|
+
const writeMock = vi.mocked(fs.writeFileSync);
|
|
85
|
+
expect(writeMock).toHaveBeenCalled();
|
|
86
|
+
const [path, contents, opts] = writeMock.mock.calls[0];
|
|
87
|
+
expect(typeof path).toBe("string");
|
|
88
|
+
expect(contents).toBe(`https://x-access-token:${token}@github.com\n`);
|
|
89
|
+
expect(opts?.mode).toBe(0o600);
|
|
90
|
+
const credHelperCall = mockExecFileSync.mock.calls.find((c) => Array.isArray(c[1]) && c[1].includes("credential.helper"));
|
|
91
|
+
expect(credHelperCall).toBeDefined();
|
|
92
|
+
const args = credHelperCall[1];
|
|
93
|
+
const valueArg = args[args.length - 1];
|
|
94
|
+
// Helper value is the non-shell `store --file=<path>` form (no `!f`,
|
|
95
|
+
// no quotes, no interpolation).
|
|
96
|
+
expect(valueArg).toMatch(/^store --file=/);
|
|
97
|
+
expect(valueArg).not.toContain("!f()");
|
|
98
|
+
expect(valueArg).not.toContain(token);
|
|
99
|
+
});
|
|
100
|
+
it("configureGitAuth refuses tokens containing characters outside [A-Za-z0-9_-]", async () => {
|
|
101
|
+
mockFetchToken('ghs_evil";rm -rf /;"');
|
|
102
|
+
await expect(configureGitAuth(baseConfig)).rejects.toThrow(/outside \[A-Za-z0-9_-\]/);
|
|
103
|
+
});
|
|
104
|
+
it("refreshGitAuth does not use execSync", async () => {
|
|
105
|
+
await refreshGitAuth(baseConfig);
|
|
106
|
+
expect(mockExecSync).not.toHaveBeenCalled();
|
|
107
|
+
});
|
|
108
|
+
it("refreshGitAuth calls execFileSync with git array args", async () => {
|
|
109
|
+
await refreshGitAuth(baseConfig);
|
|
110
|
+
expect(mockExecFileSync).toHaveBeenCalled();
|
|
111
|
+
for (const call of mockExecFileSync.mock.calls) {
|
|
112
|
+
expect(call[0]).toBe("git");
|
|
113
|
+
expect(Array.isArray(call[1])).toBe(true);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=git-auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-auth.test.js","sourceRoot":"","sources":["../../src/engine/git-auth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createAppAuth } from "@octokit/auth-app";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { Octokit } from "octokit";
|
|
4
|
+
import { resolve } from "path";
|
|
5
|
+
export function githubAppClient(config) {
|
|
6
|
+
const privateKey = readFileSync(resolve(config.privateKeyPath), "utf-8");
|
|
7
|
+
return new Octokit({
|
|
8
|
+
authStrategy: createAppAuth,
|
|
9
|
+
auth: {
|
|
10
|
+
appId: config.appId,
|
|
11
|
+
privateKey,
|
|
12
|
+
installationId: config.installationId,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=github-app-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-app-client.js","sourceRoot":"","sources":["../../src/engine/github-app-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAQ/B,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,IAAI,OAAO,CAAC;QACjB,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU;YACV,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|