dsh-scout 0.9.2 → 0.9.4

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/dist/i18n.js CHANGED
@@ -29,8 +29,175 @@ const ZH_CN = {
29
29
  claimLedger: '## Claim ledger',
30
30
  sources: '## Sources',
31
31
  coverage: '## Coverage',
32
+ identity: '## 主体核验',
32
33
  interviewQuestions: '## Interview questions',
33
34
  },
35
+ identity: {
36
+ legalEntity: '- 法定主体:{value}',
37
+ registrationNumber: '- 统一社会信用代码:{value}',
38
+ region: '- 注册地:{value}',
39
+ representative: '- 法定代表人:{value}',
40
+ brandRelationship: '- 品牌关系:{value}',
41
+ tier: '- 核验等级:{value}',
42
+ tiers: {
43
+ verified: '已核验(E3 权威来源支撑注册号)',
44
+ corroborated: '已交叉核验(E2,多源一致;非官方登记核验)',
45
+ needs_verification: '未核验',
46
+ },
47
+ fieldLabels: {
48
+ legalEntity: '法定主体',
49
+ registrationNumber: '统一社会信用代码',
50
+ registeredRegion: '注册地',
51
+ legalRepresentative: '法定代表人',
52
+ brandRelationship: '品牌关系',
53
+ },
54
+ evidence: '- 证据来源:{value}',
55
+ fieldEvidence: '- {field} 证据:{value}',
56
+ unknown: '未知',
57
+ },
58
+ report: {
59
+ meta: {
60
+ role: '岗位',
61
+ location: '地点',
62
+ evidenceAsOf: '证据截至',
63
+ decision: '判断',
64
+ objective: '目标',
65
+ unknownLocation: '未指定',
66
+ },
67
+ readingGuide: '> 阅读顺序:30 秒结论 → 主体 → 已确认事实 → 待确认 → 风险 → 面试问题 → 附录(证据台账)',
68
+ confidenceLegend: '> 可信度:已核实=多来源一致;有报道=单一来源;推断=由事实推出;未知=没查到;未找到证据=不代表不存在',
69
+ quick: {
70
+ heading: '## 30 秒结论',
71
+ entity: '主体:{entity}({registrationNumber}),{region},法人 {representative}——已核实。',
72
+ entityUnverified: '主体:{entity}——尚未核验。',
73
+ business: '业务:{text}(已核实)',
74
+ businessUnknown: '业务:公开信息未形成可核实的产品描述。',
75
+ capital: '资本:{text}{suffix}',
76
+ capitalSuffix: ';另有 {count} 条融资/工商变更线索。',
77
+ capitalUnknown: '资本:未找到公开融资信息。',
78
+ confirmHeading: '**最该先确认的 3 件事**',
79
+ confirmIdentity: '取得官方登记证据(营业执照或工商公示页),确认合同主体与信用代码',
80
+ confirmRole: '确认岗位是否真实在招、汇报给谁、有多大授权(只能见面问)',
81
+ confirmRisk: '核实口碑/面试流程类单方说法(不影响主体,但影响体验预期)',
82
+ },
83
+ sections: {
84
+ identity: '## 1. 公司与主体(已确认)',
85
+ confirmed: '## 2. 已确认的事实(阶段:可直接使用)',
86
+ open: '## 3. 线索与待确认(阶段:先别当事实)',
87
+ risk: '## 4. 风险与红旗(阶段:已识别)',
88
+ interview: '## 5. 面试问题(按主题,最多 12 条)',
89
+ gap: '## 6. 距离下一步还差什么',
90
+ appendixSources: '## 附录 A · 来源表',
91
+ appendixLedger: '## 附录 B · 主张台账(技术可追溯)',
92
+ appendixCoverage: '## 附录 C · 调查覆盖度',
93
+ appendixGlossary: '## 附录 D · 术语表',
94
+ },
95
+ themes: { business: '业务与产品', capital: '资本与融资', organization: '组织与团队' },
96
+ openSubheads: {
97
+ interview: '### 只能面试确认',
98
+ external: '### 还能通过公开渠道再核实',
99
+ conflict: '### 说法冲突(需要裁决)',
100
+ },
101
+ labels: { ask: '要问', nextStep: '下一步', advice: '建议', tier: '核验等级', means: '这意味着', identityEvidence: '主体核验字段来源' },
102
+ tier: {
103
+ verified: '已核验:有官方/权威来源支撑统一社会信用代码,可直接引用。',
104
+ corroborated: '已交叉核验:多个独立来源(工商聚合、应用商店等)在信用代码与法人上一致;尚未取得官方登记页,签约前仍需看营业执照。',
105
+ unverified: '未核验:尚无足够来源确认主体。',
106
+ meansVerified: '可以直接按该主体做后续判断。',
107
+ meansOther: '可以按该主体继续尽调与判断,但把它视为“未拿到官方盖章的事实”,关键动作(签约、背调、开票)前需复核。',
108
+ },
109
+ confirmedItem: '- {text}\n - {status} · {level} · {sources}{captured}',
110
+ captured: '(采集于 {date})',
111
+ openInterviewLine: '{status} · {level} · {ask}:{question}',
112
+ openExternalLine: '{status} · {level} · {next}:{action}',
113
+ riskLine: '- {text}({status} · {level})\n - {advice}:{action}',
114
+ gapLine: {
115
+ why: '- **为什么现在还是「{decision}」**:{sentence}',
116
+ toProceed: '- **补齐后可以进入「可以推进」**:',
117
+ minActions: '- **最小行动清单**:',
118
+ identityItem: '主体:取得官方登记页/营业执照(或明确接受“多源交叉核验”的残余风险)',
119
+ },
120
+ decisionSentences: {
121
+ proceed: '关键结论都有来源支撑,可以进入下一轮,并在现场继续核验。',
122
+ identity: '公司主体还没有核验,现在还不能决定是否推进。',
123
+ corroborated: '公司主体已多源交叉核验,但还没拿到官方登记证据,仍有 {open} 项关键结论未确认,现在还不能决定是否推进。',
124
+ unresolved: '仍有 {open} 项影响判断的结论未确认,现在还不能决定是否推进。',
125
+ stop: '存在互相矛盾的关键事实,先解决冲突再决定。',
126
+ },
127
+ questionThemes: {
128
+ role: '岗位与团队',
129
+ capital: '资本与现金',
130
+ product: '产品与市场',
131
+ process: '流程与待遇',
132
+ general: '通用',
133
+ },
134
+ questionKeywords: {
135
+ role: ['岗位', '在招', '汇报', '授权', '编制', '团队', '离职', '组织'],
136
+ capital: ['融资', '轮次', '金额', '现金', '股东', '股权'],
137
+ product: ['产品', '收入', '竞品', '市场', '差异化', '增长'],
138
+ process: ['面试', '英语', '薪资', '流程', '办公', '通勤'],
139
+ },
140
+ tableHeaders: {
141
+ item: '项目',
142
+ value: '内容',
143
+ id: '编号',
144
+ source: '来源',
145
+ type: '类型',
146
+ level: '可信度',
147
+ capturedAt: '采集日期',
148
+ summary: '结论摘要',
149
+ stage: '阶段/证据',
150
+ impact: '影响',
151
+ next: '下一步',
152
+ code: '代码',
153
+ label: '面向读者的说法',
154
+ meaning: '含义',
155
+ },
156
+ coverage: {
157
+ untouched: '未调查',
158
+ openOnly: '仅 {open} 条待确认线索',
159
+ verified: '{verified} 条已核实',
160
+ withOpen: '{verified} 条已核实,{open} 条待确认',
161
+ },
162
+ sourceTypes: {
163
+ company_registry: '工商登记',
164
+ regulator: '政府/监管',
165
+ official_filing: '官方文件',
166
+ company_official: '公司官方',
167
+ job_posting: '招聘平台',
168
+ independent_media: '独立媒体',
169
+ public_database: '公开数据库',
170
+ user_provided: '用户提供',
171
+ user_provided_historical_report: '用户历史材料',
172
+ other: '其他',
173
+ },
174
+ levelLabels: {
175
+ E3: '官方/权威来源',
176
+ E2: '独立来源',
177
+ E1: '单方说法',
178
+ E0: '未找到证据',
179
+ },
180
+ levelMeanings: {
181
+ E3: '政府登记、监管、官方文件;可直接引用',
182
+ E2: '独立媒体、公开数据库、招聘平台;可交叉核对',
183
+ E1: '公司自述、招聘信息、匿名评价、用户提供',
184
+ E0: '没找到证据,不等于不存在',
185
+ },
186
+ statusMeanings: {
187
+ verified: '多来源一致',
188
+ reported: '单一来源转述,未交叉',
189
+ inferred: '由事实推出,不是直接证据',
190
+ contradicted: '两个来源口径不一致',
191
+ unknown: '没查到,需要补',
192
+ needs_verification: '有线索但未核实',
193
+ },
194
+ empty: {
195
+ noVerified: '- 暂无已核实的事实',
196
+ noOpen: '- 暂无待确认事项',
197
+ noRisks: '- 暂无已识别风险',
198
+ noQuestions: '- 暂无面试问题',
199
+ },
200
+ },
34
201
  claim: {
35
202
  line: '- **{status} / {evidenceLevel} / {impact}** {text}(维度:{dimension};来源:{sourceIds};置信说明:{confidenceNote};下一步:{nextAction}{history})',
36
203
  noSourceIds: '无来源',
@@ -47,6 +214,7 @@ const ZH_CN = {
47
214
  },
48
215
  coverage: {
49
216
  entry: '- {dimension}({label}):已核验 {verified} / 待核验 {open} / 未调查:{untouched}',
217
+ identityEntry: '- {dimension}({label}):已核验 {verified} / 待核验 {open} / 未调查:{untouched};主体核验:{identity}',
50
218
  untouchedLine: '未调查维度({count}):{dimensions}',
51
219
  yes: '是',
52
220
  no: '否',
@@ -60,6 +228,8 @@ const ZH_CN = {
60
228
  },
61
229
  decisionReasons: {
62
230
  identity: '公司主体仍未核验,不能直接推进。',
231
+ identityCorroborated: '公司主体已完成多源交叉核验(E2),但仍未取得 E3 官方登记证据,且尚有未核验结论,不能直接推进。',
232
+ identityCorroboratedClear: '公司主体已完成多源交叉核验(E2),但尚未取得 E3 官方登记证据,不能直接推进。',
63
233
  unresolved: '仍有阻断级或重要结论未完成核验,不能直接推进。',
64
234
  missingDimension: '缺少已核验的必需维度:{dimension}。',
65
235
  proceed: '当前关键结论均有来源支撑,建议进入下一轮并继续现场核验。',
@@ -126,12 +296,19 @@ const ZH_CN = {
126
296
  autoConfidenceNote: '由采集项自动登记,来源 {sourceId}',
127
297
  autoNextAction: '核验该主张并补充独立来源',
128
298
  },
299
+ nextActions: {
300
+ verifyIdentity: '核验公司主体(补充 E3 官方来源,或两家独立工商源交叉验证)',
301
+ collectSources: '用 scout_search / scout_ingest 登记第一批来源',
302
+ missingDimension: '补齐必需维度:{dimension}',
303
+ conclude: '整理报告并准备进入下一轮',
304
+ },
129
305
  comparison: {
130
306
  title: '# 公司/岗位对比({count} 个案例)',
131
307
  overviewHeading: '## 总览',
132
308
  summary: '- **{title}**:决策 **{decision}**;主体{identity};主张 {claimCount} 条{countsSuffix}',
133
309
  countsSuffix: '({counts})',
134
310
  identityVerified: '已核验',
311
+ identityCorroborated: '已交叉核验',
135
312
  identityUnverified: '待核验',
136
313
  decisionTableHeading: '## 决策与主体核验对比',
137
314
  tableHeader: '| 案例 | 决策 | 主体核验 | 主张数 |',
@@ -167,8 +344,175 @@ const EN = {
167
344
  claimLedger: '## Claim ledger',
168
345
  sources: '## Sources',
169
346
  coverage: '## Coverage',
347
+ identity: '## Verified subject',
170
348
  interviewQuestions: '## Interview questions',
171
349
  },
350
+ identity: {
351
+ legalEntity: '- Legal entity: {value}',
352
+ registrationNumber: '- Unified social credit identifier: {value}',
353
+ region: '- Registered region: {value}',
354
+ representative: '- Legal representative: {value}',
355
+ brandRelationship: '- Brand relationship: {value}',
356
+ tier: '- Verification tier: {value}',
357
+ tiers: {
358
+ verified: 'verified (E3 authoritative source backs the registration number)',
359
+ corroborated: 'corroborated (E2, multiple independent sources agree; not an official registry check)',
360
+ needs_verification: 'not verified',
361
+ },
362
+ fieldLabels: {
363
+ legalEntity: 'Legal entity',
364
+ registrationNumber: 'Unified social credit identifier',
365
+ registeredRegion: 'Registered region',
366
+ legalRepresentative: 'Legal representative',
367
+ brandRelationship: 'Brand relationship',
368
+ },
369
+ evidence: '- Evidence sources: {value}',
370
+ fieldEvidence: '- {field} evidence: {value}',
371
+ unknown: 'unknown',
372
+ },
373
+ report: {
374
+ meta: {
375
+ role: 'Role',
376
+ location: 'Location',
377
+ evidenceAsOf: 'Evidence as of',
378
+ decision: 'Decision',
379
+ objective: 'Objective',
380
+ unknownLocation: 'unspecified',
381
+ },
382
+ readingGuide: '> Reading order: 30-second verdict -> subject -> confirmed facts -> open items -> risks -> interview questions -> appendices (evidence ledger)',
383
+ confidenceLegend: '> Confidence: verified=multiple sources agree; reported=single source; inferred=derived; unknown=not found; no-evidence-found does not mean absent',
384
+ quick: {
385
+ heading: '## 30-second verdict',
386
+ entity: 'Subject: {entity} ({registrationNumber}), {region}, legal representative {representative} - verified.',
387
+ entityUnverified: 'Subject: {entity} - not verified yet.',
388
+ business: 'Business: {text} (verified)',
389
+ businessUnknown: 'Business: public sources do not support a verifiable product description.',
390
+ capital: 'Capital: {text}{suffix}',
391
+ capitalSuffix: '; {count} more funding or registration leads.',
392
+ capitalUnknown: 'Capital: no public funding information found.',
393
+ confirmHeading: '**Top 3 things to confirm first**',
394
+ confirmIdentity: 'Obtain an official registration record (business licence or registry filing) and confirm the contracting entity and credit code',
395
+ confirmRole: 'Confirm the role is open, who it reports to, and how much authority it carries (interview only)',
396
+ confirmRisk: 'Verify the single-source reputation and interview-process claims (not decision-blocking, but expectation-setting)',
397
+ },
398
+ sections: {
399
+ identity: '## 1. The company and its legal subject (confirmed)',
400
+ confirmed: '## 2. Confirmed facts (stage: safe to use)',
401
+ open: '## 3. Leads and open items (stage: do not treat as facts yet)',
402
+ risk: '## 4. Risks and red flags (stage: identified)',
403
+ interview: '## 5. Interview questions (by theme, up to 12)',
404
+ gap: '## 6. What still stands between you and the next step',
405
+ appendixSources: '## Appendix A - Sources',
406
+ appendixLedger: '## Appendix B - Claim ledger (technical audit trail)',
407
+ appendixCoverage: '## Appendix C - Investigation coverage',
408
+ appendixGlossary: '## Appendix D - Glossary',
409
+ },
410
+ themes: { business: 'Business and product', capital: 'Capital and funding', organization: 'Organization and team' },
411
+ openSubheads: {
412
+ interview: '### Interview-only',
413
+ external: '### Still publicly checkable',
414
+ conflict: '### Conflicting accounts (needs a ruling)',
415
+ },
416
+ labels: { ask: 'ask', nextStep: 'next step', advice: 'suggested action', tier: 'Verification tier', means: 'What this means', identityEvidence: 'Identity field provenance' },
417
+ tier: {
418
+ verified: 'Verified: an authoritative source backs the credit code; safe to quote.',
419
+ corroborated: 'Corroborated: several independent sources agree on the credit code and legal representative; no official registry page yet, so check the business licence before signing.',
420
+ unverified: 'Not verified: not enough sources confirm the subject yet.',
421
+ meansVerified: 'You can make decisions on this subject.',
422
+ meansOther: 'Continue diligence and judgement on this subject, but treat it as "not officially stamped"; re-check before signing, reference checks, or invoicing.',
423
+ },
424
+ confirmedItem: '- {text}\n - {status} · {level} · {sources}{captured}',
425
+ captured: ' (captured {date})',
426
+ openInterviewLine: '{status} · {level} · {ask}: {question}',
427
+ openExternalLine: '{status} · {level} · {next}: {action}',
428
+ riskLine: '- {text} ({status} · {level})\n - {advice}: {action}',
429
+ gapLine: {
430
+ why: '- **Why the verdict is still "{decision}"**: {sentence}',
431
+ toProceed: '- **What would move it to "proceed"**:',
432
+ minActions: '- **Smallest action list**:',
433
+ identityItem: 'Subject: obtain the official registry page or business licence (or explicitly accept the residual risk of multi-source corroboration)',
434
+ },
435
+ decisionSentences: {
436
+ proceed: 'Key claims are sourced; proceed to the next round and keep verifying on site.',
437
+ identity: 'The legal subject is not verified yet, so the decision cannot be made.',
438
+ corroborated: 'The legal subject is corroborated by multiple sources, but no official registry evidence exists yet and {open} decision-relevant claims remain open.',
439
+ unresolved: '{open} decision-relevant claims remain open, so the decision cannot be made.',
440
+ stop: 'Key facts contradict each other; resolve the conflict first.',
441
+ },
442
+ questionThemes: {
443
+ role: 'Role and team',
444
+ capital: 'Capital and cash',
445
+ product: 'Product and market',
446
+ process: 'Process and compensation',
447
+ general: 'General',
448
+ },
449
+ questionKeywords: {
450
+ role: ['role', 'open', 'report', 'authority', 'headcount', 'team', 'attrition', 'organization'],
451
+ capital: ['funding', 'round', 'amount', 'runway', 'cash', 'shareholder', 'equity'],
452
+ product: ['product', 'revenue', 'competitor', 'market', 'differentiation', 'growth'],
453
+ process: ['interview', 'english', 'salary', 'process', 'office', 'commute'],
454
+ },
455
+ tableHeaders: {
456
+ item: 'Item',
457
+ value: 'Detail',
458
+ id: 'Id',
459
+ source: 'Source',
460
+ type: 'Type',
461
+ level: 'Confidence',
462
+ capturedAt: 'Captured',
463
+ summary: 'Claim',
464
+ stage: 'Stage/evidence',
465
+ impact: 'Impact',
466
+ next: 'Next step',
467
+ code: 'Code',
468
+ label: 'Reader-facing label',
469
+ meaning: 'Meaning',
470
+ },
471
+ coverage: {
472
+ untouched: 'not investigated',
473
+ openOnly: 'only {open} open lead(s)',
474
+ verified: '{verified} verified',
475
+ withOpen: '{verified} verified, {open} open',
476
+ },
477
+ sourceTypes: {
478
+ company_registry: 'Registry',
479
+ regulator: 'Government/regulator',
480
+ official_filing: 'Official filing',
481
+ company_official: 'Company official',
482
+ job_posting: 'Job platform',
483
+ independent_media: 'Independent media',
484
+ public_database: 'Public database',
485
+ user_provided: 'User provided',
486
+ user_provided_historical_report: 'User history',
487
+ other: 'Other',
488
+ },
489
+ levelLabels: {
490
+ E3: 'Official/authoritative',
491
+ E2: 'Independent source',
492
+ E1: 'Single-party account',
493
+ E0: 'No evidence found',
494
+ },
495
+ levelMeanings: {
496
+ E3: 'Registry, regulator, or official document; safe to quote',
497
+ E2: 'Independent media, public database, job platform; cross-checkable',
498
+ E1: 'Company self-description, job posting, anonymous review, user-provided',
499
+ E0: 'Nothing found; absence of evidence is not evidence of absence',
500
+ },
501
+ statusMeanings: {
502
+ verified: 'multiple sources agree',
503
+ reported: 'single source, not cross-checked',
504
+ inferred: 'derived from facts, not direct evidence',
505
+ contradicted: 'sources disagree',
506
+ unknown: 'not found yet',
507
+ needs_verification: 'lead exists but unverified',
508
+ },
509
+ empty: {
510
+ noVerified: '- No confirmed facts yet',
511
+ noOpen: '- No open items',
512
+ noRisks: '- No identified risks yet',
513
+ noQuestions: '- No interview questions yet',
514
+ },
515
+ },
172
516
  claim: {
173
517
  line: '- **{status} / {evidenceLevel} / {impact}** {text} (dimension: {dimension}; sources: {sourceIds}; confidence: {confidenceNote}; next action: {nextAction}{history})',
174
518
  noSourceIds: 'no source',
@@ -185,6 +529,7 @@ const EN = {
185
529
  },
186
530
  coverage: {
187
531
  entry: '- {dimension} ({label}): verified {verified} / open {open} / untouched: {untouched}',
532
+ identityEntry: '- {dimension} ({label}): verified {verified} / open {open} / untouched: {untouched}; subject: {identity}',
188
533
  untouchedLine: 'Untouched dimensions ({count}): {dimensions}',
189
534
  yes: 'yes',
190
535
  no: 'no',
@@ -198,6 +543,8 @@ const EN = {
198
543
  },
199
544
  decisionReasons: {
200
545
  identity: 'The company identity is not verified yet, so we cannot proceed.',
546
+ identityCorroborated: 'The company identity is corroborated by multiple independent sources (E2), but no E3 official registry evidence exists yet and some claims remain unverified, so we cannot proceed.',
547
+ identityCorroboratedClear: 'The company identity is corroborated by multiple independent sources (E2), but no E3 official registry evidence exists yet, so we cannot proceed.',
201
548
  unresolved: 'Blocking or material claims are still unverified, so we cannot proceed.',
202
549
  missingDimension: 'Missing verified required dimension: {dimension}.',
203
550
  proceed: 'All key claims are backed by sources; proceed to the next round and keep verifying on site.',
@@ -264,12 +611,19 @@ const EN = {
264
611
  autoConfidenceNote: 'Auto-registered from an ingested item; source {sourceId}',
265
612
  autoNextAction: 'Verify this claim and add an independent source',
266
613
  },
614
+ nextActions: {
615
+ verifyIdentity: 'Verify the company identity (add an E3 official source, or cross-check two independent registries)',
616
+ collectSources: 'Register the first sources with scout_search / scout_ingest',
617
+ missingDimension: 'Cover the required dimension: {dimension}',
618
+ conclude: 'Wrap up the report and prepare for the next round',
619
+ },
267
620
  comparison: {
268
621
  title: '# Company / role comparison ({count} cases)',
269
622
  overviewHeading: '## Overview',
270
623
  summary: '- **{title}**: decision **{decision}**; identity {identity}; claims: {claimCount}{countsSuffix}',
271
624
  countsSuffix: ' ({counts})',
272
625
  identityVerified: 'verified',
626
+ identityCorroborated: 'corroborated',
273
627
  identityUnverified: 'unverified',
274
628
  decisionTableHeading: '## Decision and identity comparison',
275
629
  tableHeader: '| Case | Decision | Identity | Claims |',
package/dist/index.d.ts CHANGED
@@ -3,6 +3,23 @@ import z from '@deepseek-ai/schemastery';
3
3
  import { type ScoutLanguage } from './i18n.js';
4
4
  export declare const name = "dsh-scout";
5
5
  export declare const inject: string[];
6
+ /**
7
+ * The version this source tree ships, stated as a literal.
8
+ *
9
+ * It is deliberately never read back from `package.json`. A release checklist
10
+ * anchor only works when the version is asserted in two independent places: the
11
+ * assertion compares this literal against the manifest, so a bump that updates
12
+ * one and forgets the other fails the suite instead of shipping silently.
13
+ * `tests/acceptance.test.mjs` pins this constant, `package.json` and the
14
+ * `/scout status` output to the same string.
15
+ *
16
+ * Where this reaches a user: `runScoutCommand` prints it in `/scout status`.
17
+ * It cannot be printed at load time — a plugin's log output is not visible in
18
+ * any DSH surface (cordis only buffers it in memory), and a plugin that failed
19
+ * to load never runs at all, so "is it loaded, and which version?" is answered
20
+ * by the settings plugin list instead.
21
+ */
22
+ export declare const PLUGIN_VERSION = "0.9.4";
6
23
  export interface Config {
7
24
  /** Default directory for case exports; case files land under `<scoutDir>/<caseId>/`. */
8
25
  scoutDir?: string;