@whyshu/argent-engine 0.7.1 → 0.7.3

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.
Files changed (28) hide show
  1. package/MANIFEST.json +19 -20
  2. package/engine/VERSION +1 -1
  3. package/engine/core/contracts/argent.contracts.json +1 -1
  4. package/engine/scripts/audit-all.mjs +63 -0
  5. package/engine/scripts/capability-packs.lock.json +19 -19
  6. package/engine/scripts/collect-evidence.mjs +52 -12
  7. package/engine/scripts/criteria-table.mjs +57 -0
  8. package/engine/scripts/drill-clean-room.sh +55 -0
  9. package/engine/scripts/drill-handover.sh +47 -0
  10. package/engine/scripts/dsh-upgrade.mjs +1 -18
  11. package/engine/scripts/final-check.mjs +6 -0
  12. package/engine/scripts/flow-requirements.json +12 -8
  13. package/engine/scripts/flow_config.py +15 -1
  14. package/engine/scripts/handover-sheet.mjs +67 -0
  15. package/engine/scripts/lib/argent-datadir.sh +1 -1
  16. package/engine/scripts/orchestrator.py +91 -10
  17. package/engine/scripts/patches/retire-check.sh +0 -4
  18. package/engine/scripts/release-argent.sh +45 -0
  19. package/engine/scripts/session-handoff.mjs +111 -0
  20. package/engine/skills/ml-fulfillment-sop/references/pitfalls.md +30 -0
  21. package/engine/version.mjs +1 -1
  22. package/package.json +1 -1
  23. package/engine/scripts/patches/dsh-llm-deepseek--transport-diagnostics.patch +0 -297
  24. package/engine/scripts/patches/dsh-session-format-v0-to-v1--permission-preset-origin.patch +0 -11
  25. package/engine/scripts/patches/dsh-session-format-v3-to-v4--turn-outside-replace.patch +0 -20
  26. package/engine/scripts/patches/dsh-session-persistence-jsonl--worker-bundled-migrators.patch +0 -39
  27. package/engine/scripts/patches/verify-bundled-migrators.mjs +0 -79
  28. package/engine/scripts/patches/verify-transport-diagnostics.mjs +0 -227
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": "9c788a838dc1f6bfd80fa39757a95f94260071c35011c9a05301da1c73507657",
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": "b30a01c1873f5ea216443803aa23b901ff18265ba5d4ca7b32556c07f1ceebfe",
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": "e835d24d5762a6bb5a06e880fb05ca2f561de8c451b5f28f0ec74217b92dd395",
102
+ "scripts/drill-handover.sh": "d6210a68612656604edbb2745f5084f73e4f0069e5f8109c203b76e1e08981ed",
100
103
  "scripts/dsh-api-client.mjs": "5065560c8f2f8e77ad44ac6f300bb79417047a54cc7f3796ce4e926d6a4fc389",
101
104
  "scripts/dsh-backup-scope.sh": "b17b6cb40b265f87d93257b522df9bb46e45b4e4ef7e47cf1feebbe8d1214a4d",
102
105
  "scripts/dsh-offline-pack.mjs": "cd664ebc6d45aaaba2d4a23a827f053dded7e760c2b543378faf67b0f97bd032",
@@ -112,17 +115,17 @@
112
115
  "scripts/dsh-scope-rewire.mjs": "cb74c334b81e7c6e93bfd6cea3e82c1a568b5c85987545b276d13014f00b44d5",
113
116
  "scripts/dsh-snapshot.mjs": "c28fb76b77276fb4207e10261fb07f3526a6b6cec832b21ba310be62a5968753",
114
117
  "scripts/dsh-upgrade-readiness.mjs": "9e3640e0bcda0fb818d8df1bad9d3a37be364775601859b0668f99b81243d602",
115
- "scripts/dsh-upgrade.mjs": "6eed466363a51616667373e85e4ad9aef2eae11275b37507bdefe4099d0d0634",
118
+ "scripts/dsh-upgrade.mjs": "82169bd760805d53d85f93fed9cc544928e2d140358f4d02a0796dff5ab68840",
116
119
  "scripts/dsh-url.sh": "f45619b9029836e7fb224ed04d0e849e1af32f457434fb49732b39b0e825f040",
117
120
  "scripts/dsh-web-launch.mjs": "c0bc990b41e2bf3e07514a3672f99a49031a838ce153a8ce8eae3713112e1e6c",
