dsh-punky-swarm 0.3.6
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/CHANGELOG.md +120 -0
- package/LICENSE +661 -0
- package/README.en.md +281 -0
- package/README.md +281 -0
- package/cordis.patch.yml +59 -0
- package/lib/acps/certs.js +310 -0
- package/lib/acps/discovery-client.js +283 -0
- package/lib/acps/registry-client.js +527 -0
- package/lib/acps/server.js +302 -0
- package/lib/aip/agent-descriptor.js +170 -0
- package/lib/aip/identity.js +469 -0
- package/lib/aip/tool-descriptor.js +93 -0
- package/lib/api.js +266 -0
- package/lib/artifact-types.js +48 -0
- package/lib/assembly/audit-blind-review.js +170 -0
- package/lib/assembly/schema.js +253 -0
- package/lib/assembly.js +41 -0
- package/lib/assets.js +103 -0
- package/lib/bridge/trajectory.js +202 -0
- package/lib/client.js +704 -0
- package/lib/comms/acps-bridge.js +219 -0
- package/lib/comms/aip-format.js +141 -0
- package/lib/comms/budget.js +124 -0
- package/lib/comms/mailbox.js +221 -0
- package/lib/comms/topic-runtime.js +76 -0
- package/lib/comms/topic.js +115 -0
- package/lib/discovery/filter.js +199 -0
- package/lib/discovery/schema.js +157 -0
- package/lib/discovery/service.js +251 -0
- package/lib/hot/config-watch.js +252 -0
- package/lib/index.js +433 -0
- package/lib/lock.js +69 -0
- package/lib/panel/batch-detail.js +163 -0
- package/lib/panel/batch-list.js +84 -0
- package/lib/panel/locales.js +93 -0
- package/lib/panel/main.js +270 -0
- package/lib/panel/stream.js +348 -0
- package/lib/panel/theme.js +103 -0
- package/lib/panel/widgets.js +63 -0
- package/lib/schema.d.ts +192 -0
- package/lib/schema.js +259 -0
- package/lib/schema.ts +398 -0
- package/lib/state/archive.js +174 -0
- package/lib/state/command-exec.js +148 -0
- package/lib/state/constants.js +37 -0
- package/lib/state/corrupt-registry.js +103 -0
- package/lib/state/event-types.js +65 -0
- package/lib/state/gates.d.ts +226 -0
- package/lib/state/gates.js +428 -0
- package/lib/state/gates.ts +348 -0
- package/lib/state/machine-rules.d.ts +14 -0
- package/lib/state/machine-rules.js +76 -0
- package/lib/state/machine-rules.ts +88 -0
- package/lib/state/machine.js +68 -0
- package/lib/state/resume.js +201 -0
- package/lib/state/schema-v3.d.ts +10 -0
- package/lib/state/schema-v3.js +57 -0
- package/lib/state/schema-v3.ts +80 -0
- package/lib/state/store.js +607 -0
- package/lib/state/task-utils.js +40 -0
- package/lib/tools/core.js +323 -0
- package/lib/tools/git-utils.js +44 -0
- package/lib/tools/lane-tools.js +455 -0
- package/lib/tools/log-tools.js +173 -0
- package/lib/tools/mailbox-tools.js +121 -0
- package/lib/tools/merge-agent.js +127 -0
- package/lib/tools/register.js +85 -0
- package/lib/tools/shared.js +32 -0
- package/lib/types/contracts.d.ts +277 -0
- package/lib/types/contracts.js +17 -0
- package/lib/types/contracts.ts +279 -0
- package/lib/verify/evidence.js +249 -0
- package/lib/verify/gate.js +161 -0
- package/lib/verify/mount.js +48 -0
- package/lib/verify/selector.js +101 -0
- package/lib/watch/lane-heartbeat.js +333 -0
- package/lib/wave-plan.d.ts +48 -0
- package/lib/wave-plan.js +473 -0
- package/lib/wave-plan.ts +465 -0
- package/package.json +71 -0
- package/presets/jiufeng/NOTICE +5 -0
- package/presets/jiufeng/agent.cordis.yml +275 -0
- package/presets/jiufeng/preset.yml +3 -0
- package/skills/jiufeng-team/SKILL.md +214 -0
- package/skills/jiufeng-team/references/constitution.md +62 -0
- package/skills/jiufeng-team/references/roles/coder.md +17 -0
- package/skills/jiufeng-team/references/roles/coordinator.md +13 -0
- package/skills/jiufeng-team/references/roles/designer.md +14 -0
- package/skills/jiufeng-team/references/roles/doc-manager.md +13 -0
- package/skills/jiufeng-team/references/roles/manager.md +22 -0
- package/skills/jiufeng-team/references/roles/reviewer.md +19 -0
- package/skills/jiufeng-team/references/roles/supervisor.md +13 -0
- package/skills/jiufeng-team/references/roles/tester.md +13 -0
- package/skills/jiufeng-team/references/templates/call-chain-matrix-template.md +121 -0
- package/skills/jiufeng-team/references/templates/endpoint-behavior-template.md +60 -0
- package/skills/jiufeng-team/references/templates/gap-list.json +33 -0
- package/skills/jiufeng-team/references/templates/leader-decision-pack.md +92 -0
- package/skills/jiufeng-team/references/templates/plan-template.md +61 -0
- package/skills/jiufeng-team/references/templates/success-pattern-seeds.md +126 -0
- package/skills/jiufeng-team/references/workflow.md +98 -0
- package/skills/jiufeng-team/scripts/check-v3-density.mjs +98 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# jiufeng 工作流蓝图(蟛蜞模式)
|
|
2
|
+
|
|
3
|
+
> 说明:Manager 为任务第一对接点;粗拆由 Leader 人工对接;Coordinator 负责细拆与代码摸底。
|
|
4
|
+
|
|
5
|
+
## 一、角色 DAG(谁产出 → 谁消费 → 谁验证)
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
graph TD
|
|
9
|
+
subgraph 任务层🎯
|
|
10
|
+
L[Leader] -->|人工对接+粗拆决策包| MA[Manager]
|
|
11
|
+
L -->|模块清单| CO[coordinator]
|
|
12
|
+
CO -->|task-tree.json + codebase-survey.md| DE[designer]
|
|
13
|
+
DE -->|四件套: plan/spec/coder-tasks/tester-tasks| MA
|
|
14
|
+
end
|
|
15
|
+
subgraph 执行层⚡
|
|
16
|
+
MA -.->|建议派发| L
|
|
17
|
+
L -->|lane 任务| CR[coder池]
|
|
18
|
+
L -->|测试任务| TE[tester池]
|
|
19
|
+
CR -->|代码| RV[reviewer]
|
|
20
|
+
TE -->|测试报告| RV
|
|
21
|
+
RV -->|PASS/REWORK(review.md)| SV[supervisor]
|
|
22
|
+
end
|
|
23
|
+
subgraph 审计层🛡️
|
|
24
|
+
SV -->|acceptance-report + gap-list.json + CBM 对账| DM[doc-manager]
|
|
25
|
+
DM -->|retrospective-report → 记忆沉淀| CO
|
|
26
|
+
end
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 二、核心流转(11 步)
|
|
30
|
+
|
|
31
|
+
| 步骤 | 动作 | 角色 | 产出物(产物类型) |
|
|
32
|
+
|:----|------|------|------|
|
|
33
|
+
| ① | 开启任务 + 人工粗拆 | Leader | leader-decision-pack.md + 模块清单(plan/) |
|
|
34
|
+
| ② | 细拆 + 代码摸底 | Coordinator | task-tree.json + codebase-survey.md(plan/) |
|
|
35
|
+
| ③ | 任务规范设计(四件套) | Designer | plan.md + spec.md + coder-tasks.md + tester-tasks.md(plan/) |
|
|
36
|
+
| ④ | 建议派发 | Manager | 派发建议(mailbox inbox/broadcast)→ Leader 按建议 subagent 派发 worker(depth-1) |
|
|
37
|
+
| ⑤ | 编码实现 | Coder 池 | 代码(exec/) |
|
|
38
|
+
| ⑥a | 测试套件编写 + 验收检查清单准备(**准备段·与 code 同 wave 并行**) | Tester 池 / Reviewer | 测试套件 + 验收检查清单(exec/)——只依赖 plan 产物,不依赖 code 产物 |
|
|
39
|
+
| ⑥b | 运行测试套件出测试报告(**执行段·code 完成后立即**) | Tester 池 | 测试报告(exec/)——code 完成即跑,不等串行排期;gap-list 对账归 Supervisor(audit 段) |
|
|
40
|
+
| ⑦ | 对抗审查(执行段产物汇总) | Reviewer | review.md(audit/) |
|
|
41
|
+
| ⑧ | 验收审计 + gap-list 对账 | Supervisor | acceptance-report.md + gap-list.json(audit/) |
|
|
42
|
+
| ⑨ | 复盘沉淀 | Doc-Manager | retrospective-report.md(audit/)→ 记忆库 |
|
|
43
|
+
| ⑩ | 回馈循环 | Doc-Manager → Coordinator | 复盘知识 → 下一子模块 |
|
|
44
|
+
|
|
45
|
+
> 注:⑤ 编码与 ⑥a 准备段同 wave 并行;⑥b 在 code 完成后立即触发(非全串行直链)。
|
|
46
|
+
|
|
47
|
+
### 两段式 wave 示例
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
wave1: [plan-四件套]
|
|
51
|
+
wave2: [code-A, code-B, test-套件准备, review-清单准备] ← 并行
|
|
52
|
+
wave3: [test-执行, review-执行] ← code 完成后触发
|
|
53
|
+
wave4: [audit-验收]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> 注记:test/review lane 的 consume 指向 **plan 产物**(spec/tester-tasks)而非 code 产物;wave3 触发条件=code 完成,不依赖串行排期。
|
|
57
|
+
|
|
58
|
+
## 三、产物契约表(对应 wave_plan 的 layer/consume/produce)
|
|
59
|
+
|
|
60
|
+
| 层 | 产物(相对批次产物根) | 消费方 |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| plan 🎯 | leader-decision-pack.md、task-tree.json、codebase-survey.md、plan.md、spec.md、coder-tasks.md、tester-tasks.md | exec(consume spec/task-tree) |
|
|
63
|
+
| exec ⚡ | 代码(exec/<lane>/...)、测试报告、可执行测试套件(推荐) | audit(consume 产物) |
|
|
64
|
+
| audit 🛡️ | review.md、gap-list.json、acceptance-checklist.md(验收检查清单,推荐)、acceptance-report.md、retrospective-report.md | 记忆沉淀(dsh-mneme) |
|
|
65
|
+
|
|
66
|
+
> 引擎只校验存在性 + Plan 契约结构底线(spec 必含 \`## 验收标准\`/\`## 约束\`、task-tree.json 合法);四件套内部结构见 references/templates/。
|
|
67
|
+
|
|
68
|
+
### 模板 ↔ 产物映射表(P2-17 收敛:6 模板(5 md + 1 json 数据模板)指名引用)
|
|
69
|
+
|
|
70
|
+
> references/templates/ 6 模板逐一映射:模板 → 产出物 → 产物类型(artifact_types 注册表)→ layer/目录 → 产出角色 → consume 归属。call-chain-matrix / endpoint-behavior 为 **spec.md 内部章节模板**(非独立产物),由 Designer 四件套组装时填充;gap-list.json 为 **audit 对账数据模板**(非独立文件产物),由 Supervisor 对账时按 schema 落盘。
|
|
71
|
+
|
|
72
|
+
| 模板(references/templates/) | 产出物 | 产物类型 | layer / 目录 | 产出角色 | consume 归属 |
|
|
73
|
+
|---|---|---|---|---|---|
|
|
74
|
+
| leader-decision-pack.md | leader-decision-pack.md(粗拆决策包) | plan(任务层产物) | plan/ | Leader(人工对接 + grill 后) | Coordinator(细拆输入) |
|
|
75
|
+
| plan-template.md | plan.md(四件套之一) | plan(排期) | plan/ | Designer(dev-designer + spec-writing) | Coder/Tester/Reviewer(spec 参照) |
|
|
76
|
+
| call-chain-matrix-template.md | spec.md 的「调用链矩阵」章节(CH-*) | spec(执行规范) | plan/ | Designer(四件套组装时填充) | Coder/Tester(实现/测试依据) |
|
|
77
|
+
| endpoint-behavior-template.md | spec.md 的「端点行为」章节(EP-*) | spec(执行规范) | plan/ | Designer(四件套组装时填充) | Coder/Tester(实现/测试依据) |
|
|
78
|
+
| success-pattern-seeds.md | dsh-mneme 记忆(type=history/decision,SP-01~10 种子) | retrospective(复盘) | audit/ | Doc-Manager(复盘落库,非文件产物) | 记忆沉淀(后续批次检索复用) |
|
|
79
|
+
| gap-list.json | gap-list.json(audit 对账数据,schema 见模板) | gapList(audit 对账) | audit/ | Supervisor(audit 对账唯一产出者) | Leader(门禁裁决) |
|
|
80
|
+
|
|
81
|
+
> 产物类型名(plan/spec/taskTree/survey/code/testReport/review/gapList/acceptance/retrospective)与 lib/artifact-types.js 注册表一致;目录前缀(plan/、exec/、audit/)即 wave_plan layer 路径契约。
|
|
82
|
+
|
|
83
|
+
## 四、硬化判定点 ↔ 三层门禁
|
|
84
|
+
|
|
85
|
+
| 硬化判定点 | 三层门禁(引擎强制) |
|
|
86
|
+
|---|---|
|
|
87
|
+
| dp1 分配判定(ready→空闲实例) | Entry Gate(consume 齐备才派发)+ assign_check(A/B/C) |
|
|
88
|
+
| dp2 完成确认(产出完整性) | Exit Gate(outputs/produce 落盘才 merged);exec 层产物可含独立行 `gate: <命令>`(行首锚定,可多行顺序执行)→ merged 前置确定性执行、exit 0 通过(失败拒 merged 留 review;声明 needHuman 则转人工闸) |
|
|
89
|
+
| dp3 审查路由(REWORK/PASS) | review 状态 + member_settle(返工 review→running 保留);audit 层产物可含独立行 `needHuman: true` → merged 须带 `human:<裁决人>:<时间>:<结论>` 证据(缺则 GATE_NEEDHUMAN_PENDING) |
|
|
90
|
+
| dp4 验收判定(gap-list 对账) | Complete Gate(audit 验收完成才 complete) |
|
|
91
|
+
|
|
92
|
+
## 五、职责分工要点
|
|
93
|
+
|
|
94
|
+
- **Manager**:第一对接点;收发消息(mailbox)、读状态(batch_status/gate_status)、空闲发现(只读 member_status 查询);**建议派发经 mailbox_send;member_status 写按 Leader 裁决执行**;DAG 全员只读、指派写权归 Leader;
|
|
95
|
+
- **Leader**:人工粗拆(决策包 + 模块清单),不充当 worker;
|
|
96
|
+
- **Coordinator**:细拆(API 粒度)+ 代码摸底(codebase-survey.md);
|
|
97
|
+
- **Designer**:四件套(执行层全部规范,模板见 references/templates/);
|
|
98
|
+
- **Doc-Manager**:复盘产物落盘 + 记忆沉淀(dsh-mneme 优先,Mnemopi 降级)。
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* check-v3-density.mjs — V3 信息密度检查脚本(S1–S4)
|
|
4
|
+
*
|
|
5
|
+
* 批次:punky-impl-takeover-0829 / lane e4(exec-roles-script 域)
|
|
6
|
+
* 契约:v3-impl-pack.md(落点 A/B)+ v3-density-design.md §4.3(脚本可测规则)
|
|
7
|
+
* 规则:
|
|
8
|
+
* S1 统计任务包顶层键数 >10 → FAIL(SKILL.md §任务包最小结构 json 示例)
|
|
9
|
+
* S2 Persona 行字符数 >50(CJK 计 1 字符)→ FAIL(roles/*.md ## Persona 段)
|
|
10
|
+
* S3 roles/*.md 中「约束」行与公共约束模板串匹配数 >0 → FAIL(收敛后应为 0,提示去重)
|
|
11
|
+
* S4 公共语义指针句在 roles 内出现:完整指针句 >0 → FAIL;压缩差异说明 >2 处 → FAIL
|
|
12
|
+
* (收敛后仅 manager/reviewer 差异说明可保留,≤2 处)
|
|
13
|
+
* 用法:node skills/jiufeng-team/scripts/check-v3-density.mjs
|
|
14
|
+
* 退出码:全 PASS = 0;任一 FAIL = 1
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import fs from 'node:fs';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import { fileURLToPath } from 'node:url';
|
|
20
|
+
|
|
21
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
const ROOT = path.resolve(__dirname, '..'); // skills/jiufeng-team/
|
|
23
|
+
const SKILL = path.join(ROOT, 'SKILL.md');
|
|
24
|
+
const ROLES_DIR = path.join(ROOT, 'references', 'roles');
|
|
25
|
+
|
|
26
|
+
/** 公共约束模板串(SKILL.md §worker 公共约束 单一来源)——去空白比较,防换行干扰 */
|
|
27
|
+
const PUBLIC_CONSTRAINT = '按真实用户行为操作(点击调用链,禁机器式调接口);产物落盘 `artifacts/<batchId>/`;诚实披露(失败/异常如实记录);回执简短结构化(对比表/清单)';
|
|
28
|
+
/** 完整指针句(收敛前 8 角色同句的旧长句) */
|
|
29
|
+
const FULL_POINTER = '协作方式公共语义(checkpoint 纪律 / 三层门禁 / 约束引用格式单一来源)见 SKILL.md §纪律要点 + §三层门禁 + 使用方式 §3 + references/workflow.md §二/§四';
|
|
30
|
+
/** 压缩差异说明(收敛后仅 manager/reviewer 保留) */
|
|
31
|
+
const COMPACT_POINTER = '协作方式:公共语义单一来源见 SKILL.md;本角色差异如下';
|
|
32
|
+
|
|
33
|
+
const strip = (s) => s.replace(/\s+/g, '');
|
|
34
|
+
const compactPublic = strip(PUBLIC_CONSTRAINT);
|
|
35
|
+
const compactFull = strip(FULL_POINTER);
|
|
36
|
+
|
|
37
|
+
const results = [];
|
|
38
|
+
const add = (id, pass, detail) => results.push({ id, pass, detail });
|
|
39
|
+
|
|
40
|
+
/* ---------- S1:任务包顶层键数 ---------- */
|
|
41
|
+
const sk = fs.readFileSync(SKILL, 'utf8');
|
|
42
|
+
const jsonBlock = sk.match(/```json\n([\s\S]*?)\n```/);
|
|
43
|
+
if (!jsonBlock) {
|
|
44
|
+
add('S1', false, 'SKILL.md 未找到 ```json 任务包示例块');
|
|
45
|
+
} else {
|
|
46
|
+
const block = jsonBlock[1];
|
|
47
|
+
// 顶层键 = 块首行 `{ id, role, layer,` 内联键(整行逗号分隔)+ 恰好 2 空格缩进的独立行(内层 4 空格不匹配)
|
|
48
|
+
const firstLine = (block.match(/^\{\s*([^\n]*)/m) || [])[1] || '';
|
|
49
|
+
const inlineKeys = firstLine.split(',').map((k) => k.trim()).filter((k) => /^[a-zA-Z\u4e00-\u9fa5]+$/.test(k));
|
|
50
|
+
const rowKeys = [...block.matchAll(/^ ([^ :{][^:]*?):/gm)].map((m) => m[1].trim());
|
|
51
|
+
const keys = [...inlineKeys, ...rowKeys];
|
|
52
|
+
const n = keys.length;
|
|
53
|
+
add('S1', n <= 10, `任务包顶层键数 = ${n}(≤10 达标);键:${keys.join(' / ')}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* ---------- S2:Persona 长度 ---------- */
|
|
57
|
+
const roleFiles = fs.readdirSync(ROLES_DIR).filter((f) => f.endsWith('.md')).sort();
|
|
58
|
+
const over = [];
|
|
59
|
+
for (const f of roleFiles) {
|
|
60
|
+
const c = fs.readFileSync(path.join(ROLES_DIR, f), 'utf8');
|
|
61
|
+
const m = c.match(/## Persona[^\n]*\n([\s\S]*?)(?=\n## )/);
|
|
62
|
+
const p = m ? m[1].trim() : '';
|
|
63
|
+
if (p.length > 50) over.push(`${f}:${p.length}`);
|
|
64
|
+
}
|
|
65
|
+
add('S2', over.length === 0, over.length === 0
|
|
66
|
+
? `Persona 全部 ≤50 字(${roleFiles.length} 角色)`
|
|
67
|
+
: `超限:${over.join(',')}`);
|
|
68
|
+
|
|
69
|
+
/* ---------- S3:公共约束行去重(roles 内不再内联全文) ---------- */
|
|
70
|
+
const s3hits = [];
|
|
71
|
+
for (const f of roleFiles) {
|
|
72
|
+
const c = fs.readFileSync(path.join(ROLES_DIR, f), 'utf8');
|
|
73
|
+
if (strip(c).includes(compactPublic)) s3hits.push(f);
|
|
74
|
+
}
|
|
75
|
+
add('S3', s3hits.length === 0, s3hits.length === 0
|
|
76
|
+
? 'roles 内无公共约束全文内联(全部指针化 SKILL.md 单一来源)'
|
|
77
|
+
: `仍内联公共约束全文:${s3hits.join(',')}(改为「公共约束见 SKILL.md §worker 公共约束」)`);
|
|
78
|
+
|
|
79
|
+
/* ---------- S4:公共语义指针句收敛(完整句 0;压缩说明 ≤2 处) ---------- */
|
|
80
|
+
const s4Full = [];
|
|
81
|
+
const s4Compact = [];
|
|
82
|
+
for (const f of roleFiles) {
|
|
83
|
+
const c = fs.readFileSync(path.join(ROLES_DIR, f), 'utf8');
|
|
84
|
+
if (strip(c).includes(compactFull)) s4Full.push(f);
|
|
85
|
+
if (c.includes(COMPACT_POINTER)) s4Compact.push(f);
|
|
86
|
+
}
|
|
87
|
+
const s4Ok = s4Full.length === 0 && s4Compact.length <= 2;
|
|
88
|
+
add('S4', s4Ok,
|
|
89
|
+
`完整指针句出现 ${s4Full.length} 处(要求 0:${s4Full.join(',') || '无'});压缩差异说明 ${s4Compact.length} 处(要求 ≤2:${s4Compact.join(',') || '无'})`);
|
|
90
|
+
|
|
91
|
+
/* ---------- 汇总 ---------- */
|
|
92
|
+
const fails = results.filter((r) => !r.pass);
|
|
93
|
+
console.log('=== check-v3-density (S1–S4) ===');
|
|
94
|
+
for (const r of results) {
|
|
95
|
+
console.log(`${r.pass ? 'PASS' : 'FAIL'} ${r.id} ${r.detail}`);
|
|
96
|
+
}
|
|
97
|
+
console.log(`--- ${results.length - fails.length}/${results.length} PASS ---`);
|
|
98
|
+
process.exit(fails.length === 0 ? 0 : 1);
|