@whyshu/argent-engine 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/MANIFEST.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "schema": 1,
3
3
  "package": "@whyshu/argent-engine",
4
4
  "files": {
5
- "VERSION": "902311c7bb38fa1658ff403def6158ee7378fe9d6e2e284fa1c38735c31bd30b",
5
+ "VERSION": "d0176718bd214ce8474c06ed61c395ca113fdfc2acdd86d9aa9933b40d9b561e",
6
6
  "agents/catalog.json": "5356a812f2554dfd3115370363d4c3f787a82c9e5928a85d05b2a07c9e4b324d",
7
7
  "configs/_aliases.proposed.json": "3a59edf80563bcc20d410d488decad6fd787bd3de9489321367b0783904cd3e5",
8
8
  "configs/_migration-plan.proposed.json": "dd9f90b0b9b2f217dd23367a618402e57997d44f7fddcfa88a7cadf52e056c0d",
@@ -12,7 +12,7 @@
12
12
  "configs/hr.json": "59c0ea732139e7f54f04dce7595825b778b36f450e5ae5049d1326562388f7b8",
13
13
  "configs/notify.json": "cb9ef11c1c498fcf99af99ec50271b8a2598061b77ed73a6099032e837474ef0",
14
14
  "core/cli/argent.mjs": "9a8977324c238ca4e20435f9817eb7ec76157da32b1d510977dc03e0feb416a9",
15
- "core/contracts/argent.contracts.json": "dcfd30f862b85e6752a9e1091a6a45197da21d1a7981901b8fa076b1215a436d",
15
+ "core/contracts/argent.contracts.json": "ad0ebbcbfa06ab0da15043b0e5d86f676478bdbee6064cf437a3d08def9f3483",
16
16
  "core/contracts/verbs.schema.json": "4cc63e9709caf1bb71f3ac0dbfc374a258b24cec00b4294016b75a32a3471e8f",
17
17
  "core/lib/argent-datadir.mjs": "7102aedf538c1e935f45475b536b84f878b69ad1f4638a13b4d1a99a19cc175b",
18
18
  "core/lib/audit.mjs": "b57c233b1926e4ce4686604bbd2fdda33fdd432083828e589c5652606c63ba75",
@@ -54,10 +54,11 @@
54
54
  "scripts/argent-schedule.mjs": "d8235a4961fca28bcff3b5f28f8a9c3323f3e2707b6d017742d123d6c8c940d9",
55
55
  "scripts/argent-setup-check.mjs": "91a5752f8b4bb0a2748b831cb27809e8942ba7ddf99162a61582f732175c6041",
56
56
  "scripts/argent-upgrade.mjs": "ba75148cb3c27b4aab2b184d1320d4b57a203adf8b90214fa3d62880685a0d81",
57
+ "scripts/audit-all.mjs": "54c21512dc7c192fba21e45aab19502e070fecc4d0686fabb1fbdba0d7140794",
57
58
  "scripts/base-bootstrap.sh": "d44361618f808533fc11e8acdbccf5dfa53822a745e7c7a84bbd09885f6d6c2e",
58
59
  "scripts/billing-mode-daily.sh": "830e2dca9f362d1098239111479794a68d4a34071242daaeb04c36cf858cd175",
59
60
  "scripts/build-engine-package.mjs": "d2771385dfebfaaaae9c4dd9cc36a0bf1dd1536d1d95463fea9d5656fb9a1a98",
60
- "scripts/capability-packs.lock.json": "72688b8bb8e972246689d640f7ac5ff02340d1e5bdb824d9f124727375436b66",
61
+ "scripts/capability-packs.lock.json": "2abfeed7e1ca77006ae3fe9097d13f8c0bbd916e04e15ef84c1827395a8355c8",
61
62
  "scripts/capability_pack.py": "d21bca70deadab6bb818a3f2e12721c7eeb1c690bb382daae752620db8db5cb3",
62
63
  "scripts/check-1.0-criteria.mjs": "8fe145a83c4060c51a678eb2586b87a78b66d1456cebc95c52f7789aeb181c66",
63
64
  "scripts/check-agent-catalog.mjs": "25d68748cb507c0c70c43fefb8bf895944480de4f9306196588cd1af8e62250c",
@@ -80,9 +81,10 @@
80
81
  "scripts/check-test-env-safety.mjs": "7050d08972277a4d8b5c01e2ae16b96c6f45ad289e12d039948e3b6b3a2d95cc",
81
82
  "scripts/check-version-consistency.mjs": "621b4f58c0f7e3689fa663173f13830fa82fe5690b63fb64b3891553ae9b22e9",
82
83
  "scripts/ci-run.sh": "e6c6cf2b7b8e8f0f80da1afd1341a218338e85c26a7b8fea7c95b04ce90ebf82",
83
- "scripts/collect-evidence.mjs": "9de35d9504b1fe0e8322315961888b644741119a63168239cd3fd799b7d40f0e",
84
+ "scripts/collect-evidence.mjs": "0611287b5778f5889d6ee158c85398834e1b2f332e3a71ed709010e747f14808",
84
85
  "scripts/config-explain.mjs": "7d17980ab2fb17cad0deacc529650554e09b50d37af0aa43b7b29af3ffa8fffc",
85
86
  "scripts/configure-provider.rb": "cc84e2a714885a1f3ccaef9c4042cf72072d49a5b4538f1681fe7df2ab037315",
87
+ "scripts/criteria-table.mjs": "c178e8a9263d3218cacd03aaf16473420ae89fa200f1f4e38c5f4a495dfed137",
86
88
  "scripts/customer-config-migrate.mjs": "1f8b3502ef77d5b15348466b7d97ee0c76e7787a532eb8acd7cf8c29e1b268e4",
87
89
  "scripts/customer-preflight.py": "7af125636bec369ada3ed4a3387eab99adf4b97924c527588656a245d22a76a6",
88
90
  "scripts/customer-readiness.sh": "9e24d0041ccc3f82672b038e82452b8453c108a9b9403a6faf25f252cd67de0f",
@@ -96,7 +98,8 @@
96
98
  "scripts/desktop-trial.sh": "fde663b5b94f934d4f71769ed1d6876141022f264753862997126fd8f7b8fab2",
97
99
  "scripts/dev-window.sh": "09a98babff27d2f30048326339603cc926571a2e52befabbda186ed14ff14b16",
98
100
  "scripts/drill-clean-machine.sh": "06b5242de621545915901f502f2847ec4bf58d276d169fe6be6af4e5952009ad",
99
- "scripts/drill-clean-room.sh": "9a16d197c42649ef0c4e6a6dbbefaf832bc0c0fbe429583e0c7aaa2e333db86c",
101
+ "scripts/drill-clean-room.sh": "705b6edc97a93213610f694969addb5a73dd354b60c8f8dd12268d0ac5579c8c",
102
+ "scripts/drill-handover.sh": "b9d531a1a05e41359b12cb114094323edd67c2a9bca50bf73084553b781e1c51",
100
103
  "scripts/dsh-api-client.mjs": "5065560c8f2f8e77ad44ac6f300bb79417047a54cc7f3796ce4e926d6a4fc389",
101
104
  "scripts/dsh-backup-scope.sh": "b17b6cb40b265f87d93257b522df9bb46e45b4e4ef7e47cf1feebbe8d1214a4d",
102
105
  "scripts/dsh-offline-pack.mjs": "cd664ebc6d45aaaba2d4a23a827f053dded7e760c2b543378faf67b0f97bd032",
@@ -119,10 +122,10 @@
119
122
  "scripts/entitlements.py": "827bc3dd842faef7b4e7711f517633158cc5fbc2c9738faa41f80095c10b84c6",
120
123
  "scripts/env_probe.py": "976171519efe2a699844940687f179cb07b277f979ca5465d409a4e6cee4b3a7",
121
124
  "scripts/feishu-card.mjs": "1041cc0d32ad49a5d2ef5c5dc5f954f4e6b5d628395768847e9d5ed246706e8f",
122
- "scripts/final-check.mjs": "24d3f0ac0f0e25dee2855aefe7bf3c9c1f759a929caba17e77def01bbc0ab1e1",
125
+ "scripts/final-check.mjs": "45e2004e778c83fe08b35921a555b2ca57ddb375672cc965544ef1bb6ff10aa8",
123
126
  "scripts/fix-skill-frontmatter.py": "c77cb8d389bd96bc40655bbdd712435bfb06f74453a2f54dad58013f615ea748",
124
127
  "scripts/flow-auto-retry.py": "bf4cc963c9f766bd9011f4a252eb7a411b1b1a53cdd0e25c09c6dad95e1d44fa",
125
- "scripts/flow-requirements.json": "a0538e933545a8540530d8bd1fa82a2e71a46c624befe727f6e6d4cb883c5a29",
128
+ "scripts/flow-requirements.json": "b67cb282edcd10e0057a04d227066965b649870db3f093b6baafb62926ebe471",
126
129
  "scripts/flow-scaffold.py": "d886e4e5d5cf0e80991d1d1a40e54a7281d87fec7c781c89101277795e401ae1",
127
130
  "scripts/flow-timers-plist.sh": "a7b1007526fe21923566a002ef4e50fade5cbcdef38799f1a52e50c7b9c21131",
128
131
  "scripts/flow-timers.sh": "7400b6d2f5d46f3d96e04f348dc0422650eb40f8c2d4d9ab526c40ba988d4448",
@@ -132,7 +135,7 @@
132
135
  "scripts/flow_capability_stats.py": "68babceb21ff47eaec6cd5119539dea6726c1e058341ae4a2533f01b13ec3baf",
133
136
  "scripts/flow_case.py": "03870f8f4f3161302c7d43777c3c914205e088c6ebe4f9f4664caf9e76ccf266",
134
137
  "scripts/flow_claim.py": "5ebe13d0d95f6f282b9ede172fe60948b892c8871f041dc65fa5e3c9cb1b43e0",
135
- "scripts/flow_config.py": "1c1c1cb1d902f39b7a3a0e5acc90ccd5b5eb362e1e0b3a38429e22f9c03c737a",
138
+ "scripts/flow_config.py": "ed3dd02a946086b4134a47a401ef8bb0de86d1f56860e5c689941a252ecd5b3a",
136
139
  "scripts/flow_failure.py": "220cc33c34edd8fdf7296a48bf908012cf71421b8ed644c1b183b09ee35bbd11",
137
140
  "scripts/flow_learn.py": "b2e3e99ee5d2e758871b0cbaab73257a928b3c854f819c7be49d4c1d92f6bba9",
138
141
  "scripts/flow_ledger.py": "c4e3012ad9e573aa3f26374f2dcc7089f03253fb60a564e2700f5268b18f7df5",
@@ -153,6 +156,7 @@
153
156
  "scripts/fulfillment.js": "8de1ea386ebfe628caf4eaf2df5f1941938c07d4b8b2dcf79a78d45ac231669f",
154
157
  "scripts/gen-agent-bundles.mjs": "452582961b40e7b035d1ba423c1342321c9685f8bb622a2117e6027ec4fc4062",
155
158
  "scripts/gen-preset-rows.mjs": "029a352ab5a1c05e213ff425b6bd839e2880fce4b72dbabb22f5a4df48b00021",
159
+ "scripts/handover-sheet.mjs": "3d2270622f79fdfd6ac2317d660e1e05180d55731b41f1d43d05b1e8dfc837b9",
156
160
  "scripts/init-ml.sh": "c5a04fc723a4b254d7d92990ca31adb1100de666821e3a236285aaf3516453f7",
157
161
  "scripts/install-internal-role.sh": "6fe76b3a2604658341d75bce4d8ca0f03a18898982a33eefe414059e7bc2226e",
158
162
  "scripts/install-license.mjs": "6bac5b31647f1e84300fb54711e6852f978ce056d5b0c9ad706a25003ff2d4f9",
@@ -174,7 +178,7 @@
174
178
  "scripts/lease.py": "01356c24658c86e3a19e2e8d46bf29044f75cb3dc39a5a6016ecbf1d44badd77",
175
179
  "scripts/lib/agent-install.mjs": "538d1efa746679d10848763db0ddd2e76115964746f2e423a22cae1a8571e423",
176
180
  "scripts/lib/argent-datadir.mjs": "8398972cf7e2504f53ca72ff6d72bf9339f20dad0e18d0c557a39a4367fba265",
177
- "scripts/lib/argent-datadir.sh": "875f775f6622c6faf87c0765b6c2db05419692aace40d3bde861663c8a520403",
181
+ "scripts/lib/argent-datadir.sh": "efa0b28c447f1923f5d94ecfd285c48fc180e191ff1febf3246877e48e93312b",
178
182
  "scripts/lib/argent_datadir.py": "b7dadcc6eb53d1e818090d8a46d8b94c4b61dadd0f4e674a3f0171474fba3efc",
179
183
  "scripts/lib/argent_filelock.py": "dbbca6d9fae21f4fd9d63eaeb44974db3f6f56b6bf852042a6139f943412b7fb",
180
184
  "scripts/lib/bootcheck-wiring.mjs": "9c14308bed9456a3564a44d4bb6bb4452ca839b4675540431219ac753c01b62b",
@@ -252,7 +256,7 @@
252
256
  "scripts/provider-sync-target.check.mjs": "f4a1fcb2724724f895053d2401b6f3701a76594f8dbec3f3045db66901f3f135",
253
257
  "scripts/python-runtime.sh": "151f45f76ca6e8884789cf5f9f65849b4a2d81c55fb77eb58b5f481f55ab35cc",
254
258
  "scripts/query_runner.py": "9dca3900c30a2404d2942af5627743d1322da25cf31bf3918e72af1024270687",
255
- "scripts/release-argent.sh": "df099289641e3e0ee37e9fcfcedff1ef12dc9e2aba9254c7aac15be8cb23b119",
259
+ "scripts/release-argent.sh": "8b13f38c2ed1d0f25c03529c1c81be0e6cbf9af2cd5ba33357b8a83d9f8d9de2",
256
260
  "scripts/repair-unresolved-tools.mjs": "bcdeb4a1fe9544a304248880804e29a0dccf251d93eeea1a7608e2aa4e03f10a",
257
261
  "scripts/retire-inventory.mjs": "c9dda33d9ac741a45459bbf8088e3a50f8eb2bed83cc819ef850e780d7bf8c09",
258
262
  "scripts/run-tests.sh": "4297f8d5309a6c2ee15e9db1a894c43051c1a5bbe0e1a9fcfef36f2773ff2bcd",
package/engine/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.1
1
+ 0.7.2
@@ -1,5 +1,5 @@
1
1
  {
2
- "argentVersion": "0.7.1",
2
+ "argentVersion": "0.7.2",
3
3
  "principle": "宿主无关:宿主只依赖 `argent <verb>`;确定性逻辑在 CLI/MCP,不在提示词里。",
4
4
  "verbs": {
5
5
  "version": {
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ // 0.7.x **统一只读体检**:一条命令回答"这台机器/这次交付健康吗"。
3
+ // ① 串行终检(本地,无网)② 文档数字/版本一致(独立审计)③ 发布后体检(需网+ssh;`--with-net` 才跑)
4
+ // ⛔ 只读:不发布、不写任何文件(除子命令自身行为)。
5
+ import { spawnSync } from 'node:child_process'
6
+ import { mkdirSync, writeFileSync, readdirSync, readFileSync, existsSync } from 'node:fs'
7
+ import { join, dirname } from 'node:path'
8
+ import { fileURLToPath } from 'node:url'
9
+ const REPO = join(dirname(fileURLToPath(import.meta.url)), '..')
10
+ const WITH_NET = process.argv.includes('--with-net')
11
+ const TIMEOUT = WITH_NET ? 900000 : 600000
12
+
13
+ const PARTS = [
14
+ { name: '串行终检', cmd: ['node', ['scripts/final-check.mjs']], need: 'local' },
15
+ { name: '文档数字/版本一致', cmd: ['node', ['scripts/tests/docs-consistency.test.mjs']], need: 'local' },
16
+ { name: '证据可复算', cmd: ['node', ['scripts/tests/evidence-repro.test.mjs']], need: 'local' },
17
+ { name: '交接单最新', cmd: ['node', ['scripts/tests/handover-fresh.test.mjs']], need: 'local' },
18
+ { name: '判据总表最新', cmd: ['node', ['scripts/tests/criteria-fresh.test.mjs']], need: 'local' },
19
+ { name: '发布后体检', cmd: ['bash', ['scripts/release-argent.sh', '--post-release-check']], need: 'net' },
20
+ ]
21
+ const rows = []
22
+ for (const p of PARTS) {
23
+ if (p.need === 'net' && !WITH_NET) { rows.push({ name: p.name, state: 'skip', tail: '未执行(加 --with-net 才跑;需联网与服务器访问)' }); continue }
24
+ const r = spawnSync(p.cmd[0], p.cmd[1], { cwd: REPO, encoding: 'utf8', timeout: TIMEOUT, maxBuffer: 64 * 1024 * 1024 })
25
+ const out = `${r.stdout || ''}${r.stderr || ''}`
26
+ const tail = out.trim().split('\n').filter((l) => /✅|❌|通过|体检/.test(l)).slice(-1)[0]?.trim().slice(0, 80)
27
+ || out.trim().split('\n').slice(-1)[0]?.slice(0, 80) || ''
28
+ const timedOut = r.error && r.error.code === 'ETIMEDOUT'
29
+ rows.push({ name: p.name, state: timedOut ? 'timeout' : (r.status === 0 ? 'ok' : 'bad'), tail })
30
+ }
31
+ const bad = rows.filter((r) => r.state === 'bad' || r.state === 'timeout')
32
+ const skipped = rows.filter((r) => r.state === 'skip')
33
+ // ⚠️ `--json` 必须是**纯 JSON**(本仓契约:--json ⇒ 只输出机器可读;混人读表格会让调用方解析失败)
34
+ if (process.argv.includes('--json')) {
35
+ console.log(JSON.stringify({ ok: bad.length === 0, passed: rows.length - bad.length - skipped.length, total: rows.length - skipped.length, rows }, null, 2))
36
+ } else {
37
+ console.log('Argent 交付体检(只读):')
38
+ for (const r of rows) console.log(` ${r.state === 'ok' ? '✅' : r.state === 'bad' ? '❌' : '⚠'} ${r.name.padEnd(18)} ${r.tail}`)
39
+ console.log(`\n${bad.length ? '❌' : '✅'} 体检:${rows.length - bad.length - skipped.length}/${rows.length - skipped.length} 通过` +
40
+ (skipped.length ? `(⚠ ${skipped.length} 项未执行:${skipped.map((s) => s.name).join('、')};加 --with-net 可跑)` : ''))
41
+ }
42
+ // ── 历史留档(⛔ 默认只读:只有显式 --record 才写文件)──
43
+ const HIST = join(REPO, 'docs', 'audit-history')
44
+ if (process.argv.includes('--history')) {
45
+ if (!existsSync(HIST)) { console.log('(还没有体检历史:用 --record 落第一份)') }
46
+ else {
47
+ const files = readdirSync(HIST).filter((f) => f.endsWith('.json')).sort().slice(-10)
48
+ for (const f of files) {
49
+ try { const d = JSON.parse(readFileSync(join(HIST, f), 'utf8'))
50
+ console.log(` ${f.replace(/\.json$/, '')} ${d.ok ? '✅' : '❌'} ${d.passed}/${d.total} ${d.rows.map((r) => `${r.name}:${r.state}`).join(' ')}`)
51
+ } catch { console.log(` ${f} (解析失败)`) }
52
+ }
53
+ }
54
+ }
55
+ if (process.argv.includes('--record')) {
56
+ mkdirSync(HIST, { recursive: true })
57
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-')
58
+ const rec = { at: new Date().toISOString(), net: WITH_NET, ok: bad.length === 0, passed: rows.length - bad.length - skipped.length, total: rows.length - skipped.length, rows }
59
+ const f = join(HIST, `${stamp}${WITH_NET ? '-net' : '-local'}.json`)
60
+ writeFileSync(f, JSON.stringify(rec, null, 2) + '\n')
61
+ console.log(`已留档:${f.replace(REPO + '/', '')}`)
62
+ }
63
+ process.exit(bad.length ? 1 : 0)
@@ -2,7 +2,7 @@
2
2
  "_doc": "能力包版本锁(迭代3-⑨):由 scripts/capability_pack.py --stamp 生成。内容变了(sha 或 digest 变)而版本没变 ⇒ --stamp 直接拒绝(stamp_check)且 --validate 报错;版本**降**了同样拒绝(--allow-downgrade 才放行,且显著告警);提了版本再盖章。digest = 整包内容摘要,与 --emit-server-manifest#sha256 / --digest-tgz 同口径;批次收口前用只读的 --check-stamp 自检。",
3
3
  "capabilities": {
4
4
  "daily-report": {
5
- "version": "1.1.169",
5
+ "version": "1.1.170",
6
6
  "flows": [
7
7
  "mercadolibre.daily-report"
8
8
  ],
@@ -48,7 +48,7 @@
48
48
  "scripts/flow-auto-retry.py": "bf4cc963c9f766bd",
49
49
  "scripts/flow_billing.py": "70a1129ac75860a1",
50
50
  "scripts/flow_claim.py": "5ebe13d0d95f6f28",
51
- "scripts/flow_config.py": "1c1c1cb1d902f39b",
51
+ "scripts/flow_config.py": "ed3dd02a946086b4",
52
52
  "scripts/vertical-init.mjs": "b4f63d71152a84b0",
53
53
  "scripts/vertical-lint.mjs": "90d65215a2ac7940",
54
54
  "scripts/flow_registry.py": "53928b3fb7635156",
@@ -80,7 +80,7 @@
80
80
  "core/cli/argent.mjs": "9a8977324c238ca4",
81
81
  "core/mcp/server.mjs": "cb4d4a1150ee96cc",
82
82
  "core/mcp/http.mjs": "4388cdb18128844a",
83
- "core/contracts/argent.contracts.json": "dcfd30f862b85e67",
83
+ "core/contracts/argent.contracts.json": "ad0ebbcbfa06ab0d",
84
84
  "core/contracts/verbs.schema.json": "4cc63e9709caf1bb",
85
85
  "core/lib/argent-datadir.mjs": "7102aedf538c1e93",
86
86
  "core/lib/audit.mjs": "b57c233b1926e4ce",
@@ -112,7 +112,7 @@
112
112
  "core/lib/notify/webhook.mjs": "33708fec34641c8d",
113
113
  "core/lib/notify/feishu.mjs": "bdd494330f813546",
114
114
  "core/lib/notify/wecom.mjs": "789be0b3e28a151d",
115
- "VERSION": "902311c7bb38fa16",
115
+ "VERSION": "d0176718bd214ce8",
116
116
  "scripts/flow_case.py": "03870f8f4f316130",
117
117
  "scripts/ml_schema_check.py": "4e7435d0d9a4d999",
118
118
  "scripts/telemetry.py": "c0362ae50638f63b",
@@ -146,10 +146,10 @@
146
146
  "verticals/mercadolibre/flows.json": "6bc3d7198eb23c7c",
147
147
  "verticals/mercadolibre/config.json": "85e592d700383b9b"
148
148
  },
149
- "digest": "292dd4add89c74a4b31d918f8682b1b1dc80710959f42b5aea7e21efb2b03ed3"
149
+ "digest": "76ffa4ef56681569479d467ef50c1345cbdada2bcf68c5634883a2984e61afba"
150
150
  },
151
151
  "full": {
152
- "version": "1.3.176",
152
+ "version": "1.3.177",
153
153
  "flows": [
154
154
  "mercadolibre.full"
155
155
  ],
@@ -195,7 +195,7 @@
195
195
  "scripts/flow-auto-retry.py": "bf4cc963c9f766bd",
196
196
  "scripts/flow_billing.py": "70a1129ac75860a1",
197
197
  "scripts/flow_claim.py": "5ebe13d0d95f6f28",
198
- "scripts/flow_config.py": "1c1c1cb1d902f39b",
198
+ "scripts/flow_config.py": "ed3dd02a946086b4",
199
199
  "scripts/vertical-init.mjs": "b4f63d71152a84b0",
200
200
  "scripts/vertical-lint.mjs": "90d65215a2ac7940",
201
201
  "scripts/flow_registry.py": "53928b3fb7635156",
@@ -227,7 +227,7 @@
227
227
  "core/cli/argent.mjs": "9a8977324c238ca4",
228
228
  "core/mcp/server.mjs": "cb4d4a1150ee96cc",
229
229
  "core/mcp/http.mjs": "4388cdb18128844a",
230
- "core/contracts/argent.contracts.json": "dcfd30f862b85e67",
230
+ "core/contracts/argent.contracts.json": "ad0ebbcbfa06ab0d",
231
231
  "core/contracts/verbs.schema.json": "4cc63e9709caf1bb",
232
232
  "core/lib/argent-datadir.mjs": "7102aedf538c1e93",
233
233
  "core/lib/audit.mjs": "b57c233b1926e4ce",
@@ -259,7 +259,7 @@
259
259
  "core/lib/notify/webhook.mjs": "33708fec34641c8d",
260
260
  "core/lib/notify/feishu.mjs": "bdd494330f813546",
261
261
  "core/lib/notify/wecom.mjs": "789be0b3e28a151d",
262
- "VERSION": "902311c7bb38fa16",
262
+ "VERSION": "d0176718bd214ce8",
263
263
  "scripts/flow_case.py": "03870f8f4f316130",
264
264
  "scripts/ml_schema_check.py": "4e7435d0d9a4d999",
265
265
  "scripts/telemetry.py": "c0362ae50638f63b",
@@ -302,10 +302,10 @@
302
302
  "verticals/mercadolibre/flows.json": "6bc3d7198eb23c7c",
303
303
  "verticals/mercadolibre/config.json": "85e592d700383b9b"
304
304
  },
305
- "digest": "a4c6dcb23d89b077afaea7ea1137516dd6edf20f514d0768142caad13480f4cf"
305
+ "digest": "7a279161b3fa11119cb187436b0111451595d869c99dc09aee6f6c0e62f8228a"
306
306
  },
307
307
  "hr": {
308
- "version": "0.1.77",
308
+ "version": "0.1.78",
309
309
  "flows": [],
310
310
  "files": {
311
311
  "presets/argent-hr/agent.cordis.yml": "a4252f828176033f",
@@ -315,10 +315,10 @@
315
315
  "presets/argent-hr-office/format-version.txt": "6b86b273ff34fce1",
316
316
  "presets/argent-hr-office/preset.yml": "0b4d7304a412722a"
317
317
  },
318
- "digest": "f852304af6b4f589ca72f4a05f44813e615f97018441327adb0bfca661ec7783"
318
+ "digest": "613d5197cdd1dc3330e6597128678755583d9577045cb1045e78e09e6d98d779"
319
319
  },
320
320
  "invoice": {
321
- "version": "1.2.171",
321
+ "version": "1.2.172",
322
322
  "flows": [
323
323
  "mercadolibre.wenyao-invoice",
324
324
  "mercadolibre.xzh-invoice"
@@ -365,7 +365,7 @@
365
365
  "scripts/flow-auto-retry.py": "bf4cc963c9f766bd",
366
366
  "scripts/flow_billing.py": "70a1129ac75860a1",
367
367
  "scripts/flow_claim.py": "5ebe13d0d95f6f28",
368
- "scripts/flow_config.py": "1c1c1cb1d902f39b",
368
+ "scripts/flow_config.py": "ed3dd02a946086b4",
369
369
  "scripts/vertical-init.mjs": "b4f63d71152a84b0",
370
370
  "scripts/vertical-lint.mjs": "90d65215a2ac7940",
371
371
  "scripts/flow_registry.py": "53928b3fb7635156",
@@ -397,7 +397,7 @@
397
397
  "core/cli/argent.mjs": "9a8977324c238ca4",
398
398
  "core/mcp/server.mjs": "cb4d4a1150ee96cc",
399
399
  "core/mcp/http.mjs": "4388cdb18128844a",
400
- "core/contracts/argent.contracts.json": "dcfd30f862b85e67",
400
+ "core/contracts/argent.contracts.json": "ad0ebbcbfa06ab0d",
401
401
  "core/contracts/verbs.schema.json": "4cc63e9709caf1bb",
402
402
  "core/lib/argent-datadir.mjs": "7102aedf538c1e93",
403
403
  "core/lib/audit.mjs": "b57c233b1926e4ce",
@@ -429,7 +429,7 @@
429
429
  "core/lib/notify/webhook.mjs": "33708fec34641c8d",
430
430
  "core/lib/notify/feishu.mjs": "bdd494330f813546",
431
431
  "core/lib/notify/wecom.mjs": "789be0b3e28a151d",
432
- "VERSION": "902311c7bb38fa16",
432
+ "VERSION": "d0176718bd214ce8",
433
433
  "scripts/flow_case.py": "03870f8f4f316130",
434
434
  "scripts/ml_schema_check.py": "4e7435d0d9a4d999",
435
435
  "scripts/telemetry.py": "c0362ae50638f63b",
@@ -478,7 +478,7 @@
478
478
  "verticals/mercadolibre/flows.json": "6bc3d7198eb23c7c",
479
479
  "verticals/mercadolibre/config.json": "85e592d700383b9b"
480
480
  },
481
- "digest": "c342e58d59dd0a99b83e564414908c87291dd73e8794d376c2bbc4152bcea88a"
481
+ "digest": "e95efaecbc0695507718d0f3c00a81bd9479d4c31ef229b82b1f612571581762"
482
482
  }
483
483
  }
484
484
  }
@@ -1,16 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  // 0.7.0 **证据包生成器**:跑关键判据并把"命令 → 结果"写成 docs/Argent-0.7.0-交付证据.md(可随时复算)。
3
- import { execFileSync } from 'node:child_process'
4
- import { writeFileSync, readFileSync, existsSync } from 'node:fs'
3
+ import { execFileSync, spawnSync } from 'node:child_process'
4
+ import { writeFileSync, readFileSync, existsSync, readdirSync } from 'node:fs'
5
5
  import { join, dirname } from 'node:path'
6
6
  import { fileURLToPath } from 'node:url'
7
7
  const REPO = join(dirname(fileURLToPath(import.meta.url)), '..')
8
8
  const CLI = process.env.ARGENT_CLI_REPO || join(REPO, '..', 'argent-cli')
9
9
  const run = (cmd, args, cwd = REPO) => { try { return execFileSync(cmd, args, { cwd, encoding: 'utf8' }).trim() } catch (e) { return `(失败) ${String(e.stdout || e.message).trim().split('\n').slice(-1)[0]}` } }
10
+ // ⚠️ 命令**非零退出**时 execFileSync 抛错,但 stdout 往往正是我们要记录的 JSON ⇒ 单独一个容错解析器
11
+ const runJSON = (cmd, args, cwd = REPO) => { let out = ''; try { out = execFileSync(cmd, args, { cwd, encoding: 'utf8' }) } catch (e) { out = String(e.stdout || '') } return JSON.parse(out) }
10
12
  const head = (cwd) => run('git', ['log', '-1', '--format=%h %s', '--'], cwd).slice(0, 90)
11
- const final = JSON.parse(run('node', ['scripts/final-check.mjs', '--json']))
12
- const a = JSON.parse(run('node', ['scripts/s1-audit.mjs', '--assignments', '--json']))
13
- const w = JSON.parse(run('node', ['scripts/s1-audit.mjs', '--writes', '--json']))
13
+ const final = runJSON('node', ['scripts/final-check.mjs', '--json'])
14
+ const a = runJSON('node', ['scripts/s1-audit.mjs', '--assignments', '--json'])
15
+ const w = runJSON('node', ['scripts/s1-audit.mjs', '--writes', '--json'])
14
16
  const cliTests = run('npm', ['test', '--silent'], CLI).match(/^✔/gm)?.length ?? 0
15
17
  const packs = JSON.parse(readFileSync(join(REPO, 'scripts/flow-requirements.json'), 'utf8')).capabilities
16
18
  const packRows = Object.entries(packs).filter(([, v]) => v?.pack?.version).map(([k, v]) => `| ${k} | ${v.pack.version} |`)
@@ -19,23 +21,61 @@ const installers = ['install-argent.mjs', 'install.sh', 'install.ps1'].map((p) =
19
21
  const d = run('sh', ['-c', `curl -fsS "https://whyshu.com/dl/${p}?v=$(date +%s)" | shasum -a 256 | cut -c1-12`])
20
22
  return `| ${p} | ${h || '—'} | ${d || '—'} | ${h && h === d ? '✅ 一致' : '⚠️ 待核'} |`
21
23
  })