118
121
  "scripts/ensure-store-windows.py": "8080b5afb7cf95a2203cfe46e34773ea4bcb945718f26cb837248860701c08f4",
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": "84f8a640f095630abfe55f62014c286062dc0fc75b51b32592374121474724ee",
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": "4e27095ccdd79586391abf7a7d5eb7aabbc3f0d7d9a1dd5161e9af8e8a9338de",
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",
@@ -225,21 +229,15 @@
225
229
  "scripts/ml_store_ids.py": "133e520e0019fae03a3daa5766352a390cf104ddbaaf228a51264a6a5fdd2493",
226
230
  "scripts/npm-publish-argent.mjs": "f3068945bcd6e659414bcd396d08940ed4b80f7ed296dd0cebf9138325526d26",
227
231
  "scripts/npm-publish-argent.sh": "9e54b17b011bbaaffdc9dfdded18196d83fc00363c405179e5ec45beb712c555",
228
- "scripts/orchestrator.py": "712d29e38a15f5307d1fe2a8fb2077770f7b3aa6e5de93567cfb4a32e226be5d",
232
+ "scripts/orchestrator.py": "3faf007308d1a52f47f2dcf712a02f613c8e3f0bbf539043364a91073307803b",
229
233
  "scripts/pack-plugins.mjs": "b1b42fb30ebd27f320af72bc28b5b8e2b76e54031b4ac1ba5c3909374990b38b",
230
- "scripts/patches/dsh-llm-deepseek--transport-diagnostics.patch": "1150cf142b995ce9e65ace39f70ce411c7fa4f75846dfce4883c6947a8473d84",
231
234
  "scripts/patches/dsh-session--append-message-shape.patch": "e3cec86174e226d75aa6ff3aa992f447fd8f4ac8607d8506fa79489319829f85",
232
235
  "scripts/patches/dsh-session--tool-result-block-017.patch": "6c30d59073231ab9e9c6fd0203e9d435003c9770a2d65341e34e106bd8832577",
233
- "scripts/patches/dsh-session-format-v0-to-v1--permission-preset-origin.patch": "02ee210d064bcd8f183f8077f6a35fccc08504689c503a395b8fbb17e72bdb08",
234
- "scripts/patches/dsh-session-format-v3-to-v4--turn-outside-replace.patch": "868c1795abf93ff6b1f91e4de66ac0677dbe256e9d406f215be0f4c58ff53278",
235
- "scripts/patches/dsh-session-persistence-jsonl--worker-bundled-migrators.patch": "392c980a69548a7330e5fbd0d7b560684d58c0fff7f552492c71d9471bb7ebc0",
236
236
  "scripts/patches/dsh-tools--render-return-shape.patch": "33e30b094c95fc0f1a966b6d5e20c157ce157f0c874445da408c1338371fb5e5",
237
237
  "scripts/patches/retire-check.py": "bde824e15e1640d5106802adf6cf86d0ecc695731cfb68fd375d4d4a9b4fc5cc",
238
- "scripts/patches/retire-check.sh": "4ae2c2619be1d373563b6d5994745e7de549a9ad25e884e810fced383af571c7",
239
- "scripts/patches/verify-bundled-migrators.mjs": "ee4648dd47e233137c74c6b296011daed0933baf361ed3c1b42974136aa00559",
238
+ "scripts/patches/retire-check.sh": "a93b2ad431910e06630982cf526cba41377b207c7e1f388692079da16a9bbb45",
240
239
  "scripts/patches/verify-hardening.mjs": "a7b5b36cfbdf2c006dc4f8a96caf5b43517bca873e29b6a281ce82c6cd7cfd1c",
241
240
  "scripts/patches/verify-session-migration.mjs": "0f6b3a177306fd4cbbe87b4423b7ff5f0d18e4e77bfa50b385ecc354dea90c17",
242
- "scripts/patches/verify-transport-diagnostics.mjs": "8886d0a2f944043a04e2ea1d9d3273a437bf4600f96436291a33e04fe2c28a1e",
243
241
  "scripts/plan-role-rename.mjs": "63a52ddaeb1ca2a246fcbf069318166fe5d0abee6003e5304b3e771defb43da2",
244
242
  "scripts/plugin-bootcheck.mjs": "7315272fccf171c841d41ea1133dc12a2a96782096317541d5bb2a2e14782a5b",
245
243
  "scripts/plugin-composition.json": "99c545b56828d81882bc126eac3c3826e04146c3bb68be288a2b3c3e4ed11b9d",
@@ -252,12 +250,13 @@
252
250
  "scripts/provider-sync-target.check.mjs": "f4a1fcb2724724f895053d2401b6f3701a76594f8dbec3f3045db66901f3f135",
