@vicfei/dsh-super-agent 0.5.0 → 0.6.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 +23 -3
- package/README.zh-CN.md +23 -4
- package/dist/cli.js +128 -46
- package/dist/cli.js.map +1 -1
- package/dist/domain.d.ts +21 -0
- package/dist/domain.js +13 -0
- package/dist/domain.js.map +1 -1
- package/dist/engine.d.ts +25 -0
- package/dist/engine.js +49 -0
- package/dist/engine.js.map +1 -1
- package/dist/github/app-auth.d.ts +33 -0
- package/dist/github/app-auth.js +102 -0
- package/dist/github/app-auth.js.map +1 -0
- package/dist/github/client.d.ts +44 -0
- package/dist/github/client.js +36 -3
- package/dist/github/client.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/merge.d.ts +28 -0
- package/dist/merge.js +129 -0
- package/dist/merge.js.map +1 -0
- package/dist/panel.d.ts +1 -0
- package/dist/panel.html +44 -0
- package/dist/panel.js +1 -0
- package/dist/panel.js.map +1 -1
- package/dist/usage.d.ts +5 -0
- package/dist/usage.js +52 -0
- package/dist/usage.js.map +1 -0
- package/dist/watch.js +5 -2
- package/dist/watch.js.map +1 -1
- package/dist/work.d.ts +10 -0
- package/dist/work.js +20 -2
- package/dist/work.js.map +1 -1
- package/examples/policy.json +7 -0
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -72,14 +72,16 @@ Early. Seed milestone — the admission domain compiles, is tested, and nothing
|
|
|
72
72
|
| LLM assessment layer — any OpenAI-compatible endpoint, fail-closed, inferred-only | ✅ v0.3.0 |
|
|
73
73
|
| Panel — one page of what awaits a human, observe records, mode switch | ✅ v0.4.0 |
|
|
74
74
|
| PR delivery — worker commits become a branch + pull request, linked in the report | ✅ v0.5.0 |
|
|
75
|
-
|
|
|
75
|
+
| Auto-merge — delivery requirements: own PR, allowed-list approval covering head, ±line cap; any CHANGES_REQUESTED vetoes | ✅ v0.6 |
|
|
76
|
+
| GitHub App auth, person-stages panel | M6 — see [docs/ROADMAP.md](docs/ROADMAP.md) |
|
|
77
|
+
| Feishu / Slack sources, speculative execution, Watchdog | later — see [docs/ROADMAP.md](docs/ROADMAP.md) |
|
|
76
78
|
|
|
77
79
|
## Quick start
|
|
78
80
|
|
|
79
81
|
One-liner (no clone needed, once published):
|
|
80
82
|
|
|
81
83
|
```bash
|
|
82
|
-
npx @vicfei/dsh-super-agent
|
|
84
|
+
npx @vicfei/dsh-super-agent --help # verify it runs; every command has --help-friendly errors
|
|
83
85
|
```
|
|
84
86
|
|
|
85
87
|
The poll-and-classify loop runs today — point it at any repo and watch the gate work (observe mode by default: **nothing executes**, inferred candidates are only recorded as `would accept`):
|
|
@@ -87,7 +89,7 @@ The poll-and-classify loop runs today — point it at any repo and watch the gat
|
|
|
87
89
|
```bash
|
|
88
90
|
git clone https://github.com/vicfei/dsh-super-agent && cd dsh-super-agent
|
|
89
91
|
npm install
|
|
90
|
-
cp examples/policy.json policy.json # put your login in allowedList
|
|
92
|
+
cp examples/policy.json policy.json # put your login in allowedList (or skip — first run scaffolds it)
|
|
91
93
|
export GITHUB_TOKEN=ghp_… # PAT: repo read (comments-write when replies land)
|
|
92
94
|
npm run poll -- --repo you/your-repo --agent-login your-login --config policy.json
|
|
93
95
|
```
|
|
@@ -115,6 +117,20 @@ npm run watch -- --repo you/your-repo --agent-login your-login --executor-config
|
|
|
115
117
|
|
|
116
118
|
`claude`, `codex`, `opencode`, `aider` or any shell command works as the worker; 30-minute background cap (timeout kills the whole process group), worker slots, blocked-by-name commands, reports posted back into the thread. Wire a real assessment model with `--assessment llm` (+ `ASSESS_BASE_URL` / `ASSESS_MODEL` / `ASSESS_API_KEY`): called only for inferred candidates, explicit never waits, errors fail closed to negative.
|
|
117
119
|
|
|
120
|
+
Auto-merge (default **off**) closes the loop with structural brakes — every condition is a checkable fact, never model judgment. Set `"merge": { "enabled": true, … }` in `policy.json` and the watch cycle (or a one-shot `npm run merge -- --repo you/your-repo`) merges a ticket PR only when **all** hold:
|
|
121
|
+
|
|
122
|
+
- the PR is one the agent opened (`dsh/ticket-N` branch)
|
|
123
|
+
- an **allowed-list, non-bot** reviewer approved at exactly the head SHA — stale approvals never merge
|
|
124
|
+
- additions + deletions ≤ `maxChangedLines` (default 200)
|
|
125
|
+
- no allowed-list reviewer's latest stance is CHANGES_REQUESTED (a one-person veto until re-reviewed)
|
|
126
|
+
- the merge PUT is pinned to the approved SHA — if the head moved, it re-evaluates next cycle
|
|
127
|
+
|
|
128
|
+
**GitHub App auth (optional, recommended).** By default everything rides a personal token (`GITHUB_TOKEN`): replies post as *you*, and rate limits are per-user. Configure a GitHub App instead and replies post as the App's bot identity (the gate already caps bots at inferred — they can never issue explicit requests), limits are per-installation, and installation tokens rotate hourly — no long-lived secret in the environment:
|
|
129
|
+
|
|
130
|
+
1. Create a user-owned App at [github.com/settings/apps/new](https://github.com/settings/apps/new) — permissions: **Issues: read & write, Pull requests: read & write, Contents: read & write, Metadata: read**; no webhook/subscription needed (everything is polled)
|
|
131
|
+
2. Install it on your repo, then set the environment: `GITHUB_APP_ID`, `GITHUB_APP_PRIVATE_KEY` (the PEM, `\n`-escaped — or `GITHUB_APP_PRIVATE_KEY_PATH`), optionally `GITHUB_APP_INSTALLATION_ID` (auto-discovered from `--repo` when omitted)
|
|
132
|
+
3. Run as usual — startup logs `auth: GitHub App …`. Precedence: `--token` flag > App env > `GITHUB_TOKEN`; branch pushes ride the same credential over https (ssh remotes keep using your ssh key)
|
|
133
|
+
|
|
118
134
|
And the panel (`npm run panel`, localhost) shows only what needs a person — needs-person tickets, observe records marked *would accept*, the full decision log, and the accept-mode switch (switching to `auto` asks you to confirm):
|
|
119
135
|
|
|
120
136
|
## Comparison
|
|
@@ -140,6 +156,10 @@ The distinction is levels: inside the DSH plugin ecosystem, 25+ plugins guard in
|
|
|
140
156
|
- [dsh-superagent-prototype](https://github.com/deepseek-ai/dsh-superagent-prototype) (MIT) — docs 000–008 are the specification this project follows; the admission-table semantics, observe mode and ticket stages are adapted from docs 002 and 003 with gratitude.
|
|
141
157
|
- [deepseek-harness](https://github.com/deepseek-ai/deepseek-harness) (MIT) — the runtime the official prototype runs on; this project deliberately does not require it.
|
|
142
158
|
|
|
159
|
+
## Contributing
|
|
160
|
+
|
|
161
|
+
Issue-first, English, tests green — the full walkthrough is in [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
162
|
+
|
|
143
163
|
## License
|
|
144
164
|
|
|
145
165
|
[MIT](LICENSE)
|
package/README.zh-CN.md
CHANGED
|
@@ -72,15 +72,16 @@ Super-agent 文章里最锋利的实验发现:给单会话智能体配上 subage
|
|
|
72
72
|
| LLM 评估层——任意 OpenAI 兼容端点,失败关闭,仅 inferred 调用 | ✅ v0.3.0 |
|
|
73
73
|
| 面板——只列等人事项、观察记录、模式切换 | ✅ v0.4.0 |
|
|
74
74
|
| PR 交付——Worker 的新提交自动变分支+Pull Request,报告带链接 | ✅ v0.5.0 |
|
|
75
|
-
| PR
|
|
76
|
-
|
|
|
75
|
+
| Auto-merge——交付门槛:自己的 PR、allowedList 审批覆盖头提交、±行数上限;CHANGES_REQUESTED 一票否决 | ✅ v0.6 |
|
|
76
|
+
| GitHub App 认证、按人分阶段面板 | M6——见 [docs/ROADMAP.md](docs/ROADMAP.md) |
|
|
77
|
+
| 飞书 / Slack 源、投机执行、Watchdog | 路线图——见 [docs/ROADMAP.md](docs/ROADMAP.md) |
|
|
77
78
|
|
|
78
79
|
## 快速开始
|
|
79
80
|
|
|
80
81
|
一行试用(发布后无需克隆仓库):
|
|
81
82
|
|
|
82
83
|
```bash
|
|
83
|
-
npx @vicfei/dsh-super-agent
|
|
84
|
+
npx @vicfei/dsh-super-agent --help # 先确认能跑;所有命令带 --help 友好报错
|
|
84
85
|
```
|
|
85
86
|
|
|
86
87
|
轮询+分类回路今天就能跑——指向任意仓库,看门禁工作(默认 observe 模式:**什么都不执行**,inferred 候选只记录为 `would accept`):
|
|
@@ -88,7 +89,7 @@ npx @vicfei/dsh-super-agent tickets # 先确认能跑;所有命令带友好
|
|
|
88
89
|
```bash
|
|
89
90
|
git clone https://github.com/vicfei/dsh-super-agent && cd dsh-super-agent
|
|
90
91
|
npm install
|
|
91
|
-
cp examples/policy.json policy.json # 把你的登录名放进 allowedList
|
|
92
|
+
cp examples/policy.json policy.json # 把你的登录名放进 allowedList(也可跳过——首跑会自动生成)
|
|
92
93
|
export GITHUB_TOKEN=ghp_… # PAT:repo 读权限(回复上线后需评论写权限)
|
|
93
94
|
npm run poll -- --repo you/your-repo --agent-login your-login --config policy.json
|
|
94
95
|
```
|
|
@@ -116,6 +117,20 @@ npm run watch -- --repo you/your-repo --agent-login your-login --executor-config
|
|
|
116
117
|
|
|
117
118
|
`claude`、`codex`、`opencode`、`aider` 或任意 shell 命令都可以当 Worker;30 分钟后台上限(超时杀整个进程组)、Worker 槽位、按名封锁的命令、报告回帖到原线程。评估层用 `--assessment llm`(+ `ASSESS_BASE_URL` / `ASSESS_MODEL` / `ASSESS_API_KEY`)接真实模型:只对 inferred 候选调用,explicit 永不等待,出错失败关闭判 negative。
|
|
118
119
|
|
|
120
|
+
Auto-merge(默认**关闭**)用结构性刹车把闭环走完——每个条件都是可核查的事实,从不依赖模型自觉。在 `policy.json` 设 `"merge": { "enabled": true, … }`,watch 周期(或一次性 `npm run merge -- --repo you/your-repo`)只在**全部满足**时合并工单 PR:
|
|
121
|
+
|
|
122
|
+
- 这个 PR 是 agent 自己开的(`dsh/ticket-N` 分支)
|
|
123
|
+
- 一位 **allowedList 非机器人**评审在恰好当前头提交 SHA 上 approve——过期审批永不合并
|
|
124
|
+
- additions + deletions ≤ `maxChangedLines`(默认 200)
|
|
125
|
+
- 没有任何 allowedList 评审的最新立场是 CHANGES_REQUESTED(一人否决,直到重审)
|
|
126
|
+
- 合并请求锁定被审批的那个 SHA——头提交变了就下周期重评
|
|
127
|
+
|
|
128
|
+
**GitHub App 认证(可选,推荐)。** 默认一切走个人令牌(`GITHUB_TOKEN`):回复以*你本人*身份发出,限额按用户算。改配 GitHub App 后,回复以 App 的 bot 身份发出(门禁本就把 bot 封顶在 inferred——bot 永远发不出 explicit 请求),限额按安装计,installation token 每小时轮换——环境里不再有长效密钥:
|
|
129
|
+
|
|
130
|
+
1. 在 [github.com/settings/apps/new](https://github.com/settings/apps/new) 创建用户级 App——权限只需 **Issues: read & write、Pull requests: read & write、Contents: read & write、Metadata: read**;不需要 webhook/订阅(全部轮询)
|
|
131
|
+
2. 安装到你的仓库,然后设环境变量:`GITHUB_APP_ID`、`GITHUB_APP_PRIVATE_KEY`(PEM 内容,`\n` 转义——或 `GITHUB_APP_PRIVATE_KEY_PATH` 指文件)、可选 `GITHUB_APP_INSTALLATION_ID`(省略时从 `--repo` 自动发现)
|
|
132
|
+
3. 照常运行——启动会打一行 `auth: GitHub App …`。优先级:`--token` 参数 > App 环境变量 > `GITHUB_TOKEN`;分支推送走 https 时用同一凭证(ssh remote 继续用你的 ssh key)
|
|
133
|
+
|
|
119
134
|
面板(`npm run panel`,仅本机)只显示需要人的事项——needs-person 工单、标注 *would accept* 的观察记录、完整决策日志,以及接受模式切换(切 `auto` 会要求确认):
|
|
120
135
|
|
|
121
136
|
## 对比
|
|
@@ -134,6 +149,10 @@ npm run watch -- --repo you/your-repo --agent-login your-login --executor-config
|
|
|
134
149
|
- [dsh-superagent-prototype](https://github.com/deepseek-ai/dsh-superagent-prototype)(MIT)——其 000–008 文档即本项目遵循的规格;准许表语义、观察模式与工单阶段改编自其 docs 002 与 003,致谢。
|
|
135
150
|
- [deepseek-harness](https://github.com/deepseek-ai/deepseek-harness)(MIT)——官方原型的运行底座;本项目刻意不依赖它。
|
|
136
151
|
|
|
152
|
+
## 参与贡献
|
|
153
|
+
|
|
154
|
+
英文 issue 优先、测试全绿——完整流程见 [CONTRIBUTING.md](CONTRIBUTING.md)。
|
|
155
|
+
|
|
137
156
|
## 许可证
|
|
138
157
|
|
|
139
158
|
[MIT](LICENSE)
|
package/dist/cli.js
CHANGED
|
@@ -2,48 +2,99 @@
|
|
|
2
2
|
// CLI — poll (Source → gate → optional LLM assessment → Engine), work (claim → subprocess →
|
|
3
3
|
// report → drain), tickets (list / stop). Token and API keys come from the environment only.
|
|
4
4
|
import { parseArgs } from "node:util";
|
|
5
|
-
import { readFileSync } from "node:fs";
|
|
5
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
6
|
+
import { createRequire } from "node:module";
|
|
6
7
|
import { Engine } from "./engine.js";
|
|
7
8
|
import { classify, formatOutcome } from "./runner.js";
|
|
8
9
|
import { evaluateGate } from "./gate.js";
|
|
9
10
|
import { llmAssessor, stubAssessor } from "./assess.js";
|
|
10
11
|
import { GitHubClient } from "./github/client.js";
|
|
12
|
+
import { AppTokenProvider, appAuthFromEnv } from "./github/app-auth.js";
|
|
11
13
|
import { GitHubSource } from "./github/source.js";
|
|
12
14
|
import { Executor } from "./executor.js";
|
|
13
15
|
import { runWork } from "./work.js";
|
|
16
|
+
import { mergePolicyOf } from "./domain.js";
|
|
17
|
+
import { NO_TOKEN_HINT, scaffoldFromExample, USAGE } from "./usage.js";
|
|
14
18
|
function die(msg) {
|
|
15
19
|
console.error(msg);
|
|
16
20
|
process.exit(1);
|
|
17
21
|
}
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
22
|
+
const WITH_HELP = "\nRun with --help for usage.";
|
|
23
|
+
function parseOrDie() {
|
|
24
|
+
try {
|
|
25
|
+
return parseArgs({
|
|
26
|
+
allowPositionals: true,
|
|
27
|
+
options: {
|
|
28
|
+
help: { type: "boolean", short: "h", default: false },
|
|
29
|
+
version: { type: "boolean", default: false },
|
|
30
|
+
repo: { type: "string" },
|
|
31
|
+
"agent-login": { type: "string" },
|
|
32
|
+
config: { type: "string", default: "policy.json" },
|
|
33
|
+
"executor-config": { type: "string", default: "executor.json" },
|
|
34
|
+
db: { type: "string", default: ".state/engine.db" },
|
|
35
|
+
assessment: { type: "string", default: "stub-positive" }, // stub-positive | stub-negative | llm
|
|
36
|
+
"assess-base-url": { type: "string" },
|
|
37
|
+
"assess-model": { type: "string" },
|
|
38
|
+
interval: { type: "string" },
|
|
39
|
+
"no-panel": { type: "boolean", default: false },
|
|
40
|
+
token: { type: "string" },
|
|
41
|
+
post: { type: "boolean", default: false },
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
die(`${e instanceof Error ? e.message : e}${WITH_HELP}`); // unknown option / missing value — no stack trace
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const { values: args, positionals } = parseOrDie();
|
|
50
|
+
const { version } = createRequire(import.meta.url)("../package.json");
|
|
51
|
+
if (args.version) {
|
|
52
|
+
console.log(version);
|
|
53
|
+
process.exit(0);
|
|
54
|
+
}
|
|
55
|
+
const COMMANDS = ["poll", "work", "watch", "tickets", "panel", "merge", "help"];
|
|
35
56
|
const command = positionals[0] ?? "poll";
|
|
57
|
+
if (args.help || command === "help") {
|
|
58
|
+
console.log(USAGE);
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
if (!COMMANDS.includes(command)) {
|
|
62
|
+
die(`unknown command: ${command}${WITH_HELP}`);
|
|
63
|
+
}
|
|
36
64
|
const engine = new Engine(args.db);
|
|
65
|
+
function readPolicyConfig() {
|
|
66
|
+
if (!existsSync(args.config) && scaffoldFromExample(args.config, "policy.json")) {
|
|
67
|
+
console.log(`[bootstrap] created ${args.config} from examples/policy.json`);
|
|
68
|
+
console.log("[bootstrap] put your GitHub login in allowedList, then rerun the same command");
|
|
69
|
+
engine.close();
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(readFileSync(args.config, "utf8"));
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
die(`cannot read policy config ${args.config}: ${e instanceof Error ? e.message : e}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
37
79
|
function loadPolicy() {
|
|
38
80
|
if (!args.repo)
|
|
39
|
-
die(
|
|
81
|
+
die(`--repo owner/name is required${WITH_HELP}`);
|
|
40
82
|
if (!args["agent-login"])
|
|
41
|
-
die(
|
|
83
|
+
die(`--agent-login <login> is required (mention detection)${WITH_HELP}`);
|
|
84
|
+
return readPolicyConfig();
|
|
85
|
+
}
|
|
86
|
+
function loadExecutorConfig() {
|
|
87
|
+
if (!existsSync(args["executor-config"]) && scaffoldFromExample(args["executor-config"], "executor.json")) {
|
|
88
|
+
console.log(`[bootstrap] created ${args["executor-config"]} from examples/executor.json`);
|
|
89
|
+
console.log('[bootstrap] point "command" at your agent CLI (claude / codex / aider / …), then rerun');
|
|
90
|
+
engine.close();
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
42
93
|
try {
|
|
43
|
-
return JSON.parse(readFileSync(args
|
|
94
|
+
return JSON.parse(readFileSync(args["executor-config"], "utf8"));
|
|
44
95
|
}
|
|
45
96
|
catch (e) {
|
|
46
|
-
die(`cannot read
|
|
97
|
+
die(`cannot read executor config ${args["executor-config"]}: ${e instanceof Error ? e.message : e}`);
|
|
47
98
|
}
|
|
48
99
|
}
|
|
49
100
|
function buildAssessor() {
|
|
@@ -52,7 +103,7 @@ function buildAssessor() {
|
|
|
52
103
|
}
|
|
53
104
|
const baseUrl = args["assess-base-url"] ?? process.env.ASSESS_BASE_URL;
|
|
54
105
|
if (!baseUrl)
|
|
55
|
-
die(
|
|
106
|
+
die(`--assessment llm requires --assess-base-url or ASSESS_BASE_URL${WITH_HELP}`);
|
|
56
107
|
return llmAssessor({
|
|
57
108
|
baseUrl,
|
|
58
109
|
model: args["assess-model"] ?? process.env.ASSESS_MODEL ?? "",
|
|
@@ -60,8 +111,37 @@ function buildAssessor() {
|
|
|
60
111
|
});
|
|
61
112
|
}
|
|
62
113
|
try {
|
|
63
|
-
|
|
64
|
-
|
|
114
|
+
// Credential precedence (M6-2): explicit --token > GitHub App env > GITHUB_TOKEN > anonymous.
|
|
115
|
+
function buildClient() {
|
|
116
|
+
if (args.token)
|
|
117
|
+
return { client: new GitHubClient({ token: args.token }), identity: "token (--token)" };
|
|
118
|
+
let appAuth = null;
|
|
119
|
+
try {
|
|
120
|
+
appAuth = appAuthFromEnv();
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
die(`GitHub App auth misconfigured: ${e instanceof Error ? e.message : e}`);
|
|
124
|
+
}
|
|
125
|
+
if (appAuth) {
|
|
126
|
+
const provider = new AppTokenProvider({
|
|
127
|
+
...appAuth,
|
|
128
|
+
...(args.repo ? { repo: args.repo } : {}), // installation auto-discovery when id absent
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
client: new GitHubClient({ tokenProvider: provider }),
|
|
132
|
+
identity: `GitHub App ${appAuth.appId}${appAuth.installationId ? ` (installation ${appAuth.installationId})` : ""}`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const envToken = process.env.GITHUB_TOKEN;
|
|
136
|
+
return { client: new GitHubClient({ token: envToken || undefined }), identity: envToken ? "token (GITHUB_TOKEN)" : "anonymous" };
|
|
137
|
+
}
|
|
138
|
+
const { client, identity } = buildClient();
|
|
139
|
+
const authenticated = identity !== "anonymous";
|
|
140
|
+
if (identity.startsWith("GitHub App")) {
|
|
141
|
+
console.log(`auth: ${identity} — hourly installation tokens; replies post as the App bot identity`);
|
|
142
|
+
}
|
|
143
|
+
if (!authenticated && (command === "poll" || command === "watch" || command === "work"))
|
|
144
|
+
console.warn(NO_TOKEN_HINT);
|
|
65
145
|
if (command === "poll") {
|
|
66
146
|
const policy = loadPolicy();
|
|
67
147
|
engine.setPolicyIfChanged(policy);
|
|
@@ -93,13 +173,7 @@ try {
|
|
|
93
173
|
const policy = loadPolicy();
|
|
94
174
|
engine.setPolicyIfChanged(policy);
|
|
95
175
|
const assessor = buildAssessor();
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
execCfg = JSON.parse(readFileSync(args["executor-config"], "utf8"));
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
die(`cannot read executor config ${args["executor-config"]}: ${e instanceof Error ? e.message : e}`);
|
|
102
|
-
}
|
|
176
|
+
const execCfg = loadExecutorConfig();
|
|
103
177
|
if (!args["no-panel"]) {
|
|
104
178
|
const port = Number(process.env.PANEL_PORT ?? 8787);
|
|
105
179
|
const { startPanel } = await import("./panel.js");
|
|
@@ -112,7 +186,7 @@ try {
|
|
|
112
186
|
engine,
|
|
113
187
|
source: new GitHubSource({ repo: args.repo, agentLogin: args["agent-login"], client }),
|
|
114
188
|
executor: new Executor(execCfg),
|
|
115
|
-
client:
|
|
189
|
+
client: authenticated ? client : null,
|
|
116
190
|
repo: args.repo,
|
|
117
191
|
policy,
|
|
118
192
|
assessment: async (t) => {
|
|
@@ -124,18 +198,10 @@ try {
|
|
|
124
198
|
}
|
|
125
199
|
else if (command === "work") {
|
|
126
200
|
if (!args.repo)
|
|
127
|
-
die(
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
execCfg = JSON.parse(readFileSync(args["executor-config"], "utf8"));
|
|
131
|
-
}
|
|
132
|
-
catch (e) {
|
|
133
|
-
die(`cannot read executor config ${args["executor-config"]}: ${e instanceof Error ? e.message : e}`);
|
|
134
|
-
}
|
|
135
|
-
if (token === undefined || token === "")
|
|
136
|
-
console.warn("[work] no GITHUB_TOKEN — reports stay queued in the outbox");
|
|
201
|
+
die(`--repo owner/name is required${WITH_HELP}`);
|
|
202
|
+
const execCfg = loadExecutorConfig();
|
|
137
203
|
const executor = new Executor(execCfg);
|
|
138
|
-
const reports = await runWork(engine, executor, args.repo,
|
|
204
|
+
const reports = await runWork(engine, executor, args.repo, authenticated ? client : null);
|
|
139
205
|
if (reports.length === 0)
|
|
140
206
|
console.log("no claimable tickets");
|
|
141
207
|
for (const r of reports) {
|
|
@@ -174,8 +240,24 @@ try {
|
|
|
174
240
|
process.on("SIGTERM", shutdown);
|
|
175
241
|
await new Promise(() => { }); // serve until signal — the finally-close must not run
|
|
176
242
|
}
|
|
177
|
-
else {
|
|
178
|
-
|
|
243
|
+
else if (command === "merge") {
|
|
244
|
+
// One-shot version of the watch cycle's auto-merge sweep (cron-friendly).
|
|
245
|
+
if (!args.repo)
|
|
246
|
+
die(`--repo owner/name is required${WITH_HELP}`);
|
|
247
|
+
if (!authenticated)
|
|
248
|
+
die(`merge needs a credential to read reviews and merge — export GITHUB_TOKEN or configure the GitHub App (GITHUB_APP_ID + key, see README)${WITH_HELP}`);
|
|
249
|
+
const policy = readPolicyConfig();
|
|
250
|
+
engine.setPolicyIfChanged(policy);
|
|
251
|
+
const { runMergeSweep } = await import("./merge.js");
|
|
252
|
+
const lines = await runMergeSweep(engine, client, args.repo, policy);
|
|
253
|
+
if (lines.length === 0) {
|
|
254
|
+
console.log(mergePolicyOf(policy).enabled
|
|
255
|
+
? "no open deliveries — nothing to sweep"
|
|
256
|
+
: "auto-merge is off — set policy.merge.enabled = true (structural brakes apply)");
|
|
257
|
+
}
|
|
258
|
+
for (const l of lines) {
|
|
259
|
+
console.log(l.reasons ? `#${l.pr} [${l.action}] ${l.reasons.join("; ")}` : `#${l.pr} [${l.action}]`);
|
|
260
|
+
}
|
|
179
261
|
}
|
|
180
262
|
}
|
|
181
263
|
finally {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/domain.d.ts
CHANGED
|
@@ -50,7 +50,28 @@ export interface Policy {
|
|
|
50
50
|
acceptMode: AcceptMode;
|
|
51
51
|
/** One row per scope; a missing row means all cells "ignore". */
|
|
52
52
|
table: AdmissionRow[];
|
|
53
|
+
/** Delivery-side brakes for auto-merge (M6). Absent = disabled — nothing merges by default. */
|
|
54
|
+
merge?: Partial<MergePolicy>;
|
|
53
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Structural merge brakes (docs/ROADMAP M6): every condition is a checkable fact about the PR,
|
|
58
|
+
* never model judgment — fail-closed, each miss recorded as a reason.
|
|
59
|
+
*/
|
|
60
|
+
export interface MergePolicy {
|
|
61
|
+
/** Auto-merge is opt-in; false means the sweep only reports. */
|
|
62
|
+
enabled: boolean;
|
|
63
|
+
/** An approval counts only if its commit_id equals the PR head SHA (stale approvals never merge). */
|
|
64
|
+
requireApprovalCoveringHead: boolean;
|
|
65
|
+
/** additions + deletions above this never merge. */
|
|
66
|
+
maxChangedLines: number;
|
|
67
|
+
/** Merge method for the SHA-pinned merge PUT. */
|
|
68
|
+
method: "squash" | "merge" | "rebase";
|
|
69
|
+
/** Delete the `dsh/ticket-N` branch after a successful merge. */
|
|
70
|
+
deleteBranch: boolean;
|
|
71
|
+
}
|
|
72
|
+
export declare function defaultMergePolicy(): MergePolicy;
|
|
73
|
+
/** Policy.merge is partial in the config file; fill the rest from defaults. */
|
|
74
|
+
export declare function mergePolicyOf(policy: Policy): MergePolicy;
|
|
54
75
|
export declare function defaultRow(scope: Scope): AdmissionRow;
|
|
55
76
|
/** The state an accepted Trigger's Ticket reports. */
|
|
56
77
|
export type Report = "progress" | "waiting" | "ready" | "blocked" | "failed" | "dropped";
|
package/dist/domain.js
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
// Domain types — adapted from dsh-superagent-prototype docs/001 & docs/002 (MIT, DeepSeek).
|
|
2
2
|
// Flow: Source → Trigger → Gate (host-enforced admission) → [assessment] → Ticket → Executor → Channel.
|
|
3
|
+
export function defaultMergePolicy() {
|
|
4
|
+
return {
|
|
5
|
+
enabled: false,
|
|
6
|
+
requireApprovalCoveringHead: true,
|
|
7
|
+
maxChangedLines: 200,
|
|
8
|
+
method: "squash",
|
|
9
|
+
deleteBranch: true,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Policy.merge is partial in the config file; fill the rest from defaults. */
|
|
13
|
+
export function mergePolicyOf(policy) {
|
|
14
|
+
return { ...defaultMergePolicy(), ...(policy.merge ?? {}) };
|
|
15
|
+
}
|
|
3
16
|
export function defaultRow(scope) {
|
|
4
17
|
return { scope, listedNotAddressing: "inferred", unlistedAddressing: "ignore", unlistedNotAddressing: "ignore" };
|
|
5
18
|
}
|
package/dist/domain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,wGAAwG;
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,wGAAwG;AAwFxG,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,2BAA2B,EAAE,IAAI;QACjC,eAAe,EAAE,GAAG;QACpB,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,EAAE,GAAG,kBAAkB,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC;AACnH,CAAC"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -36,6 +36,19 @@ export interface EffectRow {
|
|
|
36
36
|
payload: unknown;
|
|
37
37
|
attempts: number;
|
|
38
38
|
}
|
|
39
|
+
/** A PR the agent opened for a ticket — the auto-merge sweep's work list (M6-1). */
|
|
40
|
+
export interface DeliveryView {
|
|
41
|
+
id: number;
|
|
42
|
+
repo: string;
|
|
43
|
+
prNumber: number;
|
|
44
|
+
ticketId: number;
|
|
45
|
+
threadId: string;
|
|
46
|
+
branch: string;
|
|
47
|
+
headSha: string;
|
|
48
|
+
state: "open" | "merged" | "closed";
|
|
49
|
+
openedAt: string;
|
|
50
|
+
mergedAt?: string;
|
|
51
|
+
}
|
|
39
52
|
export interface DecisionView {
|
|
40
53
|
id: number;
|
|
41
54
|
kind: "accept" | "ignore" | "unavailable";
|
|
@@ -84,6 +97,18 @@ export declare class Engine {
|
|
|
84
97
|
completeTicket(id: number): boolean;
|
|
85
98
|
/** Public reply enqueue for adapters acting after commit (work reports, notices). */
|
|
86
99
|
enqueueReply(key: string, threadId: string, body: string): void;
|
|
100
|
+
/** Record (or re-open on re-delivery) the PR opened for a ticket. */
|
|
101
|
+
recordDelivery(d: {
|
|
102
|
+
repo: string;
|
|
103
|
+
prNumber: number;
|
|
104
|
+
ticketId: number;
|
|
105
|
+
threadId: string;
|
|
106
|
+
branch: string;
|
|
107
|
+
headSha: string;
|
|
108
|
+
}): void;
|
|
109
|
+
openDeliveries(repo: string): DeliveryView[];
|
|
110
|
+
finishDelivery(id: number, state: "merged" | "closed"): boolean;
|
|
111
|
+
deliveries(limit?: number): DeliveryView[];
|
|
87
112
|
/** Recent decisions with trigger context — the audit trail (panel + observe records). */
|
|
88
113
|
decisions(limit?: number): DecisionView[];
|
|
89
114
|
tickets(): TicketView[];
|
package/dist/engine.js
CHANGED
|
@@ -68,6 +68,17 @@ CREATE TABLE IF NOT EXISTS assignment (
|
|
|
68
68
|
started_at TEXT NOT NULL, ended_at TEXT
|
|
69
69
|
);
|
|
70
70
|
CREATE INDEX IF NOT EXISTS idx_assignment_ticket ON assignment(ticket_id);
|
|
71
|
+
|
|
72
|
+
CREATE TABLE IF NOT EXISTS delivery (
|
|
73
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
74
|
+
repo TEXT NOT NULL, pr_number INTEGER NOT NULL,
|
|
75
|
+
ticket_id INTEGER NOT NULL, thread_id TEXT NOT NULL,
|
|
76
|
+
branch TEXT NOT NULL, head_sha TEXT NOT NULL,
|
|
77
|
+
state TEXT NOT NULL DEFAULT 'open', -- open | merged | closed
|
|
78
|
+
opened_at TEXT NOT NULL, merged_at TEXT, updated_at TEXT NOT NULL,
|
|
79
|
+
UNIQUE(repo, pr_number)
|
|
80
|
+
);
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_delivery_state ON delivery(state);
|
|
71
82
|
`;
|
|
72
83
|
const MAX_EFFECT_ATTEMPTS = 5;
|
|
73
84
|
const BACKOFF_BASE_MS = 5_000;
|
|
@@ -272,6 +283,30 @@ export class Engine {
|
|
|
272
283
|
attempts = 0, next_due_at = excluded.next_due_at, last_error = NULL, updated_at = excluded.updated_at`)
|
|
273
284
|
.run(key, JSON.stringify({ threadId, issueNumber: n ? Number(n[2]) : null, body }), now, now, now);
|
|
274
285
|
}
|
|
286
|
+
// ── deliveries (M6-1: PRs the agent opened — the auto-merge sweep's work list) ──
|
|
287
|
+
/** Record (or re-open on re-delivery) the PR opened for a ticket. */
|
|
288
|
+
recordDelivery(d) {
|
|
289
|
+
const now = new Date().toISOString();
|
|
290
|
+
this.db.prepare(`INSERT INTO delivery (repo, pr_number, ticket_id, thread_id, branch, head_sha, state, opened_at, updated_at)
|
|
291
|
+
VALUES (@repo, @prNumber, @ticketId, @threadId, @branch, @headSha, 'open', @now, @now)
|
|
292
|
+
ON CONFLICT(repo, pr_number) DO UPDATE SET branch = excluded.branch, head_sha = excluded.head_sha,
|
|
293
|
+
state = 'open', merged_at = NULL, updated_at = excluded.updated_at`)
|
|
294
|
+
.run({ ...d, now });
|
|
295
|
+
}
|
|
296
|
+
openDeliveries(repo) {
|
|
297
|
+
const rows = this.db.prepare("SELECT * FROM delivery WHERE repo = ? AND state = 'open' ORDER BY id").all(repo);
|
|
298
|
+
return rows.map(toDeliveryView);
|
|
299
|
+
}
|
|
300
|
+
finishDelivery(id, state) {
|
|
301
|
+
const r = this.db
|
|
302
|
+
.prepare("UPDATE delivery SET state = ?, merged_at = CASE WHEN ? = 'merged' THEN ? ELSE merged_at END, updated_at = ? WHERE id = ? AND state = 'open'")
|
|
303
|
+
.run(state, state, new Date().toISOString(), new Date().toISOString(), id);
|
|
304
|
+
return r.changes > 0;
|
|
305
|
+
}
|
|
306
|
+
deliveries(limit = 30) {
|
|
307
|
+
const rows = this.db.prepare("SELECT * FROM delivery ORDER BY id DESC LIMIT ?").all(limit);
|
|
308
|
+
return rows.map(toDeliveryView);
|
|
309
|
+
}
|
|
275
310
|
// ── views ────────────────────────────────────────────────────────────────
|
|
276
311
|
/** Recent decisions with trigger context — the audit trail (panel + observe records). */
|
|
277
312
|
decisions(limit = 50) {
|
|
@@ -359,6 +394,20 @@ export class Engine {
|
|
|
359
394
|
.run(attempts, new Date(now.getTime() + delay).toISOString(), error, now.toISOString(), id);
|
|
360
395
|
}
|
|
361
396
|
}
|
|
397
|
+
function toDeliveryView(r) {
|
|
398
|
+
return {
|
|
399
|
+
id: Number(r.id),
|
|
400
|
+
repo: String(r.repo),
|
|
401
|
+
prNumber: Number(r.pr_number),
|
|
402
|
+
ticketId: Number(r.ticket_id),
|
|
403
|
+
threadId: String(r.thread_id),
|
|
404
|
+
branch: String(r.branch),
|
|
405
|
+
headSha: String(r.head_sha),
|
|
406
|
+
state: r.state,
|
|
407
|
+
openedAt: String(r.opened_at),
|
|
408
|
+
...(r.merged_at !== null ? { mergedAt: String(r.merged_at) } : {}),
|
|
409
|
+
};
|
|
410
|
+
}
|
|
362
411
|
function replyPayload(t, ticketId, verb, strength) {
|
|
363
412
|
const n = t.threadId.match(/\/(issues|pulls)\/(\d+)$/);
|
|
364
413
|
return {
|