24
+ // ── 4.5 发布后体检(**默认不联网**;`--with-net` 才跑:dl 字节 → 清单双端 → registry 可见性)──
25
+ const WITH_NET = process.argv.includes('--with-net')
26
+ const postRows = (() => {
27
+ if (!WITH_NET) return ['> 未执行(默认不联网,保持可离线复算)。要复算:`bash scripts/release-argent.sh --post-release-check`。']
28
+ const r = spawnSync('bash', ['scripts/release-argent.sh', '--post-release-check'], { cwd: REPO, encoding: 'utf8', timeout: 300000 })
29
+ const txt = `${r.stdout || ''}${r.stderr || ''}`
30
+ const keep = txt.split('\n').filter((l) => /══|✅|❌|⚠/.test(l)).map((l) => ' ' + l.trim()).slice(0, 16)
31
+ return [`- 退出码:**${r.status}**(0 = 三层全部落地)`, '', '```', ...keep, '```']
32
+ })()
33
+
34
+ // ── 4.6 一键体检(`audit-all`:终检 + 文档审计 [+ 发布后体检])──
35
+ const audit = (() => {
36
+ const args = ['scripts/audit-all.mjs', '--json'].concat(WITH_NET ? ['--with-net'] : [])
37
+ const r = spawnSync('node', args, { cwd: REPO, encoding: 'utf8', timeout: 900000, maxBuffer: 64 * 1024 * 1024 })
38
+ try { return JSON.parse(r.stdout) } catch { return { ok: false, rows: [{ name: 'audit-all', state: 'bad', tail: '输出无法解析' }] } }
39
+ })()
40
+ const auditRows = audit.rows.map((r) => `| ${r.state === 'ok' ? '✅' : r.state === 'bad' ? '❌' : '⚠'} ${r.name} | ${r.state} | ${String(r.tail).replace(/\|/g, '\\|').slice(0, 76)} |`)
41
+
42
+ // ── 4.7 最近一次体检留档(读 docs/audit-history/ 最新一份;⛔ 不存在就如实写"无留档")──
43
+ const auditRecent = (() => {
44
+ const dir = join(REPO, 'docs', 'audit-history')
45
+ if (!existsSync(dir)) return ['> 无留档(用 `node scripts/audit-all.mjs --with-net --record` 落一份)']
46
+ const files = readdirSync(dir).filter((f) => f.endsWith('.json')).sort()
47
+ if (!files.length) return ['> 无留档']
48
+ const last = files[files.length - 1]
49
+ const d = JSON.parse(readFileSync(join(dir, last), 'utf8'))
50
+ return [
51
+ `最近一次:**${d.at}**(${d.net ? '含联网档' : '本地档'})⇒ **${d.ok ? '✅ 全部通过' : '❌ 有未通过项'}**(${d.passed}/${d.total})`,
52
+ '', '| 项 | 状态 | 末行 |', '|---|---|---|',
53
+ ...d.rows.map((r) => `| ${r.state === 'ok' ? '✅' : r.state === 'bad' ? '❌' : '⚠'} ${r.name} | ${r.state} | ${String(r.tail).replace(/\|/g, '\\|').slice(0, 70)} |`),
54
+ '', `复算:\`node scripts/audit-all.mjs --history\`(回看最近 10 次)`,
55
+ ]
56
+ })()
57
+
22
58
  const L = [
23
59
  '# Argent 0.7.0 交付证据(可复算)', '',
24
60
  `生成时间:${new Date().toISOString()} 生成器:\`node scripts/collect-evidence.mjs\``, '',
25
61
  '> 本文件由脚本**重新生成**:每条结论都对应一条命令,随时可复算(⛔ 不是人工誊写)。', '',
26
- '## 1. 串行终检(唯一入口)', '', '```', ...final.rows.map((r) => `${r.ok ? '✅' : '❌'} ${r.name.padEnd(22)} ${r.tail}`), '```', '',
62
+ '## 1. 串行终检(唯一入口)', '', '复算:`node scripts/final-check.mjs`(`--list` 列项、`--json` 结构化)', '', '```', ...final.rows.map((r) => `${r.ok ? '✅' : '❌'} ${r.name.padEnd(22)} ${r.tail}`), '```', '',
27
63
  `结论:**${final.rows.filter((r) => r.ok).length}/${final.rows.length} 通过**`, '',
28
- '## 2. W8/S1 双口径(Argent 数据目录写死路径)', '',
64
+ '## 2. W8/S1 双口径(Argent 数据目录写死路径)', '', '复算:`node scripts/s1-audit.mjs --assignments --json` 与 `--writes --json`', '',
29
65
  `- 赋值行残留:**${a.argentDataDir}** 处(dsh 自身 home ${a.hostOwnedDsh} 处不判红)`,
30
66
  `- 非赋值写入残留:**${w.total}** 处(白名单 2 处已注明理由)`, '',
31
- '## 3. 夹具', '',
67
+ '## 3. 夹具', '', '复算:新仓 `npm test`;本仓见终检各行(§4.6 给出汇总)', '',
32
68
  `- 新仓(argent-cli):**${cliTests}** 条通过`, `- 本仓(argent-dsh):见终检各行`, '',
33
- '## 4. 发布物 = 提交(三件安装器逐件对账,含 cache-bust)', '',
69
+ '## 4. 发布物 = 提交(三件安装器逐件对账,含 cache-bust)', '', '复算:`git show HEAD:<文件> | shasum -a 256` 与 `curl -fsS "https://whyshu.com/dl/<文件>?v=$(date +%s)" | shasum -a 256`', '',
34
70
  '| 安装器 | HEAD sha256 | dl 取回 sha256 | 判定 |', '|---|---|---|---|', ...installers, '',
35
- '## 5. 能力包版本(仓库侧;线上发布需发布窗口)', '', '| 能力 | 版本 |', '|---|---|', ...packRows, '',
36
- '## 6. 提交', '',
71
+ '## 5. 能力包版本(仓库侧;线上发布需发布窗口)', '', '复算:`python3 scripts/capability_pack.py --list`(摘要用 `--emit-server-manifest`)', '', '| 能力 | 版本 |', '|---|---|', ...packRows, '',
72
+ '## 6. 提交', '', '复算:`git log -1 --format=%h\\ %s`(各自仓库)', '',
37
73
  `- argent-dsh:\`${head(REPO)}\``,
38
74
  `- argent-cli:\`${existsSync(CLI) ? head(CLI) : '(未找到本机克隆)'}\``, '',
75
+ '## 4.5 发布后体检(dl 字节 / 服务器在服务的清单 / registry 可见性)', '', '复算:`bash scripts/release-argent.sh --post-release-check`(联网 + ssh)', '',
76
+ '## 4.6 一键体检(`node scripts/audit-all.mjs`)', '',
77
+ '## 4.7 最近一次体检留档(`docs/audit-history/`)', '', ...auditRecent, '', `结论:**${audit.ok ? '全部通过' : '有未通过项'}**(联网项${WITH_NET ? '已跑' : '未执行'})`, '', '| 项 | 状态 | 末行 |', '|---|---|---|', ...auditRows, '',
78
+ ...postRows, '',
39
79
  ]
