@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.
- package/MANIFEST.json +341 -0
- package/engine/VERSION +1 -0
- package/engine/agents/catalog.json +454 -0
- package/engine/configs/_aliases.proposed.json +651 -0
- package/engine/configs/_migration-plan.proposed.json +899 -0
- package/engine/configs/account.json +272 -0
- package/engine/configs/advanced.json +205 -0
- package/engine/configs/host.json +149 -0
- package/engine/configs/hr.json +27 -0
- package/engine/configs/notify.json +264 -0
- package/engine/core/cli/argent.mjs +277 -0
- package/engine/core/contracts/argent.contracts.json +1065 -0
- package/engine/core/contracts/verbs.schema.json +2539 -0
- package/engine/core/lib/argent-datadir.mjs +223 -0
- package/engine/core/lib/audit.mjs +187 -0
- package/engine/core/lib/claim.mjs +258 -0
- package/engine/core/lib/config-catalog.mjs +1172 -0
- package/engine/core/lib/doctor-customer.mjs +577 -0
- package/engine/core/lib/flow-list.mjs +138 -0
- package/engine/core/lib/flow-registry.mjs +48 -0
- package/engine/core/lib/init.mjs +247 -0
- package/engine/core/lib/ledger.mjs +124 -0
- package/engine/core/lib/license-activate.mjs +813 -0
- package/engine/core/lib/license-device.mjs +314 -0
- package/engine/core/lib/license-file.mjs +349 -0
- package/engine/core/lib/license-guard.mjs +123 -0
- package/engine/core/lib/license-ops.mjs +1645 -0
- package/engine/core/lib/license-verdict.mjs +133 -0
- package/engine/core/lib/license.mjs +577 -0
- package/engine/core/lib/notify/dedup.mjs +101 -0
- package/engine/core/lib/notify/feishu.mjs +38 -0
- package/engine/core/lib/notify/index.mjs +95 -0
- package/engine/core/lib/notify/verb.mjs +327 -0
- package/engine/core/lib/notify/webhook.mjs +135 -0
- package/engine/core/lib/notify/wecom.mjs +36 -0
- package/engine/core/lib/python.mjs +145 -0
- package/engine/core/lib/sop.mjs +116 -0
- package/engine/core/lib/versions.mjs +205 -0
- package/engine/core/mcp/client.mjs +67 -0
- package/engine/core/mcp/http.mjs +138 -0
- package/engine/core/mcp/server.mjs +702 -0
- package/engine/scripts/_engine_rules_probe.py +15 -0
- package/engine/scripts/analyze-full-day.py +568 -0
- package/engine/scripts/archive/feishu-bridge.js +246 -0
- package/engine/scripts/argent-agents.mjs +527 -0
- package/engine/scripts/argent-capabilities.mjs +776 -0
- package/engine/scripts/argent-catalog.mjs +186 -0
- package/engine/scripts/argent-datadir.py +62 -0
- package/engine/scripts/argent-doctor.mjs +624 -0
- package/engine/scripts/argent-env-write.mjs +302 -0
- package/engine/scripts/argent-schedule.mjs +620 -0
- package/engine/scripts/argent-setup-check.mjs +369 -0
- package/engine/scripts/argent-upgrade.mjs +1046 -0
- package/engine/scripts/base-bootstrap.sh +576 -0
- package/engine/scripts/billing-mode-daily.sh +13 -0
- package/engine/scripts/build-engine-package.mjs +126 -0
- package/engine/scripts/capability-packs.lock.json +484 -0
- package/engine/scripts/capability_pack.py +1242 -0
- package/engine/scripts/check-1.0-criteria.mjs +355 -0
- package/engine/scripts/check-agent-catalog.mjs +141 -0
- package/engine/scripts/check-billing-mode.sh +378 -0
- package/engine/scripts/check-child-sessions.mjs +83 -0
- package/engine/scripts/check-config-catalog.mjs +677 -0
- package/engine/scripts/check-docs-drift.mjs +522 -0
- package/engine/scripts/check-dsh-web-expose.sh +98 -0
- package/engine/scripts/check-judgment-drift.mjs +403 -0
- package/engine/scripts/check-license.mjs +199 -0
- package/engine/scripts/check-model-auth.py +443 -0
- package/engine/scripts/check-pack-closure.mjs +661 -0
- package/engine/scripts/check-portable-symbols.mjs +116 -0
- package/engine/scripts/check-preset-landing.mjs +124 -0
- package/engine/scripts/check-production-home.mjs +602 -0
- package/engine/scripts/check-role-mapping.mjs +461 -0
- package/engine/scripts/check-sample-redaction.mjs +320 -0
- package/engine/scripts/check-skill-classification.mjs +188 -0
- package/engine/scripts/check-sop-consistency.mjs +431 -0
- package/engine/scripts/check-test-env-safety.mjs +627 -0
- package/engine/scripts/check-version-consistency.mjs +452 -0
- package/engine/scripts/ci-run.sh +558 -0
- package/engine/scripts/collect-evidence.mjs +42 -0
- package/engine/scripts/config-explain.mjs +278 -0
- package/engine/scripts/configure-provider.rb +29 -0
- package/engine/scripts/customer-config-migrate.mjs +179 -0
- package/engine/scripts/customer-preflight.py +892 -0
- package/engine/scripts/customer-readiness.sh +135 -0
- package/engine/scripts/daily-report-inbox.py +242 -0
- package/engine/scripts/daily-report-reconcile.mjs +312 -0
- package/engine/scripts/daily-report.mjs +1310 -0
- package/engine/scripts/daily-report.sh +47 -0
- package/engine/scripts/data/lip-product-dict.json +306 -0
- package/engine/scripts/deliver-customer.mjs +932 -0
- package/engine/scripts/delivery-faces.txt +31 -0
- package/engine/scripts/desktop-trial.sh +146 -0
- package/engine/scripts/dev-window.sh +261 -0
- package/engine/scripts/drill-clean-machine.sh +315 -0
- package/engine/scripts/dsh-api-client.mjs +215 -0
- package/engine/scripts/dsh-backup-scope.sh +83 -0
- package/engine/scripts/dsh-offline-pack.mjs +77 -0
- package/engine/scripts/dsh-overlay-pin.sh +87 -0
- package/engine/scripts/dsh-plane.mjs +153 -0
- package/engine/scripts/dsh-portforward.py +223 -0
- package/engine/scripts/dsh-preflight.mjs +179 -0
- package/engine/scripts/dsh-release-watch-daily.sh +19 -0
- package/engine/scripts/dsh-release-watch.mjs +458 -0
- package/engine/scripts/dsh-remote-check.sh +99 -0
- package/engine/scripts/dsh-restart.sh +179 -0
- package/engine/scripts/dsh-restore.sh +111 -0
- package/engine/scripts/dsh-scope-rewire.mjs +803 -0
- package/engine/scripts/dsh-snapshot.mjs +116 -0
- package/engine/scripts/dsh-upgrade-readiness.mjs +165 -0
- package/engine/scripts/dsh-upgrade.mjs +612 -0
- package/engine/scripts/dsh-url.sh +86 -0
- package/engine/scripts/dsh-web-launch.mjs +155 -0
- package/engine/scripts/ensure-store-windows.py +509 -0
- package/engine/scripts/entitlements.py +458 -0
- package/engine/scripts/env_probe.py +411 -0
- package/engine/scripts/feishu-card.mjs +252 -0
- package/engine/scripts/final-check.mjs +43 -0
- package/engine/scripts/fix-skill-frontmatter.py +209 -0
- package/engine/scripts/flow-auto-retry.py +454 -0
- package/engine/scripts/flow-requirements.json +735 -0
- package/engine/scripts/flow-scaffold.py +275 -0
- package/engine/scripts/flow-timers-plist.sh +87 -0
- package/engine/scripts/flow-timers.sh +184 -0
- package/engine/scripts/flow-trigger-wake.mjs +284 -0
- package/engine/scripts/flow-trigger.sh +571 -0
- package/engine/scripts/flow_billing.py +354 -0
- package/engine/scripts/flow_capability_stats.py +314 -0
- package/engine/scripts/flow_case.py +194 -0
- package/engine/scripts/flow_claim.py +497 -0
- package/engine/scripts/flow_config.py +1025 -0
- package/engine/scripts/flow_failure.py +588 -0
- package/engine/scripts/flow_learn.py +105 -0
- package/engine/scripts/flow_ledger.py +235 -0
- package/engine/scripts/flow_policy.py +238 -0
- package/engine/scripts/flow_preflight.py +339 -0
- package/engine/scripts/flow_registry.py +341 -0
- package/engine/scripts/flow_retry.py +304 -0
- package/engine/scripts/flow_return_to_ops.py +191 -0
- package/engine/scripts/flow_source.py +315 -0
- package/engine/scripts/flow_sources/__init__.py +53 -0
- package/engine/scripts/flow_sources/cases_json.py +106 -0
- package/engine/scripts/flow_sources/common.py +428 -0
- package/engine/scripts/flow_sources/feishu_base.py +273 -0
- package/engine/scripts/flow_stale.py +185 -0
- package/engine/scripts/flow_status_reconcile.py +344 -0
- package/engine/scripts/flow_triage.py +849 -0
- package/engine/scripts/flow_write_verify.py +496 -0
- package/engine/scripts/fulfillment.js +586 -0
- package/engine/scripts/gen-agent-bundles.mjs +276 -0
- package/engine/scripts/gen-preset-rows.mjs +259 -0
- package/engine/scripts/init-ml.sh +2278 -0
- package/engine/scripts/install-internal-role.sh +190 -0
- package/engine/scripts/install-license.mjs +641 -0
- package/engine/scripts/install-one-shot.mjs +665 -0
- package/engine/scripts/integration_contract.py +220 -0
- package/engine/scripts/integrations/wenyao/adapter.py +98 -0
- package/engine/scripts/integrations/xzh/adapter.py +75 -0
- package/engine/scripts/invoice-mapping.example.json +40 -0
- package/engine/scripts/invoice-table.sh +195 -0
- package/engine/scripts/invoice_carrier_notice.py +279 -0
- package/engine/scripts/invoice_fail_closeout.py +297 -0
- package/engine/scripts/invoice_lip_runner.py +1508 -0
- package/engine/scripts/invoice_lip_runner.py.bak-20260922-1710-freready +1090 -0
- package/engine/scripts/invoice_ready_audit.py +191 -0
- package/engine/scripts/invoice_runner.py +675 -0
- package/engine/scripts/invoice_stageb.py +516 -0
- package/engine/scripts/launchd/com.whyshu.argent-bridge.plist.example +42 -0
- package/engine/scripts/launchd/com.whyshu.fulfillment-poll.plist.example +29 -0
- package/engine/scripts/lease.py +377 -0
- package/engine/scripts/lib/agent-install.mjs +649 -0
- package/engine/scripts/lib/argent-datadir.mjs +16 -0
- package/engine/scripts/lib/argent-datadir.sh +18 -0
- package/engine/scripts/lib/argent_datadir.py +285 -0
- package/engine/scripts/lib/argent_filelock.py +507 -0
- package/engine/scripts/lib/bootcheck-wiring.mjs +510 -0
- package/engine/scripts/lib/cdp_ports.py +197 -0
- package/engine/scripts/lib/customer-env.mjs +102 -0
- package/engine/scripts/lib/daily-report-core.mjs +517 -0
- package/engine/scripts/lib/dep-declaration.mjs +81 -0
- package/engine/scripts/lib/deps-migrate.mjs +310 -0
- package/engine/scripts/lib/dsh-host-resolve.mjs +109 -0
- package/engine/scripts/lib/dsh-scope.mjs +500 -0
- package/engine/scripts/lib/dsh-snapshot-path.mjs +35 -0
- package/engine/scripts/lib/dsh-versions.mjs +96 -0
- package/engine/scripts/lib/dsh-web-probe.mjs +214 -0
- package/engine/scripts/lib/is-direct-run.mjs +61 -0
- package/engine/scripts/lib/patch-compose.mjs +241 -0
- package/engine/scripts/lib/patch-target.mjs +35 -0
- package/engine/scripts/lib/plugin-lifecycle.mjs +128 -0
- package/engine/scripts/lib/plugin-packages.mjs +332 -0
- package/engine/scripts/lib/preset-compat.mjs +127 -0
- package/engine/scripts/lib/preset-install.mjs +575 -0
- package/engine/scripts/lib/preset-mechanism.mjs +56 -0
- package/engine/scripts/lib/preset-sync.mjs +59 -0
- package/engine/scripts/lib/profile-retire.mjs +97 -0
- package/engine/scripts/lib/python-runtime.mjs +190 -0
- package/engine/scripts/lib/registry.mjs +72 -0
- package/engine/scripts/lib/repo-root.sh +56 -0
- package/engine/scripts/lib/schedule-mechanism.mjs +659 -0
- package/engine/scripts/lib/schedule-probe.mjs +835 -0
- package/engine/scripts/lib/scope-pointer.mjs +164 -0
- package/engine/scripts/lib/settings-panels.mjs +816 -0
- package/engine/scripts/lib/stdio_utf8.py +86 -0
- package/engine/scripts/lib/wake-auth.mjs +392 -0
- package/engine/scripts/lib/webdriver_ipc.py +264 -0
- package/engine/scripts/lib/zstd-frames.mjs +104 -0
- package/engine/scripts/license-e2e-drill.mjs +426 -0
- package/engine/scripts/license-gate.mjs +245 -0
- package/engine/scripts/lip_backlog.py +171 -0
- package/engine/scripts/lip_table.py +185 -0
- package/engine/scripts/local-usage.mjs +214 -0
- package/engine/scripts/migrate-providers.mjs +127 -0
- package/engine/scripts/migrate-skills.sh +65 -0
- package/engine/scripts/ml-oauth-setup.mjs +550 -0
- package/engine/scripts/ml-store-ids.json +26 -0
- package/engine/scripts/ml_artifact_attribution.py +333 -0
- package/engine/scripts/ml_capacity_probe.py +1158 -0
- package/engine/scripts/ml_hub_status.py +1556 -0
- package/engine/scripts/ml_schema_check.py +115 -0
- package/engine/scripts/ml_store_ids.py +139 -0
- package/engine/scripts/npm-publish-argent.mjs +499 -0
- package/engine/scripts/npm-publish-argent.sh +20 -0
- package/engine/scripts/orchestrator.py +13811 -0
- package/engine/scripts/pack-plugins.mjs +140 -0
- package/engine/scripts/patches/dsh-llm-deepseek--transport-diagnostics.patch +297 -0
- package/engine/scripts/patches/dsh-session--append-message-shape.patch +15 -0
- package/engine/scripts/patches/dsh-session--tool-result-block-017.patch +28 -0
- package/engine/scripts/patches/dsh-session-format-v0-to-v1--permission-preset-origin.patch +11 -0
- package/engine/scripts/patches/dsh-session-format-v3-to-v4--turn-outside-replace.patch +20 -0
- package/engine/scripts/patches/dsh-session-persistence-jsonl--worker-bundled-migrators.patch +39 -0
- package/engine/scripts/patches/dsh-tools--render-return-shape.patch +50 -0
- package/engine/scripts/patches/verify-bundled-migrators.mjs +79 -0
- package/engine/scripts/patches/verify-hardening.mjs +167 -0
- package/engine/scripts/patches/verify-session-migration.mjs +149 -0
- package/engine/scripts/patches/verify-transport-diagnostics.mjs +227 -0
- package/engine/scripts/plan-role-rename.mjs +125 -0
- package/engine/scripts/plugin-bootcheck.mjs +451 -0
- package/engine/scripts/plugin-composition.json +15 -0
- package/engine/scripts/poc-mcp-host.mjs +455 -0
- package/engine/scripts/poll-fulfillment.sh +295 -0
- package/engine/scripts/poll-invoice.sh +76 -0
- package/engine/scripts/profile-doctor.mjs +686 -0
- package/engine/scripts/provider-select.sh +71 -0
- package/engine/scripts/provider-switch.sh +146 -0
- package/engine/scripts/provider-sync-target.check.mjs +64 -0
- package/engine/scripts/python-runtime.sh +78 -0
- package/engine/scripts/query_runner.py +310 -0
- package/engine/scripts/release-argent.sh +574 -0
- package/engine/scripts/repair-unresolved-tools.mjs +178 -0
- package/engine/scripts/retire-inventory.mjs +40 -0
- package/engine/scripts/run-tests.sh +257 -0
- package/engine/scripts/s1-audit.mjs +85 -0
- package/engine/scripts/self-sign-license.mjs +179 -0
- package/engine/scripts/session-health-scan.mjs +63 -0
- package/engine/scripts/session-repair-tool-result-content.mjs +181 -0
- package/engine/scripts/setup.sh +22 -0
- package/engine/scripts/skill-install.mjs +629 -0
- package/engine/scripts/sku_translate.py +148 -0
- package/engine/scripts/sync-plugins.sh +90 -0
- package/engine/scripts/sync-presets.sh +27 -0
- package/engine/scripts/sync-scripts.sh +445 -0
- package/engine/scripts/telemetry.py +873 -0
- package/engine/scripts/ui-copy-count.mjs +220 -0
- package/engine/scripts/usage-anchor.sh +137 -0
- package/engine/scripts/usage_report.py +531 -0
- package/engine/scripts/validate-preset-schema.mjs +208 -0
- package/engine/scripts/vertical-init.mjs +323 -0
- package/engine/scripts/vertical-lint.mjs +482 -0
- package/engine/scripts/wenyao-browser.sh +74 -0
- package/engine/scripts/wenyao-fixture-export.py +116 -0
- package/engine/scripts/wenyao-invoice-writeback.mjs +540 -0
- package/engine/scripts/wenyao-login.sh +35 -0
- package/engine/scripts/wenyao-template-map.json +292 -0
- package/engine/scripts/wenyao_attach.py +131 -0
- package/engine/scripts/wenyao_download_template.py +144 -0
- package/engine/scripts/wenyao_fill_template.py +568 -0
- package/engine/scripts/wenyao_login.py +145 -0
- package/engine/scripts/wenyao_portal.py +633 -0
- package/engine/scripts/wenyao_recon.py +230 -0
- package/engine/scripts/wenyao_run.py +503 -0
- package/engine/scripts/wenyao_shadow_diff.py +160 -0
- package/engine/scripts/wenyao_skill_contract.py +156 -0
- package/engine/scripts/wenyao_template_fetch.py +175 -0
- package/engine/scripts/win/dsh-web-autostart.ps1 +372 -0
- package/engine/scripts/ziniao-auth-probe.sh +268 -0
- package/engine/scripts/ziniao-keepalive.sh +217 -0
- package/engine/scripts/ziniao-post-upgrade-check.sh +121 -0
- package/engine/scripts/ziniao-windows.sh +154 -0
- package/engine/skills/README.md +86 -0
- package/engine/skills/argent-dev/SKILL.md +41 -0
- package/engine/skills/internal.json +37 -0
- package/engine/skills/lktop-pm/SKILL.md +35 -0
- package/engine/skills/lktopapp-dev/SKILL.md +34 -0
- package/engine/skills/ml-config-guide/SKILL.md +50 -0
- package/engine/skills/ml-fulfillment-sop/SKILL.md +178 -0
- package/engine/skills/ml-fulfillment-sop/references/andes-components.md +69 -0
- package/engine/skills/ml-fulfillment-sop/references/cdp-port-mapping.md +35 -0
- package/engine/skills/ml-fulfillment-sop/references/feishu-base-fulfillment-schema.md +136 -0
- package/engine/skills/ml-fulfillment-sop/references/multi-window-concurrency.md +69 -0
- package/engine/skills/ml-fulfillment-sop/references/pitfalls.md +77 -0
- package/engine/skills/ml-fulfillment-sop/references/selectors.md +243 -0
- package/engine/skills/ml-fulfillment-sop/scripts/fulfillment.js +586 -0
- package/engine/skills/ml-fulfillment-sop/scripts/poll-and-execute.sh +271 -0
- package/engine/skills/ml-fulfillment-sop/templates/report.md +55 -0
- package/engine/skills/ml-invoice/SKILL.md +506 -0
- package/engine/skills/ml-invoice/references/pitfalls.md +268 -0
- package/engine/skills/ml-invoice/references/portal-flow.md +360 -0
- package/engine/skills/ml-invoice/references/template-fill-contract.md +133 -0
- package/engine/skills/ml-invoice-xzh/SKILL.md +133 -0
- package/engine/skills/ml-invoice-xzh/references/pitfalls.md +230 -0
- package/engine/skills/ml-store-daily-report/SKILL.md +224 -0
- package/engine/skills/ml-store-daily-report/scripts/README.md +25 -0
- package/engine/skills/ml-store-daily-report/scripts/extract.js +691 -0
- package/engine/skills/ml-store-daily-report/scripts/generate.js +299 -0
- package/engine/skills/pet-dev/SKILL.md +42 -0
- package/engine/skills/whyshu-pm/SKILL.md +35 -0
- package/engine/skills/whyshu-web-dev/SKILL.md +50 -0
- package/engine/version.mjs +1 -0
- package/engine/verticals/README.md +103 -0
- package/engine/verticals/_engine-words.baseline.txt +237 -0
- package/engine/verticals/_engine-words.json +19 -0
- package/engine/verticals/mercadolibre/README.md +43 -0
- package/engine/verticals/mercadolibre/config.json +709 -0
- package/engine/verticals/mercadolibre/flows.json +738 -0
- package/engine/verticals/mercadolibre/manifest.json +538 -0
- package/engine/verticals/mercadolibre/migrate-machine-state.mjs +138 -0
- package/engine/verticals/mercadolibre/preflight.py +143 -0
- package/engine/verticals/mercadolibre/prompts/daily-report.failure.md +69 -0
- package/engine/verticals/mercadolibre/prompts/daily-report.md +47 -0
- package/engine/verticals/mercadolibre/prompts/daily-report.scheduled.md +79 -0
- package/engine/verticals/mercadolibre/prompts/full.failure.md +125 -0
- package/engine/verticals/mercadolibre/prompts/full.md +91 -0
- package/engine/verticals/mercadolibre/prompts/wenyao-invoice.failure.md +88 -0
- package/engine/verticals/mercadolibre/prompts/wenyao-invoice.md +64 -0
- package/engine/verticals/mercadolibre/prompts/xzh-invoice.failure.md +91 -0
- package/engine/verticals/mercadolibre/prompts/xzh-invoice.md +46 -0
- package/package.json +22 -4
- package/requirements.txt +5 -0
- package/README.md +0 -3
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
. "$(dirname "$0")/lib/argent-datadir.sh" # 0.7.0 W8/S1:数据根唯一判据(⛔ 不再写死 ~/.dsh/argent)
|
|
3
|
+
# ziniao-keepalive.sh —— 紫鸟**常驻 WebDriver 模式**的守护(W2 部署件)
|
|
4
|
+
#
|
|
5
|
+
# ## 为什么需要
|
|
6
|
+
# 2026-09-24 用户选定「生产机常驻 WebDriver 模式」。常驻要成立,三件事必须自动:
|
|
7
|
+
# ① 开机/登录后**自己起来**(RunAtLoad);
|
|
8
|
+
# ② 掉线(客户端退出/内核崩/IPC 端口不再监听)**自己拉回来**;
|
|
9
|
+
# ③ 授权链路(applyAuth 设备授权)**每天自愈一次**(`ziniao-auth-probe.sh` 已实现,这里复用)。
|
|
10
|
+
#
|
|
11
|
+
# ## 安全口径(这条比功能重要)
|
|
12
|
+
# **默认不 kill 一个正在跑的 GUI 客户端**(那会关掉用户手开的所有店铺窗口 —— W2 已定的口径)。
|
|
13
|
+
# 只有两种情况会启动客户端:① 完全没有紫鸟进程;② 显式 `ZINIAO_KEEPALIVE_RESTART=1`(生产机专用,
|
|
14
|
+
# 表示"这台机器的客户端就该常驻 WebDriver 模式")。
|
|
15
|
+
# 应急开关:`touch ~/.dsh/argent/PAUSE_ZINIAO_KEEPALIVE` ⇒ 巡检直接跳过(运维在人工操作时用)。
|
|
16
|
+
#
|
|
17
|
+
# 用法:
|
|
18
|
+
# bash scripts/ziniao-keepalive.sh run # 单次巡检(LaunchAgent 调的就是它)
|
|
19
|
+
# bash scripts/ziniao-keepalive.sh run --dry-run # 只判断不动作(测试/排障)
|
|
20
|
+
# bash scripts/ziniao-keepalive.sh status # 看 agent + 当前 IPC/客户端状态
|
|
21
|
+
# bash scripts/ziniao-keepalive.sh print-plist # 只打印 plist(不装;测试用)
|
|
22
|
+
# bash scripts/ziniao-keepalive.sh install # 写 plist + bootstrap(**改本机系统**)
|
|
23
|
+
# bash scripts/ziniao-keepalive.sh uninstall # bootout + 删 plist
|
|
24
|
+
set -uo pipefail
|
|
25
|
+
|
|
26
|
+
# 仓库根与 agent PATH 都用共享实现(写死会让客户机的 plist 指向不存在的脚本)
|
|
27
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib/repo-root.sh"
|
|
28
|
+
REPO="$(argent_repo_root "${BASH_SOURCE[0]}")"
|
|
29
|
+
AGENT_PATH="$(argent_agent_path)"
|
|
30
|
+
export PATH="$(printf '%s' "$AGENT_PATH" | tr ':' '\n' | head -3 | paste -sd: -):$PATH"
|
|
31
|
+
LABEL="com.whyshu.ziniao-keepalive"
|
|
32
|
+
AGENTS="$HOME/Library/LaunchAgents"
|
|
33
|
+
PLIST="$AGENTS/$LABEL.plist"
|
|
34
|
+
LOGDIR="${ARGENT_LOG_DIR:-$HOME/Library/Logs/argent}"
|
|
35
|
+
UID_N="$(id -u)"
|
|
36
|
+
WD_PORT="${ZINIAO_WD_PORT:-19515}"
|
|
37
|
+
INTERVAL_SEC="${ZINIAO_KEEPALIVE_INTERVAL_SEC:-180}"
|
|
38
|
+
|
|
39
|
+
log() { echo "[$(date '+%F %T')] $*"; }
|
|
40
|
+
pick_py() {
|
|
41
|
+
local c
|
|
42
|
+
for c in "${ARGENT_PY:-}" "$ARGENT_DATA_DIR_RESOLVED/venv/bin/python3" "$REPO/.venv/bin/python3" \
|
|
43
|
+
"$(command -v python3 2>/dev/null || true)"; do
|
|
44
|
+
[ -n "$c" ] && [ -x "$c" ] && { printf '%s' "$c"; return 0; }
|
|
45
|
+
done
|
|
46
|
+
return 1
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
port_listening() {
|
|
50
|
+
"$PY" - "$WD_PORT" <<'PY' 2>/dev/null
|
|
51
|
+
import socket, sys
|
|
52
|
+
s = socket.socket(); s.settimeout(1.0)
|
|
53
|
+
try:
|
|
54
|
+
s.connect(("127.0.0.1", int(sys.argv[1]))); print("yes")
|
|
55
|
+
except Exception:
|
|
56
|
+
print("no")
|
|
57
|
+
finally:
|
|
58
|
+
s.close()
|
|
59
|
+
PY
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
client_running() { pgrep -f "[A]pplications/ziniao.app" >/dev/null 2>&1; }
|
|
63
|
+
|
|
64
|
+
ipc_healthy() {
|
|
65
|
+
# 端口在听 ≠ 服务正常:真发一次 getRunningInfo(免凭据)
|
|
66
|
+
[ "$(port_listening)" = "yes" ] || return 1
|
|
67
|
+
"$PY" - "$REPO" "$WD_PORT" <<'PY' >/dev/null 2>&1
|
|
68
|
+
import importlib.util, pathlib, sys
|
|
69
|
+
repo, port = sys.argv[1], int(sys.argv[2])
|
|
70
|
+
spec = importlib.util.spec_from_file_location("orch", pathlib.Path(repo) / "scripts" / "orchestrator.py")
|
|
71
|
+
m = importlib.util.module_from_spec(spec); sys.modules["orch"] = m; spec.loader.exec_module(m)
|
|
72
|
+
cfg = m.load_config()
|
|
73
|
+
m.wd_running_info(cfg) # 免凭据;失败会抛
|
|
74
|
+
PY
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
cmd_run() {
|
|
78
|
+
local dry=0
|
|
79
|
+
for a in "$@"; do [ "$a" = "--dry-run" ] && dry=1; done
|
|
80
|
+
if [ -f "$PAUSE" ]; then
|
|
81
|
+
log "PAUSE_ZINIAO_KEEPALIVE 存在 ⇒ 跳过本次巡检(运维人工操作中)"; return 0
|
|
82
|
+
fi
|
|
83
|
+
if ipc_healthy; then
|
|
84
|
+
log "✅ WebDriver IPC 正常(端口 ${WD_PORT})"
|
|
85
|
+
# ③ 授权链路每天自愈一次(探针自带 12h 去重;失败不阻塞,只叫人)
|
|
86
|
+
if [ -f "$REPO/scripts/ziniao-auth-probe.sh" ]; then
|
|
87
|
+
bash "$REPO/scripts/ziniao-auth-probe.sh" --quiet || {
|
|
88
|
+
local rc=$?
|
|
89
|
+
[ "$rc" = "2" ] && log "⚠️ 授权链路需要人工(ziniao-auth-probe --force 看详情)"
|
|
90
|
+
}
|
|
91
|
+
fi
|
|
92
|
+
return 0
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# IPC 不健康
|
|
96
|
+
if client_running; then
|
|
97
|
+
if [ "${ZINIAO_KEEPALIVE_RESTART:-0}" != "1" ]; then
|
|
98
|
+
log "⚠️ WebDriver IPC 不可用(端口 ${WD_PORT} 未响应)且客户端在跑 ⇒ **不 kill**(会关掉用户手开的窗口)"
|
|
99
|
+
log " 首因通常是**模式不对**:人工打开客户端 = GUI 模式,与 WebDriver 模式不能并存(**不是登录过期**)"
|
|
100
|
+
log " 处置:① 人工按部署约定以 --run_type=web_driver 重启;② 或设 ZINIAO_KEEPALIVE_RESTART=1 让本脚本接管重启"
|
|
101
|
+
return 3
|
|
102
|
+
fi
|
|
103
|
+
log "♻️ ZINIAO_KEEPALIVE_RESTART=1 ⇒ 关闭客户端后以 WebDriver 模式拉起(会关闭已开窗口)"
|
|
104
|
+
[ "$dry" = "1" ] && { log "[dry-run] 将 kill 紫鸟并重启"; return 0; }
|
|
105
|
+
pkill -f "[A]pplications/ziniao.app" 2>/dev/null || true
|
|
106
|
+
sleep 5
|
|
107
|
+
else
|
|
108
|
+
log "ℹ️ 没有紫鸟进程 ⇒ 以 WebDriver 模式启动"
|
|
109
|
+
[ "$dry" = "1" ] && { log "[dry-run] 将启动:open -a /Applications/ziniao.app --args --run_type=web_driver --ipc_type=http --port=${WD_PORT}"; return 0; }
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
# 启动(官方前的提是主进程已完全退出;上面已确保)
|
|
113
|
+
open -a /Applications/ziniao.app --args --run_type=web_driver --ipc_type=http --port="${WD_PORT}" \
|
|
114
|
+
>/dev/null 2>&1 || { log "❌ open -a 启动失败(紫鸟是否已安装?)"; return 1; }
|
|
115
|
+
local deadline=$(( $(date +%s) + 120 ))
|
|
116
|
+
while [ "$(date +%s)" -lt "$deadline" ]; do
|
|
117
|
+
if ipc_healthy; then
|
|
118
|
+
log "✅ 已拉起并确认 IPC 正常(端口 ${WD_PORT})"
|
|
119
|
+
[ -f "$REPO/scripts/ziniao-auth-probe.sh" ] && bash "$REPO/scripts/ziniao-auth-probe.sh" --quiet || true
|
|
120
|
+
return 0
|
|
121
|
+
fi
|
|
122
|
+
sleep 3
|
|
123
|
+
done
|
|
124
|
+
log "❌ 拉起后 120s 内 IPC 仍不可用 ⇒ 需人工(ziniao-auth-probe --force / 看客户端界面)"
|
|
125
|
+
"$PY" "$REPO/scripts/telemetry.py" --emit --kind engine --flow full --error-class needs_human \
|
|
126
|
+
--detail "紫鸟 keepalive:拉起后 IPC 仍不可用" >/dev/null 2>&1 || true
|
|
127
|
+
"$PY" "$REPO/scripts/telemetry.py" --flush >/dev/null 2>&1 || true
|
|
128
|
+
return 2
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
gen_plist() {
|
|
132
|
+
cat <<PLIST
|
|
133
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
134
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
135
|
+
<!-- 由 scripts/ziniao-keepalive.sh 生成(勿手改) -->
|
|
136
|
+
<plist version="1.0">
|
|
137
|
+
<dict>
|
|
138
|
+
<key>Label</key>
|
|
139
|
+
<string>$LABEL</string>
|
|
140
|
+
<key>ProgramArguments</key>
|
|
141
|
+
<array>
|
|
142
|
+
<string>/bin/bash</string>
|
|
143
|
+
<string>$REPO/scripts/ziniao-keepalive.sh</string>
|
|
144
|
+
<string>run</string>
|
|
145
|
+
</array>
|
|
146
|
+
<key>RunAtLoad</key>
|
|
147
|
+
<true/>
|
|
148
|
+
<key>StartInterval</key>
|
|
149
|
+
<integer>$INTERVAL_SEC</integer>
|
|
150
|
+
<key>AbandonProcessGroup</key>
|
|
151
|
+
<true/>
|
|
152
|
+
<key>EnvironmentVariables</key>
|
|
153
|
+
<dict>
|
|
154
|
+
<key>ARGENT_PY</key><string>$PY</string>
|
|
155
|
+
<key>ZINIAO_WD_PORT</key><string>$WD_PORT</string>
|
|
156
|
+
<key>ZINIAO_KEEPALIVE_RESTART</key><string>${ZINIAO_KEEPALIVE_RESTART:-0}</string>
|
|
157
|
+
<key>PATH</key><string>$AGENT_PATH</string>
|
|
158
|
+
</dict>
|
|
159
|
+
<key>StandardOutPath</key><string>$LOGDIR/ziniao-keepalive.out.log</string>
|
|
160
|
+
<key>StandardErrorPath</key><string>$LOGDIR/ziniao-keepalive.err.log</string>
|
|
161
|
+
</dict>
|
|
162
|
+
</plist>
|
|
163
|
+
PLIST
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
cmd_status() {
|
|
167
|
+
echo "── agent ──"
|
|
168
|
+
launchctl list 2>/dev/null | grep -i "$LABEL" || echo " (未安装:bash scripts/ziniao-keepalive.sh install)"
|
|
169
|
+
echo "── 客户端 ──"
|
|
170
|
+
client_running && echo " ✓ 紫鸟客户端进程在" || echo " ✗ 无紫鸟客户端进程"
|
|
171
|
+
echo " IPC ${WD_PORT}: $(port_listening)"
|
|
172
|
+
ipc_healthy && echo " ✓ getRunningInfo 正常" || echo " ✗ getRunningInfo 异常"
|
|
173
|
+
echo " ${LOGDIR}/ziniao-keepalive.out.log(最近 5 行):"
|
|
174
|
+
tail -5 "$LOGDIR/ziniao-keepalive.out.log" 2>/dev/null | sed 's/^/ /' || echo " (无日志)"
|
|
175
|
+
[ -f "$PAUSE" ] && echo " ⏸ PAUSE_ZINIAO_KEEPALIVE 存在 ⇒ 巡检被跳过"
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
cmd_install() {
|
|
179
|
+
PY="$(pick_py)" || { echo "❌ 找不到 python3" >&2; exit 2; }
|
|
180
|
+
mkdir -p "$AGENTS" "$LOGDIR"
|
|
181
|
+
gen_plist > "$PLIST"
|
|
182
|
+
launchctl bootout "gui/$UID_N/$LABEL" 2>/dev/null || true
|
|
183
|
+
launchctl bootstrap "gui/$UID_N" "$PLIST" 2>/dev/null || launchctl load -w "$PLIST" 2>/dev/null || true
|
|
184
|
+
echo "✅ 已安装 ${PLIST}(RunAtLoad + 每 ${INTERVAL_SEC}s 巡检;日志 $LOGDIR/ziniao-keepalive.*.log)"
|
|
185
|
+
echo " 立刻生效判定:bash scripts/ziniao-keepalive.sh status"
|
|
186
|
+
echo " 卸载:bash scripts/ziniao-keepalive.sh uninstall"
|
|
187
|
+
[ "${ZINIAO_KEEPALIVE_RESTART:-0}" = "1" ] \
|
|
188
|
+
&& echo " ⚠️ ZINIAO_KEEPALIVE_RESTART=1:客户端不在 WebDriver 模式时脚本会**关闭并重启**它(会关掉已开窗口)" \
|
|
189
|
+
|| echo " ℹ️ 默认不 kill 正在跑的 GUI 客户端(生产机若要「永远 WebDriver 模式」,安装前设 ZINIAO_KEEPALIVE_RESTART=1)"
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
cmd_uninstall() {
|
|
193
|
+
launchctl bootout "gui/$UID_N/$LABEL" 2>/dev/null || true
|
|
194
|
+
rm -f "$PLIST"
|
|
195
|
+
echo "🗑 已卸载 ${LABEL}(客户端与店铺窗口**未**被触碰)"
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
PY="$(pick_py)" || { echo "❌ 找不到 python3" >&2; exit 2; }
|
|
199
|
+
|
|
200
|
+
# 数据目录:**唯一判据**在 Python 单一实现(scripts/lib/argent_datadir.py,经 CLI 包装
|
|
201
|
+
# scripts/argent-datadir.py)——⛔ 不在 bash 里重写三级链。取不到 ⇒ 响亮停住(fail-closed)。
|
|
202
|
+
# 放在 `$PY` 之后:客户机 launchd 的 PATH 极简,用**已验过可执行**的解释器最稳。
|
|
203
|
+
DATA="$("$PY" "$REPO/scripts/argent-datadir.py" 2>/dev/null || true)"
|
|
204
|
+
if [ -z "$DATA" ]; then
|
|
205
|
+
echo "❌ $(basename "${BASH_SOURCE[0]}"): 数据目录判据不可用($REPO/scripts/argent-datadir.py 取不到)⇒ 停住,不猜目录" >&2
|
|
206
|
+
exit 2
|
|
207
|
+
fi
|
|
208
|
+
PAUSE="$DATA/PAUSE_ZINIAO_KEEPALIVE"
|
|
209
|
+
|
|
210
|
+
case "${1:-status}" in
|
|
211
|
+
run) shift; cmd_run "$@" ;;
|
|
212
|
+
status) cmd_status ;;
|
|
213
|
+
print-plist) gen_plist ;;
|
|
214
|
+
install) cmd_install ;;
|
|
215
|
+
uninstall) cmd_uninstall ;;
|
|
216
|
+
*) echo "用法:bash scripts/ziniao-keepalive.sh run [--dry-run] | status | print-plist | install | uninstall" >&2; exit 2 ;;
|
|
217
|
+
esac
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
. "$(dirname "$0")/lib/argent-datadir.sh" # 0.7.0 W8/S1:数据根唯一判据
|
|
3
|
+
# ziniao-post-upgrade-check.sh —— 紫鸟客户端**升级后**的一键复核(只读 + 幂等;不改业务数据)
|
|
4
|
+
#
|
|
5
|
+
# 背景:2026-09-24 排查"30 天人工登录",定位到根因 = 客户端 6.26.6.6 太旧(Bridge 没有 /login 路由
|
|
6
|
+
# ⇒ `zclaw login` 报 `parse login response: invalid character '<'`)。升级客户端后要确认:
|
|
7
|
+
# ① 版本变了;② doctor 的"终端绑定检查"不再报版本不支持;③ `zclaw login` 能成功(这是"免人工"关键);
|
|
8
|
+
# ④ WebDriver 授权链路(IPC + applyAuth/getBrowserList)仍正常;⑤ 客户端回到常驻 WebDriver 模式。
|
|
9
|
+
#
|
|
10
|
+
# 用法:bash scripts/ziniao-post-upgrade-check.sh
|
|
11
|
+
# 退出码:0=全部通过 / 2=有需要人工的项(逐条打印)
|
|
12
|
+
set -uo pipefail
|
|
13
|
+
# 仓库根:共享解析(脚本自身位置优先)—— 写死 ~/Code/argent-dsh 会让客户机
|
|
14
|
+
# (克隆在 ~/.argent-dsh)上找不到本仓文件(2026-09-28 实测)
|
|
15
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib/repo-root.sh"
|
|
16
|
+
REPO="$(argent_repo_root "${BASH_SOURCE[0]}")"
|
|
17
|
+
# 数据目录:**唯一判据**在 Python 单一实现(scripts/lib/argent_datadir.py,经 CLI 包装
|
|
18
|
+
# scripts/argent-datadir.py)——⛔ 不在 bash 里重写三级链。取不到 ⇒ 响亮停住(fail-closed)。
|
|
19
|
+
# 本脚本自身不依赖 python(纯 shell 诊断)⇒ 这里显式给候选解释器(与各脚本 pick_py 的候选表同源):
|
|
20
|
+
# ARGENT_PY → PATH 的 python3 → 默认位置的 venv。
|
|
21
|
+
_DATA_PY="${ARGENT_PY:-$(command -v python3 2>/dev/null || true)}"
|
|
22
|
+
if [ -z "$_DATA_PY" ] || [ ! -x "$_DATA_PY" ]; then
|
|
23
|
+
_DATA_PY="$ARGENT_DATA_DIR_RESOLVED/venv/bin/python3"
|
|
24
|
+
fi
|
|
25
|
+
DATA="$("$_DATA_PY" "$REPO/scripts/argent-datadir.py" 2>/dev/null || true)"
|
|
26
|
+
if [ -z "$DATA" ]; then
|
|
27
|
+
echo "❌ $(basename "${BASH_SOURCE[0]}"): 数据目录判据不可用($REPO/scripts/argent-datadir.py 取不到)⇒ 停住,不猜目录" >&2
|
|
28
|
+
exit 2
|
|
29
|
+
fi
|
|
30
|
+
PRE="$DATA/.ziniao-pre-upgrade.txt"
|
|
31
|
+
fails=0
|
|
32
|
+
say() { echo "$*"; }
|
|
33
|
+
ok() { echo " ✅ $*"; }
|
|
34
|
+
bad() { echo " ❌ $*"; fails=$((fails+1)); }
|
|
35
|
+
warn(){ echo " ⚠️ $*"; }
|
|
36
|
+
|
|
37
|
+
say "═══ 紫鸟客户端升级后复核 $(date '+%F %T') ═══"
|
|
38
|
+
|
|
39
|
+
say
|
|
40
|
+
say "【0】版本:升级前 → 现在"
|
|
41
|
+
[ -f "$PRE" ] && say " 升级前(快照):$(grep -m1 '^version=' "$PRE" 2>/dev/null | cut -d= -f2-)"
|
|
42
|
+
now="$(defaults read /Applications/ziniao.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo '?')"
|
|
43
|
+
say " 现在:${now}"
|
|
44
|
+
if [ -d "$DATA/backup" ]; then
|
|
45
|
+
say " 回滚备份:$(ls -d "$DATA"/backup/ziniao-app-*.app 2>/dev/null | tail -1 || echo '(无)')"
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
say
|
|
49
|
+
say "【1】doctor(期望:终端绑定检查不再报「版本不支持」)"
|
|
50
|
+
doc="$(ziniao-cli doctor 2>&1 || true)"
|
|
51
|
+
if echo "$doc" | grep -q "不支持终端绑定检查"; then
|
|
52
|
+
bad "仍报「当前客户端版本不支持终端绑定检查」⇒ 客户端可能没升级成功"
|
|
53
|
+
else
|
|
54
|
+
ok "终端绑定检查不再报版本不支持"
|
|
55
|
+
fi
|
|
56
|
+
echo "$doc" | grep -E "客户端登录用户|API Key 有效|Bridge" | sed 's/^/ /'
|
|
57
|
+
echo "$doc" | grep -q "客户端登录用户" && ok "客户端已登录" || warn "客户端未登录(若被登出,需人工登录一次)"
|
|
58
|
+
|
|
59
|
+
say
|
|
60
|
+
say "【2】zclaw login(「免人工登录」的关键一环)"
|
|
61
|
+
out="$(ziniao-cli zclaw login 2>&1)"; rc=$?
|
|
62
|
+
case "$out" in
|
|
63
|
+
*次数过多*|*请1分钟后再试*)
|
|
64
|
+
warn "zclaw login 被**限流**(供应商:apiKey 登录验证次数过多,请1分钟后再试)⇒ 本次未判定,不是 Key 失效"
|
|
65
|
+
say " (本脚本反复跑会撞限流;等 1 分钟后单独复跑:ziniao-cli zclaw login)" ;;
|
|
66
|
+
*)
|
|
67
|
+
if [ "$rc" = "0" ] && ! echo "$out" | grep -q "invalid character"; then
|
|
68
|
+
ok "zclaw login 成功 ⇒ 以后客户端会话到期可**程序化**恢复,不再需要人工点登录"
|
|
69
|
+
else
|
|
70
|
+
bad "zclaw login 仍失败:$(echo "$out" | head -2 | tr '\n' ' ')"
|
|
71
|
+
say " ⇒ 把这条证据发给紫鸟支持:新 CLI 需要 Bridge 的 /login 路由;并问 WebDriver 模式下该端点是否可用"
|
|
72
|
+
fi ;;
|
|
73
|
+
esac
|
|
74
|
+
|
|
75
|
+
say
|
|
76
|
+
say "【3】WebDriver 授权链路(跑票用;与上面那层无关)"
|
|
77
|
+
if [ -f "$REPO/scripts/ziniao-auth-probe.sh" ]; then
|
|
78
|
+
ZINIAO_AUTH_PROBE_TTL_H=0 bash "$REPO/scripts/ziniao-auth-probe.sh" --force 2>&1 | sed 's/^/ /'
|
|
79
|
+
probe_rc=${PIPESTATUS[0]}
|
|
80
|
+
[ "$probe_rc" = "0" ] && ok "授权链路正常(⓪①② 全绿)" || bad "授权探针退出码 ${probe_rc}(看上面 ⓪①② 分层结论)"
|
|
81
|
+
else
|
|
82
|
+
warn "找不到 ziniao-auth-probe.sh(跳过)"
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
say
|
|
86
|
+
say "【4】常驻形态:客户端是否在 WebDriver 模式"
|
|
87
|
+
if [ -f "$REPO/scripts/ziniao-keepalive.sh" ]; then
|
|
88
|
+
bash "$REPO/scripts/ziniao-keepalive.sh" status 2>&1 | sed 's/^/ /' | head -8
|
|
89
|
+
say " (若 IPC 不在听:升级期间守护被 PAUSE_ZINIAO_KEEPALIVE 挡住了,"
|
|
90
|
+
say " 确认无票在跑后执行:rm -f $DATA/PAUSE_ZINIAO_KEEPALIVE && bash scripts/*-keepalive.sh run)"
|
|
91
|
+
else
|
|
92
|
+
warn "找不到 *-keepalive.sh(跳过)"
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
say
|
|
96
|
+
say "【5】ChromeDriver 缓存面 ↔ 内核大版本(只读;P1-g)"
|
|
97
|
+
WINDOWS="$REPO/scripts/ziniao-windows.sh"
|
|
98
|
+
if [ -f "$WINDOWS" ]; then
|
|
99
|
+
# 只读:缓存里有哪些大版本的驱动 ↔ 在跑窗口的内核大版本(免凭据:getRunningInfo + 窗口 CDP)。
|
|
100
|
+
# ⛔ 不下载、不删除、不调需凭据接口;结果只打印,不参与 fails 判据(缓存缺失不是"升级失败")。
|
|
101
|
+
bash "$WINDOWS" cache 2>&1 | sed 's/^/ /' || warn "缓存面巡检未跑成(看上面输出;只读项,不影响升级判定)"
|
|
102
|
+
else
|
|
103
|
+
warn "找不到 *-windows.sh(跳过缓存面巡检)"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
say
|
|
107
|
+
say "【6】插件安装状态(只读探测;P1-f)"
|
|
108
|
+
if [ -f "$WINDOWS" ]; then
|
|
109
|
+
# 官方 getPluginInstalled 免凭据,但需要 pluginIds 来源;没有来源时只报「能力未接」(⛔ 不猜)。
|
|
110
|
+
bash "$WINDOWS" plugins 2>&1 | sed 's/^/ /' || warn "插件探测未跑成(只读项,不影响升级判定)"
|
|
111
|
+
else
|
|
112
|
+
warn "找不到 *-windows.sh(跳过插件探测)"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
say
|
|
116
|
+
if [ "$fails" = "0" ]; then
|
|
117
|
+
say "✅ 全部通过。下一步(确认无票在跑后):bash scripts/dev-window.sh off(恢复被本窗口暂停的轮询)"
|
|
118
|
+
exit 0
|
|
119
|
+
fi
|
|
120
|
+
say "❌ 有 ${fails} 项需要处理(见上)"
|
|
121
|
+
exit 2
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
. "$(dirname "$0")/lib/argent-datadir.sh" # 0.7.0 W8/S1:数据根唯一判据(⛔ 不再写死 ~/.dsh/argent)
|
|
3
|
+
# ziniao-windows.sh —— 紫鸟**窗口**运维小工具(W5:窗口回收由人显式决定,不自动关)
|
|
4
|
+
#
|
|
5
|
+
# 为什么不做"跑完自动关店"(W5 的原始设想被否):我们刚修好"每轮 startBrowser = 重启窗口"
|
|
6
|
+
# (官方 api-core.md 原文),而**跑完就关店**会让下一轮又得 startBrowser 重启一遍——
|
|
7
|
+
# 等于把刚修掉的病再种回去(端口又会漂、旧标签页又会失效)。
|
|
8
|
+
# 所以:**默认什么都不关**;要回收窗口时由人显式执行本脚本。
|
|
9
|
+
#
|
|
10
|
+
# 用法:
|
|
11
|
+
# bash scripts/*-windows.sh list # 只读:列出当前已开店铺窗口(端口/内核/句柄)
|
|
12
|
+
# bash scripts/*-windows.sh close <店铺名> # 关闭指定店铺窗口(stopBrowser,异步,有界等待)
|
|
13
|
+
# bash scripts/*-windows.sh close --store-id <id>
|
|
14
|
+
# bash scripts/*-windows.sh cache # 只读(P1-g):ChromeDriver 缓存面 ↔ 在跑窗口内核大版本
|
|
15
|
+
# bash scripts/*-windows.sh plugins # 只读(P1-f):插件安装状态(无 pluginIds 来源 ⇒ 只报「能力未接」)
|
|
16
|
+
# bash scripts/*-windows.sh clear-cache [--oauth <店铺标识>]… [--yes]
|
|
17
|
+
# # **写**:清理本地缓存(免凭据;⛔ 默认 dry-run)
|
|
18
|
+
# bash scripts/*-windows.sh clear-online --store <店铺名> [--type 1|2|3] [--yes]
|
|
19
|
+
# # **写 + 需凭据**:清理在线缓存(⛔ 默认 dry-run;
|
|
20
|
+
# # type=3 = 仅保留二步认证 cookie = 登录态在、页面脏时用)
|
|
21
|
+
# ⛔ 后两条**只供人工**:编排路径不会调用它们(默认 dry-run,`--yes` 才真跑)。
|
|
22
|
+
set -uo pipefail
|
|
23
|
+
|
|
24
|
+
# 仓库根:共享解析(脚本自身位置优先)—— 写死 ~/Code/argent-dsh 会让客户机
|
|
25
|
+
# (克隆在 ~/.argent-dsh)上找不到本仓文件(2026-09-28 实测)
|
|
26
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib/repo-root.sh"
|
|
27
|
+
REPO="$(argent_repo_root "${BASH_SOURCE[0]}")"
|
|
28
|
+
PY="${ARGENT_PY:-$ARGENT_DATA_DIR_RESOLVED/venv/bin/python3}"
|
|
29
|
+
[ -x "$PY" ] || PY="$(command -v python3)"
|
|
30
|
+
|
|
31
|
+
cmd="${1:-list}"; shift || true
|
|
32
|
+
exec "$PY" - "$cmd" "$@" <<'PY'
|
|
33
|
+
import json, os, sys, time
|
|
34
|
+
sys.path.insert(0, os.path.join(os.environ.get("ARGENT_DSH_REPO", os.path.expanduser("~/Code/argent-dsh")), "scripts"))
|
|
35
|
+
import importlib.util, pathlib
|
|
36
|
+
repo = os.environ.get("ARGENT_DSH_REPO", os.path.expanduser("~/Code/argent-dsh"))
|
|
37
|
+
spec = importlib.util.spec_from_file_location("orch", pathlib.Path(repo) / "scripts" / "orchestrator.py")
|
|
38
|
+
m = importlib.util.module_from_spec(spec); sys.modules["orch"] = m; spec.loader.exec_module(m)
|
|
39
|
+
cfg = m.load_config()
|
|
40
|
+
cmd = sys.argv[1] if len(sys.argv) > 1 else "list"
|
|
41
|
+
if cmd == "list":
|
|
42
|
+
inv = m.window_inventory(cfg)
|
|
43
|
+
print("已开店铺窗口:", inv or "(无)")
|
|
44
|
+
print("(口径:官方 getRunningInfo;端口/内核/句柄可用于判断窗口是否被重启过)")
|
|
45
|
+
raise SystemExit(0)
|
|
46
|
+
if cmd == "close":
|
|
47
|
+
target = " ".join(sys.argv[2:]).strip()
|
|
48
|
+
if not target:
|
|
49
|
+
print("用法:ziniao-windows.sh close <店铺名|--store-id <id>>", file=sys.stderr); raise SystemExit(2)
|
|
50
|
+
creds = m._load_wd_creds()
|
|
51
|
+
if creds is None:
|
|
52
|
+
print("✗ 缺少 WebDriver 凭据(~/.dsh/argent/ziniao-webdriver.env)", file=sys.stderr); raise SystemExit(2)
|
|
53
|
+
try:
|
|
54
|
+
stores = m.wd_list_stores(cfg, creds)
|
|
55
|
+
except Exception as exc:
|
|
56
|
+
print(f"✗ 取店铺清单失败:{exc}", file=sys.stderr); raise SystemExit(2)
|
|
57
|
+
if target.startswith("--store-id"):
|
|
58
|
+
sid = target.split()[-1]
|
|
59
|
+
hit = next((s for s in stores if str(s.get("browserId")) == sid), None)
|
|
60
|
+
else:
|
|
61
|
+
hit = next((s for s in stores if str(s.get("browserName")) == target), None)
|
|
62
|
+
if hit is None:
|
|
63
|
+
print(f"✗ 店铺清单里没有 {target!r};先 `ziniao-windows.sh list` 看名字", file=sys.stderr)
|
|
64
|
+
raise SystemExit(2)
|
|
65
|
+
print(f"▸ 关闭店铺窗口:{hit.get('browserName')}(stopBrowser,异步有界等待)")
|
|
66
|
+
m.wd_stop_browser(cfg, creds, hit)
|
|
67
|
+
print("✅ 已请求关闭;用 list 复核(异步关闭通常数秒完成)")
|
|
68
|
+
raise SystemExit(0)
|
|
69
|
+
if cmd == "cache":
|
|
70
|
+
# P1-g(只读):ChromeDriver 缓存面 ↔ 在跑窗口的内核大版本(免凭据:getRunningInfo + 窗口 CDP)
|
|
71
|
+
ver, src = m.detect_running_core_version_free(cfg)
|
|
72
|
+
info = m.chromedriver_cache_inventory(ver)
|
|
73
|
+
print(m.chromedriver_cache_line(info))
|
|
74
|
+
print(f"(内核大版本判据:{ver or '取不到'};来源:{src})")
|
|
75
|
+
print("(口径:官方 prerequisites 的缓存目录 {大版本}/chromedriver;⛔ 只读——不下载、不删除、不连需凭据接口)")
|
|
76
|
+
raise SystemExit(0)
|
|
77
|
+
if cmd == "plugins":
|
|
78
|
+
# P1-f(只读):插件安装状态。没有 pluginIds 来源 ⇒ 如实报「能力未接」,⛔ 不猜、不硬凑
|
|
79
|
+
probe = m.probe_plugin_installed(cfg)
|
|
80
|
+
print(m.format_plugin_probe(probe))
|
|
81
|
+
print(f"(调用计划:callable={probe.get('callable')} reason={probe.get('reason')} "
|
|
82
|
+
f"needs_creds={probe.get('needs_creds')} browserId={probe.get('browser_id') or '(无)'})")
|
|
83
|
+
raise SystemExit(0)
|
|
84
|
+
if cmd in ("clear-cache", "clear-online"):
|
|
85
|
+
# P1-h(**写**操作;⛔ 默认 dry-run,`--yes` 才真跑;编排路径不调用本命令)
|
|
86
|
+
rest = sys.argv[2:]
|
|
87
|
+
yes = "--yes" in rest
|
|
88
|
+
where = lambda flag: [rest[i + 1] for i, a in enumerate(rest)
|
|
89
|
+
if a == flag and i + 1 < len(rest)]
|
|
90
|
+
if cmd == "clear-cache":
|
|
91
|
+
oauths = where("--oauth")
|
|
92
|
+
payload = m.clear_cache_payload(oauths)
|
|
93
|
+
print(m.format_clear_preview(m.clear_request_preview(
|
|
94
|
+
"clear-cache", payload, store_name="、".join(oauths) or "(全部店铺)",
|
|
95
|
+
notes=["免凭据接口;要指定店铺用 --oauth <店铺标识>(可重复),不给 = 全部"])))
|
|
96
|
+
if not yes:
|
|
97
|
+
raise SystemExit(0)
|
|
98
|
+
try:
|
|
99
|
+
resp = m.wd_clear_cache(m._wd_ipc_port(cfg), oauths)
|
|
100
|
+
except Exception as exc: # noqa: BLE001
|
|
101
|
+
print(f"✗ ClearCache 调用失败:{exc}", file=sys.stderr); raise SystemExit(2)
|
|
102
|
+
print(f"✅ ClearCache 已调用:statusCode={resp.get('statusCode')}"
|
|
103
|
+
f"{(' LastError=' + str(resp.get('LastError'))) if resp.get('LastError') else ''}")
|
|
104
|
+
raise SystemExit(0)
|
|
105
|
+
# clear-online:需凭据 + 目标店铺
|
|
106
|
+
typ = 3
|
|
107
|
+
for v in where("--type"):
|
|
108
|
+
try:
|
|
109
|
+
typ = int(v)
|
|
110
|
+
except ValueError:
|
|
111
|
+
print("✗ --type 只能是 1/2/3", file=sys.stderr); raise SystemExit(2)
|
|
112
|
+
creds = m._load_wd_creds()
|
|
113
|
+
if creds is None:
|
|
114
|
+
print("✗ ClearOnline 需要凭据(~/.dsh/argent/ziniao-webdriver.env)", file=sys.stderr)
|
|
115
|
+
raise SystemExit(2)
|
|
116
|
+
target = (where("--store-id") or where("--store") or [""])[0]
|
|
117
|
+
oauth = (where("--oauth") or [""])[0]
|
|
118
|
+
if target and not oauth:
|
|
119
|
+
try:
|
|
120
|
+
stores = m.wd_list_stores(cfg, creds)
|
|
121
|
+
except Exception as exc: # noqa: BLE001
|
|
122
|
+
print(f"✗ 取店铺清单失败:{exc}", file=sys.stderr); raise SystemExit(2)
|
|
123
|
+
key = "--store-id" if where("--store-id") else "--store"
|
|
124
|
+
hit = next((s for s in stores if str(s.get("browserId" if key == "--store-id" else "browserName")) == target), None)
|
|
125
|
+
if hit is None:
|
|
126
|
+
print(f"✗ 店铺清单里没有 {target!r};先 `scripts/*-windows.sh list` 看名字", file=sys.stderr)
|
|
127
|
+
raise SystemExit(2)
|
|
128
|
+
oauth = str(hit.get("browserOauth") or hit.get("browserId") or "")
|
|
129
|
+
if not oauth:
|
|
130
|
+
print("✗ ClearOnline 需要 --store <店铺名> / --store-id <id> / --oauth <店铺标识> 之一", file=sys.stderr)
|
|
131
|
+
raise SystemExit(2)
|
|
132
|
+
try:
|
|
133
|
+
payload = m.clear_online_payload(creds, oauth, typ)
|
|
134
|
+
except ValueError as exc:
|
|
135
|
+
print(f"✗ {exc}", file=sys.stderr); raise SystemExit(2)
|
|
136
|
+
print(m.format_clear_preview(m.clear_request_preview(
|
|
137
|
+
"clear-online", payload, store_name=target or oauth,
|
|
138
|
+
notes=[f"type={typ} 的适用场景见上一行;写操作会改本机店铺缓存的在线状态",
|
|
139
|
+
"真要跑请确认该店铺**没有**在跑票(编排路径不会自动调用本命令)"])))
|
|
140
|
+
if not yes:
|
|
141
|
+
raise SystemExit(0)
|
|
142
|
+
try:
|
|
143
|
+
resp = m.wd_clear_online(m._wd_ipc_port(cfg), creds, oauth, typ)
|
|
144
|
+
except Exception as exc: # noqa: BLE001
|
|
145
|
+
print(f"✗ ClearOnline 调用失败:{exc}", file=sys.stderr); raise SystemExit(2)
|
|
146
|
+
print(f"✅ ClearOnline 已调用(type={typ}):statusCode={resp.get('statusCode')}"
|
|
147
|
+
f" {resp.get('statusMsg') or ''}"
|
|
148
|
+
f"{(' LastError=' + str(resp.get('LastError'))) if resp.get('LastError') else ''}")
|
|
149
|
+
raise SystemExit(0)
|
|
150
|
+
print("用法:list | close <店铺名|--store-id <id>> | cache | plugins | "
|
|
151
|
+
"clear-cache [--oauth <店铺标识>]… [--yes] | "
|
|
152
|
+
"clear-online (--store <店铺名>|--oauth <店铺标识>) [--type 1|2|3] [--yes]",
|
|
153
|
+
file=sys.stderr); raise SystemExit(2)
|
|
154
|
+
PY
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Argent 技能目录
|
|
2
|
+
|
|
3
|
+
本目录存放 Argent 的 DSH 技能(SKILL.md 格式)。运行时落位到 `<dshHome>/skills`
|
|
4
|
+
(preset 零配置挂载 `skill-filesystem` 的默认根,扫描直接子目录)。
|
|
5
|
+
|
|
6
|
+
## 技能目录谁在管(2026-10-04 按现行代码订正)
|
|
7
|
+
|
|
8
|
+
**升级器有角色过滤了(= 外发白名单)。** 三个环节的行为各不相同:
|
|
9
|
+
|
|
10
|
+
| 环节 | 行为 | 证据 |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| **安装**(`install-argent.mjs`) | **完全不碰技能目录**:只 `mkdirSync` 保证存在,不清理、不新增 | `install-argent.mjs:584-590`(注释「KB-061:不再按角色隔离」「已存在的 `<dshHome>/skills` 与仓库技能目录一律不碰」) |
|
|
13
|
+
| **安装**(`install-dsh.sh`) | 旧 bash 安装器,角色只支持 `general` / `hr-office`;`ml-seller` 分支直接 die(企业级订阅专享) | `install-dsh.sh:26-40` |
|
|
14
|
+
| **升级**(`scripts/argent-upgrade.mjs`) | **只同步外发集**(= `verticals/*/manifest.json#skills` 并集,判据复用 `check-skill-classification.mjs#classify()`);**内部角色技能(`skills/internal.json`)不同步**;宿主里既有的内部/旧技能**只报告不删**;内容 sha 一致 ⇒ 幂等跳过 | `argent-upgrade.mjs#syncSkills`(2026-10-04 修:客户机实测旧版 `✓ 技能同步: 11 项` = 5 外发 + 6 内部,违反 D5);回归 `scripts/tests/upgrade-skill-whitelist.test.mjs` |
|
|
15
|
+
| **清理**(`scripts/skill-install.mjs --prune-orphans`) | **人工决策**的收敛动词(默认 dry-run):只列"将删除(点名)/ 未点名 / 拒绝清理",真删要 `--apply` **且逐个 `--allow <name>` 点名**;只删四条件同时满足的目录(不在外发集 / 不在 `internal.json` / 不在安装器清单 / 含 `SKILL.md`),**先备份再删** | 见下「收敛宿主里的旧残留」;回归 `scripts/tests/skill-subset.test.mjs`【F】 |
|
|
16
|
+
|
|
17
|
+
**收敛宿主里的旧残留(客户机实测:6 个内部角色技能 + 12 个旧 hermes 期技能)** —— 升级器**故意不删**,
|
|
18
|
+
所以清理是**人的决定**,命令分两步(`--dir` 写死目标最稳;`~/.dsh/skills` 就是 dsh 宿主的技能根):
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# ① 先看清单(缺省 dry-run,零副作用):哪些会被删、哪些拒绝、为什么
|
|
22
|
+
node ~/Code/argent-dsh/scripts/skill-install.mjs --host dsh --prune-orphans --allow-host-dsh-prune
|
|
23
|
+
# ② 逐个核对名字后**逐个点名**真删(备份到 <dir>/.argent-skills-pruned-<ts>/,审计见 .argent-skills-prune-audit.jsonl)
|
|
24
|
+
node ~/Code/argent-dsh/scripts/skill-install.mjs --host dsh --prune-orphans --allow-host-dsh-prune \
|
|
25
|
+
--apply --allow hermes-era-skill-01 --allow hermes-era-skill-02
|
|
26
|
+
```
|
|
27
|
+
⚠️ **不该自动清的**:`skills/internal.json` 里的 6 个内部角色技能(宿主上它们是**角色包「已装」的判据**,
|
|
28
|
+
清了角色包状态就对不上)、外发集里那 5 个(归升级器/安装器管)、安装器清单里的(用 `--uninstall`)、
|
|
29
|
+
任何**用户自建**(非技能形态一律拒绝;手写技能与旧残留形态无法区分 ⇒ 只能靠逐个点名 + 人眼核对)。
|
|
30
|
+
|
|
31
|
+
**结论**:技能一旦在仓库 `skills/` 下,**必须先在两处声明里归类**(外发 or 内部)——外发的会被同步给
|
|
32
|
+
每一个 agent 的技能目录,内部的**不会**;**未归类的目录不会被同步**,但门禁会判红(`G2`)。
|
|
33
|
+
角色级的技能可见性由**网关群级** `chats[<chatId>].skills` 决定
|
|
34
|
+
(`plugins/argent-gateway/src/index.js:628-629` 拼成「【本群启用技能】…」进 prompt),
|
|
35
|
+
角色级 `skills` 字段只是权益回显。**不要把 `ml-daily` / `ml-fulfillment` 当技能目录名**——
|
|
36
|
+
它们是套餐装配档标识,实际目录是 `ml-store-daily-report` / `ml-fulfillment-sop`。
|
|
37
|
+
|
|
38
|
+
> 历史说明:旧文档写的「角色 → 技能集合(`install-argent.mjs` 的 `ROLE_SKILLS`)」**已无实现**——
|
|
39
|
+
> 该符号在全仓库只剩两处注释提及(`plugins/argent-core/src/index.js:195` 与本文),没有任何代码路径。
|
|
40
|
+
|
|
41
|
+
## 当前技能清单(11 个目录)—— 并且**分成外发 / 内部两半**
|
|
42
|
+
|
|
43
|
+
> ⚠️ 2026-10-03(P3)更正:本节原写「9 个目录」,实际 **11**(漏了 `ml-invoice-xzh` / `ml-config-guide`)。
|
|
44
|
+
> 清单**不再手抄**,判据在两处声明里:外发 = `verticals/<id>/manifest.json#skills`(**唯一真源**),
|
|
45
|
+
> 内部 = `skills/internal.json`(逐条带理由)。跑 `node scripts/check-skill-classification.mjs` 看当前分类。
|
|
46
|
+
|
|
47
|
+
**外发(客户可用的流程技能,5 个)** —— 真源:`verticals/mercadolibre/manifest.json#skills`
|
|
48
|
+
|
|
49
|
+
- `ml-fulfillment-sop/` —— FULL 货件管理(含 references / scripts / template)
|
|
50
|
+
- `ml-store-daily-report/` —— 美客多店铺日报
|
|
51
|
+
- `ml-invoice/` —— 上海文鳐发票全链路
|
|
52
|
+
- `ml-invoice-xzh/` —— 鑫中航发票全链路(同引擎、不同门户)
|
|
53
|
+
- `ml-config-guide/` —— 配置缺口诊断与引导(替代写死 schema 快照的旧校验)
|
|
54
|
+
|
|
55
|
+
**内部(不外发的角色技能,6 个)** —— 真源:`skills/internal.json`(含逐条理由)
|
|
56
|
+
|
|
57
|
+
- `argent-dev/` `pet-dev/` `whyshu-web-dev/` `whyshu-pm/` `lktop-pm/` `lktopapp-dev/`
|
|
58
|
+
(角色包「已装」的硬判据:`plugins/argent-packs/src/index.js` 以 `~/.dsh/skills/<skill>` 是否存在为准)
|
|
59
|
+
|
|
60
|
+
⚠️ **往 `skills/` 丢一个新目录 = 必须先归类**:外发(写进业务线声明)才会同步给客户,
|
|
61
|
+
未归类的目录**不会**被同步,但门禁 `G2` 会判红(升级器只发外发集,见上表)⇒ 必须先做一次决定:
|
|
62
|
+
写进业务线声明(外发)或写进 `skills/internal.json`(内部)。
|
|
63
|
+
安装到非 dsh 宿主用 `node scripts/skill-install.mjs --host <dsh|claude-code|codex|cursor> --apply`(只装外发 5 个;**缺省只预演**,真装要 `--apply`)。
|
|
64
|
+
|
|
65
|
+
## 技能格式
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
---
|
|
69
|
+
name: <skill-id>
|
|
70
|
+
description: <一句话说明,用于技能目录展示与匹配>
|
|
71
|
+
---
|
|
72
|
+
<技能正文指令>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
硬约束(`dsh-skill-filesystem` 的 `parseSkillFile()`):首行 `---` 且**有闭合 `---`**;
|
|
76
|
+
`name` 必须是**严格小写 kebab-case**且等于目录名(**中文名一律非法**,会被静默丢弃);
|
|
77
|
+
frontmatter 必须**同时含 `name` 与 `description`**。
|
|
78
|
+
|
|
79
|
+
改完技能后跑门禁:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python3 scripts/fix-skill-frontmatter.py --check # 格式(闭合 + kebab name + description)
|
|
83
|
+
node scripts/tests/skills-frontmatter.test.mjs
|
|
84
|
+
node scripts/check-skill-classification.mjs # 归类(外发/内部/未归类即红)
|
|
85
|
+
node scripts/tests/skill-subset.test.mjs # 归类 + 外发安装器回归
|
|
86
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: argent-dev
|
|
3
|
+
description: Argent开发者角色技能:Argent on DSH 开发知识(安装器/插件/preset/脚本)与 dsh 插件三种角色能力设计。接 whyshu-pm 任务,完成后飞书群 @ 汇报。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
author: 问述科技 (Whyshu)
|
|
6
|
+
license: MIT
|
|
7
|
+
metadata:
|
|
8
|
+
argent:
|
|
9
|
+
role: argent-dev
|
|
10
|
+
tags: [argent, dsh, cordis, plugin]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Argent开发者(argent-dev)
|
|
14
|
+
|
|
15
|
+
## 角色定位
|
|
16
|
+
|
|
17
|
+
Argent 产品开发者,负责 argent-dsh 仓库(安装器/插件/preset/脚本/skills)与策划文档的落地。
|
|
18
|
+
|
|
19
|
+
## 核心知识入口
|
|
20
|
+
|
|
21
|
+
- **Argent 仓库**:`/Users/chester/Code/argent-dsh`(本机开发仓库,远端 whyshu 裸仓库镜像)
|
|
22
|
+
- `install-argent.mjs`:跨平台安装器(`--role / --dsh-home / --port` 等)
|
|
23
|
+
- `plugins/`:argent-core / argent-skin / argent-files / argent-ml(cordis 插件)
|
|
24
|
+
- `presets/`:各角色 Agent Preset(agent.cordis.yml 组合)
|
|
25
|
+
- `scripts/`:daily-report.mjs / orchestrator.py / feishu-bridge.js 等
|
|
26
|
+
- **策划文档**:`/Users/chester/Code/whyshu/docs/products/argent-*`(含
|
|
27
|
+
`argent-edition-multi-instance-plan.md` 多实例生态策划案 v0.9)
|
|
28
|
+
- **dsh 插件开发**:三种角色能力设计(Service Definition / Provider / Consumer,
|
|
29
|
+
参考 deepseek-harness 官方 practice 文档)。
|
|
30
|
+
|
|
31
|
+
## 协作流
|
|
32
|
+
|
|
33
|
+
1. whyshu-pm 在飞书群 @ 开发者分配任务并附验收标准(旧看板已退场;新任务机制上线前以此为准);
|
|
34
|
+
2. 在飞书群/会话中确认验收标准;
|
|
35
|
+
3. 完成后在飞书群 @whyshu-pm 汇报。
|
|
36
|
+
|
|
37
|
+
## 红线(仓库全局规则)
|
|
38
|
+
|
|
39
|
+
- **严禁重启本机 dsh web 服务**(LaunchAgent com.whyshu.dsh-web,自杀式重启);
|
|
40
|
+
- **严禁擅自升级/重装全局 dsh**(锁定 0.1.1-rc.1,快照安装流程);
|
|
41
|
+
- 客户端插件改动浏览器硬刷新生效;host 端插件改动需用户手动重启服务。
|