frontend-project-context 1.0.1 → 1.2.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.
- package/CHANGELOG.md +18 -0
- package/README.md +104 -8
- package/UPGRADING.md +28 -0
- package/docs/00-PRODUCT-CONSTITUTION.md +42 -10
- package/docs/04-PROGRAM-DESIGN.md +76 -2
- package/docs/05-ACCEPTANCE-CONTRACT.md +35 -3
- package/docs/08-INSTALLATION-AND-DISTRIBUTION.md +27 -15
- package/docs/16-GUIDED-ONBOARDING-AND-AI-RECONCILIATION-DESIGN.md +469 -0
- package/docs/17-AI-EXCHANGE-BOUNDARY-DESIGN.md +268 -0
- package/docs/README.md +12 -4
- package/examples/README.md +15 -2
- package/examples/package.json +6 -2
- package/package.json +4 -3
- package/schemas/action-plan.schema.json +250 -0
- package/schemas/assist-bundle.schema.json +75 -0
- package/schemas/capabilities.schema.json +123 -0
- package/schemas/review-bundle.schema.json +109 -0
- package/src/project-context/assist.mjs +422 -0
- package/src/project-context/cli.mjs +143 -13
- package/src/project-context/exchange-schema.mjs +528 -0
- package/src/project-context/exchange.mjs +623 -0
- package/src/project-context/project-store.mjs +22 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# 17 — `1.2.0` AI Exchange Boundary 设计
|
|
2
|
+
|
|
3
|
+
> 权威说明:本文定义项目与现有 AI 编程工具之间的模型无关双向交换边界;如与 [00-PRODUCT-CONSTITUTION.md](./00-PRODUCT-CONSTITUTION.md) 冲突,以产品宪法为准。
|
|
4
|
+
>
|
|
5
|
+
> 状态:`implemented-local; A-56-through-A-63-and-full-69-test-suite-passed; release-not-authorized`
|
|
6
|
+
>
|
|
7
|
+
> 设计基线:`frontend-project-context@1.1.0` 本地完整性修正、Assist Bundle schema 1、A-01 至 A-55、B0-01/B0-02、CLI 与发布工件共 61 项通过。
|
|
8
|
+
|
|
9
|
+
## 1. 决定
|
|
10
|
+
|
|
11
|
+
Frontend Project Context 的主要职责是成为项目与 AI 编程工具之间的桥梁。现有内核已稳定完成“项目 → AI”的治理、编译和投影,`1.1.0` 也已能以 Assist Bundle 向外部 Agent 输出 setup/sync 工作单元。但“AI → 项目”仍依赖宿主自行拼装多个 CLI 参数,没有统一、可验证、可分组审查的机器合同。
|
|
12
|
+
|
|
13
|
+
因此产品内核增加第七项:**AI Exchange Boundary**。
|
|
14
|
+
|
|
15
|
+
它只扩展桥接协议,不扩展为 Provider wrapper、Agent Runtime 或任务执行系统。
|
|
16
|
+
|
|
17
|
+
## 2. 双向桥梁合同
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
项目来源
|
|
21
|
+
→ 人工治理的 Project Contract
|
|
22
|
+
→ Context / Assist Bundle
|
|
23
|
+
→ 现有 AI 编程工具
|
|
24
|
+
→ Action Plan
|
|
25
|
+
→ 确定性 Preflight / Review Bundle
|
|
26
|
+
→ 人明确批准具体 action、ID 和路径
|
|
27
|
+
→ 复用现有细粒度安全写命令
|
|
28
|
+
→ 新的 Project Contract / projection
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
桥梁的责任边界是:
|
|
32
|
+
|
|
33
|
+
1. 把项目知识编译成 AI 可消费的最小、可追溯上下文;
|
|
34
|
+
2. 把 AI 的建议收敛为实例化、可预检、可人工审查的 action;
|
|
35
|
+
3. 用 schema、snapshot、digest、scope、impact 和 ownership 限制 action;
|
|
36
|
+
4. 在人批准后仍复用已验收的细粒度命令,不新建一个隐式权限更大的批处理写入器。
|
|
37
|
+
|
|
38
|
+
## 3. 内核与适配器的分界
|
|
39
|
+
|
|
40
|
+
### 3.1 归入内核
|
|
41
|
+
|
|
42
|
+
- Assist Bundle 的机器可读 schema、版本和完整工作单元;
|
|
43
|
+
- 模型无关 Action Plan schema;
|
|
44
|
+
- 纯预检的 Review Bundle;
|
|
45
|
+
- 公开 capability 与 protocol version 描述;
|
|
46
|
+
- 对现有 register/propose/accept/revise/deprecate/approve/publish 原语的结构化映射;
|
|
47
|
+
- 人工批准前的完整差异、baseline、impact、blocker 和路径集。
|
|
48
|
+
|
|
49
|
+
### 3.2 仍属适配器
|
|
50
|
+
|
|
51
|
+
- Codex Skill、Claude instruction、MCP Server、IDE 插件或 AGENTS 触发说明;
|
|
52
|
+
- 把用户自然语言转换成 `setup`、`sync`、`context` 或 Action Plan 的宿主逻辑;
|
|
53
|
+
- 外部 CI 从 Git 或平台事件获取 changed path 的逻辑。
|
|
54
|
+
|
|
55
|
+
适配器可以根据不同 AI 工具替换;内核 schema、安全性和人工权限不随模型改变。
|
|
56
|
+
|
|
57
|
+
## 4. 新增公共入口
|
|
58
|
+
|
|
59
|
+
### 4.1 `capabilities`
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
project-context capabilities --project PATH [--json]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
永远只读,对未初始化和已初始化项目都可用。JSON 固定返回:
|
|
66
|
+
|
|
67
|
+
- package version 与 exchange protocol version;
|
|
68
|
+
- Contract/proposal/lock/renderer/dashboard/Assist/Action Plan/Review Bundle schema version;
|
|
69
|
+
- 当前可用命令与 action kind;
|
|
70
|
+
- initialized 状态和已初始化项目的 ID/name;
|
|
71
|
+
- 永久边界:无 Provider、无 Agent Runtime、无 Git、无自动批准、无业务代码写入。
|
|
72
|
+
|
|
73
|
+
输出必须从实现常量派生,不另存 capability 配置文件。
|
|
74
|
+
|
|
75
|
+
### 4.2 `preflight`
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
project-context preflight --project PATH --plan FILE [--json]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`preflight` 只读 Action Plan,不接受 `--write`、`--by`、`--approve`、`--ids` 或任何授权参数。它必须:
|
|
82
|
+
|
|
83
|
+
1. 验证 Action Plan schema 与 project ID;
|
|
84
|
+
2. 验证三个 project snapshot baseline;
|
|
85
|
+
3. 对每个 action 复用现有纯 preview/helper;
|
|
86
|
+
4. 计算 exact item/source/path/projection impact;
|
|
87
|
+
5. 把相同人工决策类型稳定分组;
|
|
88
|
+
6. 输出 Review Bundle 和结构化 invocation,不输出可直接 shell 执行的拼接字符串;
|
|
89
|
+
7. 任一 action 不可审查时整份 plan 标记 blocked,但不隐藏其他 action 的预检结果。
|
|
90
|
+
|
|
91
|
+
`1.2.0` 不新增 `apply-plan`。人工批准后,宿主根据 Review Bundle 中已展示的结构化 invocation 调用现有细粒度命令;任一 baseline 失效立即停止并重新 `sync`/`preflight`。
|
|
92
|
+
|
|
93
|
+
## 5. Action Plan schema 1
|
|
94
|
+
|
|
95
|
+
Action Plan 是由外部 AI 或其他调用方产生的短生命周期输入,不是 store,不是 Contract,不自带权限。
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"schemaVersion": 1,
|
|
100
|
+
"projectId": "project-id",
|
|
101
|
+
"baselines": {
|
|
102
|
+
"contract": "sha256:...",
|
|
103
|
+
"sourcesLock": "sha256:...",
|
|
104
|
+
"projectionsLock": "sha256:..."
|
|
105
|
+
},
|
|
106
|
+
"actions": [
|
|
107
|
+
{
|
|
108
|
+
"id": "action-revise-ui-copy",
|
|
109
|
+
"kind": "revise-item",
|
|
110
|
+
"input": {}
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
固定规则:
|
|
117
|
+
|
|
118
|
+
- action ID 在当前 plan 中唯一且稳定;
|
|
119
|
+
- `actions` 非空,按 ID 规范排序后计算 plan digest;
|
|
120
|
+
- 拒绝未知字段、未知 action kind、重复 ID 和非项目内路径;
|
|
121
|
+
- action 不得包含 `write`、`by`、`approval`、Provider 配置、shell command 或 AI 推理正文;
|
|
122
|
+
- action 只表达建议,不表达人已批准。
|
|
123
|
+
|
|
124
|
+
### 5.1 action kind
|
|
125
|
+
|
|
126
|
+
| kind | 复用现有原语 | 必须携带的主要 baseline |
|
|
127
|
+
| --- | --- | --- |
|
|
128
|
+
| `register-source` | `register` preview | contract/source locator |
|
|
129
|
+
| `propose-item` | `propose` preview | contract + proposal output path |
|
|
130
|
+
| `accept-source-change` | `review-source` + `accept-source-change` preview | contract、source object、locked/current digest、affected IDs |
|
|
131
|
+
| `revise-item` | `revise` preview | contract + current item digest |
|
|
132
|
+
| `deprecate-item` | `deprecate` preview | contract + current item digest |
|
|
133
|
+
| `deprecate-source` | `deprecate-source` preview | contract、source object digest、affected IDs |
|
|
134
|
+
| `request-item-approval` | `approve` preview | proposal/pending item ID + contract/proposal baseline |
|
|
135
|
+
| `publish-projection` | `publish` preview | contract + projection lock/ownership baseline |
|
|
136
|
+
|
|
137
|
+
`input` 使用对应原语已公开的类型化参数,不复制第二套 scope、source、item 或 projection 解析器。
|
|
138
|
+
|
|
139
|
+
## 6. Review Bundle schema 1
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"schemaVersion": 1,
|
|
144
|
+
"projectId": "project-id",
|
|
145
|
+
"planDigest": "sha256:...",
|
|
146
|
+
"baselines": {},
|
|
147
|
+
"status": "reviewable | blocked",
|
|
148
|
+
"summary": {
|
|
149
|
+
"actions": 0,
|
|
150
|
+
"reviewable": 0,
|
|
151
|
+
"blocked": 0,
|
|
152
|
+
"groups": 0
|
|
153
|
+
},
|
|
154
|
+
"actions": [],
|
|
155
|
+
"groups": [],
|
|
156
|
+
"findings": [],
|
|
157
|
+
"invocations": []
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
每个 action 结果必须包含:
|
|
162
|
+
|
|
163
|
+
- action ID/kind 和 `reviewable | blocked` 状态;
|
|
164
|
+
- exact current/proposed 差异;
|
|
165
|
+
- source/item/path/projection ID 影响集;
|
|
166
|
+
- action 特定 baseline 与 blocker;
|
|
167
|
+
- `humanApprovalRequired: true`;
|
|
168
|
+
- 若可审查,一份 `{ command, args }` 结构化 invocation,不包含 `--write`、`--by` 或任何人类身份伪造。
|
|
169
|
+
|
|
170
|
+
`groups` 至少分为 source change、new/revised knowledge、deprecation、approval request、projection 和 blocker。每组只可引用已完整展示的 action ID,不得用“全部后续变化”之类开放授权。
|
|
171
|
+
|
|
172
|
+
## 7. 机器可读 schema 发布
|
|
173
|
+
|
|
174
|
+
`1.2.0` 应在 npm 包中公开:
|
|
175
|
+
|
|
176
|
+
```text
|
|
177
|
+
schemas/capabilities.schema.json
|
|
178
|
+
schemas/assist-bundle.schema.json
|
|
179
|
+
schemas/action-plan.schema.json
|
|
180
|
+
schemas/review-bundle.schema.json
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
schema 文件是交换形式的机器合同,不是项目真源。运行时验证与 schema 必须由同一组常量和验证规则产生或交叉验收,不允许文档与代码漂移。
|
|
184
|
+
|
|
185
|
+
Contract、proposal、source lock、projection lock、renderer 和 Dashboard schema 不因此变更。
|
|
186
|
+
|
|
187
|
+
## 8. 权限、并发与失败恢复
|
|
188
|
+
|
|
189
|
+
- `capabilities`、`setup`、`sync`、`context`、`preflight` 可被 Agent/CI 自动调用,但不产生持久权限;
|
|
190
|
+
- Action Plan 即使由人提供,也只是待审查建议;
|
|
191
|
+
- Review Bundle 不是 approval receipt,不能被原命令解释为已授权;
|
|
192
|
+
- 人必须根据已展示内容明确批准具体 action/ID/path,宿主才可补入已授权的 `--write`、`--by` 和 rationale;
|
|
193
|
+
- 每个写命令继续使用自身 baseline 和原子写;
|
|
194
|
+
- 任一写入后 project snapshot 变化,未执行的旧 invocation 全部失效,必须重新 `sync`/`preflight`;
|
|
195
|
+
- 不引入全局 rollback、自动重放或跨命令事务。
|
|
196
|
+
|
|
197
|
+
## 9. 错误类别
|
|
198
|
+
|
|
199
|
+
| code | 退出码 | 含义 |
|
|
200
|
+
| --- | --- | --- |
|
|
201
|
+
| `action-plan-schema-invalid` | 2 | plan 字段、kind 或类型非法 |
|
|
202
|
+
| `action-plan-project-mismatch` | 2 | plan project ID 与当前项目不同 |
|
|
203
|
+
| `action-plan-baseline-changed` | 1 | plan snapshot 已过期,需重新 sync/preflight |
|
|
204
|
+
| `action-plan-conflict` | 1 | action 内部重复、依赖循环或互相冲突 |
|
|
205
|
+
| `action-preflight-blocked` | 1 | 对应现有原语预检失败 |
|
|
206
|
+
|
|
207
|
+
能用现有稳定错误精确表达的情况必须直接复用,不创建同义错误。
|
|
208
|
+
|
|
209
|
+
## 10. 兼容与版本
|
|
210
|
+
|
|
211
|
+
- package 目标版本为 `1.2.0`,因为新增公共 CLI、机器 schema 和内核桥接协议;
|
|
212
|
+
- `1.1.0` Assist Bundle 保持 schema 1,`1.2.0` 只补充机器 schema 文件与交叉验证;
|
|
213
|
+
- 旧项目不需要 store migration;
|
|
214
|
+
- 所有旧命令、参数和退出码保持兼容;
|
|
215
|
+
- 旧 Host Agent 可继续直接调用原命令,不强制生成 Action Plan;
|
|
216
|
+
- npm 包将 `schemas/` 加入白名单,不加入项目动态状态。
|
|
217
|
+
|
|
218
|
+
## 11. 唯一实现范围
|
|
219
|
+
|
|
220
|
+
| 文件 | 允许变更 |
|
|
221
|
+
| --- | --- |
|
|
222
|
+
| `src/project-context/exchange-schema.mjs` | Action Plan 与 Review Bundle 类型验证、稳定规范化 |
|
|
223
|
+
| `src/project-context/exchange.mjs` | capabilities、preflight 聚合、分组和 structured invocation |
|
|
224
|
+
| `src/project-context/assist.mjs` | 仅为机器 schema 交叉验收暴露必要常量;不改变 `1.1.0` 语义 |
|
|
225
|
+
| `src/project-context/cli.mjs` | 新增 `capabilities`/`preflight` 及严格 allowlist |
|
|
226
|
+
| `schemas/*.schema.json` | 四份公开交换 schema |
|
|
227
|
+
| `test/project-context/exchange.test.mjs` | A-56 至 A-63 |
|
|
228
|
+
| `README.md`、`docs/04`、`docs/05`、`docs/08`、`UPGRADING.md`、`CHANGELOG.md` | 实现后同步真实行为 |
|
|
229
|
+
| `package.json` | 实现后升至 `1.2.0` 并发布 `schemas/` |
|
|
230
|
+
|
|
231
|
+
不新建数据库、索引、缓存、Provider client、Agent loop、shell executor、Git 读取、scheduler、daemon、watcher、业务代码修改器或自动批准器。
|
|
232
|
+
|
|
233
|
+
## 12. 冻结验收 A-56 至 A-63
|
|
234
|
+
|
|
235
|
+
- **A-56 capability 可发现性**:未初始化/已初始化项目输出确定性 capability,版本、schema、action kind 和永久边界与代码一致,零写入。
|
|
236
|
+
- **A-57 Action Plan schema**:合法 plan 稳定规范化;未知字段/kind、重复 ID、越界路径、权限字段和 shell 字符串失败封闭。
|
|
237
|
+
- **A-58 原语复用**:八类 action 全部复用现有 schema/helper/preview,不存在第二套 scope、impact、source 或 projection 语义。
|
|
238
|
+
- **A-59 Review Bundle 完整性**:精确 current/proposed、baseline、item/source/path/projection 影响、blocker、分组和 structured invocation 稳定且无遗漏。
|
|
239
|
+
- **A-60 人工权限**:capabilities/preflight/plan/review 均不写 store/projection/业务文件,不产生 approval,invocation 不包含 write/by。
|
|
240
|
+
- **A-61 baseline 与恢复**:三个 snapshot 或 action-specific digest 变化必须阻断旧 plan;重新 sync/preflight 可收敛,不重放旧计划。
|
|
241
|
+
- **A-62 机器 schema 一致性**:四份发布 schema 验证实际 fixture 输入/输出,package whitelist 包含它们且不包含动态项目状态。
|
|
242
|
+
- **A-63 兼容与永久边界**:A-01 至 A-55、B0/CLI/发布工件全部继续通过;零 Provider、Agent Runtime、Git、network、child process、dependency install、scheduler、daemon、自动批准或业务代码修改。
|
|
243
|
+
|
|
244
|
+
实现 Gate:八项新验收全部通过,全量 `npm run check` 预期为 69/69;README/help/schema 足以让一个不同模型的宿主在不依赖内部代码的情况下生成 Action Plan 并理解 Review Bundle。这是协议可用性验收,不伪称已内置或运行任何真实 Host Agent。
|
|
245
|
+
|
|
246
|
+
## 13. 明确不做
|
|
247
|
+
|
|
248
|
+
- 不调用 OpenAI、Anthropic、Gemini 或其他 Provider;
|
|
249
|
+
- 不实现 Agent Runtime、prompt runner、tool loop 或自然语言路由器;
|
|
250
|
+
- 不新增 `apply-plan` 或批量隐式授权;
|
|
251
|
+
- 不把 AI 建议、Review Bundle 或对话保存为第二真源;
|
|
252
|
+
- 不读取 Git diff,不管理 hook、commit、branch、PR 或 CI 平台;
|
|
253
|
+
- 不根据新框架、文件名或单项目差异扩大 discovery;
|
|
254
|
+
- 不运行项目验证命令、不修改业务代码;
|
|
255
|
+
- 不用本设计授权真实项目访问、网络、打包、Git 写入或 npm 发布。
|
|
256
|
+
|
|
257
|
+
## 14. 实现结果与停止条件
|
|
258
|
+
|
|
259
|
+
`1.2.0` 已按本文冻结范围完成本地实现:
|
|
260
|
+
|
|
261
|
+
- `capabilities` 在未初始化、partial 和已初始化项目中确定性返回实现常量派生的能力、schema 与永久边界;
|
|
262
|
+
- `exchange-schema.mjs` 严格验证并稳定规范化 Action Plan schema 1,拒绝未知/权限/执行字段、重复 action、未知 kind 和项目外路径;
|
|
263
|
+
- `exchange.mjs` 对八类 action 复用既有原语进行纯预检,输出 Review Bundle schema 1、精确 impact、blocker、稳定 group 和结构化 invocation;
|
|
264
|
+
- approval/deprecation 只在内部借用既有 preview 语义进行验证,对外 proposed intent 明确要求人类身份与执行时间,不暴露内部 sentinel、不形成 approval;
|
|
265
|
+
- `schemas/` 发布 capabilities、Assist Bundle、Action Plan 与 Review Bundle 四份机器合同,npm 白名单继续排除动态项目状态和自托管 store;
|
|
266
|
+
- A-56 至 A-63 和全部旧验收共 69/69 通过,store schema、renderer、Dashboard 与旧 CLI 无迁移和无回归。
|
|
267
|
+
|
|
268
|
+
实现和自托管同步完成后本阶段停止。当前仍不授权 Provider、Agent Runtime、`apply-plan`、自动批准/修复、业务代码执行、Git 管理、网络、依赖安装、scheduler、daemon、真实项目访问、`npm pack`、registry、push 或发布。构建与测试成功不等于发布授权。
|
package/docs/README.md
CHANGED
|
@@ -54,20 +54,28 @@
|
|
|
54
54
|
|
|
55
55
|
记录首次公开发布前来源生命周期修补的冻结设计与本地实现:处理来源删除、搬迁和永久退役,不自动接受、批准或修复;A-40 至 A-45 已通过。
|
|
56
56
|
|
|
57
|
+
12. [16-GUIDED-ONBOARDING-AND-AI-RECONCILIATION-DESIGN.md](./16-GUIDED-ONBOARDING-AND-AI-RECONCILIATION-DESIGN.md)
|
|
58
|
+
|
|
59
|
+
记录 `1.1.0` AI Exchange Boundary 聚合基础的冻结合同与本地实现:以 setup/sync 聚合既有原语,外部 AI 依据模型无关工作单元准备首次接入和增量维护,人集中评判;Assist Bundle 默认不携带来源正文,A-46 至 A-55 已通过。
|
|
60
|
+
|
|
61
|
+
13. [17-AI-EXCHANGE-BOUNDARY-DESIGN.md](./17-AI-EXCHANGE-BOUNDARY-DESIGN.md)
|
|
62
|
+
|
|
63
|
+
记录 `1.2.0` 双向 AI 交换内核的冻结设计与本地实现结果:机器可发现 capability、Action Plan、只读 preflight/Review Bundle、结构化 invocation 和人工精确授权边界;A-56 至 A-63 已通过,发布仍未授权。
|
|
64
|
+
|
|
57
65
|
## 历史证据
|
|
58
66
|
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
14. [06-HISTORICAL-PROTOTYPE.md](./06-HISTORICAL-PROTOTYPE.md)
|
|
68
|
+
15. [07-REAL-TASK-EVIDENCE.md](./07-REAL-TASK-EVIDENCE.md)
|
|
61
69
|
|
|
62
70
|
历史文档只解释为什么不再建设任务执行 Harness。它们不是程序需求、工作流或授权来源。
|
|
63
71
|
|
|
64
72
|
## Beta 证据
|
|
65
73
|
|
|
66
|
-
|
|
74
|
+
16. [09-B0-DTG-TMC-MOBILE.md](./09-B0-DTG-TMC-MOBILE.md)
|
|
67
75
|
|
|
68
76
|
记录首次真实项目只读接入、通用修补和同项目回归。报告中的历史“下一步”不再产生新需求。
|
|
69
77
|
|
|
70
|
-
|
|
78
|
+
17. [10-B0-DTG-TMC-PC.md](./10-B0-DTG-TMC-PC.md)
|
|
71
79
|
|
|
72
80
|
记录第二个真实项目只读接入和跨项目对比:核心链路与首轮通用修补再次通过。产品宪法已经停止继续寻找项目和扩充技术发现白名单。
|
|
73
81
|
|
package/examples/README.md
CHANGED
|
@@ -5,7 +5,20 @@
|
|
|
5
5
|
维护者首次初始化:
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm run context:
|
|
8
|
+
npm run context:setup -- --id my-project --name "My Project" --write --json
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
日常维护时生成只读变化工作单元:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm run context:sync -- --changed-path src/example.ts --json
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
外部 AI 宿主先查询机器协议,再对无权限 Action Plan 生成只读 Review Bundle:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm run context:capabilities -- --json
|
|
21
|
+
npm run context:preflight -- --plan .project-context/action-plan.json --json
|
|
9
22
|
```
|
|
10
23
|
|
|
11
24
|
团队和 CI 的只读 Gate:
|
|
@@ -14,4 +27,4 @@ npm run context:init -- --id my-project --name "My Project" --write
|
|
|
14
27
|
npm run context:check
|
|
15
28
|
```
|
|
16
29
|
|
|
17
|
-
|
|
30
|
+
人工审查 setup/sync 或 Review Bundle 返回的精确 action、ID 和路径后,继续使用 approve/accept/revise/deprecate/publish 的显式写入命令。Review Bundle invocation 不含 `--write`/`--by`,不能当成授权。应提交 `.project-context/contract.json`、`.project-context/sources.lock.json`、`.project-context/projections.lock.json` 和团队明确采用的受管投影。不要提交 proposal、Action Plan、Review Bundle、Assist Bundle、dashboard HTML、tarball、node_modules 或临时 Context Bundle。
|
package/examples/package.json
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"private": true,
|
|
3
3
|
"scripts": {
|
|
4
|
+
"context:setup": "project-context setup --project .",
|
|
4
5
|
"context:init": "project-context init --project .",
|
|
5
6
|
"context:check": "project-context check --project .",
|
|
6
|
-
"context:dashboard": "project-context dashboard --project ."
|
|
7
|
+
"context:dashboard": "project-context dashboard --project .",
|
|
8
|
+
"context:sync": "project-context sync --project .",
|
|
9
|
+
"context:capabilities": "project-context capabilities --project .",
|
|
10
|
+
"context:preflight": "project-context preflight --project ."
|
|
7
11
|
},
|
|
8
12
|
"devDependencies": {
|
|
9
|
-
"frontend-project-context": "1.0
|
|
13
|
+
"frontend-project-context": "1.2.0"
|
|
10
14
|
}
|
|
11
15
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "frontend-project-context",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Govern, compile, and verify project-local context for AI coding tools.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"files": [
|
|
14
14
|
"bin/",
|
|
15
15
|
"src/",
|
|
16
|
+
"schemas/",
|
|
16
17
|
"docs/",
|
|
17
18
|
"examples/",
|
|
18
19
|
"CHANGELOG.md",
|
|
@@ -24,8 +25,8 @@
|
|
|
24
25
|
"project-context": "bin/project-context.mjs"
|
|
25
26
|
},
|
|
26
27
|
"scripts": {
|
|
27
|
-
"check": "node --check bin/project-context.mjs &&
|
|
28
|
-
"test": "node --test test/project-context test/release",
|
|
28
|
+
"check": "node --check bin/project-context.mjs && npm test",
|
|
29
|
+
"test": "node --test test/project-context/acceptance.test.mjs test/project-context/assist.test.mjs test/project-context/cli.test.mjs test/project-context/dashboard.test.mjs test/project-context/exchange.test.mjs test/project-context/maintenance.test.mjs test/project-context/source-lifecycle.test.mjs test/release/acceptance.test.mjs",
|
|
29
30
|
"prepack": "npm run check"
|
|
30
31
|
},
|
|
31
32
|
"engines": {
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "urn:frontend-project-context:schema:action-plan:1",
|
|
4
|
+
"title": "Frontend Project Context Action Plan",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schemaVersion", "projectId", "baselines", "actions"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schemaVersion": { "const": 1 },
|
|
10
|
+
"projectId": { "$ref": "#/$defs/id" },
|
|
11
|
+
"baselines": { "$ref": "#/$defs/baselines" },
|
|
12
|
+
"actions": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"minItems": 1,
|
|
15
|
+
"items": {
|
|
16
|
+
"oneOf": [
|
|
17
|
+
{ "$ref": "#/$defs/registerSource" },
|
|
18
|
+
{ "$ref": "#/$defs/proposeItem" },
|
|
19
|
+
{ "$ref": "#/$defs/acceptSourceChange" },
|
|
20
|
+
{ "$ref": "#/$defs/reviseItem" },
|
|
21
|
+
{ "$ref": "#/$defs/deprecateItem" },
|
|
22
|
+
{ "$ref": "#/$defs/deprecateSource" },
|
|
23
|
+
{ "$ref": "#/$defs/requestItemApproval" },
|
|
24
|
+
{ "$ref": "#/$defs/publishProjection" }
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"$defs": {
|
|
30
|
+
"id": { "type": "string", "pattern": "^[a-z0-9]+(?:[.-][a-z0-9]+)*$" },
|
|
31
|
+
"digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
|
|
32
|
+
"path": { "type": "string", "minLength": 1, "not": { "pattern": "(^/|(^|[\\/])\\.\\.([\\/]|$))" } },
|
|
33
|
+
"baselines": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"additionalProperties": false,
|
|
36
|
+
"required": ["contract", "sourcesLock", "projectionsLock"],
|
|
37
|
+
"properties": {
|
|
38
|
+
"contract": { "$ref": "#/$defs/digest" },
|
|
39
|
+
"sourcesLock": { "$ref": "#/$defs/digest" },
|
|
40
|
+
"projectionsLock": { "$ref": "#/$defs/digest" }
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"scope": {
|
|
44
|
+
"oneOf": [
|
|
45
|
+
{
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"required": ["kind"],
|
|
49
|
+
"properties": { "kind": { "const": "project" } }
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"type": "object",
|
|
53
|
+
"additionalProperties": false,
|
|
54
|
+
"required": ["kind", "path"],
|
|
55
|
+
"properties": {
|
|
56
|
+
"kind": { "enum": ["path-prefix", "file"] },
|
|
57
|
+
"path": { "$ref": "#/$defs/path" }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"verification": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"additionalProperties": false,
|
|
65
|
+
"required": ["kind"],
|
|
66
|
+
"properties": {
|
|
67
|
+
"kind": { "enum": ["none", "file-exists", "json-value", "path-digest"] },
|
|
68
|
+
"source": { "$ref": "#/$defs/id" },
|
|
69
|
+
"expected": {}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"itemInput": {
|
|
73
|
+
"type": "object",
|
|
74
|
+
"required": ["id", "kind", "subject", "value", "statement", "sources", "scope"],
|
|
75
|
+
"properties": {
|
|
76
|
+
"id": { "$ref": "#/$defs/id" },
|
|
77
|
+
"kind": { "enum": ["fact", "policy", "reference", "validation-description"] },
|
|
78
|
+
"subject": { "$ref": "#/$defs/id" },
|
|
79
|
+
"value": {},
|
|
80
|
+
"statement": { "type": "string", "minLength": 1 },
|
|
81
|
+
"sources": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/id" } },
|
|
82
|
+
"scope": { "$ref": "#/$defs/scope" },
|
|
83
|
+
"overrides": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/id" } },
|
|
84
|
+
"verification": { "$ref": "#/$defs/verification" }
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"registerSource": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"additionalProperties": false,
|
|
90
|
+
"required": ["id", "kind", "input"],
|
|
91
|
+
"properties": {
|
|
92
|
+
"id": { "$ref": "#/$defs/id" },
|
|
93
|
+
"kind": { "const": "register-source" },
|
|
94
|
+
"input": {
|
|
95
|
+
"type": "object",
|
|
96
|
+
"additionalProperties": false,
|
|
97
|
+
"required": ["id", "kind"],
|
|
98
|
+
"properties": {
|
|
99
|
+
"id": { "$ref": "#/$defs/id" },
|
|
100
|
+
"kind": { "enum": ["file", "path", "json-pointer", "human-decision", "external-reference"] },
|
|
101
|
+
"path": { "$ref": "#/$defs/path" },
|
|
102
|
+
"pointer": { "type": "string" },
|
|
103
|
+
"reference": { "type": "string", "minLength": 1 }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"proposeItem": {
|
|
109
|
+
"type": "object",
|
|
110
|
+
"additionalProperties": false,
|
|
111
|
+
"required": ["id", "kind", "input"],
|
|
112
|
+
"properties": {
|
|
113
|
+
"id": { "$ref": "#/$defs/id" },
|
|
114
|
+
"kind": { "const": "propose-item" },
|
|
115
|
+
"input": {
|
|
116
|
+
"unevaluatedProperties": false,
|
|
117
|
+
"allOf": [
|
|
118
|
+
{ "$ref": "#/$defs/itemInput" },
|
|
119
|
+
{
|
|
120
|
+
"type": "object",
|
|
121
|
+
"required": ["output"],
|
|
122
|
+
"properties": { "output": { "$ref": "#/$defs/path" } }
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"acceptSourceChange": {
|
|
129
|
+
"type": "object",
|
|
130
|
+
"additionalProperties": false,
|
|
131
|
+
"required": ["id", "kind", "input"],
|
|
132
|
+
"properties": {
|
|
133
|
+
"id": { "$ref": "#/$defs/id" },
|
|
134
|
+
"kind": { "const": "accept-source-change" },
|
|
135
|
+
"input": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"additionalProperties": false,
|
|
138
|
+
"required": ["id", "sourceObjectDigest", "lockedDigest", "currentDigest", "affectedItems"],
|
|
139
|
+
"properties": {
|
|
140
|
+
"id": { "$ref": "#/$defs/id" },
|
|
141
|
+
"sourceObjectDigest": { "$ref": "#/$defs/digest" },
|
|
142
|
+
"lockedDigest": { "$ref": "#/$defs/digest" },
|
|
143
|
+
"currentDigest": { "$ref": "#/$defs/digest" },
|
|
144
|
+
"affectedItems": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/id" } }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"reviseItem": {
|
|
150
|
+
"type": "object",
|
|
151
|
+
"additionalProperties": false,
|
|
152
|
+
"required": ["id", "kind", "input"],
|
|
153
|
+
"properties": {
|
|
154
|
+
"id": { "$ref": "#/$defs/id" },
|
|
155
|
+
"kind": { "const": "revise-item" },
|
|
156
|
+
"input": {
|
|
157
|
+
"unevaluatedProperties": false,
|
|
158
|
+
"allOf": [
|
|
159
|
+
{ "$ref": "#/$defs/itemInput" },
|
|
160
|
+
{
|
|
161
|
+
"type": "object",
|
|
162
|
+
"required": ["expectedItemDigest"],
|
|
163
|
+
"properties": { "expectedItemDigest": { "$ref": "#/$defs/digest" } }
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
"deprecateItem": {
|
|
170
|
+
"type": "object",
|
|
171
|
+
"additionalProperties": false,
|
|
172
|
+
"required": ["id", "kind", "input"],
|
|
173
|
+
"properties": {
|
|
174
|
+
"id": { "$ref": "#/$defs/id" },
|
|
175
|
+
"kind": { "const": "deprecate-item" },
|
|
176
|
+
"input": {
|
|
177
|
+
"type": "object",
|
|
178
|
+
"additionalProperties": false,
|
|
179
|
+
"required": ["id", "expectedItemDigest", "rationale"],
|
|
180
|
+
"properties": {
|
|
181
|
+
"id": { "$ref": "#/$defs/id" },
|
|
182
|
+
"expectedItemDigest": { "$ref": "#/$defs/digest" },
|
|
183
|
+
"rationale": { "type": "string", "minLength": 1 }
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"deprecateSource": {
|
|
189
|
+
"type": "object",
|
|
190
|
+
"additionalProperties": false,
|
|
191
|
+
"required": ["id", "kind", "input"],
|
|
192
|
+
"properties": {
|
|
193
|
+
"id": { "$ref": "#/$defs/id" },
|
|
194
|
+
"kind": { "const": "deprecate-source" },
|
|
195
|
+
"input": {
|
|
196
|
+
"type": "object",
|
|
197
|
+
"additionalProperties": false,
|
|
198
|
+
"required": ["id", "expectedSourceDigest", "affectedItems", "rationale"],
|
|
199
|
+
"properties": {
|
|
200
|
+
"id": { "$ref": "#/$defs/id" },
|
|
201
|
+
"expectedSourceDigest": { "$ref": "#/$defs/digest" },
|
|
202
|
+
"affectedItems": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/id" } },
|
|
203
|
+
"rationale": { "type": "string", "minLength": 1 }
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"requestItemApproval": {
|
|
209
|
+
"type": "object",
|
|
210
|
+
"additionalProperties": false,
|
|
211
|
+
"required": ["id", "kind", "input"],
|
|
212
|
+
"properties": {
|
|
213
|
+
"id": { "$ref": "#/$defs/id" },
|
|
214
|
+
"kind": { "const": "request-item-approval" },
|
|
215
|
+
"input": {
|
|
216
|
+
"type": "object",
|
|
217
|
+
"additionalProperties": false,
|
|
218
|
+
"required": ["mode", "ids"],
|
|
219
|
+
"properties": {
|
|
220
|
+
"mode": { "enum": ["pending", "proposal"] },
|
|
221
|
+
"ids": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/id" } },
|
|
222
|
+
"proposal": { "$ref": "#/$defs/path" },
|
|
223
|
+
"proposalDigest": { "$ref": "#/$defs/digest" },
|
|
224
|
+
"rationale": { "type": "string" }
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
"publishProjection": {
|
|
230
|
+
"type": "object",
|
|
231
|
+
"additionalProperties": false,
|
|
232
|
+
"required": ["id", "kind", "input"],
|
|
233
|
+
"properties": {
|
|
234
|
+
"id": { "$ref": "#/$defs/id" },
|
|
235
|
+
"kind": { "const": "publish-projection" },
|
|
236
|
+
"input": {
|
|
237
|
+
"type": "object",
|
|
238
|
+
"additionalProperties": false,
|
|
239
|
+
"required": ["target", "output", "paths", "expectedContentDigest"],
|
|
240
|
+
"properties": {
|
|
241
|
+
"target": { "enum": ["agents", "ruler"] },
|
|
242
|
+
"output": { "$ref": "#/$defs/path" },
|
|
243
|
+
"paths": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "$ref": "#/$defs/path" } },
|
|
244
|
+
"expectedContentDigest": { "anyOf": [{ "$ref": "#/$defs/digest" }, { "type": "null" }] }
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|