dsh-archify-projects 0.0.0-stage → 0.1.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/README.md +231 -2
- package/cordis.patch.yml +99 -0
- package/dist/client.js +2281 -0
- package/dist/client.js.map +1 -0
- package/docs/CONTAINER.md +197 -0
- package/docs/DESIGN.md +905 -0
- package/docs/HANDOVER.md +397 -0
- package/docs/PUBLISH.md +107 -0
- package/icon.svg +12 -0
- package/lib/host/archify-skill.js +116 -0
- package/lib/host/archify-skill.js.map +1 -0
- package/lib/host/config.js +95 -0
- package/lib/host/config.js.map +1 -0
- package/lib/host/context.js +28 -0
- package/lib/host/context.js.map +1 -0
- package/lib/host/git.js +185 -0
- package/lib/host/git.js.map +1 -0
- package/lib/host/http.js +184 -0
- package/lib/host/http.js.map +1 -0
- package/lib/host/index.js +90 -0
- package/lib/host/index.js.map +1 -0
- package/lib/host/policy.js +124 -0
- package/lib/host/policy.js.map +1 -0
- package/lib/host/routes.js +667 -0
- package/lib/host/routes.js.map +1 -0
- package/lib/host/runner.js +913 -0
- package/lib/host/runner.js.map +1 -0
- package/lib/host/store.js +370 -0
- package/lib/host/store.js.map +1 -0
- package/lib/host/workspace.js +65 -0
- package/lib/host/workspace.js.map +1 -0
- package/lib/shared/format.js +138 -0
- package/lib/shared/format.js.map +1 -0
- package/lib/shared/prompt.js +257 -0
- package/lib/shared/prompt.js.map +1 -0
- package/lib/shared/protocol.js +31 -0
- package/lib/shared/protocol.js.map +1 -0
- package/lib/shared/types.js +173 -0
- package/lib/shared/types.js.map +1 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +98 -4
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +109 -0
- package/skills/archify/THIRD_PARTY_NOTICES.md +69 -0
- package/skills/archify/assets/JetBrainsMono-OFL.txt +93 -0
- package/skills/archify/assets/template.html +13709 -0
- package/skills/archify/bin/archify.mjs +6936 -0
- package/skills/archify/bin/delivery-update.mjs +91 -0
- package/skills/archify/bin/finalize.mjs +895 -0
- package/skills/archify/bin/open-artifact.mjs +146 -0
- package/skills/archify/bin/preview.mjs +969 -0
- package/skills/archify/bin/recover-output.mjs +41 -0
- package/skills/archify/bin/visual-check.mjs +2667 -0
- package/skills/archify/brand-marks/README.md +31 -0
- package/skills/archify/brand-marks/catalog.json +131 -0
- package/skills/archify/delta/architecture-delta.mjs +1313 -0
- package/skills/archify/examples/agent-run.lifecycle.json +55 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +74 -0
- package/skills/archify/examples/async-job-roundtrip.sequence.json +56 -0
- package/skills/archify/examples/brand-aware-delivery.architecture.json +34 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +77 -0
- package/skills/archify/examples/checkout-platform.base.architecture.json +32 -0
- package/skills/archify/examples/checkout-platform.head.architecture.json +32 -0
- package/skills/archify/examples/dataflow-product-analytics.html +13820 -0
- package/skills/archify/examples/deployment-release.lifecycle.json +48 -0
- package/skills/archify/examples/event-stream.dataflow.json +52 -0
- package/skills/archify/examples/holiday-planning.workflow.json +143 -0
- package/skills/archify/examples/incident-response.workflow.json +59 -0
- package/skills/archify/examples/lifecycle-agent-run.html +13765 -0
- package/skills/archify/examples/locales/de.json +425 -0
- package/skills/archify/examples/locales/es.json +440 -0
- package/skills/archify/examples/locales/fr.json +425 -0
- package/skills/archify/examples/locales/fr.partial.json +22 -0
- package/skills/archify/examples/locales/it.json +425 -0
- package/skills/archify/examples/locales/ja.json +425 -0
- package/skills/archify/examples/locales/ko.json +440 -0
- package/skills/archify/examples/locales/pt.json +425 -0
- package/skills/archify/examples/locales/ru.json +425 -0
- package/skills/archify/examples/product-analytics.dataflow.json +71 -0
- package/skills/archify/examples/production-deployment.architecture.json +51 -0
- package/skills/archify/examples/release-delivery.workflow.json +57 -0
- package/skills/archify/examples/sequence-cache-miss-request.html +13835 -0
- package/skills/archify/examples/web-app-rendered.html +13808 -0
- package/skills/archify/examples/web-app.architecture.json +41 -0
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +13826 -0
- package/skills/archify/migrations/workflow-v2.mjs +280 -0
- package/skills/archify/package.json +17 -0
- package/skills/archify/recipes/scenarios.mjs +430 -0
- package/skills/archify/references/architecture-layout-repair.md +18 -0
- package/skills/archify/references/authoring-contract.md +419 -0
- package/skills/archify/references/authoring-defaults.md +41 -0
- package/skills/archify/references/brand-marks.md +82 -0
- package/skills/archify/references/delivery-contract.md +588 -0
- package/skills/archify/references/repository-authoring.md +105 -0
- package/skills/archify/references/update-awareness.md +12 -0
- package/skills/archify/references/viewer-runtime.md +35 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/labels.mjs +215 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +1001 -0
- package/skills/archify/renderers/architecture/routing.mjs +1157 -0
- package/skills/archify/renderers/dataflow/README.md +105 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +544 -0
- package/skills/archify/renderers/lifecycle/README.md +171 -0
- package/skills/archify/renderers/lifecycle/grid-routing.mjs +429 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +938 -0
- package/skills/archify/renderers/sequence/README.md +129 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +526 -0
- package/skills/archify/renderers/shared/atomic-output.mjs +1982 -0
- package/skills/archify/renderers/shared/brand-marks.mjs +670 -0
- package/skills/archify/renderers/shared/cli.mjs +451 -0
- package/skills/archify/renderers/shared/desktop-readability.mjs +132 -0
- package/skills/archify/renderers/shared/diagnostics.mjs +173 -0
- package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +134 -0
- package/skills/archify/renderers/shared/geometry.mjs +1941 -0
- package/skills/archify/renderers/shared/i18n.mjs +603 -0
- package/skills/archify/renderers/shared/layout-report.mjs +42 -0
- package/skills/archify/renderers/shared/legend.mjs +217 -0
- package/skills/archify/renderers/shared/output-path.mjs +440 -0
- package/skills/archify/renderers/shared/path-semantics.mjs +1017 -0
- package/skills/archify/renderers/shared/portable-path.mjs +408 -0
- package/skills/archify/renderers/shared/repository-evidence.mjs +352 -0
- package/skills/archify/renderers/shared/repository-location.mjs +59 -0
- package/skills/archify/renderers/shared/route-quality.mjs +614 -0
- package/skills/archify/renderers/shared/sidecar-path.mjs +38 -0
- package/skills/archify/renderers/shared/spatial-grid.mjs +66 -0
- package/skills/archify/renderers/shared/text-fit.mjs +105 -0
- package/skills/archify/renderers/shared/utils.mjs +254 -0
- package/skills/archify/renderers/shared/validator.mjs +86 -0
- package/skills/archify/renderers/workflow/README.md +301 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +37 -0
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +4913 -0
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/archify/schemas/README.md +256 -0
- package/skills/archify/schemas/architecture.schema.json +152 -0
- package/skills/archify/schemas/common.schema.json +181 -0
- package/skills/archify/schemas/dataflow.schema.json +254 -0
- package/skills/archify/schemas/lifecycle.schema.json +280 -0
- package/skills/archify/schemas/sequence.schema.json +234 -0
- package/skills/archify/schemas/workflow.schema.json +439 -0
- package/skills/archify/scripts/check-render-output.mjs +1388 -0
- package/skills/archify/scripts/check-update.mjs +1710 -0
- package/skills/archify/scripts/delivery-update-child.mjs +23 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/scripts/update-contract.mjs +182 -0
- package/skills/archify/skill-release.json +10 -0
package/README.md
CHANGED
|
@@ -1,3 +1,232 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-archify-projects
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
给 DSH 加一个「代码库图谱工作台」:登记本地仓库 → 自动识别 Git 分支与提交点 →
|
|
4
|
+
由受限的 DSH agent 调 [archify](https://github.com/tt-a1i/archify) 产出**项目结构图**与**领域图** →
|
|
5
|
+
以后每次打开都能切回记录的分支、更新到最新提交再重画。
|
|
6
|
+
|
|
7
|
+
左侧顶栏一个入口,右侧整页工作台,深浅色主题都跟随 DSH。
|
|
8
|
+
|
|
9
|
+
> 接手开发先看 [`docs/HANDOVER.md`](docs/HANDOVER.md)(架构、真机坑、质量门、待办);
|
|
10
|
+
> 设计取舍在 [`docs/DESIGN.md`](docs/DESIGN.md)。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 它解决什么
|
|
15
|
+
|
|
16
|
+
一件事反复做:读一个新仓库并画出结构/领域图,每次都从零开始、每次结论可能互相矛盾。
|
|
17
|
+
这个插件把它变成**可重复的操作**:
|
|
18
|
+
|
|
19
|
+
| 你在界面上做的 | 插件背后做的 |
|
|
20
|
+
| ------------------------------ | ------------------------------------------------------------------------------------------------------- |
|
|
21
|
+
| 填一个本地仓库路径,点「添加」 | `git rev-parse` 探测:是不是仓库、当前分支、HEAD commit、有没有未提交改动;然后建会话、投提示词、收产物 |
|
|
22
|
+
| 打开某个项目 | 显示记录的分支/commit/上游状态,两张图的产物、生成时间、基于哪个 commit,以及运行历史 |
|
|
23
|
+
| 点「更新」 | 先把仓库切回**当初记录的分支**并 `merge --ff-only` 到最新,再让 agent 基于新代码重画 |
|
|
24
|
+
| 点某张图的「重画」 | 只重画那一张,另一张不动 |
|
|
25
|
+
| 点「打开会话」 | 跳到那次运行的 DSH 会话,能看到 agent 读哪些文件、怎么得出结论 |
|
|
26
|
+
| 仓库不是 Git 库 | 不折腾分支,直接基于当前目录内容建模 |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 效果
|
|
31
|
+
|
|
32
|
+
> 截图来自真实运行——被测仓库就是这个插件自己,数据都是跑出来的,不是设计稿。
|
|
33
|
+
|
|
34
|
+
**总览**:每个仓库一张卡片,直接看出分支、工作区改动、概念数、哪些图已经就绪、有没有人在跑。
|
|
35
|
+
|
|
36
|
+

|
|
37
|
+
|
|
38
|
+
**工作台**:图名 tab 在图片上方(只有文字,不占高度),左边是图,右边是检查器——
|
|
39
|
+
prompt、概念范围、分支、进度、token 用量、运行记录都在这一栏。
|
|
40
|
+
|
|
41
|
+

|
|
42
|
+
|
|
43
|
+
**提问**:对着某张图问细节,agent 在**只读会话**里读代码回答,回答可以直接「补进图里」
|
|
44
|
+
或变成一张子图。
|
|
45
|
+
|
|
46
|
+

|
|
47
|
+
|
|
48
|
+
**新建图**:图型 tag 直接对应 archify 的 5 种渲染器,点一下告诉你「适合看什么 / 会展示
|
|
49
|
+
代码库的哪些信息 / 能让你掌握什么」;不选也行,由 agent 判断。
|
|
50
|
+
|
|
51
|
+

|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 安装
|
|
56
|
+
|
|
57
|
+
装的是**已发布的包**,一条命令,装在哪个 profile 就写哪个名字(默认 `web`):
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
dsh plugin --profile web add dsh-archify-projects
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
然后重启 dsh(宿主侧代码,必须重启)。重启后左栏出现「架构建模」。
|
|
64
|
+
|
|
65
|
+
也在 npm 上(`dsh-archify-projects@0.1.1`)。
|
|
66
|
+
|
|
67
|
+
**备用路径**:GitHub Release 上的预构建 tarball(和 npm 包内容一致):
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
dsh plugin --profile web add https://github.com/guicaiyue/dsh-archify-projects/releases/download/v0.1.1/dsh-archify-projects-0.1.1.tgz
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
> ⚠️ **不要用 `add github:guicaiyue/dsh-archify-projects` 从源码装**:
|
|
74
|
+
> `lib/`、`dist/` 是构建产物、不进版本库,pnpm 默认又不跑构建脚本,装完插件起不来。
|
|
75
|
+
> 要么用 npm 包 / Release tarball,要么先把仓库 clone 下来自己 `pnpm install && pnpm build`
|
|
76
|
+
> 再用 `add link:<绝对路径>`(这是本机开发用的路径)。
|
|
77
|
+
|
|
78
|
+
**本机开发**(改了代码要立刻生效):
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
cd ~/.dsh/profiles/web
|
|
82
|
+
pnpm add link:/absolute/path/to/dsh-archify-projects # 或在 package.json 里写 link:
|
|
83
|
+
# dsh.profile.bundles 里同时要有 "dsh-archify-projects"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
依赖:**没有外部 npm 依赖**。archify skill 本体(`skills/archify/`,约 7.3 MB,来自
|
|
87
|
+
`@tt-a1i/archify-dsh@1.0.0` 的 tarball)已经内嵌在包里,preset 的 `bundledSkillDir`
|
|
88
|
+
指向它,所以装/卸别的 archify 插件都不影响这里。
|
|
89
|
+
|
|
90
|
+
> 早期版本是指向 profile 里的 `@tt-a1i/archify-dsh/skills`,那个包一旦被卸载,
|
|
91
|
+
> 建会话就抛 `Cannot find module '@tt-a1i/archify-dsh/package.json'`,图一张都出不来。
|
|
92
|
+
> 现在这条依赖已经断掉。
|
|
93
|
+
|
|
94
|
+
## 使用
|
|
95
|
+
|
|
96
|
+
1. 左栏点「架构建模」(`Archify`)图标。
|
|
97
|
+
2. 「新增项目」——填代码库绝对路径,名字可留空(默认取目录名)。
|
|
98
|
+
3. 首次添加会自动跑一次 `create`:结构图 + 领域图各一张,通常几分钟。
|
|
99
|
+
4. 之后随时「更新」:切回记录的分支 → 快进到最新 → 重画两张图。
|
|
100
|
+
5. 图是可以直接看的 HTML(archify 产物:可搜索、可缩放、可导出),不是截图。
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 设计要点
|
|
105
|
+
|
|
106
|
+
完整设计见 [docs/DESIGN.md](docs/DESIGN.md)。这里只列会影响使用的几条。
|
|
107
|
+
|
|
108
|
+
### 只读代码库,只切分支不动你的改动
|
|
109
|
+
|
|
110
|
+
- 只跑只读 git 命令(`rev-parse` / `log` / `status` / `remote` / `rev-list`)。
|
|
111
|
+
- 更新时只会 `fetch` + `checkout <记录的分支>` + `merge --ff-only`。
|
|
112
|
+
- 工作区有未提交改动就**整段跳过**同步(`reason: 'dirty'`),在界面上说明「按当前内容分析」,
|
|
113
|
+
绝不 `reset --hard` / `clean` / `stash` / 强推。
|
|
114
|
+
- 产物一律写到插件自己的工作区(`<dataDir>/workspace/<projectId>/.archify/…`),不碰代码库。
|
|
115
|
+
|
|
116
|
+
### agent 只能用 archify,无关工具进不来
|
|
117
|
+
|
|
118
|
+
三层同时生效:
|
|
119
|
+
|
|
120
|
+
| 层 | 机制 | 挡住什么 |
|
|
121
|
+
| ---------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
122
|
+
| skill 目录 | preset 私有的 `dsh-skill-filesystem`(`includeDefaultRoots: false` + `bundledSkillDir` 指向 archify) | agent 的 skill 列表里只有 `archify` |
|
|
123
|
+
| 工具面 | `tools.restrict({ allow: [read, write, edit, glob, grep, skill, pwsh\|bash] })` | 联网、子 agent、工作流、todo 等工具压根不可见(调用即 `UNKNOWN_TOOL`) |
|
|
124
|
+
| 执行层 | `tools.guard` —— `skill` 的 `name` 必须是 `archify`,其它工具必须在白名单里 | 即使前两层被绕过,运行期也会被拒 |
|
|
125
|
+
|
|
126
|
+
`restrict` 只能装在 scoped ctx(`agent.ctx`)上,写在 preset 行里会直接抛 ——
|
|
127
|
+
所以白名单与守卫在 `src/host/policy.ts` 里,运行开始时对当次会话安装。
|
|
128
|
+
|
|
129
|
+
### 深浅色
|
|
130
|
+
|
|
131
|
+
页面只用 DSH 的主题令牌(`--dsw-alias-*` / `--dsw-specific-*` / `--dsw-radius-*` /
|
|
132
|
+
`--dsw-shadow-*` / `--dsw-focus-ring-*`),没有一处硬编码颜色,也没有任何
|
|
133
|
+
`prefers-color-scheme` 分支 —— 深色由 `body[data-ds-dark-theme]` 自动翻转。
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 开发
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
pnpm install
|
|
141
|
+
pnpm build # 双产物:src/client → dist/client.js(tsdown);src/host → lib/host/**(tsc)
|
|
142
|
+
pnpm verify # build + artifact:check + typecheck + lint + format + deps + 全部测试(含覆盖率门槛)
|
|
143
|
+
pnpm dev # 只重建客户端产物;保存即热更新进已打开的页面
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
顺序:改完 → `pnpm lint:fix` → `pnpm format` → `pnpm verify`。不绿不算完。
|
|
147
|
+
|
|
148
|
+
**改动怎么生效**
|
|
149
|
+
|
|
150
|
+
| 改哪里 | 生效方式 |
|
|
151
|
+
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
152
|
+
| `src/client/**` | `pnpm build`(或常驻 `pnpm dev`)→ `dsh-client-hmr` 轮询到 mtime 变化 → 自动换掉模块,**不用刷新、不用重启**(React 内部状态会丢,页面回到默认视图) |
|
|
153
|
+
| `src/host/**` | `pnpm build` 后**重启 dsh**(Node 的 ESM 缓存活到进程结束) |
|
|
154
|
+
| `cordis.patch.yml` | 重启 dsh |
|
|
155
|
+
|
|
156
|
+
### 质量门禁(`pnpm verify` 里的每一项)
|
|
157
|
+
|
|
158
|
+
| 命令 | 拦的是什么真实缺陷 |
|
|
159
|
+
| ----------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
160
|
+
| `tsc --noEmit` ×2 | 宿主与客户端的类型错(两份 tsconfig:客户端 `bundler`,宿主 `NodeNext`) |
|
|
161
|
+
| `eslint .` | 未处理的 Promise、把 Promise 传错地方、`await` 非 Promise、客户端误用 `process`/`Buffer` |
|
|
162
|
+
| `prettier --check .` | 排版漂移 |
|
|
163
|
+
| `depcruise` | 宿主 ↔ 客户端互相 import、循环依赖、客户端引 `node:` 内建 |
|
|
164
|
+
| `artifact:check` | 产物形状:单壳 + `id` 等于包名 + 只用 11 个 baseline 外置 + 无顶层 ESM + 体积预算 + **沙箱里真跑一遍 `factory`** |
|
|
165
|
+
| `vitest run --coverage` | 174 个用例;覆盖门槛 lines 70 / branches 60 / functions 70,`git.ts`、`store.ts`、`prompt.ts` 单独收紧 |
|
|
166
|
+
|
|
167
|
+
### 发版(Release 由 CI 自动发布)
|
|
168
|
+
|
|
169
|
+
推 `v*` 标签即发布,**不需要手工打包/上传**:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
npm version patch --no-git-tag-version # 或手工改 package.json 的 version
|
|
173
|
+
git commit -am "chore: release v0.1.1"
|
|
174
|
+
git tag v0.1.1
|
|
175
|
+
git push origin main --tags
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`.github/workflows/release.yml` 会:`pnpm verify`(不绿不发)→ `pnpm pack` →
|
|
179
|
+
建 Release(自动 release notes)→ 挂 `dsh-archify-projects-<version>.tgz`、
|
|
180
|
+
稳定别名 `dsh-archify-projects.tgz`、`SHA256SUMS.txt`。
|
|
181
|
+
标签与 `package.json` 版本不一致时任务直接失败。
|
|
182
|
+
|
|
183
|
+
想连 npm 一起发:仓库 Secrets 加 `NPM_TOKEN`,workflow 会多跑 `npm publish --access public`;
|
|
184
|
+
没配就跳过。首次发 npm 的完整步骤(含镜像源这个坑)见 [`docs/PUBLISH.md`](docs/PUBLISH.md)。
|
|
185
|
+
`.github/workflows/verify.yml` 负责 main / PR 上的常规质量门。
|
|
186
|
+
|
|
187
|
+
### 测试分层
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
tests/unit/ 纯逻辑:format / types / prompt / git / store / http / policy / runner / workspace
|
|
191
|
+
tests/contract/ locale 双语键一致 + 包级 meta
|
|
192
|
+
tests/integration/ 真台账 + 真临时目录 + 桩 ctx,跑完整一次运行编排
|
|
193
|
+
tests/component/ jsdom + RTL:空态、有项目、生成中、失败、非 Git、接口错误
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
覆盖率只量宿主侧源码。客户端渲染不计入 —— jsdom 覆盖不到布局、悬停、滚动分支,
|
|
197
|
+
硬卡它的行数只会逼出一堆假测试;客户端由 `artifact:check` 与真机验证兜着。
|
|
198
|
+
|
|
199
|
+
### 目录
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
src/shared/ 两侧共用:类型、协议常量、格式化、提示词与产物标记解析
|
|
203
|
+
src/host/ apply、路由分发、台账、git、运行编排、会话策略、工作区
|
|
204
|
+
src/client/ 入口、页面、组件、样式、locale 字典、fetch 封装
|
|
205
|
+
cordis.patch.yml 挂载 + 受限 preset
|
|
206
|
+
locale/ 包级 meta(zh.json / en.json)
|
|
207
|
+
scripts/ artifact 门禁
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
两侧**只共享契约**(HTTP 形状、locale 键、URL 常量),实现各写一份:
|
|
211
|
+
浏览器里没有 `node:*`,Node 里没有 `window`,这条由 dependency-cruiser 守着。
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 数据落在哪
|
|
216
|
+
|
|
217
|
+
| 位置 | 内容 |
|
|
218
|
+
| ------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
|
|
219
|
+
| `~/.dsh/archify-projects/projects.json`(可用 `dataDir` 改) | 台账:项目、Git 快照、两张图的状态、运行历史(保留最近 20 条) |
|
|
220
|
+
| `~/.dsh/archify-projects/workspace/<projectId>/` | 每个项目的工作目录;`.archify/<kind>-<slug>-<stamp>/` 里是 `candidate.json` 与成品 HTML |
|
|
221
|
+
| `<插件目录>/skills/archify/` | 内嵌的 archify skill(不进 git:见 `.gitignore`;npm 包用 `files` 带上) |
|
|
222
|
+
|
|
223
|
+
台账损坏时会改名备份成 `projects.json.corrupt-<时间戳>` 再从空台账起步,
|
|
224
|
+
不会静默覆盖;写入走临时文件 + rename,并发请求串行化。
|
|
225
|
+
|
|
226
|
+
## 已知边界
|
|
227
|
+
|
|
228
|
+
- 同一项目同一时刻只允许一次运行;正在跑时「更新」按钮禁用,再点会被后端拒。
|
|
229
|
+
- agent 忘了打产物标记时,插件按 `.archify/` 目录兜底;兜底失败则该图记 `failed` 并显示原因。
|
|
230
|
+
- 第三方 bundle 若注册了**全局层**的 skill provider,仍可能出现在 agent 的 skill 列表里
|
|
231
|
+
(DSH 没有提供目录过滤钩子),但它**调用不了** —— 守卫要求 `name === 'archify'`。
|
|
232
|
+
- 宿主侧没有热重载,这是第三方插件的真实落差,不是本插件能绕的。
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# dsh-archify-projects —— DSH bundle patch
|
|
2
|
+
#
|
|
3
|
+
# 两件事:
|
|
4
|
+
# 1. 挂载插件本体(宿主路由 + 客户端页面);
|
|
5
|
+
# 2. 声明一个受限 agent preset:只给 fs / fs-search / shell / skill 四类工具,
|
|
6
|
+
# skill 侧由 preset 私有的 skill-filesystem 只供应 archify。
|
|
7
|
+
#
|
|
8
|
+
# 工具白名单与执行层守卫不在这里,走 `src/host/policy.ts`:
|
|
9
|
+
# tools.restrict 要求 scoped ctx(agent.ctx),写在 preset 行里会直接抛。
|
|
10
|
+
#
|
|
11
|
+
# skill 侧:includeDefaultRoots=false 关掉 user/project 两个默认根,
|
|
12
|
+
# bundledSkillDir 指到本插件自带的 skills/(里面只有 archify 一份)。
|
|
13
|
+
# 这样这个 agent 的 skill 目录里只有 archify —— 不依赖宿主碰巧装了别的什么。
|
|
14
|
+
|
|
15
|
+
- insert:
|
|
16
|
+
- id: dsh-archify-projects
|
|
17
|
+
name: dsh-archify-projects
|
|
18
|
+
- id: preset-archify-projects
|
|
19
|
+
name: '@deepseek-ai/dsh-agent-preset'
|
|
20
|
+
config:
|
|
21
|
+
id: archify-projects
|
|
22
|
+
name: Archify 图谱
|
|
23
|
+
description: 只用于代码库架构/领域建模出图;skill 只有 archify,无关工具禁用
|
|
24
|
+
order: 20
|
|
25
|
+
plugins:
|
|
26
|
+
- id: persona
|
|
27
|
+
name: '@deepseek-ai/dsh-persona'
|
|
28
|
+
config:
|
|
29
|
+
prefix: >-
|
|
30
|
+
You are an architecture-mapping agent. Your only deliverable is
|
|
31
|
+
Archify diagrams produced from repository evidence. Prefer reading
|
|
32
|
+
real files over guessing.
|
|
33
|
+
- id: tool-fs
|
|
34
|
+
name: '@deepseek-ai/dsh-tool-fs'
|
|
35
|
+
- id: tool-fs-search
|
|
36
|
+
name: '@deepseek-ai/dsh-tool-fs-search'
|
|
37
|
+
config:
|
|
38
|
+
# schemastery 里 sampleOverCapGlobResults 是 required,不写整个 preset
|
|
39
|
+
# 会在建会话时抛 invalid config,表现为「agent 起不来」。
|
|
40
|
+
sampleOverCapGlobResults: true
|
|
41
|
+
- id: tool-bash
|
|
42
|
+
name: '@deepseek-ai/dsh-tool-bash'
|
|
43
|
+
disabled: !!js process.platform === 'win32'
|
|
44
|
+
- id: tool-pwsh
|
|
45
|
+
name: '@deepseek-ai/dsh-tool-pwsh'
|
|
46
|
+
disabled: !!js process.platform !== 'win32'
|
|
47
|
+
- id: tool-skill
|
|
48
|
+
name: '@deepseek-ai/dsh-tool-skill'
|
|
49
|
+
# 进度可见:agent 必须先建 todo,页面据此显示当前步骤
|
|
50
|
+
- id: tool-todo
|
|
51
|
+
name: '@deepseek-ai/dsh-tool-todo'
|
|
52
|
+
config:
|
|
53
|
+
allowParallelInProgress: false
|
|
54
|
+
- id: archify-skill
|
|
55
|
+
name: '@deepseek-ai/dsh-skill-filesystem'
|
|
56
|
+
config:
|
|
57
|
+
providerName: archify-projects
|
|
58
|
+
includeDefaultRoots: false
|
|
59
|
+
# 指向本插件自带的 skills/ 目录(内嵌一份 archify skill)。
|
|
60
|
+
# 之前这里解析的是 @tt-a1i/archify-dsh —— 那个包一旦被卸载,
|
|
61
|
+
# 整个 preset 建会话就抛 Cannot find module,图一张都出不来。
|
|
62
|
+
bundledSkillDir: !!js process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:path').dirname(process.getBuiltinModule('node:module').createRequire(baseUrl).resolve('dsh-archify-projects/package.json')), 'skills')
|
|
63
|
+
|
|
64
|
+
# 只读问答会话:没有 shell、没有写工具,只能读文件 + 加载 archify。
|
|
65
|
+
# 放在 preset 层而不是只靠运行期 restrict:restrict 依赖 agent 作用域,宿主版本
|
|
66
|
+
# 变化时可能装不上;preset 是配置事实,建会话时就决定了工具面。
|
|
67
|
+
- id: preset-archify-ask
|
|
68
|
+
name: '@deepseek-ai/dsh-agent-preset'
|
|
69
|
+
config:
|
|
70
|
+
id: archify-projects-ask
|
|
71
|
+
name: Archify 问答
|
|
72
|
+
description: 只读代码回答图细节;工具只有 fs / fs-search / skill,skill 只有 archify
|
|
73
|
+
order: 21
|
|
74
|
+
plugins:
|
|
75
|
+
- id: persona
|
|
76
|
+
name: '@deepseek-ai/dsh-persona'
|
|
77
|
+
config:
|
|
78
|
+
prefix: >-
|
|
79
|
+
You answer questions about an architecture diagram. Read the code,
|
|
80
|
+
cite file paths, and never guess. You cannot write files or run commands.
|
|
81
|
+
- id: tool-fs
|
|
82
|
+
name: '@deepseek-ai/dsh-tool-fs'
|
|
83
|
+
- id: tool-fs-search
|
|
84
|
+
name: '@deepseek-ai/dsh-tool-fs-search'
|
|
85
|
+
config:
|
|
86
|
+
sampleOverCapGlobResults: true
|
|
87
|
+
- id: tool-skill
|
|
88
|
+
name: '@deepseek-ai/dsh-tool-skill'
|
|
89
|
+
# 进度可见:agent 必须先建 todo,页面据此显示当前步骤
|
|
90
|
+
- id: tool-todo
|
|
91
|
+
name: '@deepseek-ai/dsh-tool-todo'
|
|
92
|
+
config:
|
|
93
|
+
allowParallelInProgress: false
|
|
94
|
+
- id: archify-skill-ask
|
|
95
|
+
name: '@deepseek-ai/dsh-skill-filesystem'
|
|
96
|
+
config:
|
|
97
|
+
providerName: archify-projects-ask
|
|
98
|
+
includeDefaultRoots: false
|
|
99
|
+
bundledSkillDir: !!js process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:path').dirname(process.getBuiltinModule('node:module').createRequire(baseUrl).resolve('dsh-archify-projects/package.json')), 'skills')
|