dsh-archify-projects 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +204 -2
  2. package/cordis.patch.yml +99 -0
  3. package/dist/client.js +2261 -0
  4. package/dist/client.js.map +1 -0
  5. package/docs/CONTAINER.md +197 -0
  6. package/docs/DESIGN.md +905 -0
  7. package/docs/HANDOVER.md +391 -0
  8. package/docs/PUBLISH.md +107 -0
  9. package/icon.svg +12 -0
  10. package/lib/host/archify-skill.js +116 -0
  11. package/lib/host/archify-skill.js.map +1 -0
  12. package/lib/host/config.js +95 -0
  13. package/lib/host/config.js.map +1 -0
  14. package/lib/host/context.js +28 -0
  15. package/lib/host/context.js.map +1 -0
  16. package/lib/host/git.js +185 -0
  17. package/lib/host/git.js.map +1 -0
  18. package/lib/host/http.js +184 -0
  19. package/lib/host/http.js.map +1 -0
  20. package/lib/host/index.js +90 -0
  21. package/lib/host/index.js.map +1 -0
  22. package/lib/host/policy.js +124 -0
  23. package/lib/host/policy.js.map +1 -0
  24. package/lib/host/routes.js +667 -0
  25. package/lib/host/routes.js.map +1 -0
  26. package/lib/host/runner.js +913 -0
  27. package/lib/host/runner.js.map +1 -0
  28. package/lib/host/store.js +370 -0
  29. package/lib/host/store.js.map +1 -0
  30. package/lib/host/workspace.js +65 -0
  31. package/lib/host/workspace.js.map +1 -0
  32. package/lib/shared/format.js +138 -0
  33. package/lib/shared/format.js.map +1 -0
  34. package/lib/shared/prompt.js +257 -0
  35. package/lib/shared/prompt.js.map +1 -0
  36. package/lib/shared/protocol.js +31 -0
  37. package/lib/shared/protocol.js.map +1 -0
  38. package/lib/shared/types.js +173 -0
  39. package/lib/shared/types.js.map +1 -0
  40. package/locale/en.json +6 -0
  41. package/locale/zh.json +6 -0
  42. package/package.json +98 -4
  43. package/skills/archify/LICENSE +22 -0
  44. package/skills/archify/SKILL.md +109 -0
  45. package/skills/archify/THIRD_PARTY_NOTICES.md +69 -0
  46. package/skills/archify/assets/JetBrainsMono-OFL.txt +93 -0
  47. package/skills/archify/assets/template.html +13709 -0
  48. package/skills/archify/bin/archify.mjs +6936 -0
  49. package/skills/archify/bin/delivery-update.mjs +91 -0
  50. package/skills/archify/bin/finalize.mjs +895 -0
  51. package/skills/archify/bin/open-artifact.mjs +146 -0
  52. package/skills/archify/bin/preview.mjs +969 -0
  53. package/skills/archify/bin/recover-output.mjs +41 -0
  54. package/skills/archify/bin/visual-check.mjs +2667 -0
  55. package/skills/archify/brand-marks/README.md +31 -0
  56. package/skills/archify/brand-marks/catalog.json +131 -0
  57. package/skills/archify/delta/architecture-delta.mjs +1313 -0
  58. package/skills/archify/examples/agent-run.lifecycle.json +55 -0
  59. package/skills/archify/examples/agent-tool-call.workflow.json +74 -0
  60. package/skills/archify/examples/async-job-roundtrip.sequence.json +56 -0
  61. package/skills/archify/examples/brand-aware-delivery.architecture.json +34 -0
  62. package/skills/archify/examples/cache-miss-request.sequence.json +77 -0
  63. package/skills/archify/examples/checkout-platform.base.architecture.json +32 -0
  64. package/skills/archify/examples/checkout-platform.head.architecture.json +32 -0
  65. package/skills/archify/examples/dataflow-product-analytics.html +13820 -0
  66. package/skills/archify/examples/deployment-release.lifecycle.json +48 -0
  67. package/skills/archify/examples/event-stream.dataflow.json +52 -0
  68. package/skills/archify/examples/holiday-planning.workflow.json +143 -0
  69. package/skills/archify/examples/incident-response.workflow.json +59 -0
  70. package/skills/archify/examples/lifecycle-agent-run.html +13765 -0
  71. package/skills/archify/examples/locales/de.json +425 -0
  72. package/skills/archify/examples/locales/es.json +440 -0
  73. package/skills/archify/examples/locales/fr.json +425 -0
  74. package/skills/archify/examples/locales/fr.partial.json +22 -0
  75. package/skills/archify/examples/locales/it.json +425 -0
  76. package/skills/archify/examples/locales/ja.json +425 -0
  77. package/skills/archify/examples/locales/ko.json +440 -0
  78. package/skills/archify/examples/locales/pt.json +425 -0
  79. package/skills/archify/examples/locales/ru.json +425 -0
  80. package/skills/archify/examples/product-analytics.dataflow.json +71 -0
  81. package/skills/archify/examples/production-deployment.architecture.json +51 -0
  82. package/skills/archify/examples/release-delivery.workflow.json +57 -0
  83. package/skills/archify/examples/sequence-cache-miss-request.html +13835 -0
  84. package/skills/archify/examples/web-app-rendered.html +13808 -0
  85. package/skills/archify/examples/web-app.architecture.json +41 -0
  86. package/skills/archify/examples/workflow-agent-tool-call-rendered.html +13826 -0
  87. package/skills/archify/migrations/workflow-v2.mjs +280 -0
  88. package/skills/archify/package.json +17 -0
  89. package/skills/archify/recipes/scenarios.mjs +430 -0
  90. package/skills/archify/references/architecture-layout-repair.md +18 -0
  91. package/skills/archify/references/authoring-contract.md +419 -0
  92. package/skills/archify/references/authoring-defaults.md +41 -0
  93. package/skills/archify/references/brand-marks.md +82 -0
  94. package/skills/archify/references/delivery-contract.md +588 -0
  95. package/skills/archify/references/repository-authoring.md +105 -0
  96. package/skills/archify/references/update-awareness.md +12 -0
  97. package/skills/archify/references/viewer-runtime.md +35 -0
  98. package/skills/archify/renderers/architecture/grid.mjs +62 -0
  99. package/skills/archify/renderers/architecture/labels.mjs +215 -0
  100. package/skills/archify/renderers/architecture/render-architecture.mjs +1001 -0
  101. package/skills/archify/renderers/architecture/routing.mjs +1157 -0
  102. package/skills/archify/renderers/dataflow/README.md +105 -0
  103. package/skills/archify/renderers/dataflow/render-dataflow.mjs +544 -0
  104. package/skills/archify/renderers/lifecycle/README.md +171 -0
  105. package/skills/archify/renderers/lifecycle/grid-routing.mjs +429 -0
  106. package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +938 -0
  107. package/skills/archify/renderers/sequence/README.md +129 -0
  108. package/skills/archify/renderers/sequence/render-sequence.mjs +526 -0
  109. package/skills/archify/renderers/shared/atomic-output.mjs +1982 -0
  110. package/skills/archify/renderers/shared/brand-marks.mjs +670 -0
  111. package/skills/archify/renderers/shared/cli.mjs +451 -0
  112. package/skills/archify/renderers/shared/desktop-readability.mjs +132 -0
  113. package/skills/archify/renderers/shared/diagnostics.mjs +173 -0
  114. package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
  115. package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  116. package/skills/archify/renderers/shared/generated-validators.mjs +134 -0
  117. package/skills/archify/renderers/shared/geometry.mjs +1941 -0
  118. package/skills/archify/renderers/shared/i18n.mjs +603 -0
  119. package/skills/archify/renderers/shared/layout-report.mjs +42 -0
  120. package/skills/archify/renderers/shared/legend.mjs +217 -0
  121. package/skills/archify/renderers/shared/output-path.mjs +440 -0
  122. package/skills/archify/renderers/shared/path-semantics.mjs +1017 -0
  123. package/skills/archify/renderers/shared/portable-path.mjs +408 -0
  124. package/skills/archify/renderers/shared/repository-evidence.mjs +352 -0
  125. package/skills/archify/renderers/shared/repository-location.mjs +59 -0
  126. package/skills/archify/renderers/shared/route-quality.mjs +614 -0
  127. package/skills/archify/renderers/shared/sidecar-path.mjs +38 -0
  128. package/skills/archify/renderers/shared/spatial-grid.mjs +66 -0
  129. package/skills/archify/renderers/shared/text-fit.mjs +105 -0
  130. package/skills/archify/renderers/shared/utils.mjs +254 -0
  131. package/skills/archify/renderers/shared/validator.mjs +86 -0
  132. package/skills/archify/renderers/workflow/README.md +301 -0
  133. package/skills/archify/renderers/workflow/render-workflow.mjs +37 -0
  134. package/skills/archify/renderers/workflow/workflow-compiler.mjs +4913 -0
  135. package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  136. package/skills/archify/schemas/README.md +256 -0
  137. package/skills/archify/schemas/architecture.schema.json +152 -0
  138. package/skills/archify/schemas/common.schema.json +181 -0
  139. package/skills/archify/schemas/dataflow.schema.json +254 -0
  140. package/skills/archify/schemas/lifecycle.schema.json +280 -0
  141. package/skills/archify/schemas/sequence.schema.json +234 -0
  142. package/skills/archify/schemas/workflow.schema.json +439 -0
  143. package/skills/archify/scripts/check-render-output.mjs +1388 -0
  144. package/skills/archify/scripts/check-update.mjs +1710 -0
  145. package/skills/archify/scripts/delivery-update-child.mjs +23 -0
  146. package/skills/archify/scripts/render-examples.mjs +26 -0
  147. package/skills/archify/scripts/update-contract.mjs +182 -0
  148. package/skills/archify/skill-release.json +10 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * 展示与文件名用的纯函数(零 IO)。