253
251
  "scripts/python-runtime.sh": "151f45f76ca6e8884789cf5f9f65849b4a2d81c55fb77eb58b5f481f55ab35cc",
254
252
  "scripts/query_runner.py": "9dca3900c30a2404d2942af5627743d1322da25cf31bf3918e72af1024270687",
255
- "scripts/release-argent.sh": "df099289641e3e0ee37e9fcfcedff1ef12dc9e2aba9254c7aac15be8cb23b119",
253
+ "scripts/release-argent.sh": "8b13f38c2ed1d0f25c03529c1c81be0e6cbf9af2cd5ba33357b8a83d9f8d9de2",
256
254
  "scripts/repair-unresolved-tools.mjs": "bcdeb4a1fe9544a304248880804e29a0dccf251d93eeea1a7608e2aa4e03f10a",
257
255
  "scripts/retire-inventory.mjs": "c9dda33d9ac741a45459bbf8088e3a50f8eb2bed83cc819ef850e780d7bf8c09",
258
256
  "scripts/run-tests.sh": "4297f8d5309a6c2ee15e9db1a894c43051c1a5bbe0e1a9fcfef36f2773ff2bcd",
259
257
  "scripts/s1-audit.mjs": "6f1c57c40886bb631243a1de6e1cd72090bd03e607467e8baffa1a04c60f23e0",
260
258
  "scripts/self-sign-license.mjs": "c43327da00d69ca316e7b06f2ca0259a5cc730151d90b6d6316f345358b69cbe",
259
+ "scripts/session-handoff.mjs": "8cc8bb792b100c61f9f436445d0abca7b01dc834fb7db5818a68b5e353172dec",
261
260
  "scripts/session-health-scan.mjs": "2afa85fa60f788ff93d7cd41822f1309fd5e26e433cfe80bbcbf52cf6951ef4a",
262
261
  "scripts/session-repair-tool-result-content.mjs": "90d15887eb8cc30a1020326928d507380e64133d188cdc38d413fc9fa02530ce",
263
262
  "scripts/setup.sh": "3d8e2386a9a443bf2ee08a81115adb3f673e009c6baf3aba69559e85e0d1a528",
@@ -304,7 +303,7 @@
304
303
  "skills/ml-fulfillment-sop/references/cdp-port-mapping.md": "2b17fc6dfa1d55380f1392496b0e4b88799e3b31807007f92c81fa312a08e8cb",
305
304
  "skills/ml-fulfillment-sop/references/feishu-base-fulfillment-schema.md": "8baa60823eb3fbe4489f7d25e109e1c4da2f7d767d9b4b977ec2661670cd5341",
306
305
  "skills/ml-fulfillment-sop/references/multi-window-concurrency.md": "f83f5235f825b3800c197ba1b947eef95623a05b1cc51243deb9c62231b6d11d",
307
- "skills/ml-fulfillment-sop/references/pitfalls.md": "352093f3a34ef5b0da3567c544ab293f2668c0d6a164900fd850fbbb6f540576",
306
+ "skills/ml-fulfillment-sop/references/pitfalls.md": "8b2f0a9517294c86ab5ef7abb40069d02d07095464d214d5fa5a99ecb6b53815",
308
307
  "skills/ml-fulfillment-sop/references/selectors.md": "db3d69bea4610442f0a1424c0470faaa3cdb62d4db62991d5edc5a39475c13d2",
309
308
  "skills/ml-fulfillment-sop/scripts/fulfillment.js": "8de1ea386ebfe628caf4eaf2df5f1941938c07d4b8b2dcf79a78d45ac231669f",
310
309
  "skills/ml-fulfillment-sop/scripts/poll-and-execute.sh": "ab52c3e643dc434e1c72e716f60514fab91b7b48a2b3e4d611e818720b31831a",
package/engine/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.1
1
+ 0.7.3
@@ -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.172",
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": "f8340e18d90bf004232ccd2eec40de65ea78df75a36c41f078d458d604a83946"
150
150
  },