40
80
  const out = join(REPO, 'docs/Argent-0.7.0-交付证据.md')
41
81
  // ⚠️ 保留**手写/追加**区(`<!-- manual:start -->` 之后):本脚本只重写自动部分,
@@ -47,4 +87,4 @@ try {
47
87
  if (i >= 0) manual = prev.slice(i)
48
88
  } catch { /* 首次生成 */ }
49
89
  writeFileSync(out, L.join('\n') + (manual ? '\n' + manual : ''))
50
- console.log(`✅ 已写 ${out}(终检 ${final.rows.filter((r) => r.ok).length}/${final.rows.length},新仓夹具 ${cliTests},S1 双口径 ${a.argentDataDir}/${w.total})`)
90
+ console.log(`✅ 已写 ${out}(发布后体检 ${WITH_NET ? '已跑' : '未跑'};终检 ${final.rows.filter((r) => r.ok).length}/${final.rows.length},新仓夹具 ${cliTests},S1 双口径 ${a.argentDataDir}/${w.total})`)
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ // 0.7.x **验收判据总表**生成器:把"验什么、在哪跑、判据是什么"汇总成一页。
3
+ // ⛔ 只读 + **确定性**:内容全部从**判据源**派生(final-check 的 CHECKS、audit-all 的 PARTS、演练脚本的 ok 行),
4
+ // ⛔ 不写时间戳/提交哈希 ⇒ 可用"重新生成是否字节相同"审计漂移。
5
+ import { readFileSync, writeFileSync } from 'node:fs'
6
+ import { execFileSync } from 'node:child_process'
7
+ import { join, dirname } from 'node:path'
8
+ import { fileURLToPath } from 'node:url'
9
+ const REPO = join(dirname(fileURLToPath(import.meta.url)), '..')
10
+ const out = process.argv[2] || join(REPO, 'docs/Argent-0.7.0-验收判据总表.md')
11
+
12
+ // ① final-check:名字取自 --list(权威),命令取自已定义处(含独立代码块则标注)
13
+ const fcNames = execFileSync('node', ['scripts/final-check.mjs', '--list'], { cwd: REPO, encoding: 'utf8' }).trim().split('\n').filter(Boolean)
14
+ const fcSrc = readFileSync(join(REPO, 'scripts/final-check.mjs'), 'utf8')
15
+ const fcRows = fcNames.map((n) => {
16
+ const m = fcSrc.match(new RegExp(`\\['${n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}'\\s*,\\s*'([^']+)'\\s*,\\s*\\[([^\\]]*)\\]`))
17
+ const cmd = m ? `${m[1]} ${m[2].split(',').map((s) => s.trim().replace(/^'|'$/g, '')).join(' ')}` : '(独立代码块,见 scripts/final-check.mjs)'
18
+ return `| ${n} | \`${cmd}\` |`
19
+ })
20
+
21
+ // ② audit-all:从 PARTS 派生
22
+ const aaSrc = readFileSync(join(REPO, 'scripts/audit-all.mjs'), 'utf8')
23
+ // PARTS 的 cmd 是嵌套数组(['node', ['a.mjs']])⇒ 取出**所有引号内的字符串**按序拼接,⛔ 别用括号拼
24
+ const aaRows = [...aaSrc.matchAll(/\{ name: '([^']+)', cmd: \[(.+?)\], need:/gs)].map((m) => {
25
+ const parts = [...m[2].matchAll(/'([^']+)'/g)].map((x) => x[1])
26
+ return `| ${m[1]} | \`${parts.join(' ')}\` |`
27
+ })
28
+
29
+ // ③ 演练脚本:从 ok() 的第二个参数(判据描述)派生
30
+ const drill = (file, title) => {
31
+ const s = readFileSync(join(REPO, file), 'utf8')
32
+ const rows = [...s.matchAll(/ok "[^"]*"\s+"([^"]+)"/g)].map((m) => `| ${m[1]} |`)
33
+ return { title, rows }
34
+ }
35
+ const d1 = drill('scripts/drill-clean-room.sh', `\`bash scripts/drill-clean-room.sh\`(本机/任意机器,需 registry;判据 ${0} 步全过)`)
36
+ const d2 = drill('scripts/drill-handover.sh', '`bash scripts/drill-handover.sh`(接手人视角;判据 7 项全过)')
37
+
38
+ const L = [
39
+ '# Argent 0.7.x 验收判据总表', '',
40
+ '> 本页由 `node scripts/criteria-table.mjs` **生成**(内容全部派生自判据源:`final-check` 的 CHECKS、',
41
+ '> `audit-all` 的 PARTS、演练脚本的 `ok` 行)⇒ 判据改了本页必须重生成(由 `criteria-fresh` 审计保证)。', '',
42
+ `## 1. 串行终检(唯一入口:\`node scripts/final-check.mjs\`;当前 ${fcNames.length} 项)`, '',
43
+ '| 判据 | 命令 |', '|---|---|', ...fcRows, '',
44
+ `## 2. 一键体检(\`node scripts/audit-all.mjs --with-net\`;当前 ${aaSrc.match(/name: '/g)?.length ?? 0} 项)`, '',
45
+ '| 项 | 命令 |', '|---|---|', ...aaRows, '',
46
+ `## 3. 从零复现演练(${d1.rows.length} 步;已发布版本 + 临时数据目录)`, '',
47
+ '| 判据 |', '|---|', ...d1.rows, '',
48
+ `## 4. 接手人通读演练(${d2.rows.length} 项)`, '',
49
+ '| 判据 |', '|---|', ...d2.rows, '',
50
+ '## 5. 环境与安全纪律(每条都有实测依据)', '',
51
+ '- drill/audit 一律**只碰临时目录**(`ARGENT_DATA_DIR=$(mktemp -d)`);⛔ 不读不写真实 `~/.argent`/`~/.dsh`',
52
+ '- `--json` ⇒ **只输出机器可读**;exit 码契约 **0 通过 / 1 红 / 2 证据不足**',
53
+ '- 发布后体检:`bash scripts/release-argent.sh --post-release-check`(dl 字节 / 服务器在服务的清单 / registry 可见性)',
54
+ '- 凭据纪律:令牌只由用户在自己终端输入(⛔ 不进对话、不进仓库、不进日志)',
55
+ ]
56
+ writeFileSync(out, L.join('\n'))
57
+ console.log(`✅ 已写 ${out}(终检 ${fcNames.length} 项 / 体检 ${aaSrc.match(/name: '/g)?.length ?? 0} 项 / 复现 ${d1.rows.length} 步 / 通读 ${d2.rows.length} 项)`)
@@ -28,6 +28,16 @@ ok "$($BIN events list --profile u1 --json 2>&1 | grep -q '"count"' && echo 1 ||
28
28
  printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize"}' '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' > "$D/req.jsonl"
29
29
  MC=$($BIN mcp < "$D/req.jsonl" 2>/dev/null | tail -1)
30
30
  ok "$(echo "$MC" | python3 -c 'import json,sys;d=json.load(sys.stdin);sys.exit(0 if len(d.get("result",{}).get("tools",[]))>=5 else 1)' 2>/dev/null && echo 1 || echo 0)" "MCP:initialize + tools/list ≥5 个工具"
31
+ # ── 适配器面(0.7.x):技能真源出口 + 宿主适配体检 ────────────────────
32
+ HOST="$D/host-skills"; mkdir -p "$HOST"
33
+ $BIN skill sync --profile u1 --dir "$HOST" >/dev/null 2>&1
34
+ _n_skills=$(ls "$HOST" 2>/dev/null | wc -l | tr -d ' ')
35
+ ok "$([ "${_n_skills:-0}" -ge 10 ] && echo 1 || echo 0)" "技能真源出口:同步到宿主技能目录 ${_n_skills} 个"
36
+ _pc=$($BIN provider check 2>&1); _pcrc=$?
37
+ _okpc=0
38
+ { [ "$_pcrc" -eq 0 ] || [ "$_pcrc" -eq 2 ]; } && echo "$_pc" | grep -q 'engine' && _okpc=1
39
+ ok "$_okpc" "宿主适配体检:provider check 给出结论(exit=${_pcrc};2=证据不足,符合契约)"
40
+
31
41
  # ── 多实例(0.7.0):默认实例 + 缺项回退 ──────────────────────────────
32
42
  D2=$(mktemp -d); export ARGENT_DATA_DIR="$D2"
33
43
  $BIN init >/dev/null 2>&1
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env bash
2
+ # 0.7.x **接手人通读演练**:逐条真跑「交接单」上的命令,给出 7 条判据。
3
+ # ⛔ 只读(除 npm/npx 缓存与临时目录):不发布、不改服务器、不碰客户机。
4
+ # 用法:bash scripts/drill-handover.sh [--fast] # --fast = 跳过第 ⑥ 项(13 步从零复现,最慢)
5
+ set -uo pipefail
6
+ REPO="$(cd "$(dirname "$0")/.." && pwd)"
7
+ FAST=0; [ "${1:-}" = "--fast" ] && FAST=1
8
+ REG="https://registry.npmjs.org"
9
+ PASS=0; FAIL=0
10
+ ok(){ if [ "$1" = "1" ]; then PASS=$((PASS+1)); printf ' ✅ %s\n' "$2"; else FAIL=$((FAIL+1)); printf ' ❌ %s\n' "$2"; fi }
11
+ ENGINE="$(tr -d '\n' < "$REPO/VERSION")"
12
+ CLI="$(python3 -c "import json;print(json.load(open('$REPO/../argent-cli/package.json'))['version'])" 2>/dev/null || echo '?')"
13
+ echo "接手人通读(引擎 ${ENGINE} | CLI ${CLI})"
14
+
15
+ V=$(npx -y --registry="$REG" "@whyshu/argent-cli@$CLI" --version 2>/dev/null | head -1 | tr -d '[:space:]')
16
+ ok "$([ "$V" = "$CLI" ] && echo 1 || echo 0)" "① CLI 可从 registry 取回并报版本:${V:-(取不到)}"
17
+
18
+ G=$(npm view @whyshu/argent-engine version --registry="$REG" 2>/dev/null | tail -1 | tr -d '[:space:]')
19
+ ok "$([ "$G" = "$ENGINE" ] && echo 1 || echo 0)" "② 引擎版本与仓库一致:registry=${G:-?} 仓库=${ENGINE}"
20
+
21
+ H=$(git -C "$REPO" show HEAD:argent-setup.md | shasum -a 256 | cut -d' ' -f1)
22
+ D=""; for i in 1 2; do D=$(curl -fsS "https://whyshu.com/dl/argent-setup.md?v=$(date +%s)" 2>/dev/null | shasum -a 256 | cut -d' ' -f1); [ "$H" = "$D" ] && break; sleep 2; done
23
+ ok "$([ -n "$D" ] && [ "$H" = "$D" ] && echo 1 || echo 0)" "③ 安装指南 HTTP 取回 == HEAD($(echo "$H" | cut -c1-16)…)"
24
+
25
+ bash "$REPO/scripts/release-argent.sh" --check-dl >/tmp/handover-dl.log 2>&1
26
+ ok "$([ $? -eq 0 ] && echo 1 || echo 0)" "④ 安装器/能力包对账 --check-dl(exit 0;✗ $(grep -oE '对账:✗ [0-9]+' /tmp/handover-dl.log | tail -1 | grep -oE '[0-9]+$'))"
27
+
28
+ python3 "$REPO/scripts/capability_pack.py" --validate >/dev/null 2>&1
29
+ ok "$([ $? -eq 0 ] && echo 1 || echo 0)" "⑤ 能力包自洽(版本/文件/流程;摘要口径见 --check-dl)"
30
+
31
+ if [ "$FAST" = "1" ]; then printf ' ⚠ ⑥ 从零复现:--fast 跳过\n'
32
+ else
33
+ R=$(ARGENT_BIN="npx -y --registry=$REG @whyshu/argent-cli@$CLI" bash "$REPO/scripts/drill-clean-room.sh" 2>&1 | tail -1)
34
+ ok "$(echo "$R" | grep -q '13 通过 / 0 失败' && echo 1 || echo 0)" "⑥ 从零复现 13 步:$(echo "$R" | sed 's/^✅ 从零复现://')"
35
+ fi
36
+
37
+ # ⚠️ 不写死项数(体检项会增减)⇒ 读 `--json` 的 ok/passed/total(脚本自身也踩过"写死 5/5"的漂移)
38
+ AJ=$(node "$REPO/scripts/audit-all.mjs" --with-net --json 2>/dev/null | tail -n +1)
39
+ AOK=$(echo "$AJ" | python3 -c "import json,sys;d=json.load(sys.stdin);print('1' if d.get('ok') else '0')" 2>/dev/null || echo 0)
40
+ AN=$(echo "$AJ" | python3 -c "import json,sys;d=json.load(sys.stdin);print('%d/%d' % (d.get('passed',0), d.get('total',0)))" 2>/dev/null || echo '?')
41
+ ok "$AOK" "⑦ 一键体检(读结构化结论,⛔ 不写死项数):${AN} 通过"
42
+
43
+ printf '\n%s 接手人通读:%d 通过 / %d 失败\n' "$([ "$FAIL" = 0 ] && echo ✅ || echo ❌)" "$PASS" "$FAIL"
44
+ exit $([ "$FAIL" = 0 ] && echo 0 || echo 1)
@@ -17,12 +17,18 @@ const CHECKS = [
17
17
  ['安装指南命令核对', 'node', ['scripts/tests/setup-guide.test.mjs']],
18
18
  ['本地引用完整性', 'node', ['scripts/tests/refs-integrity.test.mjs']],
19
19
  ['文档/脚本→CLI 命令核对', 'node', ['scripts/tests/cli-command-refs.test.mjs']],
20
+ ['能力包清单三方一致', 'node', ['scripts/tests/manifest-consistency.test.mjs']],
21
+ ['Node 内建符号导入完整', 'node', ['scripts/tests/import-integrity.test.mjs']],
22
+ ['shell 变量引用规范', 'node', ['scripts/tests/sh-var-quoting.test.mjs']],
20
23
  ['README 安装入口核对', 'node', ['scripts/tests/readme-install-path.test.mjs']],
21
24
 
22
25
  ['命名空间/业务词 lint', 'node', ['scripts/vertical-lint.mjs']],
23
26
  ['能力包盖章自检', 'python3', ['scripts/capability_pack.py', '--check-stamp']],
24
27
  ['能力包 validate', 'python3', ['scripts/capability_pack.py', '--validate']],
25
28
  ]
29
+ // ⚠️ 最后一个检查(新仓发布前自检)是**独立代码块**(见下),--list 必须把它算进去,否则文档核对会差 1
30
+ if (process.argv.includes('--list')) { for (const [name] of CHECKS) console.log(name); if (existsSync(CLI)) console.log('新仓发布前自检'); process.exit(0) }
31
+
26
32
  const rows = []
27
33
  for (const [name, cmd, args] of CHECKS) {
28
34
  const t0 = Date.now(); let ok = false, out = ''
@@ -148,7 +148,7 @@
148
148
  },
149
149
  "minPlan": "enterprise",
150
150
  "pack": {
151
- "version": "1.2.171",
151
+ "version": "1.2.172",
152
152
  "scripts": [
153
153
  "scripts/wenyao-invoice-writeback.mjs",
154
154
  "scripts/invoice_lip_runner.py",
@@ -193,7 +193,8 @@
193
193
  "0.7.0 W8/S1:路径统一(22 个脚本改走唯一判据)触及本包成员 ⇒ 按纪律提版重盖章。",
194
194
  "0.6.1:引擎版本(VERSION)随包内容 ⇒ 按纪律提版重发。",
195
195
  "0.7.0:修正脚本里指向不存在命令的文案(init-ml / install-license / self-sign-license / vertical-lint)⇒ 包内容变,按纪律提版。",
196
- "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。"
196
+ "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。",
197
+ "0.7.2:修 `flow_config.py --list --json`(忽略 --json 的契约违背)⇒ 包内容变,按纪律提版。"
197
198
  ],
198
199
  "hostAssets": {
199
200
  "scheduler": {
@@ -250,7 +251,7 @@
250
251
  ],
251
252
  "minPlan": "enterprise",
252
253
  "pack": {
253
- "version": "1.3.176",
254
+ "version": "1.3.177",
254
255
  "scripts": [
255
256
  "scripts/poll-fulfillment.sh",
256
257
  "scripts/orchestrator.py",
@@ -292,7 +293,8 @@
292
293
  "0.7.0 W8/S1:路径统一(22 个脚本改走唯一判据)触及本包成员 ⇒ 按纪律提版重盖章。",
293
294
  "0.6.1:引擎版本(VERSION)随包内容 ⇒ 按纪律提版重发。",
294
295
  "0.7.0:修正脚本里指向不存在命令的文案(init-ml / install-license / self-sign-license / vertical-lint)⇒ 包内容变,按纪律提版。",
295
- "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。"
296
+ "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。",
297
+ "0.7.2:修 `flow_config.py --list --json`(忽略 --json 的契约违背)⇒ 包内容变,按纪律提版。"
296
298
  ],
297
299
  "hostAssets": {
298
300
  "scheduler": {
@@ -329,7 +331,7 @@
329
331
  "minPlan": "pro",
330
332
  "_minPlanNote": "**2026-10-09(变现分层落地)**:`enterprise` → **`pro`**。判据 = 用户已确认的产品模型「分界线 = **价值更高 / 风险更高 ⇒ 企业版**」:日报是**只读**能力(官方 API 只读查询 + 生成推送,⛔ 不写客户任何系统、⛔ 不动浏览器),与 `full`(箱唛/写操作)、`invoice`(发票/门户写操作)不同档 ⇒ 归 **Pro**。⛔ 只改**档位下限**,⛔ 不改流程行为、⛔ 不改价格口径;`daily-report` 的能力包版本随引擎前进(见 pack.version)。已装机器**不因本改动被卸载/停用**(缩权只影响后续下发,见 entitlements.plans._why 与 docs 策划案 §4.4)。",
331
333
  "pack": {
332
- "version": "1.1.169",
334
+ "version": "1.1.170",
333
335
  "scripts": [
334
336
  "scripts/daily-report.mjs",
335
337
  "scripts/daily-report.sh",
@@ -365,7 +367,8 @@
365
367
  "0.7.0 W8/S1:路径统一(22 个脚本改走唯一判据)触及本包成员 ⇒ 按纪律提版重盖章。",
366
368
  "0.6.1:引擎版本(VERSION)随包内容 ⇒ 按纪律提版重发。",
367
369
  "0.7.0:修正脚本里指向不存在命令的文案(init-ml / install-license / self-sign-license / vertical-lint)⇒ 包内容变,按纪律提版。",
368
- "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。"
370
+ "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。",
371
+ "0.7.2:修 `flow_config.py --list --json`(忽略 --json 的契约违背)⇒ 包内容变,按纪律提版。"
369
372
  ],
370
373
  "hostAssets": {
371
374
  "scheduler": {
@@ -430,7 +433,7 @@
430
433
  }
431
434
  ]
432
435
  },
433
- "version": "0.1.77",
436
+ "version": "0.1.78",
434
437
  "_note": [
435
438
  "能力包版本(语义化):改了该能力的流程/提示词/脚本/技能 ⇒ 必须提版本并重新打包 |**0.1.40(2026-10-04,角色退役·墓碑)**:包内容变更(`presets/argent-hr-office/agent.cordis.yml` 的 persona 改成退役告知、`preset.yml` 的 name/description 标注「已退役」)—— 角色 `hr-office` 已于 2026-10-04 退役(方案 §3.3.1:gateway.json 条目与 install-dsh.sh 安装期入口已撤),**本能力包保留**(装机内容不变、仍可安装;入口 preset 作为 web 老会话的墓碑保留)⇒ 版本随内容前进。|**0.1.41(2026-10-09,版本随内容前进)**:`0.1.40` **发布之后其字节被原地覆盖过一次**(服务端清单 `sha256` `15cf4f43…` → `058ccead…` 而 `version` 原地不动,见 whyshu-svr `docs/ops/deploy-fe02231-packs-align.md`)⇒ 同一个 URL 下的内容变过 ⇒ \"内容变 ⇒ 版本变\"这条不变式被破坏,客户机无法靠版本号判断自己拿到的是哪一份。本次**只提版本、包内容一字未改**(重盖章后内容摘要与 0.1.40 时逐字相同)⇒ `hr-0.1.41.tgz` 是该内容**首次以某个版本号**对外发布。⛔ 未改共用引擎、未新增运行期文件,故 `pack.engine` 清单不变。|**0.1.42(2026-10-09,配置地基:配置目录 + 通用读取器 —— hr 包内容随之改变)**:本能力**无 flow**,按 `pack.engine` 的分发规矩**不背共用引擎**(`files` 仍只有 `presets/argent-hr-office/**` 三件,`integrity` 逐字节未变)。但**每个包的 tgz 里都带一份注册表投影**(`scripts/flow-requirements.json` 的引擎级段),而本批改了它的 `pack.engine`(新增 `core/lib/config-catalog.mjs` 与 5 个 `configs/*.json`)⇒ **hr 的包字节变了** ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式**必须一起提版本**,否则会出现\"同一个版本号 0.1.41 对应两份不同字节\"(这正是 `release-argent.sh --check-dl` 的能力包档当场抓到的形态:`✗ hr: 版本相同(0.1.41)但内容摘要不同 —— 仓库 ad3599c5 vs 线上 09e1fef9`;提版后该条转为 ⚠「发布在途」,不再判红)。⛔ 本轮 hr 的**能力内容一字未改**。|**0.1.44(2026-10-09,预约失败判定链 + 口径统一)**:共用引擎 `scripts/flow_failure.py` 变更(新增 `canonical_reason()` 与 `--case` —— 打印某 case 的**规范失败原因**:优先读台账 `failed.reason`,老台账回落到 `error` 去身份前缀;给角色/运维一个**逐字照抄**的取数口,杜绝\"表备注写 A、账本写 B\")⇒ 所有能力包的注册表投影同批变化。本能力自身:⛔ 本能力内容一字未改;但 `flow_failure.py` 在 `pack.engine` 内,且包内 `scripts/flow-requirements.json` 投影**含 `failureClasses`**(本次新增的两条 needsHuman 判据就在其中)⇒ **包字节变了**,按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式必须一起提版本。(⚠️ **盖章说明**:本版内容在同一工作树里经过**多轮收口**(先落实现,再按 vertical-lint 的引擎业务词约束改注册表文案、再收口文案)⇒ 以**最终内容**盖章;版本号从未发布过,不存在\"内容变了版本没动\"的对外窗口。)|**0.1.45(2026-10-09,三处生产实测收口:票不许静默消失 · 失败必写原因+动作 · 发票流程 Rule R)**:共用引擎变更 ⇒ 四个能力包一起提版本并重盖章。① `scripts/flow_triage.py`:判定改为**有效末条事件**(`INFO_EVENTS = phase/wake/policy_apply/policy_new` 回退到最近一条状态性事件;`failed_ack` = 有意不动且**不参与回退**)、`blocked` 从「静默 pass」改为可见的 `needs_human`,并加**循环后对账兜底**(任何未归桶的 case ⇒ `needs_human`,kind=unclassified)——修的是客户机生产实测 P0(某发票票):其尾部是 `blocked → phase` ⇒ 分诊摘要全 0、运营勾了放行也不派发、且**不在「需人工」里**(静默卡死)。② `scripts/flow_failure.py`:新增运营文案**唯一来源** `ops_message()`(`结论:<业务类|系统类|我方缺陷类>|<原因>|动作:…`,≤300 字)与 `release_hint()`(放行位/提示的**唯一实现**:变体与**顶层** pick 都认;`orchestrator._ops_action_hint` 改为委托它);③ **新增** `scripts/invoice_fail_closeout.py`(属**发票能力专属脚本** `capabilities.invoice.pack.scripts`,⛔ 不进共用引擎 —— 它只写发票那一列):失败/成功收口 —— 把**同一串**写进表「发票错误信息」与台账(`detail` 逐字相同、`error` 放规范原因),取不到原因 ⇒ **exit 2 拒绝执行**,代码级异常归「我方缺陷类」且**不回原文**,成功 ⇒ `--clear-error` 清空;④ `scripts/flow_return_to_ops.py`:缺口回填文案改用同一来源(表字段 == 台账 `detail`);④b `scripts/flow_config.py`:归一化的 `guards` 增**标量透传**(`writer`=写手路径、`errorField`=失败原因列 —— 不透出就只能各自把路径/列名写死,那正是「判据第二份」与业务词泄漏进引擎的来源);⑤ 业务线声明(`verticals/<id>/flows.json`):两个发票流程新增 `pick.release` / `pick.releaseReDispatch`(放行位 = **各自的门控列**「发票就绪」;上限 3 / 冷却 30)与 `guards.errorField`。本能力自身:⛔ 内容一字未改(无 flow ⇒ 不背共用引擎);但包内注册表投影含 `failureClasses`/`pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本。|**0.1.46(2026-10-09,配置「生效来源」可见化 + 冲突告警,批 1)**:本能力无 flow ⇒ **不背共用引擎**(`files` 仍只有 3 件 preset,逐字节未变);但包内注册表投影含 `pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本(同 `0.1.42` 先例)。本能力内容一字未改。共用引擎 `core/lib/config-catalog.mjs` 新增**纯函数** `resolveEffective()`(按规范链算「谁赢了 / 谁被压住」)、密钥脱敏 `redactSecret()` 与读取器 `effectiveOf()/levelsOf()`,并新增只读 CLI `scripts/config-explain.mjs`(`--key/--all/--list/--json`)⇒ 能力包内容变化,按纪律提版本并重盖章。⛔ **零行为变化**:读取器的取值路径(`resolveOne`)与任何 `todayChain` 一个字节都没改,只是「如实展示」;同批回归 `scripts/tests/config-effective.test.mjs`(63 断言)+ 端点 / 页面两条既有回归扩测。|**0.1.47(2026-10-09,同批收口:脱敏闸幂等)**:只读 CLI `scripts/config-explain.mjs` 的\"再脱敏\"兜底闸原先**无条件**执行 ⇒ `❰已设置(长度N)❱` 里的 N 变成**占位串自己的长度**(恒 11,实测),而用户正是拿它比对\"密钥换没换\" ⇒ 已改为**幂等**(含被压住的那级)并补回归;引擎面同一份 CLI 变了 ⇒ 包内容变化,按纪律再提版本并重盖章。本能力自身内容一字未改。|**0.1.49(2026-10-10,A 批:按智能体安装清单 —— 客户从「智能体库」选一个装,只装它的东西)**:① **`pack.engine` 新增两项**:`agents/catalog.json`(L0 货架声明:agent → capability + flows 子集 + 角色 + 插件/技能/集成/凭据槽)与 `scripts/argent-agents.mjs`(声明解析/校验/清单构造;安装器与门禁**共用一份**判据)⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**,按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式一起提版本);② **共用引擎行为变更**(`install-argent.mjs` / `scripts/lib/preset-install.mjs` / `scripts/argent-upgrade.mjs`):新增 `--agent <id>[,<id>…]` / `--list-agents` / `--internal-roles` / `--capability remove <id>`(写前备份 + 审计);preset **行落盘集合**改为「按清单收窄」(`--agent` ⇒ 恒装 + 本智能体角色 + 已装集;默认 ⇒ 客户可见集 + 已装集;**内部角色默认不落**);升级器按 `<dshHome>/argent/agents.json` **重新施加**同一集合(否则一次升级就把收窄还原);**未给 `--agent` 时 CLI 契约与计划清单输出与改动前逐字一致**(差分回归钉住);③ 本能力自身:**新增活的 HR 角色** `presets/argent-hr/`(招聘支持 / 员工关系 / PPT 与文档产出 / 员工隐私严格保密)+ `pack.presets` 收它 ⇒ 本能力从「只有墓碑」变成「有入口」;设置页入口字段由 `hrOfficeRole`(hr-office) 改为 `hrRole`(argent-hr),旧角色改用 `hrOfficeTombstone` 字段如实报告(⛔ 墓碑不复活、⛔ 不当入口,仍随包落位供老会话 agentPreset 外键解析)。回归:`scripts/tests/agent-catalog.test.mjs`(110 断言,七条判据:只落本智能体 / 子集过滤 / 向后兼容差分 / 未知输入零写入 / remove 备份+审计 / 目录 schema / 内部角色默认不落)。|**0.1.50(2026-10-10,同批二次收口:宿主资产声明 + 门禁)**:同一工作树里第二次收口(先落 `--agent` 实现并盖章,再补 `capabilities.<c>.pack.hostAssets`(**宿主侧资产声明位**:定时器/登录自启/桌面项)与它的门禁 C12,并把 `scripts/argent-agents.mjs` 的清单/回执接上宿主资产)⇒ 引擎面文件内容变了,按「内容变 ⇒ 版本必变」纪律**再提一版**(先例同 1.3.104→1.3.105、`docs/Argent-智能体平台-设计.md` §8.3 第 3 条)。版本号 0.1.49 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**0.1.51(2026-10-10,同批三次收口:安装器用法文案 · 门禁登记 · 引擎面去业务词)**:同一工作树里第三次收口 —— ① `install-argent.mjs` 的**用法头注释**补上 `--agent` / `--list-agents` / `--internal-roles` / `--capability remove` 四个入口(内容变 ⇒ 引擎 sha 变);② `scripts/tests/is-direct-run.test.mjs` 的**唯一登记处**加入 `scripts/check-agent-catalog.mjs`(新增 CLI 必须登记,否则端到端判据覆盖不到它;测试文件不在包内,本条只为留痕);③ 本文件里本批新加的 `_note` 文案去掉业务词(`vertical-lint` 的 engine-words 档按**基线**只拦新增,⛔ 不抬基线 ⇒ 改写文案而不是改基线)⇒ 引擎面内容再变,按纪律**再提一版**。版本号 0.1.50 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**0.1.52(2026-10-10,仓容前置探测批 —— 注册表投影变化,hr 必须跟随提版)**:本批改了共用引擎面 `scripts/flow-requirements.json`(新增 `failureClasses.capacityFull`)、`scripts/flow_capacity*`/`ml_capacity_probe.py`、`flow_failure.py` 分类顺序、`configs/advanced.json`(`advanced.appointment.max_day` 默认 5)与编排器接入点 ⇒ **每个包的 tgz 里都带一份注册表投影**(含 `failureClasses`/`pack.engine`)⇒ hr 的包字节随之改变。本能力自身内容一字未改(`files` 仍只有两个 preset 目录)。⚠️ **教训**:本批曾按 `--describe hr`(只列 6 个 preset 文件)判定\"hr 不含 pack.engine ⇒ 内容没变\",漏掉了\"注册表投影在包内\"这一层 ⇒ 被 `release-argent.sh --check-dl` 当场抓成 `✗ hr: 版本相同(0.1.51)但内容摘要不同 ⇒ 同版本覆盖发布的形态`;按不变式提版后该条转为 ⚠「发布在途」。先例:0.1.42 / 0.1.44 / 0.1.46(均为\"改了引擎基表 ⇒ 无 flow 的包也提版本\")。|**0.1.55(2026-10-11,同批:引擎面新增 `scripts/lib/cdp_ports.py`)**:本能力**无 flow ⇒ 不背共用引擎**(`files` 仍只有两个 preset 目录,逐字节未变);但包内注册表投影含 `pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」提版本并重盖章(同 `0.1.42` / `0.1.52` 先例)。本能力内容一字未改。|**0.1.56(2026-10-12,Windows 安装路径三缺陷修复批)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:**「已装集」判据改为选择痕迹** `presets.selection.json#kept`(⛔ 不再读 `package.json#dsh.bundle.patch` —— pnpm 对 `file:` 依赖建的是指向货架的链,读到的永远是货架自带的 14 条 ⇒ 收窄被自己的安装步骤抹掉),新增 `installedSelectionIds()` / `materializeBundleDir()`(软链**实体化**后再改写,⛔ 不走链写进仓库)/ `checkPresetSelectionConsistency()`(patch 实体 == presets.json 行 == dsh.bundle.patch == 痕迹);② `install-argent.mjs`:新增**第 7c2 步收尾重施**(第 7 步 `pnpm add file:…` 会把 profile 副本换回货架 14 个 ⇒ 旧实现在 winpc 真机\"声称只落 7/14、装完却是 14\",7 个内部角色永久留下)、版本体检改**两个候选落点**(克隆目录 + 安装器自己那棵树 —— Windows 的 boot 克隆场景,此前永远退回内置列表 ⇒ 现役 `0.1.7-rc.2` 被报\"未验证\")、`profile-doctor` 与升级器子进程**显式传 `DSH_HOME`**(否则 `--dsh-home <临时>` 时改的是真实 `~/.dsh`)、完成提示**按平台**给启动/重启指引(Windows 不再打 bash 的 `DSH_HOME=… dsh web …`);③ `scripts/lib/dsh-versions.mjs`:内置基线补 `0.1.7-rc.2` + 新增 `verifiedListGaps()` **防漂移门禁**;④ `scripts/argent-upgrade.mjs`:同一判据 + 收尾重施。⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个包一起提版本并重盖章。本能力内容**一字未改**(无 flow ⇒ 不背共用引擎,仍因包内注册表投影而变)。回归:`scripts/tests/preset-landing-selection.test.mjs`(48 断言:全新机器恰 7 个客户可见角色 / 客户机的 7 再跑安装**仍 7**(垫片 pnpm 中途真把它放大过)/ 14 坏态收窄到 7 / 三处集合+痕迹不变量 / 软链不走链改写仓库 / 真 pnpm 的机制证据)、`scripts/tests/dsh-verified-list.test.mjs`(21 断言:lock 里已晋级版本必须全在列表内(构造缺项 ⇒ 红)、`candidate/` 不参与、列表唯一真源、boot 克隆场景真跑一次)。⛔ 本批**未发布**(发布留给交付方)。|**0.1.57(2026-10-12,升级路径角色落盘追修批:已装集唯一来源 + 内部角色不变式)**:本能力**无 flow ⇒ 不背共用引擎**(`files` 仍只有 preset 目录,逐字节未变);但包内注册表投影含 `pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本并重盖章(同 `0.1.42` / `0.1.52` 先例)。本能力内容**一字未改**。① `scripts/lib/preset-install.mjs`:「已装集」的**唯一来源**收口到 `resolveInstalledSelection()`(**可信痕迹** `presets.selection.json#kept` → 退回 `agents.json` 里各 agent 的 `roles` 并集 → 两级都没有 ⇒ **空集**=首次安装语义;⛔ **绝不**把 profile 里的 patch 实体 / `presets.json` 行 / `dsh.bundle.patch` 条目当已装集 —— 那三份铺完恒是 14,「客户可见 ∪ 已装 ∪ 本智能体」于是恒等于 14,收窄被自己的安装步骤抹掉),并给「可信」加了**判据**:痕迹含 `visibility: internal` 的角色而本机 `internalRoles ≠ true`(且未给 `--internal-roles`)⇒ 判不可信、**响亮报告**后按「痕迹缺失」处理(现场那份 `kept:14/excluded:[]` 的痕迹正是放大缺陷写出来的);新增**不变式** `checkNoInternalLanding()` —— 落盘集合不得含内部角色(除非 `--internal-roles` 或 `agents.json#internalRoles === true`),违反 ⇒ `applyPresetSelection()` **判红并拒绝写出**(⛔ 不静默剔除、不静默修);新增 `reseedBundleDir()` 与 `applyPresetSelection({reseedFromShelf})`(收尾重施必须**按货架重播再收窄**:副本已被削到 7 时就地再过滤永远只能得 7,`--internal-roles` 装不回来、自检还会拿「期望 14 ≠ 落盘 7」判**假红**);② `scripts/argent-upgrade.mjs`:**升级档与安装档同一条公式**(客户可见集 ∪ 可信已装集 ∪ 本智能体角色),⛔ 不再用 `agentScoped: agents.length>0`(它把客户可见集整个排除掉 ⇒ 现场那台只落 2 个角色);第 7.6 步收尾重施带 `allowInternal` + `reseedFromShelf`,判红即该步 `ok:false`;③ `install-argent.mjs`:第 4 步默认档 / `--agent` 子集 / 第 7c2 步收尾重施 / `--capability remove` 四处统一走可信已装集与授权口径(`--capability remove` 只为「本机已合法装了内部角色」时不误判红);④ **新增只读 CLI** `scripts/check-preset-landing.mjs`(四件套 + 已装集来源 + 两条不变式,任何一台机器可照抄自查,⛔ 不写任何文件)⇒ `pack.engine` 登记项 +1。**现场(winpc 真机,2026-10-12)**:profile 14 个 patch 实体 + 痕迹 `kept:14/excluded:[]` + `agents.json=[hr]` + `internalRoles=false`,重跑官网一条命令(升级路径)修前打的是 `preset 同步(行式): **14** 个角色` + `角色落盘集合收尾:14 个;三处集合 + 痕迹一致`(7 个内部角色一个没摘),修后同一台机器 ⇒ **7**(`excluded` 列出 7 个内部角色)并打印 `选择痕迹不可信 ⇒ 已装集退回 agents.json 角色`。回归:`scripts/tests/preset-landing-upgrade-path.test.mjs`(43 断言:现场复刻升级路径 ⇒ 7 且 **pre-fix 判据重建得 14**(鉴别力)/ `agents.json` 缺失 ⇒ 7 / 可信痕迹 7 不许放大 / `internalRoles:true` ⇒ 14 放行 / **不变式负样本判红且零写入** / 「铺货架 ≠ 选择」/ 现场真形态 `kept:14` ⇒ 7 且响亮报告 / 真 home 零增量)。⛔ 本批**未发布**(发布留给交付方)。|**0.1.59(2026-10-12,P1-A 宿主排程批:四道闸防线 + 日报试点声明)**:本能力的流程/提示词/脚本**一字未改**;共用引擎面变更(`scripts/flow_config.py` 新增 trigger.schedule 解析、`scripts/vertical-lint.mjs` 新增排程声明门禁、`scripts/lib/registry.mjs` 新增只读 flowSchedule())与**包内注册表投影**变化(业务线声明只动了日报;新增的 L1 `scripts/lib/schedule-probe.mjs` 与 L2 `scripts/argent-schedule.mjs` **刻意不进 pack.engine**,理由见 daily-report 的 `_note`)⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本并重盖章。新增回归 `scripts/tests/schedule-probe.test.mjs` / `scripts/tests/schedule-declaration.test.mjs`。|**0.1.62(2026-10-12,宿主门禁追修批:⛔ 不代装宿主 + npx 形态纳入宿主解析)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变,**含无 flow 的 hr**)——① `install-argent.mjs`:**删除** `--install-host` 代装入口(连同旧自动代装函数与宿主离线包的下载/解包/bin 链接逻辑;开关若仍被传入 ⇒ 报「该开关已废弃」+ **非零退出**(1 = 用法错误),⛔ 不静默忽略),被拒文案改为按 dsh **官方**运行方式给指引(首选 `npx @deepseek-ai/dsh@<窗口内版本> web`;备选官方「从源码运行」;四要素:① 你的版本不在支持窗口(列窗口)② 官方方式换成窗口内版本的一行命令 ③ 我们正在适配你的版本(⛔ 不给对外 ETA)④ 未改动你的 dsh);② **新增** `scripts/lib/dsh-host-resolve.mjs`(**进 `pack.engine`**):宿主解析链 = **PATH 上的 `dsh` → `DSH_BIN` → npx 缓存形态**(读 `<npm cache>/_npx/<hash>/node_modules/@deepseek-ai/dsh/package.json` 的 version,纯只读零网络;多候选按「最近使用优先(mtime 最新)+ 同刻路径升序」确定并**打印选了哪个**)⇒ **npx 形态算宿主**(旧口径「npx 不等于已安装宿主」作废),且 npx 形态下插件装配走**同一条 launcher**(`npx --yes @deepseek-ai/dsh@<版本> plugin --profile web add file:…`),⛔ 不许「检测到 npx 却去用 PATH 上的另一个 dsh」;③ `install.sh` / `install.ps1` 口径同步(ps1 仍声明并透传 `-InstallHost`,只为让旧命令行得到**可读**的「已废弃」原因而不是参数绑定错误)。本能力自身流程 / 提示词 / 脚本**一字未改**。回归 `scripts/tests/install-host-gate.test.mjs`(**219 断言**,纯夹具:垫片 dsh/npx + 本地裸库 + 临时 home,⛔ 零外网、⛔ 不碰真 `~/.dsh`;⚠️ `dsh plugin` 会绕过 `DSH_HOME`/`HOME` ⇒ 夹具只断言命令行、绝不真跑)。⛔ 本批**未发布**(发布留给交付方)。",
436
439
  "2026-10-12:仓容前置探测**误报**修复(判据收紧为「严格阻断形态」+ 手动/CLI 跑完落终态台账);注册表投影在每个包内 ⇒ 四包一起提版重盖。",
@@ -441,7 +444,8 @@
441
444
  "**W7.7(2026-10-14,尾巴收口:智能体标题去掉「角色」字样 + 死指针改指新落点)**:本批改了 `pack.engine` 里的两件(`agents/catalog.json` 的两个 `title`、`configs/hr.json` 的 label/help)与本注册表自身的一处(`hr` 设置面板的 `hint`)⇒ 清单本身变了、且每个包的 tgz 都带一份注册表投影 ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个能力包一起提版本并重盖章。口径:**角色 = DSH preset**,Argent 侧不复述角色清单(会话身份 ⇒ 官方「Agent 预设」区;安装 / 升级 ⇒ 设置 → Argent →「我的智能体」)。⛔ 本能力自身的流程 / 提示词 / 脚本一字未改。",
442
445
  "0.6.1:引擎版本(VERSION)随包内容 ⇒ 按纪律提版重发。",
443
446
  "0.7.0:版本线升至 0.7.0(VERSION 参与包内容)⇒ 按纪律提版重发。",
444
- "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。"
447
+ "0.7.1:版本线提升(VERSION 参与包内容)⇒ 按纪律提版重发。",
448
+ "0.7.2:修 `flow_config.py --list --json`(忽略 --json 的契约违背)⇒ 包内容变,按纪律提版。"
445
449
  ],
446
450
  "presets": [
447
451
  "presets/argent-hr",
@@ -980,7 +980,21 @@ def main(argv=None) -> int:
980
980
  if a.list:
981
981
  reg = load_registry(a.registry)
982
982
  if not reg:
983
- print(' (注册表为空)')
983
+ # `--json` 必须只输出机器可读(0.7.x 契约);空注册表 ⇒ 空数组
984
+ print(json.dumps({'ok': True, 'count': 0, 'flows': []}, ensure_ascii=False) if getattr(a, 'json', False) else ' (注册表为空)')
985
+ return 0
986
+ if getattr(a, 'json', False):
987
+ # ⚠️ 2026-10-15 修:`--list --json` 此前**忽略 --json**(打人读表)⇒ CLI 的 `flow list --json`
988
+ # 对外宣称 JSON 却给文本,违反全仓"`--json` ⇒ 只机器可读"契约。
989
+ out = []
990
+ for fid in sorted(reg):
991
+ cfg = load_config(fid, registry=None, registry_path=a.registry, strict=False)
992
+ out.append({
993
+ 'id': fid, 'role': cfg['role'], 'preset': cfg['dispatch']['preset'],
994
+ 'max': cfg['concurrency']['max'], 'leaseMin': cfg['concurrency']['leaseMin'],
995
+ 'unresolved': sorted(k for k, v in cfg['source'].items() if k.endswith('Unresolved')),
996
+ })
997
+ print(json.dumps({'ok': True, 'count': len(out), 'flows': out}, ensure_ascii=False, indent=2))
984
998
  return 0
985
999
  for fid in sorted(reg):
986
1000
  cfg = load_config(fid, registry=None, registry_path=a.registry, strict=False)
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ // 0.7.x **交接单生成器**:一页列出对外物 × 版本 × sha × 取回/复算命令。
3
+ // ⛔ 只读、**确定性**(不含时间戳 ⇒ 可用"重新生成是否字节相同"来审计文档漂移)。
4
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs'
5
+ import { execFileSync } from 'node:child_process'
6
+ import { join, dirname } from 'node:path'
7
+ import { fileURLToPath } from 'node:url'
8
+ const REPO = join(dirname(fileURLToPath(import.meta.url)), '..')
9
+ const CLI = process.env.ARGENT_CLI_REPO || join(REPO, '..', 'argent-cli')
10
+ const git = (cwd, args) => { try { return execFileSync('git', args, { cwd, encoding: 'utf8' }).trim() } catch { return '?' } }
11
+ const out = process.argv[2] || join(REPO, 'docs/Argent-0.7.0-交接单.md')
12
+
13
+ const engine = readFileSync(join(REPO, 'VERSION'), 'utf8').trim()
14
+ const cli = existsSync(CLI) ? JSON.parse(readFileSync(join(CLI, 'package.json'), 'utf8')).version : '?'
15
+ const manifest = existsSync(join(REPO, '..', 'whyshu-svr/src/config/capability-packs.json'))
16
+ ? JSON.parse(readFileSync(join(REPO, '..', 'whyshu-svr/src/config/capability-packs.json'), 'utf8')).capabilities : {}
17
+ const guideSha = execFileSync('sh', ['-c', 'git show HEAD:argent-setup.md | shasum -a 256 | cut -d" " -f1'], { cwd: REPO, encoding: 'utf8' }).trim()
18
+
19
+ const L = [
20
+ '# Argent 0.7.x 交接单(对外物 × 版本 × 校验)', '',
21
+ '> 本页由 `node scripts/handover-sheet.mjs` **生成**(确定性:不含时间戳);',
22
+ '> 漂移由 `node scripts/tests/handover-fresh.test.mjs` 审计(重新生成必须字节相同)。', '',
23
+ '## 1. 对外物', '',
24
+ '| 物 | 版本 | 取回 / 校验命令 |', '|---|---|---|',
25
+ `| CLI | \`${cli}\` | \`npm i -g @whyshu/argent-cli@${cli}\` ⇒ \`argent --version\` |`,
26
+ `| 引擎包 | \`${engine}\` | \`npm view @whyshu/argent-engine version\`(CLI 依赖已锁定 ^${engine}) |`,
27
+ `| 安装指南 | HEAD sha256 \`${guideSha.slice(0, 16)}…\` | \`curl -fsS https://whyshu.com/dl/argent-setup.md?v=$(date +%s) | shasum -a 256\` |`,
28
+ '| 三件安装器 + 旧安装器 | 见 `--check-dl` | `bash scripts/release-argent.sh --check-dl` |', '',
29
+ '> ⚠️ 校验口径:清单里的 `sha256` 是**包内容摘要**,**不等于 tgz 字节哈希** —— 所以⛔ 不要用 `curl … | shasum -a 256` 去比清单;',
30
+ '> 正确做法:`bash scripts/release-argent.sh --check-dl`(取回后重算内容摘要)或 `python3 scripts/capability_pack.py --list`。', '',
31
+ '## 2. 能力包(服务端清单为准)', '',
32
+ '| 能力 | 版本 | sha256(前 16) | 下载 |', '|---|---|---|---|',
33
+ ...Object.entries(manifest).map(([k, v]) => `| ${k} | ${v.version} | \`${String(v.sha256).slice(0, 16)}…\` | ${v.url} |`), '',
34
+ '## 3. 一条命令验收(普通用户视角)', '',
35
+ '```bash',
36
+ 'bash scripts/drill-clean-room.sh # 13 步;已发布版本 + 临时数据目录;要求 13/0',
37
+ 'node scripts/audit-all.mjs --with-net # 终检 + 文档一致 + 证据可复算 + 发布落地;要求 4/4',
38
+ '```', '',
39
+ '## 4. 控制面(服务端,已上线)', '',
40
+ '- `POST /api/argent/jobs/{claim,report,release}`:设备令牌 **fail-closed**(无令牌 401)| Mongo **原子 CAS**| 幂等键',
41
+ '- 权益:`argent ent list`(需 `argent auth login --whyshu-token <令牌>`,⛔ 令牌只在用户终端输入)', '',
42
+ '## 5. 体检结论怎么看', '',
43
+ '- 最近几次:`node scripts/audit-all.mjs --history`(⛔ 本页**不内嵌**留档:`--record` 一写就会让本页过时)',
44
+ '- 最近一次的逐项结论:证据包 §4.7(`node scripts/collect-evidence.mjs` 生成)', '',
45
+ '## 6. 未完成 / 冻结(如实列出,不藏)', '',
46
+ '- **S4 内核补丁退役**:上游 `0.2.1-alpha.3` 比对 ⇒ 5 个**必须保留**、2 个判据不足 ⇒ **本轮不退役**(结论与依据见退役计划)',
47
+ '- **S3 launchd 单线**:按用户指令**冻结**(⛔ 不触碰 huangwei 客户机;开发机 0 条、生产 4 条均未动)',
48
+ '- **`ent list` 真机端到端**:需用户在 MBP 自行登录账号后补测(唯一未走的在线环节)', '',
49
+ '## 7. 提交(怎么查,⛔ 本页不写死哈希)', '',
50
+ '- `git -C . log -1 --format=\'%h %s\'`(argent-dsh)',
51
+ '- `git -C ../argent-cli log -1 --format=\'%h %s\'`(argent-cli)',
52
+ '- `git -C ../whyshu-svr log -1 --format=\'%h %s\'`(服务端)',
53
+ '- 最近一次的实际哈希与结论见证据包 §6/§4.7(那份是**显式重生成**的,允许含时点信息)',
54
+ '',
55
+ '> ⚠️ 本页**不内嵌**提交哈希、留档、时间戳:它们会随"提交本页"或"记录体检"而变化 ⇒',
56
+ '> 一旦内嵌就永远无法"字节最新"(本会话踩过两次:内嵌留档、内嵌 HEAD 哈希)。可复算的东西一律写成命令。', '',
57
+ ]
58
+ writeFileSync(out, L.join('\n'))
59
+ console.log(`✅ 已写 ${out}`)
@@ -3,7 +3,7 @@
3
3
  # 用法: . "$(dirname "$0")/lib/argent-datadir.sh" ⇒ 之后用 "$ARGENT_DATA_DIR_RESOLVED"
4
4
  # 语义:与 JS/Python 解析器**同一判据**(老机"存在即沿用"、新装落 ~/.argent、显式 env 优先);
5
5
  # ⛔ 脚本里不要再写死 "$HOME/.dsh/argent"。
6
- # 覆盖顺序:$ARGENT_DATA_HOME(历史兼容)→ $ARGENT_DATA_DIR/ $DSH_HOME → 解析器 → 兜底旧路径
6
+ # 覆盖顺序:${ARGENT_DATA_HOME}(历史兼容)→ $ARGENT_DATA_DIR/ $DSH_HOME → 解析器 → 兜底旧路径
7
7
  argent_resolve_data_dir() {
8
8
  if [ -n "${ARGENT_DATA_HOME:-}" ]; then printf '%s' "$ARGENT_DATA_HOME"; return 0; fi
9
9
  _self_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
@@ -12,6 +12,7 @@
12
12
  # bash release-argent.sh --check-dl # 只体检:仓库 vs 服务器 dl/ 是否一致(不改任何东西)
13
13
  # bash release-argent.sh --publish-dl # 只同步分发文件(不打 tag、不 push)——应急修 dl 漂移
14
14
  #
15
+ # bash release-argent.sh --check-live-manifest # 只体检:服务器正在服务的清单 == 已提交清单
15
16
  # 为什么有 --check-dl:2026-09-20 实测发现服务器 dl/install-argent.mjs 停在 9-07,
16
17
  # 而仓库已是 9-15(缺 dsh 0.1.5-rc.1 已验版本 + profile-doctor 收尾门禁)——**整整漂了 8 天**。
17
18
  # 官网那条 `curl https://whyshu.com/dl/install-argent.mjs | node` 下发的就是它。
@@ -83,11 +84,55 @@ for a in "$@"; do
83
84
  --full) FULL=1 ;;
84
85
  --check-dl) MODE="check-dl" ;;
85
86
  --publish-packs) MODE="publish-packs" ;;
87
+ --check-live-manifest) MODE="check-live-manifest" ;;
88
+ --post-release-check) MODE="post-release-check" ;;
86
89
  --publish-dl) MODE="publish-dl" ;;
87
90
  -h|--help) sed -n '2,40p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
91
+ --*) echo "✗ 未知参数:${a}(⛔ 不会当作版本号;用 -h 看用法)" >&2; exit 1 ;;
88
92
  *) VERSION_ARG="$a" ;;
