@rowansenne/workflow-run 0.22.0 → 0.22.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/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.22.1] - 2026-10-19
8
+
9
+ ### 变更
10
+ - 随代码提交时不再往代码仓库的 `.gitattributes` 加 `workflow-run/feedback/*.jsonl merge=union`,`init` / `upgrade` 会去掉 0.22.0 加的这一行(文件里只剩这一行时删掉文件),改动需要你提交。独立文档仓库模式照旧,加在文档仓库的 `workflow-run/.gitattributes`。
11
+
7
12
  ## [0.22.0] - 2026-10-19
8
13
 
9
14
  ### 新增
package/README.md CHANGED
@@ -132,7 +132,7 @@ npx @rowansenne/workflow-run docs-repo git@git.example.com:team/team-docs.git
132
132
  * 知识:交付与审查的 DocNexus 沉淀率、正文引用了知识库文档的产物占比;
133
133
  * 各分支链路:开发方案、交付说明、审查报告、技术方案、上线方案齐不齐,哪些文档还没发布到 wiki。
134
134
 
135
- **运行反馈**(`npx @rowansenne/workflow-run feedback [--json]`):效果报告只看落盘的产物,看不到过程。dev 和 project-review 每跑完一次,用 `workflow/scripts/feedback.mjs add` 静默追加一行到 `workflow-run/feedback/<git 用户名>.jsonl`:模型、规模 / 深度、是否走快速通道、向用户提问几轮、用户纠正过几次理解、验收项验证了几条、跳过了哪些步骤、**哪条规则读不懂或做不到**、用户主动说的抱怨。只记过程,不记代码和业务名词;不额外问用户。每人一个文件,随 `workflow-run/` 提交,多人不冲突;安装器在 `.gitattributes` 里给这些文件配 `merge=union`,同一个人在几个分支上都有记录时合并也不冲突。用来定期精简 skill:
135
+ **运行反馈**(`npx @rowansenne/workflow-run feedback [--json]`):效果报告只看落盘的产物,看不到过程。dev 和 project-review 每跑完一次,用 `workflow/scripts/feedback.mjs add` 静默追加一行到 `workflow-run/feedback/<git 用户名>.jsonl`:模型、规模 / 深度、是否走快速通道、向用户提问几轮、用户纠正过几次理解、验收项验证了几条、跳过了哪些步骤、**哪条规则读不懂或做不到**、用户主动说的抱怨。只记过程,不记代码和业务名词;不额外问用户。每人一个文件,随 `workflow-run/` 提交,多人不冲突。独立文档仓库模式下,安装器在文档仓库的 `workflow-run/.gitattributes` 里给这些文件配 `merge=union`,同一个文件在几个分支上都有记录时合并也不冲突;随代码提交时不改代码仓库的 `.gitattributes`,合并时遇到冲突保留两边的行即可。用来定期精简 skill:
136
136
 
137
137
  1. 团队照常用两三周;
138
138
  2. 运行 `feedback` 汇总(或直接拿 `workflow-run/feedback/` 下的文件),按「常被跳过的步骤」「读不懂的规则」「提问太多」精简 SKILL.md,发新版本;
@@ -453,7 +453,7 @@ CI(`.github/workflows/test.yml`)在 push 到 main 和每个 PR 上运行:m
453
453
  | `workflow-run/feedback/` | 运行反馈,每人一个文件;独立文档仓库模式下提交到文档仓库 |
454
454
  | `workflow-run/docnexus/` | DocNexus 工作区与定制的文档模板;依赖和检索库由它自带的 `docnexus/.gitignore` 忽略。独立文档仓库模式下提交到文档仓库 |
455
455
  | `.ignore` | 让代码搜索跳过需求目录(不影响 git) |
456
- | `.gitignore`、`.gitattributes`、`CLAUDE.md` / `AGENTS.md` | 安装器追加的忽略规则、运行反馈的合并规则、DocNexus 说明段落 |
456
+ | `.gitignore`、`CLAUDE.md` / `AGENTS.md` | 安装器追加的忽略规则、DocNexus 说明段落 |
457
457
 
458
458
  **忽略**(每人每机器一份,或可重新生成):
459
459
 