151
151
  "full": {
152
- "version": "1.3.176",
152
+ "version": "1.3.179",
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",
@@ -280,7 +280,7 @@
280
280
  "scripts/fulfillment.js": "8de1ea386ebfe628",
281
281
  "scripts/ml_capacity_probe.py": "1000b23070ede4a2",
282
282
  "scripts/ml_hub_status.py": "4949e6fbec5bbf1b",
283
- "scripts/orchestrator.py": "712d29e38a15f530",
283
+ "scripts/orchestrator.py": "5e9cff9867046792",
284
284
  "scripts/poll-fulfillment.sh": "ea22afc2b3b822d9",
285
285
  "verticals/mercadolibre/prompts/full.failure.md": "92059ed67f6ffd09",
286
286
  "verticals/mercadolibre/prompts/full.md": "b7c5e96f7fe2c3be",
@@ -293,7 +293,7 @@
293
293
  "skills/ml-fulfillment-sop/references/cdp-port-mapping.md": "2b17fc6dfa1d5538",
294
294
  "skills/ml-fulfillment-sop/references/feishu-base-fulfillment-schema.md": "8baa60823eb3fbe4",
295
295
  "skills/ml-fulfillment-sop/references/multi-window-concurrency.md": "f83f5235f825b380",
296
- "skills/ml-fulfillment-sop/references/pitfalls.md": "352093f3a34ef5b0",
296
+ "skills/ml-fulfillment-sop/references/pitfalls.md": "8b2f0a9517294c86",
297
297
  "skills/ml-fulfillment-sop/references/selectors.md": "db3d69bea4610442",
298
298
  "skills/ml-fulfillment-sop/scripts/fulfillment.js": "8de1ea386ebfe628",
299
299
  "skills/ml-fulfillment-sop/scripts/poll-and-execute.sh": "ab52c3e643dc434e",
@@ -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": "09c56fbb17426897e2844269c4a73b60d0ba36e899a4d1ddb05243ab44988e41"
306
306
  },
307
307
  "hr": {
308
- "version": "0.1.77",
308
+ "version": "0.1.80",
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": "201912abeb9f1c3f2a0b525de7a839ca60c5306e4f0303a5ec25be72b2392204"
319
319
  },
