@pm_zhousl/xinyun-ai-init 1.0.2 → 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 CHANGED
@@ -24,6 +24,15 @@ npx --yes @pm_zhousl/xinyun-ai-init@latest --force
24
24
 
25
25
  完整执行要求已经内置在 `xinyun-ai-init/README.md`、`rules/` 和 `templates/` 中。后续不需要复制长提示词,只需要让 AI 读取本地释放出来的 `xinyun-ai-init/README.md`。
26
26
 
27
+ CLI 执行时会显示当前版本,并尽量检测 npm 线上最新版本;检测失败不会阻塞初始化。
28
+
29
+ 可选参数:
30
+
31
+ ```bash
32
+ --no-version-check
33
+ --strict-version
34
+ ```
35
+
27
36
  ## 维护者发布
28
37
 
29
38
  发布新版时,在本包目录执行:
@@ -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 main() {
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] 初始化包缺失:", source);
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] 当前目录已存在 xinyun-ai-init/,未覆盖。");
34
- console.log("[xinyun-ai-init] 如需覆盖,请执行:npx @pm_zhousl/xinyun-ai-init --force");
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] 已生成:", target);
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("下一步:把下面这句话发给 Codex / Cursor / Claude Code:");
146
+ console.log("Next step: send this message to Codex / Cursor / Claude Code:");
50
147
  console.log("");
51
148
  console.log("请执行 `npx --yes @pm_zhousl/xinyun-ai-init@latest --force`,然后读取 `xinyun-ai-init/README.md`,按其中规则初始化或升级当前项目。");
52
149
  console.log("");
53
- console.log("完整执行要求已经在 xinyun-ai-init/README.md 内,不需要再粘贴长提示词。");
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
+ });
@@ -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
  初始化或升级完成后,输出:
@@ -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,14 @@
1
- # 当前任务
1
+ # 当前任务
2
2
 
3
3
  - 状态:初始化
4
4
  - 用户原始需求:
5
+ - 需求编号:
6
+ - 需求理解:
5
7
  - 影响端:
8
+ - 是否影响数据库 / API / UI / 配置:
9
+ - 验收标准:
6
10
  - 待确认问题:
7
- - 本轮沉淀位置:
11
+ - 修改方案摘要:
12
+ - SQL 执行提醒:
13
+ - 验证结果:
14
+ - 本轮沉淀位置:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "projectName": "",
3
- "xinyunAiVersion": "1.0.0",
4
- "scriptVersion": "2026.07.10",
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.2",
5
- "scriptVersion": "2026.07.10",
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.2",
3
+ "version": "1.1.0",
4
4
  "description": "欣芸技术开发 Agent 流初始化包",
5
5
  "bin": {
6
6
  "xinyun-ai-init": "bin/xinyun-ai-init.js"