@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,299 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ml-store-daily-report generate script
|
|
4
|
+
* Converts extract.js JSON output into a formatted Chinese Markdown daily report.
|
|
5
|
+
*
|
|
6
|
+
* Input (single store, backward compatible):
|
|
7
|
+
* { "store": "墨西哥站", "orders": {...}, "reputation": {...}, ... }
|
|
8
|
+
*
|
|
9
|
+
* Input (multi store, v1.1.0):
|
|
10
|
+
* { "stores": [{ "store": "墨西哥站", "orders": {...}, ... }, ...] }
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* node generate.js data.json # Markdown output
|
|
14
|
+
* node generate.js data.json --json # JSON output {markdown, push}
|
|
15
|
+
* node generate.js data.json --push # Push card JSON only
|
|
16
|
+
* cat data.json | node generate.js # Markdown from stdin
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
function normalizeInput(data) {
|
|
20
|
+
if (data.stores && Array.isArray(data.stores) && data.stores.length > 0) {
|
|
21
|
+
return data.stores;
|
|
22
|
+
}
|
|
23
|
+
// Single store — wrap in array for uniform processing
|
|
24
|
+
return [data];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function generateReport(data) {
|
|
28
|
+
const stores = normalizeInput(data);
|
|
29
|
+
const lines = [];
|
|
30
|
+
const date = stores[0]?.date || new Date().toISOString().slice(0, 10);
|
|
31
|
+
|
|
32
|
+
// ---- Header ----
|
|
33
|
+
if (stores.length === 1) {
|
|
34
|
+
const s = stores[0];
|
|
35
|
+
const storeName = s.store && s.store !== '未知站' ? s.store : '墨西哥站';
|
|
36
|
+
lines.push('# 美客多运营日报');
|
|
37
|
+
lines.push(`**日期**: ${date} | **店铺**: ${storeName} | **站点**: 墨西哥`);
|
|
38
|
+
} else {
|
|
39
|
+
lines.push('# 美客多运营日报(多店铺汇总)');
|
|
40
|
+
lines.push(`**日期**: ${date} | **店铺数**: ${stores.length}`);
|
|
41
|
+
}
|
|
42
|
+
lines.push('');
|
|
43
|
+
|
|
44
|
+
// ---- 汇总概览 ----
|
|
45
|
+
if (stores.length > 1) {
|
|
46
|
+
lines.push('## 📦 汇总概览');
|
|
47
|
+
lines.push('| 店铺 | 订单量 | 销售额 | 退货 | 声誉 |');
|
|
48
|
+
lines.push('|------|--------|--------|------|------|');
|
|
49
|
+
|
|
50
|
+
let totalOrders = 0, totalAmount = 0, totalReturns = 0;
|
|
51
|
+
for (const s of stores) {
|
|
52
|
+
const count = s.orders?.count ?? 0;
|
|
53
|
+
const amount = s.orders?.total_amount_mxn ?? 0;
|
|
54
|
+
const returns = s.after_sales?.pending ?? 0;
|
|
55
|
+
const repScore = s.reputation?.score || '—';
|
|
56
|
+
totalOrders += Number(count) || 0;
|
|
57
|
+
totalAmount += Number(amount) || 0;
|
|
58
|
+
totalReturns += Number(returns) || 0;
|
|
59
|
+
lines.push(`| ${s.store || '—'} | ${count || '—'} | ${amount ? '$' + amount.toFixed(2) : '—'} | ${returns || '—'} | ${repScore} |`);
|
|
60
|
+
}
|
|
61
|
+
lines.push(`| **合计** | **${totalOrders}** | **$${totalAmount.toFixed(2)}** | **${totalReturns}** | — |`);
|
|
62
|
+
lines.push('');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ---- 逐店详情 ----
|
|
66
|
+
for (const s of stores) {
|
|
67
|
+
const sectionTitle = stores.length > 1
|
|
68
|
+
? `## 📊 ${s.store || '未知站'}`
|
|
69
|
+
: '## 📦 数据概览';
|
|
70
|
+
|
|
71
|
+
lines.push(sectionTitle);
|
|
72
|
+
if (stores.length === 1) {
|
|
73
|
+
lines.push('| 指标 | 今日 | 环比昨日 |');
|
|
74
|
+
lines.push('|------|------|----------|');
|
|
75
|
+
} else {
|
|
76
|
+
lines.push('| 指标 | 今日 |');
|
|
77
|
+
lines.push('|------|------|');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const orderCount = s.orders?.count ?? '—';
|
|
81
|
+
const totalAmount = s.orders?.total_amount_mxn != null
|
|
82
|
+
? `$${s.orders.total_amount_mxn.toFixed(2)}`
|
|
83
|
+
: '—';
|
|
84
|
+
const returns = s.after_sales?.pending ?? 0;
|
|
85
|
+
|
|
86
|
+
lines.push(`| 订单量 | ${orderCount} |${stores.length === 1 ? ' — |' : ''}`);
|
|
87
|
+
lines.push(`| 销售额 | ${totalAmount}${totalAmount === '—' ? '' : ' MXN'} |${stores.length === 1 ? ' — |' : ''}`);
|
|
88
|
+
lines.push(`| 退货/售后 | ${returns} |${stores.length === 1 ? ' — |' : ''}`);
|
|
89
|
+
// Show order detail count only for real parsed items (skip metrics synthetic entry)
|
|
90
|
+
const realItems = (s.orders?.items || []).filter(item => item.sku !== 'METRICS');
|
|
91
|
+
if (realItems.length > 0) lines.push(`| 订单明细数 | ${realItems.length} |${stores.length === 1 ? ' — |' : ''}`);
|
|
92
|
+
lines.push('');
|
|
93
|
+
|
|
94
|
+
// 发货
|
|
95
|
+
if (s.shipping) {
|
|
96
|
+
const sh = s.shipping;
|
|
97
|
+
lines.push('### 🚚 发货');
|
|
98
|
+
lines.push(`今日 ${sh.today ?? 0} | 未来 ${sh.upcoming ?? 0} | 运输中 ${sh.in_transit ?? 0}`);
|
|
99
|
+
lines.push('');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// 声誉
|
|
103
|
+
const rep = s.reputation || {};
|
|
104
|
+
lines.push('### 🌟 声誉');
|
|
105
|
+
if (rep.level) {
|
|
106
|
+
const emoji = rep.level.includes('Gold') ? '🥇' : rep.level.includes('Platinum') ? '🥈' : rep.level.includes('Silver') ? '🥉' : '';
|
|
107
|
+
lines.push(`**${emoji} ${rep.level}**${rep.score ? ` 评分: ${rep.score}` : ''}`);
|
|
108
|
+
} else if (rep.score) {
|
|
109
|
+
lines.push(`**评分**: ${rep.score}`);
|
|
110
|
+
}
|
|
111
|
+
if (rep.complaints) {
|
|
112
|
+
const c = rep.complaints;
|
|
113
|
+
const parts = [];
|
|
114
|
+
if (c.reclamos_pct != null) parts.push(`Reclamos ${c.reclamos_pct}`);
|
|
115
|
+
if (c.mediaciones_pct != null) parts.push(`Mediaciones ${c.mediaciones_pct}`);
|
|
116
|
+
if (c.cancel_pct != null) parts.push(`取消率 ${c.cancel_pct}`);
|
|
117
|
+
if (c.envio_err_pct != null) parts.push(`错误发货 ${c.envio_err_pct}`);
|
|
118
|
+
if (parts.length > 0) lines.push(parts.join(' | '));
|
|
119
|
+
}
|
|
120
|
+
if (rep.new_questions != null) lines.push(`新买家提问: ${rep.new_questions} 条`);
|
|
121
|
+
const hasRep = rep.level || rep.score || rep.complaints || rep.new_questions != null;
|
|
122
|
+
if (!hasRep) lines.push('*暂无声誉数据*');
|
|
123
|
+
lines.push('');
|
|
124
|
+
|
|
125
|
+
// FULL
|
|
126
|
+
const full = s.full || {};
|
|
127
|
+
lines.push('### 📦 FULL 库存');
|
|
128
|
+
if (full.pending_count != null) lines.push(`待处理货件: ${full.pending_count} 件`);
|
|
129
|
+
if (full.not_apt_total > 0) lines.push(`不适配 FULL: ${full.not_apt_total} 单位`);
|
|
130
|
+
if (full.shipments && full.shipments.length > 0) {
|
|
131
|
+
for (const sh of full.shipments) {
|
|
132
|
+
const emoji = sh.status === 'Vencido' ? '❌' : sh.status === 'En preparación' ? '🔄' : '✅';
|
|
133
|
+
lines.push(`- ${emoji} #${sh.id || '—'} ${sh.status} | 申报:${sh.declared ?? '?'} 适配:${sh.apt_for_full ?? '?'} | ${sh.appointment || '—'}`);
|
|
134
|
+
}
|
|
135
|
+
} else {
|
|
136
|
+
lines.push('*暂无 FULL 货件数据*');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Alerts
|
|
140
|
+
const alerts = _collectAlerts(s);
|
|
141
|
+
if (alerts.length > 0) {
|
|
142
|
+
lines.push('');
|
|
143
|
+
lines.push('### ⚠️ 告警');
|
|
144
|
+
for (const a of alerts) lines.push(`- ${a}`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
lines.push('');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return lines.join('\n');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function _collectAlerts(data) {
|
|
154
|
+
const items = [];
|
|
155
|
+
const rep = data.reputation || {};
|
|
156
|
+
const full = data.full || {};
|
|
157
|
+
|
|
158
|
+
if (data.alerts && data.alerts.length > 0) {
|
|
159
|
+
for (const a of data.alerts) {
|
|
160
|
+
switch (a) {
|
|
161
|
+
case 'auth_code_missing': items.push('🔴 授权码缺失'); break;
|
|
162
|
+
case 'no_orders_found': items.push('🟡 无订单数据'); break;
|
|
163
|
+
case 'pending_after_sales': items.push(`🔴 售后待处理 ${data.after_sales?.pending ?? 0} 单`); break;
|
|
164
|
+
default: items.push(`🟡 ${a}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (rep.complaints) {
|
|
169
|
+
const c = rep.complaints;
|
|
170
|
+
if (c.reclamos_pct && parseFloat(c.reclamos_pct) > 5) items.push(`🔴 Reclamos 过高 ${c.reclamos_pct}`);
|
|
171
|
+
if (c.mediaciones_pct && parseFloat(c.mediaciones_pct) > 3) items.push(`🔴 Mediaciones 过高 ${c.mediaciones_pct}`);
|
|
172
|
+
if (c.cancel_pct && parseFloat(c.cancel_pct) > 5) items.push(`🟡 取消率过高 ${c.cancel_pct}`);
|
|
173
|
+
}
|
|
174
|
+
if (full.shipments) {
|
|
175
|
+
const expired = full.shipments.filter(s => s.status === 'Vencido');
|
|
176
|
+
if (expired.length > 0) items.push(`🔴 ${expired.length} 件货件过期`);
|
|
177
|
+
}
|
|
178
|
+
return items;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ================================================================
|
|
182
|
+
// Push data builder
|
|
183
|
+
// ================================================================
|
|
184
|
+
|
|
185
|
+
function buildPushData(data) {
|
|
186
|
+
const stores = normalizeInput(data);
|
|
187
|
+
const multi = stores.length > 1;
|
|
188
|
+
const date = stores[0]?.date || new Date().toISOString().slice(0, 10);
|
|
189
|
+
|
|
190
|
+
// Aggregate metrics
|
|
191
|
+
let totalOrders = 0, totalAmount = 0, totalReturns = 0;
|
|
192
|
+
const perStore = [];
|
|
193
|
+
const allAlerts = [];
|
|
194
|
+
|
|
195
|
+
for (const s of stores) {
|
|
196
|
+
const count = Number(s.orders?.count) || 0;
|
|
197
|
+
const amount = Number(s.orders?.total_amount_mxn) || 0;
|
|
198
|
+
const returns = Number(s.after_sales?.pending) || 0;
|
|
199
|
+
totalOrders += count;
|
|
200
|
+
totalAmount += amount;
|
|
201
|
+
totalReturns += returns;
|
|
202
|
+
|
|
203
|
+
perStore.push({ store: s.store || '未知', count, amount, returns, score: s.reputation?.score || '' });
|
|
204
|
+
|
|
205
|
+
const alerts = _collectAlerts(s);
|
|
206
|
+
if (alerts.length > 0) allAlerts.push({ store: s.store, alerts });
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const metrics = [
|
|
210
|
+
{ label: '总订单', value: String(totalOrders), change: '' },
|
|
211
|
+
{ label: '总销售额', value: `$${totalAmount.toFixed(2)} MXN`, change: '' },
|
|
212
|
+
];
|
|
213
|
+
if (totalReturns > 0) metrics.push({ label: '退货/售后', value: String(totalReturns), change: '' });
|
|
214
|
+
|
|
215
|
+
// Per-store breakdown as highlight
|
|
216
|
+
const breakdown = multi
|
|
217
|
+
? perStore.map(p => `${p.store}: ${p.count}单 $${p.amount.toFixed(2)}`).join('\n')
|
|
218
|
+
: '';
|
|
219
|
+
|
|
220
|
+
// Alerts
|
|
221
|
+
let highlight = '';
|
|
222
|
+
if (allAlerts.length > 0) {
|
|
223
|
+
const alertSummary = allAlerts.map(a => `⚠️ ${a.store}: ${a.alerts.slice(0, 2).join('、')}`).join('\n');
|
|
224
|
+
highlight = alertSummary;
|
|
225
|
+
} else if (multi) {
|
|
226
|
+
highlight = '今日所有店铺运营数据正常';
|
|
227
|
+
} else {
|
|
228
|
+
highlight = '今日运营数据正常';
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return {
|
|
232
|
+
card: {
|
|
233
|
+
template: 'daily_report',
|
|
234
|
+
data: {
|
|
235
|
+
title: multi ? `美客多运营日报(${stores.length}店汇总)` : '美客多运营日报',
|
|
236
|
+
date,
|
|
237
|
+
store: multi ? `${stores.length} 个店铺` : (stores[0]?.store || '—'),
|
|
238
|
+
metrics,
|
|
239
|
+
highlight: breakdown ? `${breakdown}\n\n${highlight}` : highlight,
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// ---- CLI Entry ----
|
|
246
|
+
function main() {
|
|
247
|
+
const args = process.argv.slice(2).filter(a => a !== '--json' && a !== '--push');
|
|
248
|
+
const mode = process.argv.includes('--push') ? 'push'
|
|
249
|
+
: process.argv.includes('--json') ? 'json'
|
|
250
|
+
: 'markdown';
|
|
251
|
+
const fileArg = args[0];
|
|
252
|
+
|
|
253
|
+
function processJSON(input) {
|
|
254
|
+
try {
|
|
255
|
+
const data = JSON.parse(input);
|
|
256
|
+
const markdown = generateReport(data);
|
|
257
|
+
|
|
258
|
+
if (mode === 'push') {
|
|
259
|
+
console.log(JSON.stringify(buildPushData(data), null, 2));
|
|
260
|
+
} else if (mode === 'json') {
|
|
261
|
+
console.log(JSON.stringify({ markdown, push: buildPushData(data) }, null, 2));
|
|
262
|
+
} else {
|
|
263
|
+
console.log(markdown);
|
|
264
|
+
}
|
|
265
|
+
} catch (e) {
|
|
266
|
+
console.error('Error: Invalid JSON input — ' + e.message);
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (fileArg) {
|
|
272
|
+
const fs = require('fs');
|
|
273
|
+
let content;
|
|
274
|
+
try {
|
|
275
|
+
content = fs.readFileSync(fileArg, 'utf8');
|
|
276
|
+
} catch (e) {
|
|
277
|
+
console.error(`Error: Cannot read file "${fileArg}" — ${e.message}`);
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
processJSON(content);
|
|
281
|
+
} else {
|
|
282
|
+
let input = '';
|
|
283
|
+
process.stdin.setEncoding('utf8');
|
|
284
|
+
process.stdin.on('data', chunk => { input += chunk; });
|
|
285
|
+
process.stdin.on('end', () => {
|
|
286
|
+
if (!input.trim()) {
|
|
287
|
+
console.error('Error: No input received.');
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
processJSON(input);
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (require.main === module) {
|
|
296
|
+
main();
|
|
297
|
+
} else {
|
|
298
|
+
module.exports = { generateReport, buildPushData, normalizeInput };
|
|
299
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pet-dev
|
|
3
|
+
description: 云宠乐园开发者角色技能:问述服务器部署(whyshu-deploy)与 whyshu pet 开发知识。接 whyshu-pm 任务,完成后飞书群 @ 汇报。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
author: 问述科技 (Whyshu)
|
|
6
|
+
license: MIT
|
|
7
|
+
metadata:
|
|
8
|
+
argent:
|
|
9
|
+
role: pet-dev
|
|
10
|
+
tags: [pet, whyshu, deploy]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# 云宠乐园开发者(pet-dev)
|
|
14
|
+
|
|
15
|
+
## 角色定位
|
|
16
|
+
|
|
17
|
+
云宠乐园(whyshu pet)产品开发者,负责需求实现、缺陷修复、代码评审与发布。
|
|
18
|
+
|
|
19
|
+
## 核心知识入口
|
|
20
|
+
|
|
21
|
+
- **问述服务器部署**:使用 `whyshu-deploy` 技能(问述科技 whyshu 项目部署专用)完成
|
|
22
|
+
whyshu-svr(Fastify 后端)与 whyshu-web(Next.js 前端)的构建、部署与验证。
|
|
23
|
+
- **pet 开发知识**:以 `/Users/chester/Code/whyshu` 仓库为准——
|
|
24
|
+
- `whyshu/docs/`:产品文档与策划案
|
|
25
|
+
- `whyshu-svr/`:后端服务(路由/服务/数据层)
|
|
26
|
+
- `whyshu-web/`:前端(app 路由 / argent 页面等)
|
|
27
|
+
- 部署目标服务器:**问述科技**腾讯云 `81.69.222.211`(域名 `whyshu.com`,私钥 `~/.ssh/whyshu.pem`);
|
|
28
|
+
**IP / 私钥 / 部署目录以 `whyshu-deploy` 技能为唯一判据**(本行只作定位,变更以该技能为准)。
|
|
29
|
+
⛔ LKTOP(力库拓,**另一腾讯云账号**)的服务器 / 部署目录 / 私钥与本角色无关,**一律不得使用**——
|
|
30
|
+
本技能此前曾误写 LKTOP 的服务器 IP,是 2026-10-04 修掉的一处**跨业务事实错配**
|
|
31
|
+
(据 `docs/Argent-角色合并与收敛-操作方案-2026-10-04.md` §2.6)。
|
|
32
|
+
|
|
33
|
+
## 协作流
|
|
34
|
+
|
|
35
|
+
1. whyshu-pm 在飞书群 @ 开发者分配任务并附验收标准(旧看板已退场;新任务机制上线前以此为准);
|
|
36
|
+
2. 在飞书群/会话中确认需求与验收标准;
|
|
37
|
+
3. 完成后在飞书群 @whyshu-pm 汇报(改动摘要 + 验证结果)。
|
|
38
|
+
|
|
39
|
+
## 红线
|
|
40
|
+
|
|
41
|
+
- 部署/发布前核对目标环境与回滚预案;
|
|
42
|
+
- 涉及生产数据/凭据的操作先与用户确认。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: whyshu-pm
|
|
3
|
+
description: 问述科技PM角色技能:策划案需求掌握与任务分发(飞书群 @ + 会话),验收闭环。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
author: 问述科技 (Whyshu)
|
|
6
|
+
license: MIT
|
|
7
|
+
metadata:
|
|
8
|
+
argent:
|
|
9
|
+
role: whyshu-pm
|
|
10
|
+
tags: [pm, planning, task]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# 问述科技PM(whyshu-pm)
|
|
14
|
+
|
|
15
|
+
## 角色定位
|
|
16
|
+
|
|
17
|
+
问述科技产品经理:掌握策划案需求,拆解并分发任务给开发者,验收闭环。
|
|
18
|
+
|
|
19
|
+
## 核心知识入口
|
|
20
|
+
|
|
21
|
+
- **策划案需求**:`/Users/chester/Code/whyshu/docs/products/`(如
|
|
22
|
+
`argent-edition-multi-instance-plan.md`、`argent-service-monetization.md` 等)
|
|
23
|
+
- **任务分发**:lark-task(飞书任务)/ lark-doc(需求文档)/ lark-im(群通知)
|
|
24
|
+
|
|
25
|
+
## 协作流
|
|
26
|
+
|
|
27
|
+
1. 需求拆解 → 在飞书群 @ 开发者派单(旧看板已退场;新任务机制上线前以此为准)(必须含:标题、描述、验收标准、优先级、截止时间);
|
|
28
|
+
2. 分配给云宠乐园开发者(pet-dev)/ Argent开发者(argent-dev);
|
|
29
|
+
3. 分配完成后在飞书群 @ 对应开发者 Bot 通知(标题/链接/验收标准);
|
|
30
|
+
4. 开发者完成 @ 汇报 → 查看改动与验证 → 在飞书群/会话中确认验收或打回并说明原因;
|
|
31
|
+
5. 用户会在群中直接指正,及时响应。
|
|
32
|
+
|
|
33
|
+
## 约定
|
|
34
|
+
|
|
35
|
+
- 任务信息在会话与飞书群保持同步;派单信息完整,避免开发者猜测。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: whyshu-web-dev
|
|
3
|
+
description: 问述官网开发者角色技能:whyshu.com 官网(whyshu-web Next.js 项目)开发与部署(whyshu-deploy)。接 whyshu-pm 任务,完成后飞书群 @ 汇报。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
author: 问述科技 (Whyshu)
|
|
6
|
+
license: MIT
|
|
7
|
+
metadata:
|
|
8
|
+
argent:
|
|
9
|
+
role: whyshu-web-dev
|
|
10
|
+
tags: [whyshu-web, website, frontend, deploy]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# 问述官网开发者(whyshu-web-dev)
|
|
14
|
+
|
|
15
|
+
## 角色定位
|
|
16
|
+
|
|
17
|
+
whyshu.com 官网(whyshu-web 项目)开发者,负责官网需求实现、页面开发、缺陷修复、构建部署与线上验证。
|
|
18
|
+
|
|
19
|
+
## 核心知识入口
|
|
20
|
+
|
|
21
|
+
- **官网代码仓库**:`/Users/chester/Code/whyshu-web`(Next.js 16 静态导出项目,
|
|
22
|
+
`output: "export"`,构建产物在 `out/`;含 nginx/ 配置与 whyshu.com 站点结构)
|
|
23
|
+
- **部署技能**:使用 `whyshu-deploy` 技能(问述科技 whyshu 项目部署专用)完成
|
|
24
|
+
whyshu-web 的构建、部署与验证——服务器腾讯云 `81.69.222.211`(域名 `whyshu.com`),
|
|
25
|
+
前端部署路径 `/var/www/whyshu-web/`,rsync 部署**禁止 `--delete`**(保留旧 chunk 防缓存白屏)。
|
|
26
|
+
- **需求文档**:`/Users/chester/Code/whyshu/docs/`(产品文档与策划案,如 `docs/products/` 下策划案)
|
|
27
|
+
- **相关仓库**:`/Users/chester/Code/whyshu`(产品文档/资产)、`/Users/chester/Code/whyshu-svr`(后端 API,
|
|
28
|
+
官网页面涉及接口时参考 `whyshu-svr` 的 API_CONTRACT.md)
|
|
29
|
+
- **腾讯云 API 凭据(2026-09-10 起统一用子账号,唯一入口)**:
|
|
30
|
+
- 凭据文件 `~/.tccli/whyshu-sub.credential`(600 权限,子账号 `svc-argent-ops`;主账号 UIN 100000884591)
|
|
31
|
+
- 调用工具 `~/Code/whyshu-svr/scripts/tc-api.py`(TC3-HMAC-SHA256 签名,仅标准库,不回显密钥):
|
|
32
|
+
`python3 scripts/tc-api.py --profile whyshu-sub --service ssl --action DescribeCertificates --region ap-shanghai --params '{"Limit":50}'`
|
|
33
|
+
- 覆盖范围:SSL 证书(`ssl:*`)、轻量实例 `lhins-3vjhv134`(上海 81.69.222.211,快照/防火墙/重启;`Describe*` 全量)、whyshu.com 解析(DNSPod)
|
|
34
|
+
- **Whyshu 旧凭据已退役**:仅 `~/.tccli/whyshu.credential`(Whyshu 旧 OAuth 临时凭据)已移至 `~/.tccli/_deprecated-20260910/` → 对 Whyshu 不要再 `tccli auth login`、不要复用该 profile
|
|
35
|
+
- ⚠️ **范围边界(勿动)**:`~/.tccli/default.credential`、`~/.tccli/likituo.credential` **不属于 Whyshu**(LKTOP/力库拓账号,default 被 LKTOP 侧流程引用)→ 不得归档、覆盖、删除或改写
|
|
36
|
+
- 完整说明与红线:`whyshu-svr/docs/tencent-cloud-subaccount-guide.md`
|
|
37
|
+
|
|
38
|
+
## 协作流
|
|
39
|
+
|
|
40
|
+
1. whyshu-pm 在飞书群 @ 开发者分配任务并附验收标准(旧看板已退场;新任务机制上线前以此为准);
|
|
41
|
+
2. 在飞书群/会话中确认需求与验收标准后再动手;
|
|
42
|
+
3. 完成后在飞书群 @whyshu-pm 汇报(改动摘要 + 验证结果)。
|
|
43
|
+
|
|
44
|
+
## 红线
|
|
45
|
+
|
|
46
|
+
- 部署/发布前核对目标环境与回滚预案;
|
|
47
|
+
- 生产域名 `whyshu.com` 下 rsync **禁用 `--delete`**(IP 预览阶段可清理);
|
|
48
|
+
- 涉及生产数据/凭据/服务器配置的操作先与用户确认;
|
|
49
|
+
- **腾讯云操作只用子账号 `whyshu-sub`**(见上「腾讯云 API 凭据」):不新建/不复用其他腾讯云密钥,不购买付费资源(证书/套餐/带宽),不执行重装系统、重置密码、删除实例、变更套餐;**不触碰 LKTOP 资源**(LKTOP 属另一腾讯云账号 APPID 1331053332)。SSH 部署用的 `~/.ssh/whyshu.pem` 是服务器密钥,与腾讯云 CAM 凭据无关,继续使用;
|
|
50
|
+
- 代码改动在开发仓库(`/Users/chester/Code/whyshu-web`)修改并 git commit + push 提交。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const VERSION = "0.6.1"
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# 业务线(vertical)契约
|
|
2
|
+
|
|
3
|
+
> Argent 0.2 起,**底座与业务线分离**:底座(引擎/角色运行时/装机器/门禁/商业机制)业务中立,
|
|
4
|
+
> 一条业务线 = 一个可独立开发、安装、授权、迭代、回滚的单元。
|
|
5
|
+
> 本文件是**业务线作者**(含将来的第三方)的唯一入口;引擎侧规则见
|
|
6
|
+
> `docs/Argent-0.2-平台与业务线架构-评审稿-2026-09-29.md`。
|
|
7
|
+
|
|
8
|
+
## 一条业务线长什么样
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
verticals/<id>/
|
|
12
|
+
manifest.json 元数据:版本、依赖区间、端口、能力、角色、技能、流程清单
|
|
13
|
+
flows.json 流程声明(局部 id;合并后规范 id = <id>.<local>)
|
|
14
|
+
prompts/<flow>.md 派发提示词(引擎按轮次投给角色)
|
|
15
|
+
roles/ 角色 preset 源 → 安装到 `presets/argent-<id>-<role>/`
|
|
16
|
+
skills/ 技能源 → 安装到 `skills/<id>-<skill>/`
|
|
17
|
+
adapters/<system>/ 外部系统适配器(人工门、错误词表、可执行计划)
|
|
18
|
+
billing.json 计费单位(只算成功 / 一票一结 / 证据可核)
|
|
19
|
+
preflight.py 本线验收检查段(由 customer-preflight 汇总)
|
|
20
|
+
tests/ 本线测试与夹具(run-all-tests.sh 自动收集)
|
|
21
|
+
env/ 本线环境变量(600;**只在本线可见**)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 三条硬规矩(`vertical-lint.mjs` 会拦)
|
|
25
|
+
|
|
26
|
+
1. **命名空间**:所有对外可见的名字都带业务线前缀 —— 两条线装在同一台机器上不允许撞名。
|
|
27
|
+
|
|
28
|
+
| 对象 | 规则 | 例(`id=customer-order`) |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| flow id | `<id>.<local>` | `customer-order.intake` |
|
|
31
|
+
| 角色(preset) | `argent-<id>-<role>` | `argent-customer-order-clerk` |
|
|
32
|
+
| 技能 | `<id>-<skill>` | `customer-order-intake` |
|
|
33
|
+
| 暂停开关 | `verticals/<id>/PAUSE.<flow>` | `verticals/customer-order/PAUSE.intake` |
|
|
34
|
+
| 定时器 label | `com.whyshu.flow-trigger.<id>.<flow>` | 自动派生 |
|
|
35
|
+
| env 文件 | `verticals/<id>/env/*.env` | `verticals/customer-order/env/prod.env` |
|
|
36
|
+
| 提示词 | `verticals/<id>/prompts/*.md` | — |
|
|
37
|
+
| 能力包 id | `<id>.<unit>` | `customer-order.intake` |
|
|
38
|
+
|
|
39
|
+
2. **跨线引用为零**:`verticals/A` 不得引用 `verticals/B` 的路径、flow、角色、技能。
|
|
40
|
+
两条线需要共享的东西,**上提到引擎或端口**,不要在业务线之间拉手。
|
|
41
|
+
|
|
42
|
+
3. **引擎不掺业务**:`scripts/` 与 `plugins/<plugin>/src/` 不得出现业务词(美客多/文鳐/紫鸟/…)。
|
|
43
|
+
历史存量记在 `_engine-words.baseline.txt`,门禁只拦**新增**;搬迁完成后基线应清零。
|
|
44
|
+
|
|
45
|
+
## 冲突判据在加载器,不在 lint
|
|
46
|
+
|
|
47
|
+
`scripts/flow_registry.py` 负责合并 **base(`scripts/flow-requirements.json`)+ 各业务线**,并保证:
|
|
48
|
+
同名 flow / 能力 / 计费单位 / 失败类 / 别名 **一律 fail(不静默覆盖)**;`manifest.id`、
|
|
49
|
+
`flows.json#vertical` 与目录名不一致也 fail(防复制粘贴串线)。
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
python3 scripts/flow_registry.py --check # 合并与冲突
|
|
53
|
+
python3 scripts/flow_registry.py --list # 规范 flow id
|
|
54
|
+
python3 scripts/flow_registry.py --flow intake # 别名 → 规范 id
|
|
55
|
+
node scripts/vertical-lint.mjs # 业务线门禁
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
回退开关:`ARGENT_REGISTRY_MODE=legacy`(只读 base,不扫业务线);显式 `--registry <file>` 亦为 legacy 单文件行为。
|
|
59
|
+
|
|
60
|
+
## 端口(该线用到哪些底座能力)
|
|
61
|
+
|
|
62
|
+
在 `manifest.json#ports` 声明;新增实现时同步更新 `vertical-lint.mjs` 的 `KNOWN_PORTS`。
|
|
63
|
+
|
|
64
|
+
| 端口 | 职责 | 现有实现 |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `source` | 任务队列/数据源 | `feishu-base`(唯一实现;`http-json`/`sql`/`file`/`manual` 待做,见 P4) |
|
|
67
|
+
| `transport` | 人机通道(收指令、唤醒) | `feishu`(`gateway-core` 拆分后可有 `web`/`wecom`) |
|
|
68
|
+
| `notify` | 出站通知/卡片 | `feishu-card`、`log` |
|
|
69
|
+
| `actor` | 外部系统动作 | `none`、`internal-http`;货代类见 `scripts/integrations/`(待泛化) |
|
|
70
|
+
| `identity` | 凭据/身份 | `env`(`verticals/<id>/env/*.env`) |
|
|
71
|
+
|
|
72
|
+
## 开一条新线
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
node scripts/vertical-init.mjs --id customer-order --title "客单系统" \
|
|
76
|
+
--flow intake --role clerk --skill intake
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
生成物是**安全态**(`wake=off`、`mode=shadow`),按 `verticals/<id>/README.md` 的待办清单逐项填。
|
|
80
|
+
上线顺序固定:**只读跑通 → `mode=real` → `wake=session`**。
|
|
81
|
+
|
|
82
|
+
## 门禁(每条线都要过)
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
node scripts/vertical-lint.mjs # 本文件的三条硬规矩 + manifest 自洽
|
|
86
|
+
python3 scripts/flow_registry.py --check
|
|
87
|
+
node scripts/tests/run-all-tests.sh # 平台回归 + 本线测试(tests/ 自动收集)
|
|
88
|
+
node scripts/gen-preset-rows.mjs # 改了角色后必跑(0.1.7 行式 preset)
|
|
89
|
+
node scripts/validate-preset-schema.mjs --runtime && node scripts/plugin-bootcheck.mjs
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 安装与授权
|
|
93
|
+
|
|
94
|
+
- 业务线是**安装边界**:`install-argent.mjs --add-capability <id>` 只落本线声明的文件,
|
|
95
|
+
别的线的文件不会上机器;`--rollback` 按线回退上一版。
|
|
96
|
+
- 授权:`manifest.capabilities[].minPlan` + 注册表 `entitlements`(档位矩阵是唯一出处)。
|
|
97
|
+
- 装机前校验 `manifest.requires.{argent,dsh}` 与 `verifiedOn`("已在哪些版本实测过")——
|
|
98
|
+
不允许把没验过的线装到目标机器上。
|
|
99
|
+
|
|
100
|
+
## 与 profile 的关系
|
|
101
|
+
|
|
102
|
+
**能力包能分开的,用包分;包分不开的(专属插件/专属通道/不同 dsh 版本/独立 UI),
|
|
103
|
+
才用 dsh profile 分**(`dsh web --profile <v> --port <n>`)。默认形态是"业务线包 + 共用 base profile"。
|