@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.
- package/MANIFEST.json +19 -20
- package/engine/VERSION +1 -1
- package/engine/core/contracts/argent.contracts.json +1 -1
- package/engine/scripts/audit-all.mjs +63 -0
- package/engine/scripts/capability-packs.lock.json +19 -19
- package/engine/scripts/collect-evidence.mjs +52 -12
- package/engine/scripts/criteria-table.mjs +57 -0
- package/engine/scripts/drill-clean-room.sh +55 -0
- package/engine/scripts/drill-handover.sh +47 -0
- package/engine/scripts/dsh-upgrade.mjs +1 -18
- package/engine/scripts/final-check.mjs +6 -0
- package/engine/scripts/flow-requirements.json +12 -8
- package/engine/scripts/flow_config.py +15 -1
- package/engine/scripts/handover-sheet.mjs +67 -0
- package/engine/scripts/lib/argent-datadir.sh +1 -1
- package/engine/scripts/orchestrator.py +91 -10
- package/engine/scripts/patches/retire-check.sh +0 -4
- package/engine/scripts/release-argent.sh +45 -0
- package/engine/scripts/session-handoff.mjs +111 -0
- package/engine/skills/ml-fulfillment-sop/references/pitfalls.md +30 -0
- package/engine/version.mjs +1 -1
- package/package.json +1 -1
- package/engine/scripts/patches/dsh-llm-deepseek--transport-diagnostics.patch +0 -297
- package/engine/scripts/patches/dsh-session-format-v0-to-v1--permission-preset-origin.patch +0 -11
- package/engine/scripts/patches/dsh-session-format-v3-to-v4--turn-outside-replace.patch +0 -20
- package/engine/scripts/patches/dsh-session-persistence-jsonl--worker-bundled-migrators.patch +0 -39
- package/engine/scripts/patches/verify-bundled-migrators.mjs +0 -79
- 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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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
|
+
0.7.3
|
|
@@ -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.
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
149
|
+
"digest": "f8340e18d90bf004232ccd2eec40de65ea78df75a36c41f078d458d604a83946"
|
|
150
150
|
},
|
|
151
151
|
"full": {
|
|
152
|
-
"version": "1.3.
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
305
|
+
"digest": "09c56fbb17426897e2844269c4a73b60d0ba36e899a4d1ddb05243ab44988e41"
|
|
306
306
|
},
|
|
307
307
|
"hr": {
|
|
308
|
-
"version": "0.1.
|
|
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": "
|
|
318
|
+
"digest": "201912abeb9f1c3f2a0b525de7a839ca60c5306e4f0303a5ec25be72b2392204"
|
|
319
319
|
},
|
|
320
320
|
"invoice": {
|
|
321
|
-
"version": "1.2.
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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 =
|
|
12
|
-
const a =
|
|
13
|
-
const w =
|
|
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}
|
|
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
|