@@ -260,7 +260,8 @@ export function setupHome(root) {
260
260
  // 运行反馈只收当前版本的:装了新版本就清掉本项目旧版本的记录(随 workflow-run/ 提交过的,git 历史里仍可找回)
261
261
  const removed = rotateFeedback(root, PKG.version);
262
262
  const attr = ensureUnionMerge(root);
263
- if (attr) ok(`${attr.file} 已加上 ${attr.rule}(运行反馈多分支合并时保留两边的记录)`);
263
+ if (attr?.action === 'added') ok(`${attr.file} 已加上 ${attr.rule}(文档仓库里运行反馈多分支合并时保留两边的记录)`);
264
+ if (attr?.action === 'removed') ok(`${attr.file} 已去掉 ${attr.rule}(随代码提交时不再改代码仓库的 .gitattributes);改动需要你提交`);
264
265
  if (removed) ok(`运行反馈:已清空旧版本的 ${removed} 条记录(${HOME}/feedback/),从这一版重新收集;改动需要你提交`);
265
266
  }
266
267
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rowansenne/workflow-run",
3
- "version": "0.22.0",
3
+ "version": "0.22.1",
4
4
  "description": "项目级 Agent Skills 一键初始化:workflow / dev / project-review / code-graph / database-query / md-to-wiki / 技术与上线方案生成",
5
5
  "keywords": [
6
6
  "agent-skills",
@@ -77,14 +77,29 @@ export function readAll(root) {
77
77
  .split('\n').filter((l) => l.trim()).map((l) => { try { return { user: f.replace(/\.jsonl$/, ''), ...JSON.parse(l) }; } catch { return null; } }).filter(Boolean));
78
78
  }
79
79
 
80
- // 同一个人在两个分支上各追加一行,合并时会在文件末尾冲突:用 git 内置的 union 合并保留两边的行。
81
- // workflow-run/ 是独立文档仓库时规则写进它自己的 .gitattributes。返回写入的文件(已有规则时 null)
80
+ // 独立文档仓库模式下各人、各服务都往文档仓库的 feedback/ 追加,同一文件在两个分支上各追加一行时合并会在末尾冲突:
81
+ // 在文档仓库自己的 .gitattributes 里用 git 内置的 union 合并保留两边的行。随代码提交时不加(不改代码仓库的 .gitattributes),
82
+ // 并去掉 0.22.0 加在代码仓库里的这一行(文件里只剩这一行时删掉文件)。
83
+ // 返回 { action: 'added' | 'removed', file, rule },没有改动时 null
84
+ const LEGACY_RULE = `${HOME}/${FEEDBACK_DIR}/*.jsonl merge=union`;
82
85
  export function ensureUnionMerge(root) {
83
- const [file, rule] = homeIsRepo(root) ? [path.join(homeDir(root), '.gitattributes'), `${FEEDBACK_DIR}/*.jsonl merge=union`] : [path.join(root, '.gitattributes'), `${HOME}/${FEEDBACK_DIR}/*.jsonl merge=union`];
86
+ const lines = (f) => (fs.existsSync(f) ? fs.readFileSync(f, 'utf8').split(/\r?\n/) : []);
87
+ const relOf = (f) => path.relative(root, f).split(path.sep).join('/');
88
+ const codeAttr = path.join(root, '.gitattributes');
89
+ if (!homeIsRepo(root)) {
90
+ const cur = lines(codeAttr);
91
+ if (!cur.some((l) => l.trim() === LEGACY_RULE)) return null;
92
+ const keep = cur.filter((l) => l.trim() !== LEGACY_RULE);
93
+ if (keep.every((l) => !l.trim())) fs.rmSync(codeAttr);
94
+ else fs.writeFileSync(codeAttr, keep.join('\n'));
95
+ return { action: 'removed', file: relOf(codeAttr), rule: LEGACY_RULE };
96
+ }
97
+ const file = path.join(homeDir(root), '.gitattributes');
98
+ const rule = `${FEEDBACK_DIR}/*.jsonl merge=union`;
84
99
  const text = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
85
- if (text.split(/\r?\n/).some((l) => l.trim() === rule)) return null;
100
+ if (lines(file).some((l) => l.trim() === rule)) return null;
86
101
  fs.writeFileSync(file, `${text}${text && !text.endsWith('\n') ? '\n' : ''}${rule}\n`);
87
- return { file: path.relative(root, file).split(path.sep).join('/'), rule };
102
+ return { action: 'added', file: relOf(file), rule };
88
103
  }
89
104
 
90
105
  // 新版本装好后:删掉本项目旧版本的记录,其他项目(独立文档仓库里各服务共用 feedback/)的不动。返回删掉的条数