dev-change-report 1.0.0 → 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 +27 -7
- package/SKILL.md +3 -1
- package/bin/postinstall.js +47 -0
- package/lib/cli.js +3 -2
- package/lib/install.js +34 -8
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -9,16 +9,36 @@
|
|
|
9
9
|
|
|
10
10
|
## 安装
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
**一句话:装个依赖就行,skill 会自动注册。**
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
npm i -D dev-change-report
|
|
16
|
-
npm i -D ./dev-change-report-1.0.0.tgz # 本地 tarball
|
|
17
|
-
npx dcr install # 装到 ~/.agents/skills/,所有项目可用
|
|
18
|
-
npx dcr install --project # 装到 ./.agents/skills/,跟着仓库走
|
|
15
|
+
npm i -D dev-change-report
|
|
19
16
|
```
|
|
20
17
|
|
|
21
|
-
|
|
18
|
+
`postinstall` 会自动把 `SKILL.md` 写到 `~/.agents/skills/dev-change-report/`,
|
|
19
|
+
**重启编辑器**后对 AI 说「整理一下这次改动」即可触发。不需要额外命令。
|
|
20
|
+
|
|
21
|
+
升级同理,改一下版本号即可,skill 会跟着更新:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm i -D dev-change-report@latest
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 需要时可手动控制
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx dcr install # 重新注册(幂等,内容相同则不写盘)
|
|
31
|
+
npx dcr install --project # 装到 ./.agents/skills/,跟着仓库走
|
|
32
|
+
npx dcr install --force # 强制覆盖
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
| 环境变量 | 作用 |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `DCR_SKIP_INSTALL=1` | 跳过 postinstall 自动注册(CI 里常用) |
|
|
38
|
+
| `DCR_SKILLS_DIR=<路径>` | 自定义 skills 根目录,沙箱/测试用 |
|
|
39
|
+
|
|
40
|
+
> 如果公司 npm 配置了 `--ignore-scripts`,postinstall 不会执行,
|
|
41
|
+
> 装完手动跑一次 `npx dcr install` 即可。
|
|
22
42
|
|
|
23
43
|
### 备选:单文件 exe(对方机器没装 Node 时才需要)
|
|
24
44
|
|
|
@@ -29,7 +49,7 @@ npx dcr install --project # 装到 ./.agents/skills/,跟着仓
|
|
|
29
49
|
`%LOCALAPPDATA%\Programs\dcr`、加 PATH、注册 skill)。首次运行可能有
|
|
30
50
|
SmartScreen 提示,点「更多信息」→「仍要运行」。
|
|
31
51
|
|
|
32
|
-
> 83 MB 换来的只是「不用装 Node」。如果对方有 Node,用 npm 包,体积差约
|
|
52
|
+
> 83 MB 换来的只是「不用装 Node」。如果对方有 Node,用 npm 包,体积差约 3000 倍。
|
|
33
53
|
|
|
34
54
|
|
|
35
55
|
## 使用
|
package/SKILL.md
CHANGED
|
@@ -7,7 +7,9 @@ description: 把一次代码改动整理成可直接粘贴到 CKEditor / OA /
|
|
|
7
7
|
|
|
8
8
|
把代码改动整理成一份**可直接粘贴的富文本 HTML**。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
命令由 npm 包 `dev-change-report` 提供(`npx dcr`)。如果项目里还没有:
|
|
11
|
+
`npm i -D dev-change-report`,装完 skill 会自动注册。
|
|
12
|
+
|
|
11
13
|
核心约定:**片段只写语义标签,不写任何 style**,样式由 `dcr build` 统一注入。
|
|
12
14
|
|
|
13
15
|
## 工作流
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* postinstall 钩子:npm i 时自动把 skill 注册到 ~/.agents/skills/。
|
|
4
|
+
*
|
|
5
|
+
* 设计约束:
|
|
6
|
+
* - 永不失败。任何异常都吞掉并退出码 0,不能因为装 skill 失败而破坏 npm i。
|
|
7
|
+
* - 内容一致时完全静默,不给每次 npm i 都刷屏。
|
|
8
|
+
* - 用 DCR_SKIP_INSTALL=1 可跳过(CI、或不想污染用户目录时)。
|
|
9
|
+
* - 只装用户级(~/.agents/skills)。项目级请手动 dcr install --project。
|
|
10
|
+
*/
|
|
11
|
+
let installSkill;
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
({ installSkill } = require('../lib/install'));
|
|
15
|
+
} catch (error) {
|
|
16
|
+
// lib 缺失说明包损坏,交给 npm 的完整性校验处理,这里不发声。
|
|
17
|
+
process.exit(0);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const skip = String(process.env.DCR_SKIP_INSTALL || '') === '1';
|
|
21
|
+
if (skip) process.exit(0);
|
|
22
|
+
|
|
23
|
+
// npm run 时会带上大量 npm_config_*,取 loglevel 判断是否静默
|
|
24
|
+
const silent = /silent|error/.test(String(process.env.npm_config_loglevel || ''));
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const result = installSkill({
|
|
28
|
+
quiet: true,
|
|
29
|
+
force: true,
|
|
30
|
+
log: silent ? () => {} : (line) => process.stdout.write(`[dev-change-report] ${line}\n`)
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (result.written && !silent) {
|
|
34
|
+
process.stdout.write(
|
|
35
|
+
'[dev-change-report] skill 已就绪,重启编辑器后对 AI 说「整理一下这次改动」即可触发。\n'
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
// 无写权限(如只读 HOME、受限沙箱)时静默降级,提示手动安装。
|
|
40
|
+
if (!silent) {
|
|
41
|
+
process.stdout.write(
|
|
42
|
+
'[dev-change-report] 自动注册 skill 失败,请稍后手动执行: npx dcr install\n'
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
process.exit(0);
|
package/lib/cli.js
CHANGED
|
@@ -7,8 +7,10 @@ const { installSkill } = require('./install');
|
|
|
7
7
|
|
|
8
8
|
const HELP = `dcr —— 代码改动说明文档生成器
|
|
9
9
|
|
|
10
|
+
安装后无需任何配置:npm i 时已自动把 skill 注册到 ~/.agents/skills/。
|
|
11
|
+
|
|
10
12
|
用法:
|
|
11
|
-
dcr install [--project] [--force]
|
|
13
|
+
dcr install [--project] [--force] 手动注册 skill(一般不需要)
|
|
12
14
|
--project 装到当前项目而非用户目录
|
|
13
15
|
--force 覆盖已存在的版本
|
|
14
16
|
|
|
@@ -21,7 +23,6 @@ const HELP = `dcr —— 代码改动说明文档生成器
|
|
|
21
23
|
[--json changes.json] 导出 JSON
|
|
22
24
|
|
|
23
25
|
示例:
|
|
24
|
-
dcr install
|
|
25
26
|
dcr changes --repo . --base origin/release
|
|
26
27
|
dcr build --input report.fragment.html --repo-root .`;
|
|
27
28
|
|
package/lib/install.js
CHANGED
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
* 1. options.content 调用方直接给内容
|
|
9
9
|
* 2. global.__DCR_SKILL_MD__ 打包进 exe 的内嵌副本
|
|
10
10
|
* 3. 包内 SKILL.md npm 安装场景
|
|
11
|
+
*
|
|
12
|
+
* 三种调用场景:
|
|
13
|
+
* - postinstall 自动安装:内容相同则完全静默,不同则覆盖(升级路径)
|
|
14
|
+
* - dcr install:显式执行,输出完整提示
|
|
15
|
+
* - dcr install --force:强制重写
|
|
11
16
|
*/
|
|
12
17
|
const fs = require('node:fs');
|
|
13
18
|
const os = require('node:os');
|
|
@@ -16,8 +21,15 @@ const path = require('node:path');
|
|
|
16
21
|
const SKILL_NAME = 'dev-change-report';
|
|
17
22
|
const PACKAGE_ROOT = path.join(__dirname, '..');
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
/**
|
|
25
|
+
* skills 根目录。
|
|
26
|
+
* DCR_SKILLS_DIR 可整体覆盖,便于在沙箱/CI 里验证而不污染真实用户目录。
|
|
27
|
+
*/
|
|
28
|
+
const targetDir = (useProject) => {
|
|
29
|
+
const override = String(process.env.DCR_SKILLS_DIR || '').trim();
|
|
30
|
+
if (override) return path.join(override, SKILL_NAME);
|
|
31
|
+
return path.join(useProject ? process.cwd() : os.homedir(), '.agents', 'skills', SKILL_NAME);
|
|
32
|
+
};
|
|
21
33
|
|
|
22
34
|
function readSkillMarkdown(explicit) {
|
|
23
35
|
if (explicit) return explicit;
|
|
@@ -30,9 +42,11 @@ function readSkillMarkdown(explicit) {
|
|
|
30
42
|
/**
|
|
31
43
|
* @param {object} options
|
|
32
44
|
* @param {boolean} [options.project] true 装到当前项目,false 装到用户目录
|
|
33
|
-
* @param {boolean} [options.force]
|
|
45
|
+
* @param {boolean} [options.force] 已存在且内容不同时也覆盖;内容相同永远跳过写入
|
|
34
46
|
* @param {string} [options.content] 直接指定 SKILL.md 内容
|
|
47
|
+
* @param {boolean} [options.quiet] 内容无变化时不输出(postinstall 用)
|
|
35
48
|
* @param {(s:string)=>void} [options.log]
|
|
49
|
+
* @returns {{dir:string, written:boolean, existed:boolean, skipped:boolean}}
|
|
36
50
|
*/
|
|
37
51
|
function installSkill(options = {}) {
|
|
38
52
|
const log = options.log || (() => {});
|
|
@@ -40,19 +54,31 @@ function installSkill(options = {}) {
|
|
|
40
54
|
const dir = targetDir(options.project);
|
|
41
55
|
const target = path.join(dir, 'SKILL.md');
|
|
42
56
|
const existed = fs.existsSync(target);
|
|
57
|
+
const unchanged = existed && fs.readFileSync(target, 'utf8') === content;
|
|
43
58
|
|
|
44
|
-
|
|
59
|
+
// 内容一致就没必要写盘,也不打扰用户。
|
|
60
|
+
if (unchanged) {
|
|
61
|
+
if (!options.quiet) {
|
|
62
|
+
log(`已是最新: ${target}`);
|
|
63
|
+
}
|
|
64
|
+
return { dir, written: false, existed: true, skipped: true };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 已存在且内容不同:force 或 quiet(postinstall 升级场景)时覆盖
|
|
68
|
+
if (existed && !options.force && !options.quiet) {
|
|
45
69
|
log(`已存在,未覆盖: ${target}`);
|
|
46
70
|
log('如需更新,加 --force');
|
|
47
|
-
return { dir, written: false, existed: true };
|
|
71
|
+
return { dir, written: false, existed: true, skipped: false };
|
|
48
72
|
}
|
|
49
73
|
|
|
50
74
|
fs.mkdirSync(dir, { recursive: true });
|
|
51
75
|
fs.writeFileSync(target, content, 'utf8');
|
|
52
76
|
log(`${existed ? '已更新' : '已安装'}: ${target}`);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
77
|
+
if (!options.quiet) {
|
|
78
|
+
log('');
|
|
79
|
+
log('下一步:重启编辑器,然后对它说「整理一下这次改动」即可触发。');
|
|
80
|
+
}
|
|
81
|
+
return { dir, written: true, existed, skipped: false };
|
|
56
82
|
}
|
|
57
83
|
|
|
58
84
|
module.exports = { installSkill, SKILL_NAME };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev-change-report",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "把一次代码改动整理成可直接粘贴到 CKEditor / OA / 飞书 / Word 的富文本开发说明文档",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"copilot",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"node": ">=18"
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
|
+
"postinstall": "node bin/postinstall.js",
|
|
28
29
|
"bundle": "node tools/bundle.js",
|
|
29
30
|
"sea:blob": "node --experimental-sea-config packaging/sea-config.json",
|
|
30
31
|
"exe": "npm run bundle && npm run sea:blob && node tools/make-exe.js",
|