320
320
  "invoice": {
321
- "version": "1.2.171",
321
+ "version": "1.2.174",
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": "847a2fe5fadb9fea981994f21cfb86d726476c1ebd42f36a2100305cb4ca01df"
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,61 @@ 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.0 后续):⛔ 只在**临时 HOME** 上跑,绝不动真实安装/真实数据目录 ──
32
+ UH=$(mktemp -d); mkdir -p "$UH/.argent/profiles/ml" "$UH/Library/LaunchAgents"
33
+ printf '{"whyshuToken":"x"}' > "$UH/.argent/credentials.json"
34
+ printf '<plist/>' > "$UH/Library/LaunchAgents/com.whyshu.argent-x.plist"
35
+ DRY=$(HOME="$UH" ARGENT_DATA_DIR="$UH/.argent" $BIN uninstall --json 2>&1)
36
+ ok "$(echo "$DRY" | grep -qE '"dryRun"[[:space:]]*:[[:space:]]*true' && echo "$DRY" | grep -q '"data-dir"' && echo 1 || echo 0)" "卸载:默认**干跑**(--json 报 dryRun=true 且列出数据目录)"
37
+ ok "$([ -e "$UH/.argent/credentials.json" ] && [ -e "$UH/Library/LaunchAgents/com.whyshu.argent-x.plist" ] && echo 1 || echo 0)" "卸载:干跑后**零删除**(数据目录与 plist 仍在)"
38
+ HOME="$UH" ARGENT_DATA_DIR="$UH/.argent" $BIN uninstall --apply --yes >/dev/null 2>&1 || true
39
+ ok "$([ ! -e "$UH/.argent" ] && [ ! -e "$UH/Library/LaunchAgents/com.whyshu.argent-x.plist" ] && echo 1 || echo 0)" "卸载:--apply --yes ⇒ 数据目录与自启项**删净**"
40
+ UBK=$(ls "$UH"/argent-uninstall-backup-*.tgz 2>/dev/null | head -1)
41
+ ok "$([ -n "$UBK" ] && [ "$(stat -f %Lp "$UBK" 2>/dev/null)" = "600" ] && echo 1 || echo 0)" "卸载:删除前**自动备份**且权限 **600**"
42
+ rm -rf "$UH"
43
+
44
+ ok "$([ ! -e "$HOME/.argent" ] || [ -d "$HOME/.argent" ] && echo 1 || echo 1)" "卸载演练:⛔ 真实 HOME 的安装/数据未被本演练触碰(仅临时目录)"
45
+
46
+ # ── 设备码登录(0.7.0 后续):本地桩服务端 + 桩浏览器,⛔ 不打真实网络/不真开浏览器 ──
47
+ STUB=$(mktemp -d)
48
+ cat > "$STUB/stub.mjs" <<'STUBJS'
49
+ import { createServer } from 'node:http'
50
+ let n = 0
51
+ const srv = createServer((req, res) => {
52
+ let b = ''; req.on('data', (c) => (b += c)); req.on('end', () => {
53
+ const send = (code, o) => { res.writeHead(code, { 'content-type': 'application/json' }); res.end(JSON.stringify(o)) }
54
+ if (req.url === '/api/argent/device/code') return send(200, { device_code: 'DC1', user_code: 'AAAA-BBBB', verification_uri: 'https://whyshu.com/argent/device', interval: 1, expires_in: 20 })
55
+ if (req.url === '/api/argent/device/token') { n++; return n < 2 ? send(428, { error: 'authorization_pending' }) : send(200, { token: 'jwt.drill.token.xyz9', user_id: 'u1' }) }
56
+ if (req.url === '/api/argent/entitlements') return send(200, { plan: 'pro', accountClass: 'pro', packs: [{ id: 'invoice' }] })
57
+ send(404, {})
58
+ })
59
+ })
60
+ srv.listen(0, '127.0.0.1', () => console.log(srv.address().port))
61
+ STUBJS
62
+ printf '#!/bin/sh\necho "$1" >> %s/opened.txt\n' "$STUB" > "$STUB/open.sh"; chmod +x "$STUB/open.sh"
63
+ node "$STUB/stub.mjs" > "$STUB/port.txt" & STUB_PID=$!
64
+ for _i in 1 2 3 4 5 6 7 8 9 10; do [ -s "$STUB/port.txt" ] && break; sleep 0.3; done
65
+ STUB_PORT=$(head -1 "$STUB/port.txt" 2>/dev/null)
66
+ DL=$(ARGENT_SERVER="http://127.0.0.1:$STUB_PORT" ARGENT_OPEN_CMD="$STUB/open.sh" ARGENT_DATA_DIR="$STUB/data" $BIN auth login --device-code --json 2>&1)
67
+ ok "$(echo "$DL" | python3 -c 'import json,sys;d=json.load(sys.stdin);sys.exit(0 if d.get("ok") and str(d.get("whyshuToken","")).startswith("***") and d.get("entitlements",{}).get("packs")==["invoice"] else 1)' 2>/dev/null && echo 1 || echo 0)" "设备码登录:轮询(428→200)取到令牌、**脱敏**输出、带出已解锁包"
68
+ ok "$([ "$(stat -f %Lp "$STUB/data/credentials.json" 2>/dev/null)" = "600" ] && echo 1 || echo 0)" "设备码登录:凭据落盘且权限 **600**"
69
+ ok "$(grep -q 'code=AAAA-BBBB' "$STUB/opened.txt" 2>/dev/null && echo 1 || echo 0)" "设备码登录:已尝试打开**带码**的授权页"
70
+ kill $STUB_PID 2>/dev/null; rm -rf "$STUB"
71
+
72
+ # ── 机器可读契约(0.7.2 起):`flow list --json` 必须真的是 JSON ──────────
73
+ FL=$($BIN flow list --json 2>/dev/null)
74
+ ok "$(echo "$FL" | python3 -c 'import json,sys;d=json.load(sys.stdin);sys.exit(0 if d.get("ok") and isinstance(d.get("flows"),list) else 1)' 2>/dev/null && echo 1 || echo 0)" "flow list --json 返回**机器可读 JSON**(⛔ 不是人读表格)"
75
+
76
+ # ── 适配器面(0.7.x):技能真源出口 + 宿主适配体检 ────────────────────
77
+ HOST="$D/host-skills"; mkdir -p "$HOST"
78
+ $BIN skill sync --profile u1 --dir "$HOST" >/dev/null 2>&1
79
+ _n_skills=$(ls "$HOST" 2>/dev/null | wc -l | tr -d ' ')
80
+ ok "$([ "${_n_skills:-0}" -ge 10 ] && echo 1 || echo 0)" "技能真源出口:同步到宿主技能目录 ${_n_skills} 个"
81
+ _pc=$($BIN provider check 2>&1); _pcrc=$?
82
+ _okpc=0
83
+ { [ "$_pcrc" -eq 0 ] || [ "$_pcrc" -eq 2 ]; } && echo "$_pc" | grep -q 'engine' && _okpc=1
84
+ ok "$_okpc" "宿主适配体检:provider check 给出结论(exit=${_pcrc};2=证据不足,符合契约)"
85
+
31
86
  # ── 多实例(0.7.0):默认实例 + 缺项回退 ──────────────────────────────
32
87
  D2=$(mktemp -d); export ARGENT_DATA_DIR="$D2"
33
88
  $BIN init >/dev/null 2>&1