@pm_zhousl/xinyun-ai-init 1.0.1 → 1.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.
- package/README.md +40 -11
- package/bin/xinyun-ai-init.js +109 -9
- package/init/xinyun-ai-init/README.md +50 -4
- package/init/xinyun-ai-init/prompt.md +1 -1
- package/init/xinyun-ai-init/rules/init-rules.md +3 -1
- package/init/xinyun-ai-init/rules/requirement-ui-understanding.md +35 -0
- package/init/xinyun-ai-init/rules/requirements-rules.md +43 -0
- package/init/xinyun-ai-init/rules/upgrade-rules.md +9 -1
- package/init/xinyun-ai-init/templates/AGENTS.template.md +10 -0
- package/init/xinyun-ai-init/templates/README.template.md +3 -0
- package/init/xinyun-ai-init/templates/core-rules.template.md +36 -0
- package/init/xinyun-ai-init/templates/current-task.template.md +9 -2
- package/init/xinyun-ai-init/templates/manifest.template.json +12 -5
- package/init/xinyun-ai-init/templates/project-index.template.json +4 -2
- package/init/xinyun-ai-init/templates/requirement.template.md +33 -0
- package/init/xinyun-ai-init/version.json +2 -2
- package/package.json +6 -1
- package/scripts/publish-with-token.ps1 +91 -0
package/README.md
CHANGED
|
@@ -2,28 +2,57 @@
|
|
|
2
2
|
|
|
3
3
|
欣芸技术开发 Agent 流初始化包。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Codex 一句话入口
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
用 Codex 打开项目后,直接发送:
|
|
8
|
+
|
|
9
|
+
```md
|
|
10
|
+
请执行 `npx --yes @pm_zhousl/xinyun-ai-init@latest --force`,然后读取 `xinyun-ai-init/README.md`,按其中规则初始化或升级当前项目。
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 手动使用
|
|
8
14
|
|
|
9
15
|
```bash
|
|
10
16
|
npx --yes @pm_zhousl/xinyun-ai-init@latest --force
|
|
11
17
|
```
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
执行后会在当前目录生成 `xinyun-ai-init/`。
|
|
14
20
|
|
|
15
|
-
|
|
16
|
-
|
|
21
|
+
## 注意
|
|
22
|
+
|
|
23
|
+
该 CLI 只释放初始化包,不修改业务代码、不创建 `xinyun-ai/`。
|
|
24
|
+
|
|
25
|
+
完整执行要求已经内置在 `xinyun-ai-init/README.md`、`rules/` 和 `templates/` 中。后续不需要复制长提示词,只需要让 AI 读取本地释放出来的 `xinyun-ai-init/README.md`。
|
|
26
|
+
|
|
27
|
+
CLI 执行时会显示当前版本,并尽量检测 npm 线上最新版本;检测失败不会阻塞初始化。
|
|
28
|
+
|
|
29
|
+
可选参数:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
--no-version-check
|
|
33
|
+
--strict-version
|
|
17
34
|
```
|
|
18
35
|
|
|
19
|
-
|
|
36
|
+
## 维护者发布
|
|
20
37
|
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
发布新版时,在本包目录执行:
|
|
39
|
+
|
|
40
|
+
```powershell
|
|
41
|
+
npm run publish:token
|
|
23
42
|
```
|
|
24
43
|
|
|
25
|
-
|
|
44
|
+
脚本会提示输入 npm token,临时写入 `.npmrc`,发布完成或失败后自动删除 `.npmrc`。
|
|
26
45
|
|
|
27
|
-
|
|
46
|
+
如果需要让 AI 代执行,可先在当前终端设置临时环境变量:
|
|
28
47
|
|
|
29
|
-
|
|
48
|
+
```powershell
|
|
49
|
+
$env:NPM_TOKEN="你的 npm token"
|
|
50
|
+
npm run publish:token
|
|
51
|
+
$env:NPM_TOKEN=$null
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
发布前预演:
|
|
55
|
+
|
|
56
|
+
```powershell
|
|
57
|
+
npm run publish:token:dry
|
|
58
|
+
```
|
package/bin/xinyun-ai-init.js
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
const fs = require("fs");
|
|
4
|
+
const https = require("https");
|
|
4
5
|
const path = require("path");
|
|
5
6
|
|
|
7
|
+
const packageJson = require("../package.json");
|
|
8
|
+
|
|
6
9
|
const args = new Set(process.argv.slice(2));
|
|
7
10
|
const force = args.has("--force") || args.has("-f");
|
|
11
|
+
const noVersionCheck = args.has("--no-version-check");
|
|
12
|
+
const strictVersion = args.has("--strict-version");
|
|
8
13
|
const cwd = process.cwd();
|
|
9
14
|
const source = path.resolve(__dirname, "..", "init", "xinyun-ai-init");
|
|
10
15
|
const target = path.join(cwd, "xinyun-ai-init");
|
|
16
|
+
const packageName = packageJson.name;
|
|
17
|
+
const currentVersion = packageJson.version;
|
|
18
|
+
const registryMetadataUrl = "https://registry.npmjs.org/@pm_zhousl%2Fxinyun-ai-init";
|
|
11
19
|
|
|
12
20
|
function copyDir(src, dest) {
|
|
13
21
|
fs.mkdirSync(dest, { recursive: true });
|
|
@@ -22,16 +30,105 @@ function copyDir(src, dest) {
|
|
|
22
30
|
}
|
|
23
31
|
}
|
|
24
32
|
|
|
25
|
-
function
|
|
33
|
+
function compareVersions(a, b) {
|
|
34
|
+
const pa = String(a).split(".").map((part) => Number.parseInt(part, 10) || 0);
|
|
35
|
+
const pb = String(b).split(".").map((part) => Number.parseInt(part, 10) || 0);
|
|
36
|
+
const length = Math.max(pa.length, pb.length);
|
|
37
|
+
|
|
38
|
+
for (let index = 0; index < length; index += 1) {
|
|
39
|
+
const av = pa[index] || 0;
|
|
40
|
+
const bv = pb[index] || 0;
|
|
41
|
+
if (av > bv) return 1;
|
|
42
|
+
if (av < bv) return -1;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function fetchLatestVersion(timeoutMs = 1500) {
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
const request = https.get(
|
|
51
|
+
registryMetadataUrl,
|
|
52
|
+
{ headers: { Accept: "application/json", "User-Agent": "xinyun-ai-init" } },
|
|
53
|
+
(response) => {
|
|
54
|
+
let body = "";
|
|
55
|
+
|
|
56
|
+
response.setEncoding("utf8");
|
|
57
|
+
response.on("data", (chunk) => {
|
|
58
|
+
body += chunk;
|
|
59
|
+
});
|
|
60
|
+
response.on("end", () => {
|
|
61
|
+
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
62
|
+
resolve(null);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
const data = JSON.parse(body);
|
|
68
|
+
resolve(data && data["dist-tags"] ? data["dist-tags"].latest : null);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
resolve(null);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
request.setTimeout(timeoutMs, () => {
|
|
77
|
+
request.destroy();
|
|
78
|
+
resolve(null);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
request.on("error", () => {
|
|
82
|
+
resolve(null);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function checkVersion() {
|
|
88
|
+
console.log(`[xinyun-ai-init] Current version: ${currentVersion}`);
|
|
89
|
+
|
|
90
|
+
if (noVersionCheck) {
|
|
91
|
+
console.log("[xinyun-ai-init] Version check skipped.");
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const latestVersion = await fetchLatestVersion();
|
|
96
|
+
|
|
97
|
+
if (!latestVersion) {
|
|
98
|
+
console.log("[xinyun-ai-init] Could not check latest npm version. Continue with local version.");
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log(`[xinyun-ai-init] Latest version: ${latestVersion}`);
|
|
103
|
+
|
|
104
|
+
if (compareVersions(currentVersion, latestVersion) < 0) {
|
|
105
|
+
console.log("[xinyun-ai-init] A newer version is available. Recommended command:");
|
|
106
|
+
console.log(`npx --yes ${packageName}@latest --force`);
|
|
107
|
+
|
|
108
|
+
if (strictVersion) {
|
|
109
|
+
console.error("[xinyun-ai-init] Strict version mode is enabled. Stop because local version is outdated.");
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function main() {
|
|
118
|
+
const canContinue = await checkVersion();
|
|
119
|
+
if (!canContinue) {
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
|
|
26
123
|
if (!fs.existsSync(source)) {
|
|
27
|
-
console.error("[xinyun-ai-init]
|
|
124
|
+
console.error("[xinyun-ai-init] Init package missing:", source);
|
|
28
125
|
process.exit(1);
|
|
29
126
|
}
|
|
30
127
|
|
|
31
128
|
if (fs.existsSync(target)) {
|
|
32
129
|
if (!force) {
|
|
33
|
-
console.log("[xinyun-ai-init]
|
|
34
|
-
console.log(
|
|
130
|
+
console.log("[xinyun-ai-init] xinyun-ai-init/ already exists. Skip overwrite.");
|
|
131
|
+
console.log(`[xinyun-ai-init] To overwrite, run: npx --yes ${packageName}@latest --force`);
|
|
35
132
|
console.log("");
|
|
36
133
|
printNextStep();
|
|
37
134
|
return;
|
|
@@ -40,18 +137,21 @@ function main() {
|
|
|
40
137
|
}
|
|
41
138
|
|
|
42
139
|
copyDir(source, target);
|
|
43
|
-
console.log("[xinyun-ai-init]
|
|
140
|
+
console.log("[xinyun-ai-init] Created:", target);
|
|
44
141
|
console.log("");
|
|
45
142
|
printNextStep();
|
|
46
143
|
}
|
|
47
144
|
|
|
48
145
|
function printNextStep() {
|
|
49
|
-
console.log("
|
|
146
|
+
console.log("Next step: send this message to Codex / Cursor / Claude Code:");
|
|
50
147
|
console.log("");
|
|
51
|
-
console.log("
|
|
148
|
+
console.log("请执行 `npx --yes @pm_zhousl/xinyun-ai-init@latest --force`,然后读取 `xinyun-ai-init/README.md`,按其中规则初始化或升级当前项目。");
|
|
52
149
|
console.log("");
|
|
53
|
-
console.log("
|
|
150
|
+
console.log("The full workflow is in xinyun-ai-init/README.md. No long prompt is needed.");
|
|
54
151
|
console.log("");
|
|
55
152
|
}
|
|
56
153
|
|
|
57
|
-
main()
|
|
154
|
+
main().catch((error) => {
|
|
155
|
+
console.error("[xinyun-ai-init] Unexpected error:", error && error.message ? error.message : error);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
});
|
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
本目录是“欣芸技术开发 Agent 流”的初始化包,负责把完整 AI 执行要求下发到目标项目。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Codex 一句话入口
|
|
6
6
|
|
|
7
7
|
```md
|
|
8
|
-
|
|
8
|
+
请执行 `npx --yes @pm_zhousl/xinyun-ai-init@latest --force`,然后读取 `xinyun-ai-init/README.md`,按其中规则初始化或升级当前项目。
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
AI 读取本文件后,必须把本 README、`rules/`、`templates/` 作为执行依据;用户不需要再粘贴长规则。
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## 手动使用
|
|
14
14
|
|
|
15
15
|
```md
|
|
16
16
|
npx --yes @pm_zhousl/xinyun-ai-init@latest --force
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
执行上面的命令后,会生成 `xinyun-ai-init/`。随后让 AI 读取 `xinyun-ai-init/README.md` 即可。
|
|
20
20
|
|
|
21
21
|
## AI 执行入口
|
|
22
22
|
|
|
@@ -31,6 +31,24 @@ AI 读取本文件后,必须按以下方式执行:
|
|
|
31
31
|
7. 首次初始化不执行语言级语法检查、lint、typecheck、测试或构建命令;本机缺少运行时只记录为待确认,不展开长解释。
|
|
32
32
|
8. 完成后用中文输出初始化或升级结果、项目导读、待确认问题和后续短指令。
|
|
33
33
|
|
|
34
|
+
## 代码修改强制确认
|
|
35
|
+
|
|
36
|
+
用户提出“帮我改”“修复”“处理一下”“优化一下”只代表提出需求,不代表授权执行。
|
|
37
|
+
|
|
38
|
+
未确认前,只允许读取、分析、定位问题、输出方案;禁止 `apply_patch`、重写文件、格式化、自动修复、migration、seed、SQL、配置修改和任何会产生文件变化或业务副作用的命令。
|
|
39
|
+
|
|
40
|
+
修改方案至少包含:
|
|
41
|
+
|
|
42
|
+
1. 修改目标
|
|
43
|
+
2. 影响范围
|
|
44
|
+
3. 预计修改文件
|
|
45
|
+
4. 是否影响数据库 / API / UI / 配置
|
|
46
|
+
5. SQL 改动与执行提醒
|
|
47
|
+
6. 验证方式
|
|
48
|
+
7. 风险点
|
|
49
|
+
|
|
50
|
+
只有用户明确回复“确认执行”“可以修改”“按方案改”“同意”等类似内容后,才允许在确认范围内执行。
|
|
51
|
+
|
|
34
52
|
## 欣芸技术开发 Agent 流
|
|
35
53
|
|
|
36
54
|
这是一套面向 AI 编程工具的本地项目接手、按需理解、受控开发和持续沉淀方法论。
|
|
@@ -44,6 +62,22 @@ AI 读取本文件后,必须按以下方式执行:
|
|
|
44
62
|
5. 受控整改:只在确认范围内修改,不顺手重构。
|
|
45
63
|
6. 技术沉淀:会话结束前筛选有价值内容,沉淀到 `xinyun-ai/`;经验先候选,确认后升级。
|
|
46
64
|
|
|
65
|
+
## 需求与 UI 理解
|
|
66
|
+
|
|
67
|
+
涉及功能开发、业务流程、API、数据库、页面、组件、交互或样式时,AI 在输出修改方案前,必须先完成轻量需求理解。
|
|
68
|
+
|
|
69
|
+
如果当前 AI 工具有需求分析、原型、UI 交互、截图风格识别等 Skill,优先调用对应 Skill;如果没有,则按 `rules/requirement-ui-understanding.md` 的清单兜底。
|
|
70
|
+
|
|
71
|
+
信息不足时,只问 1-3 个关键问题,不展开长问卷。
|
|
72
|
+
|
|
73
|
+
## 需求沉淀
|
|
74
|
+
|
|
75
|
+
确认是开发需求时,后续可按需创建 `xinyun-ai/requirements/`,并使用 `REQ-YYYYMMDD-001` 格式编号。
|
|
76
|
+
|
|
77
|
+
需求记录应包含原始需求、需求理解、涉及端、数据库 / API / UI / 配置影响、方案摘要、验收标准、实际改动文件、SQL 执行提醒和验证结果。
|
|
78
|
+
|
|
79
|
+
普通聊天、工具使用咨询、无长期价值的临时排查、用户明确说不需要记录、与当前项目无关的内容,不沉淀。
|
|
80
|
+
|
|
47
81
|
## 执行模式
|
|
48
82
|
|
|
49
83
|
如果项目没有 `xinyun-ai/`:
|
|
@@ -141,6 +175,18 @@ AI 可以沉淀项目经验,但不能自己升级正式规则。
|
|
|
141
175
|
- 创建或修改 `xinyun-ai/` 内 Markdown 文件后,只做基础格式检查:标题、列表、代码块是否闭合。
|
|
142
176
|
- 不运行项目业务 lint、build、test、typecheck。
|
|
143
177
|
|
|
178
|
+
## 版本检测
|
|
179
|
+
|
|
180
|
+
CLI 执行时会尽量检测当前包版本和 npm 线上最新版本。
|
|
181
|
+
|
|
182
|
+
如果检测到本地版本低于线上版本,应提示用户使用:
|
|
183
|
+
|
|
184
|
+
```md
|
|
185
|
+
npx --yes @pm_zhousl/xinyun-ai-init@latest --force
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
版本检测失败不能阻塞初始化或升级流程。
|
|
189
|
+
|
|
144
190
|
## 输出要求
|
|
145
191
|
|
|
146
192
|
初始化或升级完成后,输出:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
请执行 `npx --yes @pm_zhousl/xinyun-ai-init@latest --force`,然后读取 `xinyun-ai-init/README.md`,按其中规则初始化或升级当前项目。
|
|
@@ -4,4 +4,6 @@
|
|
|
4
4
|
- 首次不创建大量规则、模板、脚本和业务沉淀目录。
|
|
5
5
|
- 首次不执行语言级语法检查、lint、typecheck、测试或构建命令。
|
|
6
6
|
- 每个端最多读取 3-5 个关键文件。
|
|
7
|
-
- 不确定的信息标注:`推断`、`待确认`、`未在项目中发现`。
|
|
7
|
+
- 不确定的信息标注:`推断`、`待确认`、`未在项目中发现`。
|
|
8
|
+
- 首次初始化必须把“代码修改强制确认规则”写入 `AGENTS.md` 和 `xinyun-ai/rules/core-rules.md`。
|
|
9
|
+
- 首次初始化只预留需求入口,不主动创建大量需求目录;后续确认是开发需求时再按需创建 `xinyun-ai/requirements/`。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 需求与 UI 理解规则
|
|
2
|
+
|
|
3
|
+
开发类任务在输出修改方案前,必须先判断是否需要需求理解或 UI 理解。
|
|
4
|
+
|
|
5
|
+
## Skill 适配
|
|
6
|
+
|
|
7
|
+
如果当前 AI 工具有以下类型 Skill,应优先使用:
|
|
8
|
+
|
|
9
|
+
- 需求理解类:`requirements-analyst`、PRD analyst、product requirements、user story、acceptance criteria
|
|
10
|
+
- 原型流程类:`prototype-designer`、product flow、screen map、information architecture
|
|
11
|
+
- UI 交互类:`ui-interaction-designer`、UI/UX designer、design reviewer
|
|
12
|
+
- 截图风格类:`ui-screenshot-style-coder`、screenshot style、视觉还原
|
|
13
|
+
- 全流程编排类:`product-build-orchestrator`、PRD to task、PRD to RFC
|
|
14
|
+
|
|
15
|
+
如果没有对应 Skill,使用本规则内置清单兜底,不阻塞任务。
|
|
16
|
+
|
|
17
|
+
## 需求理解清单
|
|
18
|
+
|
|
19
|
+
1. 用户要解决的问题
|
|
20
|
+
2. 预期结果
|
|
21
|
+
3. 涉及端:server / admin / app / pc / 其他
|
|
22
|
+
4. 涉及数据:数据库 / API / 配置 / 文件
|
|
23
|
+
5. 验收标准
|
|
24
|
+
6. 不明确点
|
|
25
|
+
|
|
26
|
+
## UI 理解清单
|
|
27
|
+
|
|
28
|
+
1. 页面位置
|
|
29
|
+
2. 现有 UI 风格
|
|
30
|
+
3. 用户操作路径
|
|
31
|
+
4. 页面状态:默认 / 加载 / 空数据 / 错误 / 成功
|
|
32
|
+
5. 是否影响移动端、多端适配或权限状态
|
|
33
|
+
6. 是否需要参考截图、原型或现有页面
|
|
34
|
+
|
|
35
|
+
信息不足时,只问 1-3 个关键问题。
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 需求沉淀与任务追踪规则
|
|
2
|
+
|
|
3
|
+
需求沉淀只服务于项目开发,不记录普通聊天、工具咨询、与当前项目无关的内容。
|
|
4
|
+
|
|
5
|
+
## 触发场景
|
|
6
|
+
|
|
7
|
+
- 新功能开发
|
|
8
|
+
- 业务规则调整
|
|
9
|
+
- 页面 / 交互 / 样式修改
|
|
10
|
+
- API 行为变化
|
|
11
|
+
- 数据库 / SQL 改动
|
|
12
|
+
- 问题修复中产生可复用需求结论
|
|
13
|
+
|
|
14
|
+
## 不沉淀场景
|
|
15
|
+
|
|
16
|
+
- 普通聊天
|
|
17
|
+
- 工具使用咨询
|
|
18
|
+
- 临时排查但无长期项目价值
|
|
19
|
+
- 用户明确说“不需要记录”
|
|
20
|
+
- 与当前项目无关的内容
|
|
21
|
+
|
|
22
|
+
## 编号与状态
|
|
23
|
+
|
|
24
|
+
需求编号格式:
|
|
25
|
+
|
|
26
|
+
```md
|
|
27
|
+
REQ-YYYYMMDD-001
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
需求状态:
|
|
31
|
+
|
|
32
|
+
- `draft`:草稿 / 待确认
|
|
33
|
+
- `confirmed`:已确认
|
|
34
|
+
- `planned`:已有方案
|
|
35
|
+
- `in_progress`:执行中
|
|
36
|
+
- `done`:已完成
|
|
37
|
+
- `cancelled`:已取消
|
|
38
|
+
|
|
39
|
+
## 记录要求
|
|
40
|
+
|
|
41
|
+
需求记录至少包含:原始需求、需求理解、涉及端、数据库 / API / UI / 配置影响、待确认问题、方案摘要、验收标准、实际改动文件、SQL 执行提醒、验证结果和最后更新时间。
|
|
42
|
+
|
|
43
|
+
运行到具体项目时,按需创建 `xinyun-ai/requirements/`,首次初始化不主动创建大量需求目录。
|
|
@@ -12,4 +12,12 @@
|
|
|
12
12
|
6. 不修改业务代码、配置、数据库、依赖、构建脚本、测试逻辑。
|
|
13
13
|
7. 升级完成后按需写入 `xinyun-ai/upgrade-log.md`。
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
升级检查时必须重点检查:
|
|
16
|
+
|
|
17
|
+
- `AGENTS.md` 是否包含代码修改强制确认规则。
|
|
18
|
+
- `xinyun-ai/rules/core-rules.md` 是否包含代码修改强制确认规则。
|
|
19
|
+
- 是否已有需求沉淀入口和 `current-task.md` 字段。
|
|
20
|
+
- 是否需要补充需求与 UI 理解规则。
|
|
21
|
+
- 当前 `xinyun-ai/manifest.json` 的版本是否低于初始化包版本。
|
|
22
|
+
|
|
23
|
+
涉及正式规则、目录结构、索引结构或历史沉淀迁移时,必须先确认。
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
本项目使用 `xinyun-ai/` 管理 AI 协作规则。
|
|
4
4
|
|
|
5
|
+
## 代码修改强制确认规则
|
|
6
|
+
|
|
7
|
+
任何代码、配置、数据库、依赖、构建脚本、测试逻辑、API 行为、UI 行为或业务流程修改前,AI 必须先输出修改方案,并等待用户明确确认。
|
|
8
|
+
|
|
9
|
+
用户提出“帮我改”“修复”“处理一下”“优化一下”只代表提出需求,不代表授权执行。
|
|
10
|
+
|
|
11
|
+
未确认前,只允许读取、分析、定位问题、输出方案;禁止 `apply_patch`、重写文件、格式化、自动修复、migration、seed、SQL、配置修改和任何会产生文件变化或业务副作用的命令。
|
|
12
|
+
|
|
13
|
+
只有用户明确回复“确认执行”“可以修改”“按方案改”“同意”等类似内容后,才允许在确认范围内执行。
|
|
14
|
+
|
|
5
15
|
AI 接手本项目时,请先读取:
|
|
6
16
|
|
|
7
17
|
- `xinyun-ai/README.md`
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
- 首次初始化为极速模式,后续能力按需补齐。
|
|
8
8
|
- 后续 AI 会话优先读取 `manifest.json`、`current-task.md`、`rules/core-rules.md`、`index/project-index.json`。
|
|
9
9
|
- 业务代码、配置、数据库、API、UI、业务流程修改前必须先出计划并等待确认。
|
|
10
|
+
- 用户提出“帮我改”“修复”“处理一下”“优化一下”只代表提出需求,不代表授权执行。
|
|
11
|
+
- 开发类任务在修改方案前应先完成需求理解;涉及页面、组件、交互或样式时应先完成 UI 理解。
|
|
12
|
+
- 确认是开发需求时,可按需沉淀到 `requirements/`;普通聊天、工具咨询和无长期价值内容不沉淀。
|
|
10
13
|
- 后续识别到新端、模块或能力时,只在 `xinyun-ai/` 内按需补齐对应目录和说明文件。
|
|
11
14
|
|
|
12
15
|
## 核心流程
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
- 只读优先,禁止副作用命令。
|
|
6
6
|
- 代码整改前必须先给修改方案,待用户确认后才能执行。
|
|
7
|
+
- 用户提出“帮我改”“修复”“处理一下”“优化一下”只代表提出需求,不代表授权执行。
|
|
8
|
+
- 未确认前,只允许读取、分析、定位问题、输出方案;禁止 `apply_patch`、重写文件、格式化、自动修复、migration、seed、SQL、配置修改和任何会产生文件变化或业务副作用的命令。
|
|
7
9
|
- SQL / 数据库改动必须重点提醒。
|
|
8
10
|
- 非项目内容不沉淀。
|
|
9
11
|
- 多端项目按 `workstreams/<端名称>/` 分开说明。
|
|
@@ -13,6 +15,40 @@
|
|
|
13
15
|
- 自我学习只沉淀候选经验,不自动改正式规则。
|
|
14
16
|
- 目录自完善只补 `xinyun-ai/` 文档和索引,不修改业务代码。
|
|
15
17
|
|
|
18
|
+
## 修改方案要求
|
|
19
|
+
|
|
20
|
+
代码整改前的修改方案至少包含:
|
|
21
|
+
|
|
22
|
+
1. 修改目标
|
|
23
|
+
2. 影响范围
|
|
24
|
+
3. 预计修改文件
|
|
25
|
+
4. 是否影响数据库 / API / UI / 配置
|
|
26
|
+
5. SQL 改动与执行提醒
|
|
27
|
+
6. 验证方式
|
|
28
|
+
7. 风险点
|
|
29
|
+
|
|
30
|
+
## 需求与 UI 理解
|
|
31
|
+
|
|
32
|
+
涉及功能、业务流程、API、数据库、页面、组件、交互或样式时,输出修改方案前必须先完成简版需求理解。
|
|
33
|
+
|
|
34
|
+
如果当前 AI 工具有需求分析、原型、UI 交互、截图风格识别等 Skill,优先使用对应 Skill;没有 Skill 时,按内置清单兜底,不阻塞任务。
|
|
35
|
+
|
|
36
|
+
需求理解至少确认:用户要解决的问题、预期结果、涉及端、涉及数据、验收标准和不明确点。
|
|
37
|
+
|
|
38
|
+
UI 理解至少确认:页面位置、现有风格、用户操作路径、默认 / 加载 / 空数据 / 错误 / 成功状态、多端适配影响和是否需要参考截图。
|
|
39
|
+
|
|
40
|
+
信息不足时,最多提出 1-3 个关键问题,不展开长问卷。
|
|
41
|
+
|
|
42
|
+
## 需求沉淀
|
|
43
|
+
|
|
44
|
+
确认是开发需求时,可按需创建 `xinyun-ai/requirements/` 并使用 `REQ-YYYYMMDD-001` 格式编号。
|
|
45
|
+
|
|
46
|
+
需求状态建议:`draft`、`confirmed`、`planned`、`in_progress`、`done`、`cancelled`。
|
|
47
|
+
|
|
48
|
+
需求记录应关联原始需求、需求理解、涉及端、数据库 / API / UI / 配置影响、方案摘要、验收标准、实际改动文件、SQL 提醒和验证结果。
|
|
49
|
+
|
|
50
|
+
普通聊天、工具咨询、临时排查且无长期价值、用户明确说不需要记录、与当前项目无关的内容,不沉淀。
|
|
51
|
+
|
|
16
52
|
## 理解深度状态
|
|
17
53
|
|
|
18
54
|
- `unknown`:未识别
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"projectName": "",
|
|
3
|
-
"xinyunAiVersion": "1.
|
|
4
|
-
"scriptVersion": "2026.07.
|
|
3
|
+
"xinyunAiVersion": "1.1.0",
|
|
4
|
+
"scriptVersion": "2026.07.11",
|
|
5
5
|
"schemaVersion": "1",
|
|
6
6
|
"initializationMode": "fast",
|
|
7
7
|
"expansionMode": "triggered",
|
|
@@ -10,8 +10,15 @@
|
|
|
10
10
|
"overall": "quick",
|
|
11
11
|
"workstreams": {},
|
|
12
12
|
"database": "unknown",
|
|
13
|
-
"api": "unknown"
|
|
13
|
+
"api": "unknown",
|
|
14
|
+
"requirements": "unknown"
|
|
14
15
|
},
|
|
15
16
|
"codegraph": { "enabled": false, "status": "unknown" },
|
|
16
|
-
"index": { "primary": "json_markdown", "sqlite": "optional" }
|
|
17
|
-
|
|
17
|
+
"index": { "primary": "json_markdown", "sqlite": "optional" },
|
|
18
|
+
"capabilities": {
|
|
19
|
+
"confirmationGate": true,
|
|
20
|
+
"requirementUnderstanding": true,
|
|
21
|
+
"uiUnderstanding": true,
|
|
22
|
+
"requirementTracking": true
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
"overall": "quick",
|
|
5
5
|
"workstreams": {},
|
|
6
6
|
"database": "unknown",
|
|
7
|
-
"api": "unknown"
|
|
7
|
+
"api": "unknown",
|
|
8
|
+
"requirements": "unknown"
|
|
8
9
|
},
|
|
9
10
|
"database": "unknown",
|
|
10
11
|
"api": "unknown",
|
|
12
|
+
"requirements": "unknown",
|
|
11
13
|
"tests": "unknown",
|
|
12
14
|
"lastUpdatedAt": ""
|
|
13
|
-
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 需求记录
|
|
2
|
+
|
|
3
|
+
- 需求编号:REQ-YYYYMMDD-001
|
|
4
|
+
- 状态:draft
|
|
5
|
+
- 创建时间:
|
|
6
|
+
- 最后更新时间:
|
|
7
|
+
|
|
8
|
+
## 用户原始需求
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## 需求理解
|
|
12
|
+
|
|
13
|
+
- 要解决的问题:
|
|
14
|
+
- 预期结果:
|
|
15
|
+
- 涉及端:
|
|
16
|
+
- 涉及数据库 / API / UI / 配置:
|
|
17
|
+
- 不明确点:
|
|
18
|
+
|
|
19
|
+
## 验收标准
|
|
20
|
+
|
|
21
|
+
1.
|
|
22
|
+
|
|
23
|
+
## 修改方案摘要
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## 实际改动
|
|
27
|
+
|
|
28
|
+
- 改动文件:
|
|
29
|
+
- SQL 执行提醒:
|
|
30
|
+
- 验证结果:
|
|
31
|
+
|
|
32
|
+
## 备注
|
|
33
|
+
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"packageName": "xinyun-ai-init",
|
|
3
3
|
"displayName": "欣芸技术开发 Agent 流初始化包",
|
|
4
|
-
"version": "1.0
|
|
5
|
-
"scriptVersion": "2026.07.
|
|
4
|
+
"version": "1.1.0",
|
|
5
|
+
"scriptVersion": "2026.07.11",
|
|
6
6
|
"schemaVersion": "1",
|
|
7
7
|
"defaultMode": "fast-init",
|
|
8
8
|
"targetWorkspace": "xinyun-ai",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pm_zhousl/xinyun-ai-init",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "欣芸技术开发 Agent 流初始化包",
|
|
5
5
|
"bin": {
|
|
6
6
|
"xinyun-ai-init": "bin/xinyun-ai-init.js"
|
|
@@ -8,8 +8,13 @@
|
|
|
8
8
|
"files": [
|
|
9
9
|
"bin/",
|
|
10
10
|
"init/",
|
|
11
|
+
"scripts/",
|
|
11
12
|
"README.md"
|
|
12
13
|
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"publish:token": "powershell -ExecutionPolicy Bypass -File ./scripts/publish-with-token.ps1",
|
|
16
|
+
"publish:token:dry": "powershell -ExecutionPolicy Bypass -File ./scripts/publish-with-token.ps1 -DryRun"
|
|
17
|
+
},
|
|
13
18
|
"keywords": [
|
|
14
19
|
"xinyun-ai",
|
|
15
20
|
"codex",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
param(
|
|
2
|
+
[string]$Registry = "https://registry.npmjs.org/",
|
|
3
|
+
[switch]$DryRun
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
$ErrorActionPreference = "Stop"
|
|
7
|
+
|
|
8
|
+
$ProjectRoot = Resolve-Path (Join-Path $PSScriptRoot "..")
|
|
9
|
+
$NpmrcPath = Join-Path $ProjectRoot ".npmrc"
|
|
10
|
+
$PackageJsonPath = Join-Path $ProjectRoot "package.json"
|
|
11
|
+
|
|
12
|
+
function Assert-CommandExists {
|
|
13
|
+
param([string]$Name)
|
|
14
|
+
|
|
15
|
+
if (-not (Get-Command $Name -ErrorAction SilentlyContinue)) {
|
|
16
|
+
throw "Missing command: $Name. Please install or configure $Name first."
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function ConvertTo-PlainText {
|
|
21
|
+
param([securestring]$SecureValue)
|
|
22
|
+
|
|
23
|
+
$ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureValue)
|
|
24
|
+
try {
|
|
25
|
+
return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
|
|
26
|
+
} finally {
|
|
27
|
+
if ($ptr -ne [IntPtr]::Zero) {
|
|
28
|
+
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Push-Location $ProjectRoot
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
Assert-CommandExists "node"
|
|
37
|
+
Assert-CommandExists "npm"
|
|
38
|
+
|
|
39
|
+
$Package = Get-Content -Raw -Encoding UTF8 $PackageJsonPath | ConvertFrom-Json
|
|
40
|
+
Write-Host "[xinyun-ai-init] Publish target: $($Package.name)@$($Package.version)"
|
|
41
|
+
Write-Host "[xinyun-ai-init] Registry: $Registry"
|
|
42
|
+
|
|
43
|
+
if (Test-Path $NpmrcPath) {
|
|
44
|
+
Remove-Item -LiteralPath $NpmrcPath -Force
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
$Token = [Environment]::GetEnvironmentVariable("NPM_TOKEN")
|
|
48
|
+
|
|
49
|
+
if ([string]::IsNullOrWhiteSpace($Token)) {
|
|
50
|
+
$SecureToken = Read-Host "Paste npm token" -AsSecureString
|
|
51
|
+
$Token = ConvertTo-PlainText $SecureToken
|
|
52
|
+
} else {
|
|
53
|
+
Write-Host "[xinyun-ai-init] Using NPM_TOKEN from environment."
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if ([string]::IsNullOrWhiteSpace($Token)) {
|
|
57
|
+
throw "NPM token is empty. Publish cancelled."
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
$Utf8NoBom = New-Object System.Text.UTF8Encoding($false)
|
|
61
|
+
[System.IO.File]::WriteAllLines(
|
|
62
|
+
$NpmrcPath,
|
|
63
|
+
@(
|
|
64
|
+
"@pm_zhousl:registry=$Registry",
|
|
65
|
+
"//registry.npmjs.org/:_authToken=$Token"
|
|
66
|
+
),
|
|
67
|
+
$Utf8NoBom
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
Write-Host "[xinyun-ai-init] Validate JSON..."
|
|
71
|
+
node -e "JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('init/xinyun-ai-init/version.json','utf8')); console.log('json ok')"
|
|
72
|
+
|
|
73
|
+
if ($DryRun) {
|
|
74
|
+
Write-Host "[xinyun-ai-init] Run npm publish dry-run..."
|
|
75
|
+
npm publish --access public --registry=$Registry --dry-run
|
|
76
|
+
} else {
|
|
77
|
+
Write-Host "[xinyun-ai-init] Run npm publish..."
|
|
78
|
+
npm publish --access public --registry=$Registry
|
|
79
|
+
|
|
80
|
+
Write-Host "[xinyun-ai-init] Check published version..."
|
|
81
|
+
npm view $Package.name version --registry=$Registry
|
|
82
|
+
}
|
|
83
|
+
} finally {
|
|
84
|
+
if (Test-Path $NpmrcPath) {
|
|
85
|
+
Remove-Item -LiteralPath $NpmrcPath -Force
|
|
86
|
+
Write-Host "[xinyun-ai-init] Removed temporary .npmrc"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
$Token = $null
|
|
90
|
+
Pop-Location
|
|
91
|
+
}
|