@whyshu/argent-engine 0.0.0-stage → 0.6.1

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 (340) hide show
  1. package/MANIFEST.json +341 -0
  2. package/engine/VERSION +1 -0
  3. package/engine/agents/catalog.json +454 -0
  4. package/engine/configs/_aliases.proposed.json +651 -0
  5. package/engine/configs/_migration-plan.proposed.json +899 -0
  6. package/engine/configs/account.json +272 -0
  7. package/engine/configs/advanced.json +205 -0
  8. package/engine/configs/host.json +149 -0
  9. package/engine/configs/hr.json +27 -0
  10. package/engine/configs/notify.json +264 -0
  11. package/engine/core/cli/argent.mjs +277 -0
  12. package/engine/core/contracts/argent.contracts.json +1065 -0
  13. package/engine/core/contracts/verbs.schema.json +2539 -0
  14. package/engine/core/lib/argent-datadir.mjs +223 -0
  15. package/engine/core/lib/audit.mjs +187 -0
  16. package/engine/core/lib/claim.mjs +258 -0
  17. package/engine/core/lib/config-catalog.mjs +1172 -0
  18. package/engine/core/lib/doctor-customer.mjs +577 -0
  19. package/engine/core/lib/flow-list.mjs +138 -0
  20. package/engine/core/lib/flow-registry.mjs +48 -0
  21. package/engine/core/lib/init.mjs +247 -0
  22. package/engine/core/lib/ledger.mjs +124 -0
  23. package/engine/core/lib/license-activate.mjs +813 -0
  24. package/engine/core/lib/license-device.mjs +314 -0
  25. package/engine/core/lib/license-file.mjs +349 -0
  26. package/engine/core/lib/license-guard.mjs +123 -0
  27. package/engine/core/lib/license-ops.mjs +1645 -0
  28. package/engine/core/lib/license-verdict.mjs +133 -0
  29. package/engine/core/lib/license.mjs +577 -0
  30. package/engine/core/lib/notify/dedup.mjs +101 -0
  31. package/engine/core/lib/notify/feishu.mjs +38 -0
  32. package/engine/core/lib/notify/index.mjs +95 -0
  33. package/engine/core/lib/notify/verb.mjs +327 -0
  34. package/engine/core/lib/notify/webhook.mjs +135 -0
  35. package/engine/core/lib/notify/wecom.mjs +36 -0
  36. package/engine/core/lib/python.mjs +145 -0
  37. package/engine/core/lib/sop.mjs +116 -0
  38. package/engine/core/lib/versions.mjs +205 -0
  39. package/engine/core/mcp/client.mjs +67 -0
  40. package/engine/core/mcp/http.mjs +138 -0
  41. package/engine/core/mcp/server.mjs +702 -0
  42. package/engine/scripts/_engine_rules_probe.py +15 -0
  43. package/engine/scripts/analyze-full-day.py +568 -0
  44. package/engine/scripts/archive/feishu-bridge.js +246 -0
  45. package/engine/scripts/argent-agents.mjs +527 -0
  46. package/engine/scripts/argent-capabilities.mjs +776 -0
  47. package/engine/scripts/argent-catalog.mjs +186 -0
  48. package/engine/scripts/argent-datadir.py +62 -0
  49. package/engine/scripts/argent-doctor.mjs +624 -0
  50. package/engine/scripts/argent-env-write.mjs +302 -0
  51. package/engine/scripts/argent-schedule.mjs +620 -0
  52. package/engine/scripts/argent-setup-check.mjs +369 -0
  53. package/engine/scripts/argent-upgrade.mjs +1046 -0
  54. package/engine/scripts/base-bootstrap.sh +576 -0
  55. package/engine/scripts/billing-mode-daily.sh +13 -0
  56. package/engine/scripts/build-engine-package.mjs +126 -0
  57. package/engine/scripts/capability-packs.lock.json +484 -0
  58. package/engine/scripts/capability_pack.py +1242 -0
  59. package/engine/scripts/check-1.0-criteria.mjs +355 -0
  60. package/engine/scripts/check-agent-catalog.mjs +141 -0
  61. package/engine/scripts/check-billing-mode.sh +378 -0
  62. package/engine/scripts/check-child-sessions.mjs +83 -0
  63. package/engine/scripts/check-config-catalog.mjs +677 -0
  64. package/engine/scripts/check-docs-drift.mjs +522 -0
  65. package/engine/scripts/check-dsh-web-expose.sh +98 -0
  66. package/engine/scripts/check-judgment-drift.mjs +403 -0
  67. package/engine/scripts/check-license.mjs +199 -0
  68. package/engine/scripts/check-model-auth.py +443 -0
  69. package/engine/scripts/check-pack-closure.mjs +661 -0
  70. package/engine/scripts/check-portable-symbols.mjs +116 -0
  71. package/engine/scripts/check-preset-landing.mjs +124 -0
  72. package/engine/scripts/check-production-home.mjs +602 -0
  73. package/engine/scripts/check-role-mapping.mjs +461 -0
  74. package/engine/scripts/check-sample-redaction.mjs +320 -0
  75. package/engine/scripts/check-skill-classification.mjs +188 -0
  76. package/engine/scripts/check-sop-consistency.mjs +431 -0
  77. package/engine/scripts/check-test-env-safety.mjs +627 -0
  78. package/engine/scripts/check-version-consistency.mjs +452 -0
  79. package/engine/scripts/ci-run.sh +558 -0
  80. package/engine/scripts/collect-evidence.mjs +42 -0
  81. package/engine/scripts/config-explain.mjs +278 -0
  82. package/engine/scripts/configure-provider.rb +29 -0
  83. package/engine/scripts/customer-config-migrate.mjs +179 -0
  84. package/engine/scripts/customer-preflight.py +892 -0
  85. package/engine/scripts/customer-readiness.sh +135 -0
  86. package/engine/scripts/daily-report-inbox.py +242 -0
  87. package/engine/scripts/daily-report-reconcile.mjs +312 -0
  88. package/engine/scripts/daily-report.mjs +1310 -0
  89. package/engine/scripts/daily-report.sh +47 -0
  90. package/engine/scripts/data/lip-product-dict.json +306 -0
  91. package/engine/scripts/deliver-customer.mjs +932 -0
  92. package/engine/scripts/delivery-faces.txt +31 -0
  93. package/engine/scripts/desktop-trial.sh +146 -0
  94. package/engine/scripts/dev-window.sh +261 -0
  95. package/engine/scripts/drill-clean-machine.sh +315 -0
  96. package/engine/scripts/dsh-api-client.mjs +215 -0
  97. package/engine/scripts/dsh-backup-scope.sh +83 -0
  98. package/engine/scripts/dsh-offline-pack.mjs +77 -0
  99. package/engine/scripts/dsh-overlay-pin.sh +87 -0
  100. package/engine/scripts/dsh-plane.mjs +153 -0
  101. package/engine/scripts/dsh-portforward.py +223 -0
  102. package/engine/scripts/dsh-preflight.mjs +179 -0
  103. package/engine/scripts/dsh-release-watch-daily.sh +19 -0
  104. package/engine/scripts/dsh-release-watch.mjs +458 -0
  105. package/engine/scripts/dsh-remote-check.sh +99 -0
  106. package/engine/scripts/dsh-restart.sh +179 -0
  107. package/engine/scripts/dsh-restore.sh +111 -0
  108. package/engine/scripts/dsh-scope-rewire.mjs +803 -0
  109. package/engine/scripts/dsh-snapshot.mjs +116 -0
  110. package/engine/scripts/dsh-upgrade-readiness.mjs +165 -0
  111. package/engine/scripts/dsh-upgrade.mjs +612 -0
  112. package/engine/scripts/dsh-url.sh +86 -0
  113. package/engine/scripts/dsh-web-launch.mjs +155 -0
  114. package/engine/scripts/ensure-store-windows.py +509 -0
  115. package/engine/scripts/entitlements.py +458 -0
  116. package/engine/scripts/env_probe.py +411 -0
  117. package/engine/scripts/feishu-card.mjs +252 -0
  118. package/engine/scripts/final-check.mjs +43 -0
  119. package/engine/scripts/fix-skill-frontmatter.py +209 -0
  120. package/engine/scripts/flow-auto-retry.py +454 -0
  121. package/engine/scripts/flow-requirements.json +735 -0
  122. package/engine/scripts/flow-scaffold.py +275 -0
  123. package/engine/scripts/flow-timers-plist.sh +87 -0
  124. package/engine/scripts/flow-timers.sh +184 -0
  125. package/engine/scripts/flow-trigger-wake.mjs +284 -0
  126. package/engine/scripts/flow-trigger.sh +571 -0
  127. package/engine/scripts/flow_billing.py +354 -0
  128. package/engine/scripts/flow_capability_stats.py +314 -0
  129. package/engine/scripts/flow_case.py +194 -0
  130. package/engine/scripts/flow_claim.py +497 -0
  131. package/engine/scripts/flow_config.py +1025 -0
  132. package/engine/scripts/flow_failure.py +588 -0
  133. package/engine/scripts/flow_learn.py +105 -0
  134. package/engine/scripts/flow_ledger.py +235 -0
  135. package/engine/scripts/flow_policy.py +238 -0
  136. package/engine/scripts/flow_preflight.py +339 -0
  137. package/engine/scripts/flow_registry.py +341 -0
  138. package/engine/scripts/flow_retry.py +304 -0
  139. package/engine/scripts/flow_return_to_ops.py +191 -0
  140. package/engine/scripts/flow_source.py +315 -0
  141. package/engine/scripts/flow_sources/__init__.py +53 -0
  142. package/engine/scripts/flow_sources/cases_json.py +106 -0
  143. package/engine/scripts/flow_sources/common.py +428 -0
  144. package/engine/scripts/flow_sources/feishu_base.py +273 -0
  145. package/engine/scripts/flow_stale.py +185 -0
  146. package/engine/scripts/flow_status_reconcile.py +344 -0
  147. package/engine/scripts/flow_triage.py +849 -0
  148. package/engine/scripts/flow_write_verify.py +496 -0
  149. package/engine/scripts/fulfillment.js +586 -0
  150. package/engine/scripts/gen-agent-bundles.mjs +276 -0
  151. package/engine/scripts/gen-preset-rows.mjs +259 -0
  152. package/engine/scripts/init-ml.sh +2278 -0
  153. package/engine/scripts/install-internal-role.sh +190 -0
  154. package/engine/scripts/install-license.mjs +641 -0
  155. package/engine/scripts/install-one-shot.mjs +665 -0
  156. package/engine/scripts/integration_contract.py +220 -0
  157. package/engine/scripts/integrations/wenyao/adapter.py +98 -0
  158. package/engine/scripts/integrations/xzh/adapter.py +75 -0
  159. package/engine/scripts/invoice-mapping.example.json +40 -0
  160. package/engine/scripts/invoice-table.sh +195 -0
  161. package/engine/scripts/invoice_carrier_notice.py +279 -0
  162. package/engine/scripts/invoice_fail_closeout.py +297 -0
  163. package/engine/scripts/invoice_lip_runner.py +1508 -0
  164. package/engine/scripts/invoice_lip_runner.py.bak-20260922-1710-freready +1090 -0
  165. package/engine/scripts/invoice_ready_audit.py +191 -0
  166. package/engine/scripts/invoice_runner.py +675 -0
  167. package/engine/scripts/invoice_stageb.py +516 -0
  168. package/engine/scripts/launchd/com.whyshu.argent-bridge.plist.example +42 -0
  169. package/engine/scripts/launchd/com.whyshu.fulfillment-poll.plist.example +29 -0
  170. package/engine/scripts/lease.py +377 -0
  171. package/engine/scripts/lib/agent-install.mjs +649 -0
  172. package/engine/scripts/lib/argent-datadir.mjs +16 -0
  173. package/engine/scripts/lib/argent-datadir.sh +18 -0
  174. package/engine/scripts/lib/argent_datadir.py +285 -0
  175. package/engine/scripts/lib/argent_filelock.py +507 -0
  176. package/engine/scripts/lib/bootcheck-wiring.mjs +510 -0
  177. package/engine/scripts/lib/cdp_ports.py +197 -0
  178. package/engine/scripts/lib/customer-env.mjs +102 -0
  179. package/engine/scripts/lib/daily-report-core.mjs +517 -0
  180. package/engine/scripts/lib/dep-declaration.mjs +81 -0
  181. package/engine/scripts/lib/deps-migrate.mjs +310 -0
  182. package/engine/scripts/lib/dsh-host-resolve.mjs +109 -0
  183. package/engine/scripts/lib/dsh-scope.mjs +500 -0
  184. package/engine/scripts/lib/dsh-snapshot-path.mjs +35 -0
  185. package/engine/scripts/lib/dsh-versions.mjs +96 -0
  186. package/engine/scripts/lib/dsh-web-probe.mjs +214 -0
  187. package/engine/scripts/lib/is-direct-run.mjs +61 -0
  188. package/engine/scripts/lib/patch-compose.mjs +241 -0
  189. package/engine/scripts/lib/patch-target.mjs +35 -0
  190. package/engine/scripts/lib/plugin-lifecycle.mjs +128 -0
  191. package/engine/scripts/lib/plugin-packages.mjs +332 -0
  192. package/engine/scripts/lib/preset-compat.mjs +127 -0
  193. package/engine/scripts/lib/preset-install.mjs +575 -0
  194. package/engine/scripts/lib/preset-mechanism.mjs +56 -0
  195. package/engine/scripts/lib/preset-sync.mjs +59 -0
  196. package/engine/scripts/lib/profile-retire.mjs +97 -0
  197. package/engine/scripts/lib/python-runtime.mjs +190 -0
  198. package/engine/scripts/lib/registry.mjs +72 -0
  199. package/engine/scripts/lib/repo-root.sh +56 -0
  200. package/engine/scripts/lib/schedule-mechanism.mjs +659 -0
  201. package/engine/scripts/lib/schedule-probe.mjs +835 -0
  202. package/engine/scripts/lib/scope-pointer.mjs +164 -0
  203. package/engine/scripts/lib/settings-panels.mjs +816 -0
  204. package/engine/scripts/lib/stdio_utf8.py +86 -0
  205. package/engine/scripts/lib/wake-auth.mjs +392 -0
  206. package/engine/scripts/lib/webdriver_ipc.py +264 -0
  207. package/engine/scripts/lib/zstd-frames.mjs +104 -0
  208. package/engine/scripts/license-e2e-drill.mjs +426 -0
  209. package/engine/scripts/license-gate.mjs +245 -0
  210. package/engine/scripts/lip_backlog.py +171 -0
  211. package/engine/scripts/lip_table.py +185 -0
  212. package/engine/scripts/local-usage.mjs +214 -0
  213. package/engine/scripts/migrate-providers.mjs +127 -0
  214. package/engine/scripts/migrate-skills.sh +65 -0
  215. package/engine/scripts/ml-oauth-setup.mjs +550 -0
  216. package/engine/scripts/ml-store-ids.json +26 -0
  217. package/engine/scripts/ml_artifact_attribution.py +333 -0
  218. package/engine/scripts/ml_capacity_probe.py +1158 -0
  219. package/engine/scripts/ml_hub_status.py +1556 -0
  220. package/engine/scripts/ml_schema_check.py +115 -0
  221. package/engine/scripts/ml_store_ids.py +139 -0
  222. package/engine/scripts/npm-publish-argent.mjs +499 -0
  223. package/engine/scripts/npm-publish-argent.sh +20 -0
  224. package/engine/scripts/orchestrator.py +13811 -0
  225. package/engine/scripts/pack-plugins.mjs +140 -0
  226. package/engine/scripts/patches/dsh-llm-deepseek--transport-diagnostics.patch +297 -0
  227. package/engine/scripts/patches/dsh-session--append-message-shape.patch +15 -0
  228. package/engine/scripts/patches/dsh-session--tool-result-block-017.patch +28 -0
  229. package/engine/scripts/patches/dsh-session-format-v0-to-v1--permission-preset-origin.patch +11 -0
  230. package/engine/scripts/patches/dsh-session-format-v3-to-v4--turn-outside-replace.patch +20 -0
  231. package/engine/scripts/patches/dsh-session-persistence-jsonl--worker-bundled-migrators.patch +39 -0
  232. package/engine/scripts/patches/dsh-tools--render-return-shape.patch +50 -0
  233. package/engine/scripts/patches/verify-bundled-migrators.mjs +79 -0
  234. package/engine/scripts/patches/verify-hardening.mjs +167 -0
  235. package/engine/scripts/patches/verify-session-migration.mjs +149 -0
  236. package/engine/scripts/patches/verify-transport-diagnostics.mjs +227 -0
  237. package/engine/scripts/plan-role-rename.mjs +125 -0
  238. package/engine/scripts/plugin-bootcheck.mjs +451 -0
  239. package/engine/scripts/plugin-composition.json +15 -0
  240. package/engine/scripts/poc-mcp-host.mjs +455 -0
  241. package/engine/scripts/poll-fulfillment.sh +295 -0
  242. package/engine/scripts/poll-invoice.sh +76 -0
  243. package/engine/scripts/profile-doctor.mjs +686 -0
  244. package/engine/scripts/provider-select.sh +71 -0
  245. package/engine/scripts/provider-switch.sh +146 -0
  246. package/engine/scripts/provider-sync-target.check.mjs +64 -0
  247. package/engine/scripts/python-runtime.sh +78 -0
  248. package/engine/scripts/query_runner.py +310 -0
  249. package/engine/scripts/release-argent.sh +574 -0
  250. package/engine/scripts/repair-unresolved-tools.mjs +178 -0
  251. package/engine/scripts/retire-inventory.mjs +40 -0
  252. package/engine/scripts/run-tests.sh +257 -0
  253. package/engine/scripts/s1-audit.mjs +85 -0
  254. package/engine/scripts/self-sign-license.mjs +179 -0
  255. package/engine/scripts/session-health-scan.mjs +63 -0
  256. package/engine/scripts/session-repair-tool-result-content.mjs +181 -0
  257. package/engine/scripts/setup.sh +22 -0
  258. package/engine/scripts/skill-install.mjs +629 -0
  259. package/engine/scripts/sku_translate.py +148 -0
  260. package/engine/scripts/sync-plugins.sh +90 -0
  261. package/engine/scripts/sync-presets.sh +27 -0
  262. package/engine/scripts/sync-scripts.sh +445 -0
  263. package/engine/scripts/telemetry.py +873 -0
  264. package/engine/scripts/ui-copy-count.mjs +220 -0
  265. package/engine/scripts/usage-anchor.sh +137 -0
  266. package/engine/scripts/usage_report.py +531 -0
  267. package/engine/scripts/validate-preset-schema.mjs +208 -0
  268. package/engine/scripts/vertical-init.mjs +323 -0
  269. package/engine/scripts/vertical-lint.mjs +482 -0
  270. package/engine/scripts/wenyao-browser.sh +74 -0
  271. package/engine/scripts/wenyao-fixture-export.py +116 -0
  272. package/engine/scripts/wenyao-invoice-writeback.mjs +540 -0
  273. package/engine/scripts/wenyao-login.sh +35 -0
  274. package/engine/scripts/wenyao-template-map.json +292 -0
  275. package/engine/scripts/wenyao_attach.py +131 -0
  276. package/engine/scripts/wenyao_download_template.py +144 -0
  277. package/engine/scripts/wenyao_fill_template.py +568 -0
  278. package/engine/scripts/wenyao_login.py +145 -0
  279. package/engine/scripts/wenyao_portal.py +633 -0
  280. package/engine/scripts/wenyao_recon.py +230 -0
  281. package/engine/scripts/wenyao_run.py +503 -0
  282. package/engine/scripts/wenyao_shadow_diff.py +160 -0
  283. package/engine/scripts/wenyao_skill_contract.py +156 -0
  284. package/engine/scripts/wenyao_template_fetch.py +175 -0
  285. package/engine/scripts/win/dsh-web-autostart.ps1 +372 -0
  286. package/engine/scripts/ziniao-auth-probe.sh +268 -0
  287. package/engine/scripts/ziniao-keepalive.sh +217 -0
  288. package/engine/scripts/ziniao-post-upgrade-check.sh +121 -0
  289. package/engine/scripts/ziniao-windows.sh +154 -0
  290. package/engine/skills/README.md +86 -0
  291. package/engine/skills/argent-dev/SKILL.md +41 -0
  292. package/engine/skills/internal.json +37 -0
  293. package/engine/skills/lktop-pm/SKILL.md +35 -0
  294. package/engine/skills/lktopapp-dev/SKILL.md +34 -0
  295. package/engine/skills/ml-config-guide/SKILL.md +50 -0
  296. package/engine/skills/ml-fulfillment-sop/SKILL.md +178 -0
  297. package/engine/skills/ml-fulfillment-sop/references/andes-components.md +69 -0
  298. package/engine/skills/ml-fulfillment-sop/references/cdp-port-mapping.md +35 -0
  299. package/engine/skills/ml-fulfillment-sop/references/feishu-base-fulfillment-schema.md +136 -0
  300. package/engine/skills/ml-fulfillment-sop/references/multi-window-concurrency.md +69 -0
  301. package/engine/skills/ml-fulfillment-sop/references/pitfalls.md +77 -0
  302. package/engine/skills/ml-fulfillment-sop/references/selectors.md +243 -0
  303. package/engine/skills/ml-fulfillment-sop/scripts/fulfillment.js +586 -0
  304. package/engine/skills/ml-fulfillment-sop/scripts/poll-and-execute.sh +271 -0
  305. package/engine/skills/ml-fulfillment-sop/templates/report.md +55 -0
  306. package/engine/skills/ml-invoice/SKILL.md +506 -0
  307. package/engine/skills/ml-invoice/references/pitfalls.md +268 -0
  308. package/engine/skills/ml-invoice/references/portal-flow.md +360 -0
  309. package/engine/skills/ml-invoice/references/template-fill-contract.md +133 -0
  310. package/engine/skills/ml-invoice-xzh/SKILL.md +133 -0
  311. package/engine/skills/ml-invoice-xzh/references/pitfalls.md +230 -0
  312. package/engine/skills/ml-store-daily-report/SKILL.md +224 -0
  313. package/engine/skills/ml-store-daily-report/scripts/README.md +25 -0
  314. package/engine/skills/ml-store-daily-report/scripts/extract.js +691 -0
  315. package/engine/skills/ml-store-daily-report/scripts/generate.js +299 -0
  316. package/engine/skills/pet-dev/SKILL.md +42 -0
  317. package/engine/skills/whyshu-pm/SKILL.md +35 -0
  318. package/engine/skills/whyshu-web-dev/SKILL.md +50 -0
  319. package/engine/version.mjs +1 -0
  320. package/engine/verticals/README.md +103 -0
  321. package/engine/verticals/_engine-words.baseline.txt +237 -0
  322. package/engine/verticals/_engine-words.json +19 -0
  323. package/engine/verticals/mercadolibre/README.md +43 -0
  324. package/engine/verticals/mercadolibre/config.json +709 -0
  325. package/engine/verticals/mercadolibre/flows.json +738 -0
  326. package/engine/verticals/mercadolibre/manifest.json +538 -0
  327. package/engine/verticals/mercadolibre/migrate-machine-state.mjs +138 -0
  328. package/engine/verticals/mercadolibre/preflight.py +143 -0
  329. package/engine/verticals/mercadolibre/prompts/daily-report.failure.md +69 -0
  330. package/engine/verticals/mercadolibre/prompts/daily-report.md +47 -0
  331. package/engine/verticals/mercadolibre/prompts/daily-report.scheduled.md +79 -0
  332. package/engine/verticals/mercadolibre/prompts/full.failure.md +125 -0
  333. package/engine/verticals/mercadolibre/prompts/full.md +91 -0
  334. package/engine/verticals/mercadolibre/prompts/wenyao-invoice.failure.md +88 -0
  335. package/engine/verticals/mercadolibre/prompts/wenyao-invoice.md +64 -0
  336. package/engine/verticals/mercadolibre/prompts/xzh-invoice.failure.md +91 -0
  337. package/engine/verticals/mercadolibre/prompts/xzh-invoice.md +46 -0
  338. package/package.json +22 -4
  339. package/requirements.txt +5 -0
  340. package/README.md +0 -3