3
+ *
4
+ * 这些函数被 host(拼目录名、写日志)和 client(渲染 Git 条、时间)同时使用,
5
+ * 所以不能碰 Date.now() —— 当前时间一律由调用方传入,测试才能确定性。
6
+ */
7
+ import { allDiagrams } from './types.js';
8
+ /** 空值占位符,页面统一用它,避免各处出现 '' / '-' / '—' 三种。 */
9
+ export const PLACEHOLDER = '—';
10
+ /** commit 短写(7 位);空值给占位符。 */
11
+ export function shortCommit(commit) {
12
+ if (commit === null || commit === undefined || commit.length === 0)
13
+ return PLACEHOLDER;
14
+ return commit.slice(0, 7);
15
+ }
16
+ /** 本地时间戳 `YYYYMMDD-HHMMSS`,用作 archify 目录名后缀。 */
17
+ export function formatStamp(date) {
18
+ const pad = (n) => String(n).padStart(2, '0');
19
+ return (`${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}` +
20
+ `-${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`);
21
+ }
22
+ /**
23
+ * 相对时间(结构化)。
24
+ *
25
+ * 页面要中英双语,日文/德文同理,所以这里**不拼句子**,只回答
26
+ * 「多久以前、以什么粒度」—— 拼句子是渲染层的事。
27
+ */
28
+ export function relativeSpan(iso, now) {
29
+ if (iso === null || iso === undefined || iso.length === 0)
30
+ return null;
31
+ const then = new Date(iso).getTime();
32
+ if (Number.isNaN(then))
33
+ return null;
34
+ const deltaSec = Math.round((now.getTime() - then) / 1000);
35
+ if (deltaSec < 60)
36
+ return { kind: 'now', value: 0 };
37
+ if (deltaSec < 3600)
38
+ return { kind: 'minutes', value: Math.floor(deltaSec / 60) };
39
+ if (deltaSec < 86400)
40
+ return { kind: 'hours', value: Math.floor(deltaSec / 3600) };
41
+ if (deltaSec < 86400 * 30)
42
+ return { kind: 'days', value: Math.floor(deltaSec / 86400) };
43
+ return { kind: 'date', value: 0, date: new Date(then).toISOString().slice(0, 10) };
44
+ }
45
+ /** 相对时间文案(中文)。宿主日志与兜底用;页面走 `relativeSpan`。 */
46
+ export function formatRelative(iso, now) {
47
+ if (iso === null || iso === undefined || iso.length === 0)
48
+ return PLACEHOLDER;
49
+ const then = new Date(iso).getTime();
50
+ if (Number.isNaN(then))
51
+ return PLACEHOLDER;
52
+ const deltaSec = Math.round((now.getTime() - then) / 1000);
53
+ if (deltaSec < 0)
54
+ return '刚刚';
55
+ if (deltaSec < 60)
56
+ return '刚刚';
57
+ if (deltaSec < 3600)
58
+ return `${Math.floor(deltaSec / 60)} 分钟前`;
59
+ if (deltaSec < 86400)
60
+ return `${Math.floor(deltaSec / 3600)} 小时前`;
61
+ if (deltaSec < 86400 * 30)
62
+ return `${Math.floor(deltaSec / 86400)} 天前`;
63
+ return new Date(then).toISOString().slice(0, 10);
64
+ }
65
+ /** ahead / behind 文案。两者都为 null(无上游)时返回 null,页面据此隐藏整块。 */
66
+ export function aheadBehindText(ahead, behind) {
67
+ if (ahead === null && behind === null)
68
+ return null;
69
+ const parts = [];
70
+ if (ahead !== null && ahead > 0)
71
+ parts.push(`↑${ahead}`);
72
+ if (behind !== null && behind > 0)
73
+ parts.push(`↓${behind}`);
74
+ return parts.length > 0 ? parts.join(' ') : '同步';
75
+ }
76
+ /** Git 单行摘要:`branch @ shortcommit`,无 Git 时说明来源是当前目录。 */
77
+ export function gitSummary(git) {
78
+ if (!git.isRepo)
79
+ return '非 Git 目录 · 基于当前目录分析';
80
+ const where = git.detached ? `detached ${shortCommit(git.commit)}` : (git.branch ?? PLACEHOLDER);
81
+ return `${where} @ ${shortCommit(git.commit)}`;
82
+ }
83
+ /** 目录名安全化:只留 ASCII 字母数字与短横,其它折叠成单个短横。 */
84
+ export function slugify(input) {
85
+ const ascii = input
86
+ .normalize('NFKD')
87
+ .replace(/[^\x20-\x7E]/g, '')
88
+ .toLowerCase()
89
+ .replace(/[^a-z0-9]+/g, '-')
90
+ .replace(/^-+|-+$/g, '');
91
+ if (ascii.length === 0)
92
+ return 'project';
93
+ return ascii.slice(0, 40).replace(/-+$/g, '');
94
+ }
95
+ /** archify 目录名:`<type>-<slug>-<stamp>`,与 Skill 的约定一致。 */
96
+ export function archifyDirName(kind, slug, stamp) {
97
+ return `${kind}-${slugify(slug)}-${stamp}`;
98
+ }
99
+ /** 图谱类型的中文标题。 */
100
+ export function diagramTitle(kind) {
101
+ return kind === 'structure' ? '项目结构图' : '领域图';
102
+ }
103
+ /** 两张图里最新的生成时间(用于「上次分析」)。 */
104
+ export function latestGeneratedAt(project) {
105
+ const stamps = allDiagrams(project)
106
+ .map((diagram) => diagram.generatedAt)
107
+ .filter((v) => v !== null)
108
+ .sort();
109
+ return stamps.length > 0 ? stamps[stamps.length - 1] : null;
110
+ }
111
+ /** token 数的紧凑写法:1234 → 1.2k,12_345_678 → 12.3M。 */
112
+ export function formatTokens(n) {
113
+ if (!Number.isFinite(n) || n <= 0)
114
+ return '0';
115
+ if (n < 1000)
116
+ return String(Math.round(n));
117
+ if (n < 1_000_000)
118
+ return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}k`;
119
+ return `${(n / 1_000_000).toFixed(1)}M`;
120
+ }
121
+ /** 估算费用(单位:货币,由配置决定是人民币还是美元)。 */
122
+ export function estimateCost(usage, pricing) {
123
+ if (usage === null || pricing === null)
124
+ return null;
125
+ const perM = 1_000_000;
126
+ const cost = (usage.uncachedInput / perM) * pricing.inputPerMTok +
127
+ (usage.output / perM) * pricing.outputPerMTok +
128
+ (usage.cacheRead / perM) * pricing.cacheReadPerMTok;
129
+ return cost;
130
+ }
131
+ /** 把绝对路径缩成「末两段」,页面里放不下全路径时用。 */
132
+ export function tailPath(fullPath, segments = 2) {
133
+ const parts = fullPath.split(/[\\/]+/).filter((p) => p.length > 0);
134
+ if (parts.length <= segments)
135
+ return fullPath;
136
+ return `…/${parts.slice(-segments).join('/')}`;
137
+ }
138
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/shared/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Agent 提示词构建与产物标记解析(纯函数)。
3
+ *
4
+ * 这段文本是插件与 agent 之间唯一的契约面:agent 只有 archify 一个 skill、
5
+ * 只有 fs / fs-search 几个工具,所以提示词必须把「做什么、概念怎么报、产物写哪、
6
+ * 怎么回报」讲死,不能依赖模型猜。
7
+ *
8
+ * 两种会话:
9
+ * - 出图会话:写产物 + 概念表({@link buildRunPrompt});
10
+ * - 问答会话:只读代码 + 已生成的图({@link buildAskPrompt}),没有任何写工具。
11
+ */
12
+ import { ARTIFACT_MARKER } from './protocol.js';
13
+ /** 默认两张图的建模口径。 */
14
+ const KIND_SPEC = {
15
+ structure: [
16
+ '项目结构图(structure)——回答「这个代码库由什么组成、怎么依赖」。',
17
+ '必含:入口/装配层、核心业务模块、基础设施适配层、外部依赖(数据库/队列/第三方服务)。',
18
+ '必须画出至少一条主调用链,以及必要的分支;不要把每个文件都画成一个节点。',
19
+ '用 boundary 表达进程/网络/信任边界(如「主进程」「外部服务」)。',
20
+ ].join('\n'),
21
+ domain: [
22
+ '领域图(domain)——回答「这块业务的领域模型是什么」。',
23
+ '必含:限界上下文、聚合根、实体/值对象、领域事件,以及上下文之间的协作关系。',
24
+ '必须写清聚合内的一致性边界;不要把它画成技术架构图。',
25
+ '如果你判断仓库规模不足以建模领域层(例如纯脚手架),就在图的 meta 里写明这一点,并退化为「模块职责图」。',
26
+ ].join('\n'),
27
+ };
28
+ /** 渲染 Git 事实块(分支级,不强调 commit)。 */
29
+ function gitBlock(git) {
30
+ if (!git.isRepo) {
31
+ return [
32
+ '- 这个目录**不是 Git 仓库**:没有分支。',
33
+ '- 因此不要执行任何 git 命令,也不要在报告里编造分支名。',
34
+ '- 分析对象就是当前目录下的代码。',
35
+ ].join('\n');
36
+ }
37
+ const lines = [`- 分支:${git.detached ? `detached HEAD` : (git.branch ?? '未知')}`];
38
+ if (git.tree !== null) {
39
+ const { staged, unstaged, untracked } = git.tree;
40
+ if (staged + unstaged + untracked > 0) {
41
+ lines.push(`- 工作区有改动(暂存 ${staged}、未暂存 ${unstaged}、未跟踪 ${untracked}):**以工作区当前内容为准**,暂存区里的代码同样算数。`);
42
+ }
43
+ else {
44
+ lines.push('- 工作区干净。');
45
+ }
46
+ }
47
+ else if (git.dirty === true) {
48
+ lines.push('- 工作区**有未提交改动**:分析时以工作区当前内容为准。');
49
+ }
50
+ return lines.join('\n');
51
+ }
52
+ /** 渲染 archify 调用方式。 */
53
+ function archifyBlock(skillPath, diagrams, stamp) {
54
+ if (skillPath === null) {
55
+ return [
56
+ '## 环境降级:archify Skill 不可用',
57
+ '',
58
+ '本次没有挂载 archify skill。请退化为「手写 JSON + 内联 SVG 的单页 HTML」:',
59
+ '每张图输出一个自包含的 HTML 文件(inline SVG,深浅色都可用),放在当前工作目录的 `.archify/` 下:',
60
+ ...diagrams.map((d) => ` - ${d.id} -> .archify/${d.id}-<slug>-${stamp}/`),
61
+ '仍然要遵守下面的回报标记约定;并在最终回复里明确说明本次是降级产物。',
62
+ ].join('\n');
63
+ }
64
+ return [
65
+ '## 出图方式(必须用 archify skill)',
66
+ '',
67
+ `1. 先用 \`skill\` 工具加载 \`archify\`(name 必须正好是 \`archify\`)。`,
68
+ `2. 按 Skill 里的「Fast authoring path」执行:选类型 → 读 references → 写 \`candidate.json\` → 跑 \`finalize\`。`,
69
+ '3. 每张图一个独立目录,统一放在当前工作目录下的 `.archify/` 里(目录名以图的 id 开头):',
70
+ ...diagrams.map((d) => ` - ${d.id} → \`.archify/${d.id}-<slug>-${stamp}/\``),
71
+ `4. \`finalize\` 命令(把 \`<skill>\` 换成 \`${skillPath}\`,把 \`<slug>\` 换成你选的短名):`,
72
+ ' ```',
73
+ ` node "${skillPath}/bin/archify.mjs" finalize architecture ` +
74
+ `<目录>/candidate.json <目录>/<slug>.html --repo-root "<REPO_ROOT>" --quality showcase --json`,
75
+ ' ```',
76
+ '5. 全部图都用 type `architecture`(structure 与 domain 的区别在建模口径,不在 type)。',
77
+ '6. `finalize` 非 0 退出就是失败:按 Skill 的修复流程改 candidate 再跑,别把失败当成功上报。',
78
+ ].join('\n');
79
+ }
80
+ /** 渲染已有概念块。 */
81
+ function conceptBlock(concepts) {
82
+ if (concepts.length === 0) {
83
+ return '(还没有概念表:这次先提取,写到 `concepts.json`。)';
84
+ }
85
+ return concepts
86
+ .map((c) => `- \`${c.id}\` ${c.name}:${c.summary}` +
87
+ (c.evidence.length > 0 ? `(证据:${c.evidence.slice(0, 4).join('、')})` : ''))
88
+ .join('\n');
89
+ }
90
+ /** 每张图的建模段。 */
91
+ function diagramBlock(diagram, previousBranch) {
92
+ const head = `### ${diagram.title}(id: \`${diagram.id}\`,${diagram.persistence === 'permanent' ? '永久图' : '临时图'})`;
93
+ const prev = previousBranch === null
94
+ ? '- 这张图以前没生成过。'
95
+ : `- 上一版生成于分支 \`${previousBranch}\`,本次请基于当前代码重新取证,不要沿用旧结论。`;
96
+ const renderer = diagram.renderer === null
97
+ ? '- 渲染器:由你按 prompt 自行选择(architecture / workflow / sequence / dataflow / lifecycle 之一)。'
98
+ : `- 渲染器:**必须使用 \`${diagram.renderer}\`**(用户已选)。`;
99
+ const scope = diagram.pathScope.length === 0
100
+ ? '- 取证范围:全仓库。'
101
+ : `- 取证范围:**只看这些目录** —— ${diagram.pathScope.map((dir) => `\`${dir}\``).join('、')};不要读范围外的文件。`;
102
+ if (diagram.kind === 'custom') {
103
+ return [
104
+ head,
105
+ `用户的出图要求(最高优先级):\n${diagram.prompt ?? '(没有给 prompt,请按代码库最重要的结构画)'}`,
106
+ renderer,
107
+ scope,
108
+ prev,
109
+ ].join('\n');
110
+ }
111
+ return [head, KIND_SPEC[diagram.kind], renderer, scope, prev].join('\n');
112
+ }
113
+ /**
114
+ * 构建一次出图运行的完整提示词。
115
+ *
116
+ * 结果是**自包含**的:agent 看不到本插件的任何文档,只有这段文本 + SKILL.md。
117
+ */
118
+ export function buildRunPrompt(input) {
119
+ const { projectName, repoPath, workspaceDir, git, diagrams, concepts, stamp, archifySkillPath } = input;
120
+ const sections = diagrams
121
+ .map((diagram) => diagramBlock(diagram, input.previous[diagram.id] ?? null))
122
+ .join('\n\n');
123
+ const markers = diagrams
124
+ .map((d) => `${ARTIFACT_MARKER} ${d.id} <该图的 HTML 绝对路径>`)
125
+ .join('\n');
126
+ return `# 任务:为代码库「${projectName}」生成 Archify 图谱
127
+
128
+ ## 环境事实
129
+
130
+ - 你的工作目录(也是产物目录):\`${workspaceDir}\`
131
+ - 待分析的代码库根目录:\`${repoPath}\`
132
+ - 本次时间戳:\`${stamp}\`
133
+ ${gitBlock(git)}
134
+
135
+ ## 概念表(先提取,再画图)
136
+
137
+ 这个仓库已经有一份项目级概念表;本次先读它、按需补充,然后在**工作目录根**写回
138
+ \`concepts.json\`(覆盖写,保留仍然成立的概念):
139
+
140
+ \`\`\`json
141
+ {
142
+ "concepts": [
143
+ {
144
+ "id": "cpt_ledger",
145
+ "name": "项目台账",
146
+ "summary": "一句话说明它是什么、边界在哪",
147
+ "evidence": ["src/host/store.ts"],
148
+ "tags": ["data"]
149
+ }
150
+ ]
151
+ }
152
+ \`\`\`
153
+
154
+ 要求:id 用 \`cpt_<小写短名>\`;只写能从代码里指出证据的概念(约 10–25 个);
155
+ 不要写「工具函数」「index 文件」这类没有架构意义的条目。
156
+
157
+ 已有概念:
158
+
159
+ ${conceptBlock(concepts)}
160
+
161
+ ## 本次要交付的图
162
+
163
+ ${sections}
164
+
165
+ ${archifyBlock(archifySkillPath, diagrams, stamp)}
166
+
167
+ ## 硬约束
168
+
169
+ 0. **先建 todo**:开工第一步就调用 \`todo_write\`,把这次工作拆成 4–7 步(例:读代码 → 提概念 → 每张图 candidate → finalize → 回报),之后每完成一步就更新一次;最后一步固定是「回报产物标记」。页面靠这份 todo 显示进度。
170
+ 1. **只读代码库**:可以 read / grep / glob 任意文件,可以跑只读 git 命令;不许 write / edit / 删除 / 移动代码库里的任何文件,不许切分支、不许 commit。
171
+ 2. **产物只写工作目录**:\`candidate.json\`、HTML 与 \`concepts.json\` 都落在工作目录下,不要写进代码库。
172
+ 3. 不要输出与图谱无关的总结长文;不要中途问问题,需要的信息自己去代码里查。
173
+ 4. 证据优先:每个节点/关系都要能对应到真实文件或目录,别凭项目名猜。
174
+
175
+ ## 结束前必须打印的回报
176
+
177
+ 在最终回复的最后,单独列出这几行(替换尖括号内容,路径必须是绝对路径):
178
+
179
+ \`\`\`
180
+ ${markers}
181
+ \`\`\`
182
+
183
+ 另外请一并说明每张图的节点数、关系数,以及你在代码里实际读过的关键路径(3–8 条)。`;
184
+ }
185
+ /**
186
+ * 构建问答会话的提示词。
187
+ *
188
+ * 这个会话是**只读**的:只有 read / glob / grep / skill(archify) 四个工具,
189
+ * 上下文里只给「这张图的产物摘要 + 概念表 + 代码库根」,回答必须落在这三样上。
190
+ */
191
+ export function buildAskPrompt(input) {
192
+ const { projectName, repoPath, diagram, concepts, candidate, question } = input;
193
+ const relevant = diagram.conceptIds
194
+ .map((id) => concepts.find((c) => c.id === id))
195
+ .filter((c) => c !== undefined);
196
+ const conceptLines = relevant.length > 0
197
+ ? relevant
198
+ .map((c) => `- \`${c.id}\` ${c.name}:${c.summary}` +
199
+ (c.evidence.length > 0 ? `(证据:${c.evidence.slice(0, 5).join('、')})` : ''))
200
+ .join('\n')
201
+ : '(这张图没有绑定具体概念,可参考项目概念表。)';
202
+ return `# 任务:就「${projectName}」的一张已生成的架构图回答细节问题
203
+
204
+ ## 环境事实
205
+
206
+ - 代码库根目录:\`${repoPath}\`(只读;可以 read / grep / glob)
207
+ - 这张图:\`${diagram.title}\`(id: \`${diagram.id}\`)
208
+ - 图的建模要求:${diagram.prompt ?? '(默认口径)'}
209
+ ${diagram.pathScope.length === 0 ? '- 取证范围:全仓库。' : `- 取证范围:只看 ${diagram.pathScope.join('、')},回答时不要引用范围外的文件。`}
210
+ ${diagram.pathScope.length === 0 ? '- 取证范围:全仓库。' : `- 取证范围:只看 ${diagram.pathScope.join('、')},回答时不要引用范围外的文件。`}
211
+
212
+ ## 这张图已绑定的概念
213
+
214
+ ${conceptLines}
215
+
216
+ ## 这张图当前的产物摘要(candidate.json 截断)
217
+
218
+ \`\`\`json
219
+ ${candidate === null ? '(没有读到 candidate.json,只能依据代码回答)' : candidate}
220
+ \`\`\`
221
+
222
+ ## 用户的问题
223
+
224
+ ${question}
225
+
226
+ ## 回答要求
227
+
228
+ 0. **先建 todo**:开工第一步调用 \`todo_write\`,把这次回答拆成 3–5 步(例:看图的产物 → 读相关代码 → 整理结论),每完成一步更新一次。
229
+ 1. **只看代码库和上面的图**:不要引用外部资料,不要猜没读过的文件。
230
+ 2. 先给结论(一句话),再给依据;依据要写清文件路径(相对仓库根)与关键符号/函数名。
231
+ 3. 如果代码里查不到,直接说「代码里没有找到」,不要编。
232
+ 4. 如果问题指向图里没有覆盖的细节,在最后列出「建议补进图里的节点/关系」(2–5 条),
233
+ 用短句描述,方便用户一键并进图里。
234
+ 5. 不要输出与问题无关的长篇总结。`;
235
+ }
236
+ /**
237
+ * 从 agent 的最终文本里解析产物标记。
238
+ *
239
+ * 容错:大小写不敏感、行内可有前后空白、路径可带引号。同一 id 多次出现取最后一次。
240
+ * 旧格式(`ARCHIFY_ARTIFACT structure <path>`)仍然接受。
241
+ */
242
+ export function parseArtifactMarkers(text) {
243
+ const result = new Map();
244
+ const pattern = new RegExp(`^\\s*${ARTIFACT_MARKER}\\s+([A-Za-z0-9_-]+)\\s+(.+?)\\s*$`, 'gim');
245
+ for (const match of text.matchAll(pattern)) {
246
+ const id = match[1]?.trim().toLowerCase();
247
+ const rawPath = match[2]?.trim();
248
+ if (id === undefined || id.length === 0 || rawPath === undefined)
249
+ continue;
250
+ const cleaned = rawPath.replace(/^[`'"]+|[`'"]+$/g, '').trim();
251
+ if (cleaned.length === 0)
252
+ continue;
253
+ result.set(id, cleaned);
254
+ }
255
+ return result;
256
+ }
257
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/shared/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * HTTP 协议:路由、请求/响应类型、错误码。
3
+ *
4
+ * host 与 client 共用;改这里等于改接口契约,两侧同时失配会立刻被类型检查抓到。
5
+ */
6
+ /** 所有路由的前缀。 */
7
+ export const ROUTE_PREFIX = '/dsh-archify-projects';
8
+ /** 路由表。host 注册与 client 请求都从这里取,避免字符串各写一份。 */
9
+ export const ROUTES = {
10
+ health: `${ROUTE_PREFIX}/health`,
11
+ projects: `${ROUTE_PREFIX}/projects`,
12
+ project: (id) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}`,
13
+ check: (id) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/check`,
14
+ update: (id) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/update`,
15
+ /** 兼容旧接口:按 kind 重画默认图。 */
16
+ diagram: (id, kind) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/diagram/${kind}`,
17
+ diagrams: (id) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/diagrams`,
18
+ customDiagram: (id, diagramId) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/diagrams/${encodeURIComponent(diagramId)}`,
19
+ regenerate: (id, diagramId) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/diagrams/${encodeURIComponent(diagramId)}/regenerate`,
20
+ ask: (id, diagramId) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/diagrams/${encodeURIComponent(diagramId)}/ask`,
21
+ mergeQa: (id, qaId) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/qa/${encodeURIComponent(qaId)}/merge`,
22
+ childQa: (id, qaId) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/qa/${encodeURIComponent(qaId)}/child`,
23
+ runs: (id) => `${ROUTE_PREFIX}/projects/${encodeURIComponent(id)}/runs`,
24
+ artifact: (relativePath) => `${ROUTE_PREFIX}/artifact/${relativePath
25
+ .split(/[\\/]+/)
26
+ .map((part) => encodeURIComponent(part))
27
+ .join('/')}`,
28
+ };
29
+ /** 生成产物在 res 里的机器标记(prompt 要求 agent 输出,runner 解析)。 */
30
+ export const ARTIFACT_MARKER = 'ARCHIFY_ARTIFACT';
31
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,eAAe;AACf,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAA;AAEnD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,GAAG,YAAY,SAAS;IAChC,QAAQ,EAAE,GAAG,YAAY,WAAW;IACpC,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,EAAE;IAC7E,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,QAAQ;IACjF,MAAM,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,SAAS;IACnF,0BAA0B;IAC1B,OAAO,EAAE,CAAC,EAAU,EAAE,IAAiB,EAAE,EAAE,CACzC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,YAAY,IAAI,EAAE;IACtE,QAAQ,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,WAAW;IACvF,aAAa,EAAE,CAAC,EAAU,EAAE,SAAiB,EAAE,EAAE,CAC/C,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE;IAChG,UAAU,EAAE,CAAC,EAAU,EAAE,SAAiB,EAAE,EAAE,CAC5C,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,aAAa;IAC3G,GAAG,EAAE,CAAC,EAAU,EAAE,SAAiB,EAAE,EAAE,CACrC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,MAAM;IACpG,OAAO,EAAE,CAAC,EAAU,EAAE,IAAY,EAAE,EAAE,CACpC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ;IAC3F,OAAO,EAAE,CAAC,EAAU,EAAE,IAAY,EAAE,EAAE,CACpC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ;IAC3F,IAAI,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,YAAY,aAAa,kBAAkB,CAAC,EAAE,CAAC,OAAO;IAC/E,QAAQ,EAAE,CAAC,YAAoB,EAAE,EAAE,CACjC,GAAG,YAAY,aAAa,YAAY;SACrC,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;SACvC,IAAI,CAAC,GAAG,CAAC,EAAE;CACR,CAAA;AAiJV,sDAAsD;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAA"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * 台账数据模型(纯类型 + 纯构造函数,零 IO)。
3
+ *
4
+ * 这里是 host 与 client 唯一的「事实形状」来源:宿主写盘用它,页面渲染用它,
5
+ * 序列化契约(protocol.ts 的请求/响应)也复用它。改这里的字段等于改协议版本。
6
+ *
7
+ * v2(图册):版本口径从 commit 级降到分支级;图谱从「两张固定图」变成
8
+ * 「默认两张 + 任意自定义图」;概念(Concept)成为项目级一等公民;
9
+ * 图可以临时(只跑这一次)或永久(下次更新沿用同一 prompt)。
10
+ */
11
+ /** 台账文件格式版本。字段形状不兼容时 +1,并在 store 里做迁移。 */
12
+ export const LEDGER_VERSION = 2;
13
+ /** 两张默认图谱(自定义图统一用 `custom`)。 */
14
+ export const DIAGRAM_KINDS = ['structure', 'domain'];
15
+ /** Archify 的真实渲染器(见 skills/archify 的 Type router)。 */
16
+ export const ARCHIFY_TYPES = [
17
+ 'architecture',
18
+ 'workflow',
19
+ 'sequence',
20
+ 'dataflow',
21
+ 'lifecycle',
22
+ ];
23
+ /** 一次运行/一次提问的 token 合计。 */
24
+ export function usageTotalOf(usage) {
25
+ if (usage === null)
26
+ return 0;
27
+ return usage.uncachedInput + usage.output + usage.cacheRead + usage.cacheWrite;
28
+ }
29
+ /** 空 Git 快照(无 Git 或尚未探测)。 */
30
+ export function emptyGitSnapshot(checkedAt) {
31
+ return {
32
+ isRepo: false,
33
+ root: null,
34
+ branch: null,
35
+ detached: false,
36
+ commit: null,
37
+ commitFull: null,
38
+ commitTime: null,
39
+ commitSubject: null,
40
+ upstream: null,
41
+ ahead: null,
42
+ behind: null,
43
+ dirty: null,
44
+ tree: null,
45
+ remoteUrl: null,
46
+ checkedAt,
47
+ };
48
+ }
49
+ /** 默认两张图的标题。 */
50
+ const DEFAULT_TITLES = {
51
+ structure: '项目结构图',
52
+ domain: '领域图',
53
+ };
54
+ /** 空图谱状态。 */
55
+ export function emptyDiagramState(kind = 'structure') {
56
+ return {
57
+ id: kind,
58
+ kind,
59
+ title: DEFAULT_TITLES[kind],
60
+ prompt: null,
61
+ persistence: 'permanent',
62
+ parentId: null,
63
+ setId: kind === 'structure' ? 'structure' : null,
64
+ conceptIds: [],
65
+ renderer: 'architecture',
66
+ pathScope: [],
67
+ status: 'idle',
68
+ htmlPath: null,
69
+ specPath: null,
70
+ generatedAt: null,
71
+ branch: null,
72
+ tree: null,
73
+ error: null,
74
+ };
75
+ }
76
+ /** 空台账。 */
77
+ export function emptyLedger(now) {
78
+ return { version: LEDGER_VERSION, updatedAt: now, projects: [] };
79
+ }
80
+ /** 默认两张 + 自定义图,统一成一条列表(默认在前)。 */
81
+ export function allDiagrams(project) {
82
+ return [...DIAGRAM_KINDS.map((kind) => project.diagrams[kind]), ...project.custom];
83
+ }
84
+ /** 按 id 找图;`structure` / `domain` 也能命中默认图。 */
85
+ export function findDiagram(project, id) {
86
+ if (DIAGRAM_KINDS.includes(id)) {
87
+ return project.diagrams[id];
88
+ }
89
+ return project.custom.find((diagram) => diagram.id === id);
90
+ }
91
+ /** 不可变地替换一张图(默认图走 record,自定义图走数组)。 */
92
+ export function withDiagram(project, next) {
93
+ if (DIAGRAM_KINDS.includes(next.kind)) {
94
+ return {
95
+ ...project,
96
+ diagrams: { ...project.diagrams, [next.kind]: next },
97
+ };
98
+ }
99
+ return { ...project, custom: project.custom.map((d) => (d.id === next.id ? next : d)) };
100
+ }
101
+ /** 需要「更新图册」的图:默认两张 + 所有永久自定义图。 */
102
+ export function runnableDiagrams(project) {
103
+ return allDiagrams(project).filter((diagram) => diagram.persistence === 'permanent' || DIAGRAM_KINDS.includes(diagram.kind));
104
+ }
105
+ /** 工作区状态签名,用于判断图是否过期。 */
106
+ export function treeSignature(tree) {
107
+ if (tree === null)
108
+ return 'none';
109
+ return `${tree.staged}:${tree.unstaged}:${tree.untracked}`;
110
+ }
111
+ /** 由 Git 快照派生「图谱是否落后于代码」——按分支 + 工作区,不看 commit。 */
112
+ export function isStale(project) {
113
+ if (!project.git.isRepo)
114
+ return false;
115
+ const ready = allDiagrams(project).filter((d) => d.status === 'ready');
116
+ if (ready.length === 0)
117
+ return false;
118
+ const currentTree = treeSignature(project.git.tree);
119
+ return ready.some((d) => d.branch !== project.git.branch || treeSignature(d.tree) !== currentTree);
120
+ }
121
+ /** 运行记录超过这个时长还没结束,就当它已经死了。
122
+ *
123
+ * 宿主被 kill / 断电 / 重启时,`running` 会被原样留在台账里。页面如果照字面
124
+ * 相信它,就会永远显示「生成中」并把按钮全部禁用——用户只能去手改 JSON。 */
125
+ export const RUN_STALE_MS = 25 * 60 * 1000;
126
+ /** 这条运行记录还算不算「活着」。 */
127
+ export function isRunAlive(run, now = Date.now()) {
128
+ if (run.status !== 'running')
129
+ return false;
130
+ const started = Date.parse(run.startedAt);
131
+ if (Number.isNaN(started))
132
+ return false;
133
+ return now - started < RUN_STALE_MS;
134
+ }
135
+ /** 项目是否有正在进行的运行。 */
136
+ export function isRunning(project, now = Date.now()) {
137
+ return (project.runs.some((run) => isRunAlive(run, now)) ||
138
+ allDiagrams(project).some((d) => d.status === 'queued' || d.status === 'running'));
139
+ }
140
+ /** 有运行记录卡在 running、但其实早就过期了的项目。 */
141
+ export function hasStaleRun(project, now = Date.now()) {
142
+ return project.runs.some((run) => run.status === 'running' && !isRunAlive(run, now));
143
+ }
144
+ /** 项目名兜底:名称空时用仓库目录名。 */
145
+ export function defaultProjectName(repoPath) {
146
+ const parts = repoPath.split(/[\\/]+/).filter((part) => part.length > 0);
147
+ return parts.length > 0 ? parts[parts.length - 1] : repoPath;
148
+ }
149
+ /** 纯构造:不读盘、不探测,把已知事实拼成一条台账记录。 */
150
+ export function createProject(input) {
151
+ return {
152
+ id: input.id,
153
+ name: input.name,
154
+ repoPath: input.repoPath,
155
+ createdAt: input.now,
156
+ updatedAt: input.now,
157
+ git: input.git,
158
+ diagrams: { structure: emptyDiagramState('structure'), domain: emptyDiagramState('domain') },
159
+ custom: [],
160
+ concepts: [],
161
+ qa: [],
162
+ lastRun: null,
163
+ runs: [],
164
+ usageTotal: 0,
165
+ };
166
+ }
167
+ /** 当前正在进行的 todo(没有就是 null)。 */
168
+ export function activeTodo(run) {
169
+ if (run === null)
170
+ return null;
171
+ return run.todos.find((todo) => todo.status === 'in_progress') ?? null;
172
+ }
173
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Archify Projects",
4
+ "description": "Register local repositories, detect their Git branch and commit automatically, and let a DSH agent produce explorable Archify structure and domain diagrams — then switch back to the recorded branch, update to the latest commit, and redraw."
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "架构建模",
4
+ "description": "登记本地代码库,自动识别 Git 分支与提交点,复用 DSH agent 调 archify 产出可交互的项目结构图与领域图,并可一键切回记录的分支、更新到最新提交后重画。"
5
+ }
6
+ }