89
93
  esac
90
94
  done
95
+ # ── 0.7.1:**发布后体检**一条入口(⛔ 只读:不发布、不写任何东西)──
96
+ # 顺序:① dl 字节 + 能力包摘要 ② 服务器在服务的清单 ③ registry 可见性(engine/CLI 版本号)
97
+ if [[ "$MODE" == "post-release-check" ]]; then
98
+ rc=0
99
+ echo "══ ① dl 字节与能力包摘要 ══"
100
+ bash "$0" --check-dl || rc=1
101
+ echo; echo "══ ② 服务器在服务的清单 ══"
102
+ bash "$0" --check-live-manifest || rc=1
103
+ echo; echo "══ ③ registry 可见性 ══"
104
+ _repo="$(cd "$(dirname "$0")/.." && pwd)"
105
+ _want_engine="$(tr -d '\n' < "$_repo/VERSION")"
106
+ _cli_pkg="$_repo/../argent-cli/package.json"
107
+ _want_cli="$(python3 -c "import json,sys;print(json.load(open(sys.argv[1]))['version'])" "$_cli_pkg" 2>/dev/null || echo '?')"
108
+ for pair in "engine=$_want_engine@whyshu/argent-engine" "cli=$_want_cli@whyshu/argent-cli"; do
109
+ _k="${pair%%=*}"; _rest="${pair#*=}"; _want="${_rest%%@*}"; _pkg="@${_rest#*@}"
110
+ _got="$(npm view "$_pkg" version --registry=https://registry.npmjs.org 2>/dev/null | tail -1 | tr -d '\r')"
111
+ if [[ -z "$_got" ]]; then echo " ⚠ $_pkg 取不到(离线或 npm 不可用)⇒ 跳过(⛔ 不判红)"
112
+ elif [[ "$_got" == "$_want" ]]; then echo " ✅ ${_k}:registry=${_got}(与本地 $_want 一致)"
113
+ else echo " ❌ ${_k}:registry=$_got ≠ 本地 ${_want}(未发布 / 未传播完)"; rc=1
114
+ fi
115
+ done
116
+ echo; [[ "$rc" == 0 ]] && echo "✅ 发布后体检:全部通过" || echo "❌ 发布后体检:有未落地项(见上)"
117
+ exit "$rc"
118
+ fi
119
+
120
+ # ── 0.7.1:核**服务器上正在服务**的清单副本(ssh 只读;取不到则 ⚠ 跳过、不判红)──
121
+ if [[ "$MODE" == "check-live-manifest" ]]; then
122
+ _repo="$(cd "$(dirname "$0")/.." && pwd)"
123
+ _svr="${ARGENT_SVR_REPO:-$_repo/../whyshu-svr}"
124
+ _local="$_svr/src/config/capability-packs.json"
125
+ [[ -f "$_local" ]] || { echo "⚠ 本机没有服务端清单副本(${_local})⇒ 跳过"; exit 0; }
126
+ _l=$(shasum -a 256 "$_local" | cut -d' ' -f1)
127
+ _r=$(ssh -o BatchMode=yes -o ConnectTimeout=8 ubuntu@81.69.222.211 \
128
+ 'sudo sha256sum /home/whyshu/server/config/capability-packs.json 2>/dev/null | cut -d" " -f1' 2>/dev/null | tr -d '\r')
129
+ [[ -n "$_r" ]] || { echo "⚠ 取不到服务器清单(网络/权限)⇒ 跳过(⛔ 不判红)"; exit 0; }
130
+ echo " 本地(已提交): $_l"
131
+ echo " 服务器(在服务): $_r"
132
+ if [[ "$_l" == "$_r" ]]; then echo " ✅ 服务器清单与已提交清单**逐字节相同**"; exit 0; fi
133
+ echo " ❌ 服务器清单与已提交清单不一致 ⇒ 清单有未部署改动(或被手改)"; exit 1
134
+ fi
135
+
91
136
  if [[ "$MODE" == "release" && -z "$VERSION_ARG" ]]; then
92
137
  echo "✗ 缺少版本参数(用法:bash release-argent.sh <版本> [--dry-run] [--full])"
93
138
  echo " 或:bash release-argent.sh --check-dl | --publish-dl | --publish-packs"
@@ -1 +1 @@
1
- export const VERSION = "0.7.1"
1
+ export const VERSION = "0.7.2"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whyshu/argent-engine",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Argent 引擎(L1):流程/台账/重试/守卫/审计/浏览器自动化 —— 逐字节来自 argent-dsh 仓库",
5
5
  "type": "module",
6
6
  "engines": {