@@ -0,0 +1,369 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * argent-setup-check —— **安装后 setup 的只读自检入口**(0.6.0 W4)。
4
+ *
5
+ * ══════════════════════════════════════════════════════════════════════════
6
+ * 它回答的问题(一句话)
7
+ * ══════════════════════════════════════════════════════════════════════════
8
+ * 「装上 bundle 之后,那四件副作用到底补齐了没有?」——**只读**读状态文件
9
+ * (`<数据目录>/setup-state.json`)**并且**实地探测一遍(venv 能不能跑、数据目录在不在、
10
+ * 凭据槽位在不在、定时器声明与当前宿主是否匹配),逐条给 ✅/❌ 与**怎么修**。
11
+ *
12
+ * ## 为什么"读状态文件 + 实地探测"两件都要做
13
+ * · 只看状态文件 ⇒ 它可能停在上一轮(venv 事后被删/被换、凭据被清空);
14
+ * · 只探测 ⇒ 分不清"缺件"与"探测证据不足"(超时/文件不可读),会把不确定说成故障。
15
+ * 故:**探测为准,状态文件用于解释"为什么缺"与给出修法**。
16
+ *
17
+ * ## 退出码(照仓库既有的三态惯例)
18
+ * · `0` = 全绿;
19
+ * · `1` = 有红(确定的缺件);
20
+ * · `2` = **证据不足**(探测超时 / 拿不到状态文件 / 找不到插件包 / 数据目录判据不可用)
21
+ * —— ⛔ 不把"不知道"说成"坏了"。
22
+ *
23
+ * ## 纪律
24
+ * · **零写入**:本脚本一个字节都不写(连状态文件都不写;补建走宿主启动期或安装器);
25
+ * · **零网络**;⛔ **不打印任何凭据值**(只报槽位名在不在);
26
+ * · 判据全部来自插件包内的 `src/argent-setup.mjs`(⛔ 不在这里重写第二份),
27
+ * 数据目录仍走内核唯一判据(`core/lib/argent-datadir.mjs`)。
28
+ *
29
+ * 用法:
30
+ * node scripts/argent-setup-check.mjs [--data-dir <目录>] [--state-only] [--json]
31
+ * [--engine <插件包根>] [--scope-dir <dsh scope>]
32
+ */
33
+ import { existsSync, readdirSync } from 'node:fs'
34
+ import { homedir } from 'node:os'
35
+ import { join, resolve } from 'node:path'
36
+ import { fileURLToPath, pathToFileURL } from 'node:url'
37
+ import { isDirectRun } from './lib/is-direct-run.mjs'
38
+
39
+ const HERE = fileURLToPath(new URL('.', import.meta.url))
40
+ const REPO = resolve(HERE, '..')
41
+
42
+ /** 参数解析(未知参数 ⇒ 用法错误,退出 2)。 */
43
+ export function parseArgs(argv = process.argv.slice(2)) {
44
+ const out = { dataDir: '', dshHome: '', engine: '', scopeDir: '', stateOnly: false, json: false, help: false }
45
+ for (let i = 0; i < argv.length; i += 1) {
46
+ const a = argv[i]
47
+ if (a === '--data-dir') { out.dataDir = String(argv[++i] || ''); continue }
48
+ if (a === '--dsh-home') { out.dshHome = String(argv[++i] || ''); continue }
49
+ if (a === '--engine') { out.engine = String(argv[++i] || ''); continue }
50
+ if (a === '--scope-dir') { out.scopeDir = String(argv[++i] || ''); continue }
51
+ if (a === '--state-only') { out.stateOnly = true; continue }
52
+ if (a === '--json') { out.json = true; continue }
53
+ if (a === '-h' || a === '--help') { out.help = true; continue }
54
+ return { ...out, error: `未知参数:${a}` }
55
+ }
56
+ return out
57
+ }
58
+
59
+ /**
60
+ * 找插件包里的判据实现(⛔ 不复制第二份)。
61
+ * 落点顺序:显式 `--engine` / `ARGENT_CORE_DIR` → 本仓库 → 安装克隆 → 各 profile 的 `node_modules`。
62
+ * 找不到 ⇒ 调用方按**证据不足**(exit 2)处置,而不是猜一个。
63
+ */
64
+ export function engineCandidates({ env = process.env, home = homedir(), repo = REPO } = {}) {
65
+ const out = []
66
+ const push = (p) => { if (p && !out.includes(p)) out.push(p) }
67
+ push(env.ARGENT_CORE_DIR)
68
+ push(join(repo, 'plugins', 'argent-core', 'src', 'argent-setup.mjs'))
69
+ const dshHome = env.DSH_HOME || join(home, '.dsh')
70
+ for (const clone of [env.ARGENT_DISH_HOME, join(home, '.argent-dsh'), join(home, 'Code', 'argent-dsh')]) {
71
+ if (clone) push(join(clone, 'plugins', 'argent-core', 'src', 'argent-setup.mjs'))
72
+ }
73
+ const profile = env.DSH_PROFILE || 'web'
74
+ push(join(dshHome, 'profiles', profile, 'node_modules', '@whyshu', 'argent-core', 'src', 'argent-setup.mjs'))
75
+ // 其它 profile(不知名 ⇒ 扫一遍目录名,只读)
76
+ try {
77
+ for (const p of readdirSync(join(dshHome, 'profiles'))) {
78
+ push(join(dshHome, 'profiles', p, 'node_modules', '@whyshu', 'argent-core', 'src', 'argent-setup.mjs'))
79
+ }
80
+ } catch { /* 没有 profiles 目录 */ }
81
+ return out
82
+ }
83
+
84
+ /** dsh 作用域候选(判"原生排程在不在")。 */
85
+ export function scopeDirCandidates({ env = process.env, home = homedir() } = {}) {
86
+ const out = []
87
+ const dshHome = env.DSH_HOME || join(home, '.dsh')
88
+ if (env.DSH_SCOPE) out.push(env.DSH_SCOPE)
89
+ const profile = env.DSH_PROFILE || 'web'
90
+ out.push(join(dshHome, 'profiles', profile, 'node_modules', '@deepseek-ai'))
91
+ return out.filter(Boolean)
92
+ }
93
+
94
+ /** 逐条判据 → `{ id, ok, detail, fix }`;`ok === null` = 证据不足。 */
95
+ export function buildChecks({ engine, dataDir, state, scopeDirs = [], stateOnly = false, probe = null, dshHome = '',
96
+ /** L1 判据(`scripts/lib/schedule-mechanism.mjs#detectScheduleMechanism()`)的现算结果;✅ 由 `main()` 注入 */
97
+ scheduleLive = null }) {
98
+ const checks = []
99
+ const venvDir = engine.venvDirOf(dataDir)
100
+ const venvPython = engine.venvLayout(venvDir).python
101
+
102
+ // ① 数据目录骨架(判据分档:**没有状态文件** ⇒ 这份安装压根没跑过 setup ⇒ 证据不足,⛔ 不刷红)
103
+ {
104
+ const missing = engine.REQUIRED_SUBDIRS.filter((s) => !existsSync(join(dataDir, s.name))).map((s) => s.name)
105
+ checks.push({
106
+ id: 'data-dir',
107
+ ok: missing.length === 0 ? true : (state ? false : null),
108
+ detail: missing.length === 0
109
+ ? `数据目录骨架齐(${dataDir};${engine.REQUIRED_SUBDIRS.length} 项)`
110
+ : (state
111
+ ? `数据目录骨架缺 ${missing.join('/')}(${dataDir})——状态文件说建过,但目录不在`
112
+ : `证据不足:骨架缺 ${missing.join('/')},且没有状态文件 ⇒ 这份安装没跑过 setup(未安装)`),
113
+ fix: missing.length ? ['重跑宿主让插件补齐(启动期幂等 setup 会建)', '或手动:mkdir -p ' + missing.map((m) => join(dataDir, m)).join(' ')] : [],
114
+ })
115
+ }
116
+
117
+ // ② 状态文件(形状)
118
+ // ⚠️ 三态:**有文件且形状对** ⇒ 绿;**有这个文件但读不出形状** ⇒ 红(坏文件是真故障);
119
+ // **没有这个文件** ⇒ 证据不足(这份安装没跑过 setup —— 说它"坏"是冤枉,说它"好"是撒谎)。
120
+ {
121
+ const has = existsSync(engine.stateFile(dataDir))
122
+ checks.push({
123
+ id: 'state-file',
124
+ ok: state ? true : (has ? false : null),
125
+ detail: state
126
+ ? `状态文件在位(${engine.stateFile(dataDir)};version=${state.version};at=${state.at})`
127
+ : (has
128
+ ? `状态文件在但**形状不认识**(${engine.stateFile(dataDir)})——版本或字段对不上这份契约`
129
+ : `证据不足:没有状态文件(${engine.stateFile(dataDir)})⇒ 这份安装没跑过安装后 setup`),
130
+ fix: state ? [] : ['重启宿主(插件启动期会写一次)', '或重跑安装器:node install-argent.mjs'],
131
+ })
132
+ }
133
+
134
+ // ③ Python 运行时(探测;state-only 时只看状态文件)
135
+ {
136
+ let verdict = null
137
+ if (!stateOnly) {
138
+ verdict = (probe || engine.probeVenv)(venvPython)
139
+ }
140
+ const step = state && state.steps ? state.steps['python-runtime'] : null
141
+ if (verdict) {
142
+ if (verdict.state === 'ready') {
143
+ checks.push({ id: 'python-runtime', ok: true, detail: `venv 可跑(${venvPython};${engine.VENV_PKGS.join(' / ')} 可 import)`, fix: [] })
144
+ } else if (verdict.state === 'timeout') {
145
+ checks.push({
146
+ id: 'python-runtime',
147
+ ok: null,
148
+ detail: `证据不足:${verdict.reason}(${venvPython})——⛔ 不判红`,
149
+ fix: ['重跑一次(机器忙时探测可能超时)', '仍超时再查:该解释器是否卡在 NFS/被杀软扫描'],
150
+ })
151
+ } else if (!state) {
152
+ // 没有状态文件 ⇒ 不知道这份安装的 venv 应不应该在(可能压根没装过)⇒ 证据不足
153
+ const at = verdict.path || venvPython
154
+ // 探测已经**读到了版本**时把它写进结论(差在版本上而不写版本号 = 现场要多跑一次才知道差多少)
155
+ const ver = verdict.foundVersion ? `(实测 ${verdict.foundVersion})` : ''
156
+ checks.push({
157
+ id: 'python-runtime',
158
+ ok: null,
159
+ detail: `证据不足:${verdict.reason}${ver}(${at}),且没有状态文件 ⇒ 无法判断这份安装是否该有它`,
160
+ fix: ['重跑安装器补齐运行时:node install-argent.mjs --venv-only', '或重启宿主让插件后台补建'],
161
+ })
162
+ } else {
163
+ const repair = step && step.repair && Array.isArray(step.repair.lines) ? step.repair.lines : engine.repairHint({ dataDir }).lines
164
+ const at = verdict.path || venvPython
165
+ const ver = verdict.foundVersion ? `(实测 ${verdict.foundVersion})` : ''
166
+ checks.push({ id: 'python-runtime', ok: false, detail: `${verdict.reason}${ver}:${at}`, fix: repair })
167
+ }
168
+ } else if (step) {
169
+ checks.push({
170
+ id: 'python-runtime',
171
+ ok: step.ok === true ? true : (step.ok === false ? false : null),
172
+ detail: `(--state-only)状态文件记:${step.detail}`,
173
+ fix: step.repair && Array.isArray(step.repair.lines) ? step.repair.lines : [],
174
+ })
175
+ } else {
176
+ checks.push({ id: 'python-runtime', ok: null, detail: '(--state-only)状态文件里没有这一步的记录', fix: ['重启宿主或重跑安装器'] })
177
+ }
178
+ }
179
+
180
+ // ④ 凭据槽位(只读键名)
181
+ {
182
+ // 凭据文件落点:显式 `--dsh-home` → 状态文件里记的宿主 home(插件写进去的那个)→ 环境/默认。
183
+ // ⛔ 绝不"猜"到另一个实例的凭据文件上(那会把别的实例的状态当成本机结论)。
184
+ const home = dshHome || (state && state.host && state.host.dshHome) || process.env.DSH_HOME || join(homedir(), '.dsh')
185
+ const file = join(home, '.credentials.yaml')
186
+ const names = engine.DEFAULT_CREDENTIAL_NAMES
187
+ if (!state) {
188
+ // ⛔ 没有状态文件 = 这份安装压根没跑过 setup ⇒ 凭据缺失不是"新故障",
189
+ // 报成"证据不足"(否则全新目录会同时刷 4 条红,把真正的红灯埋掉)
190
+ checks.push({
191
+ id: 'credential-slots',
192
+ ok: null,
193
+ detail: `证据不足:没有状态文件,不知道这份安装声明了哪些槽位(当前看 ${file})`,
194
+ fix: ['重启宿主(插件启动期会写一次状态)'],
195
+ })
196
+ } else {
197
+ const slots = engine.credentialSlotNames(file)
198
+ const missing = names.filter((n) => !slots.names.includes(n))
199
+ checks.push({
200
+ id: 'credential-slots',
201
+ ok: missing.length === 0,
202
+ detail: missing.length === 0
203
+ ? `凭据槽位齐(${names.join(' ')};只读键名)`
204
+ : `凭据槽位缺:${missing.join(' ')}(${file};${slots.reason})——⛔ 这里不读值、也不代写`,
205
+ fix: missing.length ? ['在宿主里登录/填 Key(设置页 → Argent),或让安装器写入槽位', '自查:dsh credentials list'] : [],
206
+ })
207
+ }
208
+ }
209
+
210
+ // ⑤ 定时器(**唯一判据**在 L1:scripts/lib/schedule-mechanism.mjs;本处只做"状态文件 vs 现算"对账)
211
+ {
212
+ const step = state && state.steps ? state.steps.timer : null
213
+ // ⛔ 不再自己 `existsSync(join(d,'dsh-schedule'))` 粗判(那是第二份判据)——
214
+ // 判据走 L1 的同一份实现(声明面 = 注册表 `schedule.mechanism`,证据 = 原生包 / 已装计划任务)。
215
+ const live = scheduleLive || {
216
+ state: 'unknown', declared: 'unknown',
217
+ reason: '调用方没给现算判据(buildChecks 的 scheduleLive 缺省为空)', next: [],
218
+ }
219
+ if (!step) {
220
+ checks.push({
221
+ id: 'timer', ok: null,
222
+ detail: `(状态文件里没有定时器声明这一步)|当前判据:${live.state}(${live.reason})`,
223
+ fix: ['重启宿主让插件写一次声明', '或直接看判据:node scripts/argent-schedule.mjs mechanism'],
224
+ })
225
+ } else {
226
+ const recorded = String(step.mechanism || 'unknown')
227
+ // 判据(三态,⛔ 别把"缺证据"当"故障"):
228
+ // · 判据判红(`conflict`)⇒ 红;
229
+ // · 现算给出**确定性**结论(native/activation-shim/none)却与状态文件记录不符 ⇒ 红(宿主/组合变了,需重启重写);
230
+ // · 现算 `unknown`(证据不足)∧ 状态文件**已有**记录 ⇒ **黄**:`ok=true` 但 `unknown=true`
231
+ // (进不了"全绿"的结论行,但**不把已装好的机器判成坏的** —— 这正是 F1 的 npx 形态);
232
+ // · 现算 `unknown` ∧ 状态文件**没有**记录 ⇒ 证据不足(`ok=null` ⇒ 退出码 2);
233
+ // · 其余 ⇒ 绿。
234
+ const definite = ['native', 'activation-shim', 'none'].includes(live.state)
235
+ let okCode = null
236
+ let unknownFlag = false
237
+ let detail = ''
238
+ if (live.state === 'conflict') {
239
+ okCode = false
240
+ detail = `❌ 两个调度者同时在:${live.reason}`
241
+ } else if (definite && recorded !== live.state) {
242
+ okCode = false
243
+ detail = `状态文件记 ${recorded},现算 ${live.state}(${live.reason})⇒ 不一致(多半是宿主/组合变了,需重启重写)`
244
+ } else if (live.state === 'unknown') {
245
+ // 现算证据不足 ⇒ 与状态文件的记录**无法对账**(`unknown` 记录本身也等于"没记")⇒ **黄**,⛔ 不判红。
246
+ okCode = true
247
+ unknownFlag = true
248
+ detail = `⚠️ 现算证据不足(${live.reason})⇒ 沿用状态文件记录 ${recorded === 'unknown' ? '(记录也是 unknown)' : recorded};⛔ 别顺手装 cron:${(live.next || [])[0] || ''}`
249
+ } else {
250
+ okCode = true
251
+ detail = `定时机制与判据一致(${live.state}|声明 ${live.declared})—— ${live.reason}`
252
+ }
253
+ checks.push({
254
+ id: 'timer', ok: okCode, ...(unknownFlag ? { unknown: true } : {}), detail,
255
+ fix: okCode === true ? [] : [
256
+ ...(live.state === 'conflict' ? ['二选一:关垫片(`bash scripts/flow-timers.sh uninstall --flow <flow>`)或关原生(会话内 `schedule_delete`)'] : []),
257
+ ...(live.state === 'unknown' ? (live.next || []) : []),
258
+ '自查:`node scripts/argent-schedule.mjs mechanism`(同一份判据)',
259
+ ].slice(0, 4),
260
+ })
261
+ }
262
+ }
263
+
264
+ return checks
265
+ }
266
+
267
+ /** 三态退出码:全绿 0 / 有红 1 / 证据不足(且无红)2。 */
268
+ export function exitCodeOf(checks) {
269
+ if (checks.some((c) => c.ok === false)) return 1
270
+ if (checks.some((c) => c.ok === null)) return 2
271
+ return 0
272
+ }
273
+
274
+ async function main() {
275
+ const args = parseArgs()
276
+ if (args.error) {
277
+ console.error(`argent-setup-check: ✗ ${args.error}`)
278
+ console.log('用法:node scripts/argent-setup-check.mjs [--data-dir <目录>] [--dsh-home <宿主 home>] [--state-only] [--json]')
279
+ process.exit(2)
280
+ }
281
+ if (args.help) {
282
+ console.log('用法:node scripts/argent-setup-check.mjs [--data-dir <目录>] [--dsh-home <宿主 home>] [--state-only] [--json] [--engine <插件包根>] [--scope-dir <dsh scope>]')
283
+ process.exit(0)
284
+ }
285
+
286
+ // 判据实现(插件包内)——找不到 ⇒ 证据不足,⛔ 不猜
287
+ // ⚠️ 显式 `--engine` ⇒ 只认它:找不到就**响亮失败**(⛔ 不许悄悄退回自动探测 ——
288
+ // "我明明指定了"必须是真话,否则测的是另一个副本而没有任何提示)
289
+ const explicitEngine = args.engine ? [join(args.engine, 'src', 'argent-setup.mjs')] : []
290
+ const enginePath = (explicitEngine.length ? explicitEngine : [...engineCandidates(), args.engine].filter(Boolean))
291
+ .find((p) => { try { return existsSync(p) } catch { return false } })
292
+ if (!enginePath) {
293
+ console.error('argent-setup-check: 证据不足 —— 找不到插件包内的判据实现(plugins/argent-core/src/argent-setup.mjs)')
294
+ console.error(' 修法:--engine <仓库或克隆路径>,或设置 ARGENT_CORE_DIR')
295
+ process.exit(2)
296
+ }
297
+ let engine
298
+ try {
299
+ engine = await import(pathToFileURL(enginePath).href)
300
+ } catch (error) {
301
+ console.error(`argent-setup-check: 证据不足 —— 判据实现加载失败(${enginePath}):${String((error && error.message) || error)}`)
302
+ process.exit(2)
303
+ }
304
+
305
+ // 数据目录:显式 → 内核唯一判据(⛔ 不自己拼第二份链)
306
+ let dataDir = args.dataDir
307
+ if (!dataDir) {
308
+ const kernelCands = [
309
+ join(REPO, 'core', 'lib', 'argent-datadir.mjs'),
310
+ join(process.env.ARGENT_DSH_REPO || '', 'core', 'lib', 'argent-datadir.mjs'),
311
+ join(process.env.ARGENT_DISH_HOME || join(homedir(), '.argent-dsh'), 'core', 'lib', 'argent-datadir.mjs'),
312
+ join(homedir(), 'Code', 'argent-dsh', 'core', 'lib', 'argent-datadir.mjs'),
313
+ ].filter(Boolean)
314
+ let kernel = null
315
+ for (const p of kernelCands) {
316
+ if (!existsSync(p)) continue
317
+ try {
318
+ const mod = await import(pathToFileURL(p).href)
319
+ if (mod && typeof mod.resolveDataDir === 'function') { kernel = mod; break }
320
+ } catch { /* 试下一个 */ }
321
+ }
322
+ if (!kernel) {
323
+ console.error('argent-setup-check: 证据不足 —— 内核数据目录判据取不到(core/lib/argent-datadir.mjs)')
324
+ console.error(' 修法:--data-dir <你的数据目录>,或确认安装克隆里有 core/')
325
+ process.exit(2)
326
+ }
327
+ dataDir = kernel.resolveDataDir({ env: process.env }).dir
328
+ }
329
+
330
+ const state = engine.readSetupState(dataDir)
331
+ const scopeDirs = args.scopeDir ? [args.scopeDir] : scopeDirCandidates()
332
+ // ⑤ 定时机制的**现算判据**(唯一实现 = L1 schedule-mechanism;本文件不写第二份)
333
+ const dshHome = args.dshHome || process.env.DSH_HOME || join(homedir(), '.dsh')
334
+ const profile = process.env.DSH_PROFILE || 'web'
335
+ let scheduleLive = null
336
+ for (const p of [join(REPO, 'scripts', 'lib', 'schedule-mechanism.mjs'),
337
+ join(process.env.ARGENT_DSH_REPO || '', 'scripts', 'lib', 'schedule-mechanism.mjs'),
338
+ join(process.env.ARGENT_DISH_HOME || join(homedir(), '.argent-dsh'), 'scripts', 'lib', 'schedule-mechanism.mjs')].filter(Boolean)) {
339
+ if (!existsSync(p)) continue
340
+ try {
341
+ const mod = await import(pathToFileURL(p).href)
342
+ scheduleLive = await mod.detectScheduleMechanism({ dshHome, profile, repo: REPO, scopeDirs: scopeDirs.length ? scopeDirs : null })
343
+ break
344
+ } catch (error) {
345
+ scheduleLive = { state: 'unknown', declared: 'unknown', reason: `L1 判据加载/运行失败(${p}):${String((error && error.message) || error).slice(0, 120)}`, next: [] }
346
+ }
347
+ }
348
+ if (!scheduleLive) scheduleLive = { state: 'unknown', declared: 'unknown', reason: '找不到 L1 判据模块(scripts/lib/schedule-mechanism.mjs)', next: ['确认安装克隆/仓库里有 scripts/lib/schedule-mechanism.mjs(同步面 scripts/)'] }
349
+ const checks = buildChecks({ engine, dataDir, state, scopeDirs, stateOnly: args.stateOnly, dshHome: args.dshHome, scheduleLive })
350
+ const code = exitCodeOf(checks)
351
+
352
+ if (args.json) {
353
+ console.log(JSON.stringify({ dataDir, engine: enginePath, exit: code, checks }, null, 2))
354
+ } else {
355
+ console.log(`\n安装后 setup 自检(只读)—— 数据目录:${dataDir}`)
356
+ for (const c of checks) {
357
+ const mark = c.ok === true ? '✅' : (c.ok === false ? '❌' : '❔')
358
+ console.log(` ${mark} [${c.id}] ${c.detail}`)
359
+ if (c.ok !== true && c.fix.length) for (const f of c.fix) console.log(` 修法:${f}`)
360
+ }
361
+ const red = checks.filter((c) => c.ok === false).length
362
+ const unknown = checks.filter((c) => c.ok === null).length
363
+ console.log(`\n 结论:${code === 0 ? '全绿' : code === 1 ? `${red} 条红` : '证据不足(不判红)'}`
364
+ + `${unknown ? `;${unknown} 条证据不足` : ''}(退出码 ${code})\n`)
365
+ }
366
+ process.exit(code)
367
+ }
368
+
369
+ if (isDirectRun(import.meta.url)) main()