scrum-skills 0.2.2 → 0.2.4
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/.agents/skills/scrum-planning/references/schema.md +3 -2
- package/README.md +49 -8
- package/assets/board/200.html +1 -1
- package/assets/board/404.html +1 -1
- package/assets/board/_nuxt/0VBLkWnu.js +1 -0
- package/assets/board/_nuxt/3G_ZLrk2.js +1 -0
- package/assets/board/_nuxt/51OWHj8c.js +2 -0
- package/assets/board/_nuxt/5qqsfNvn.js +1 -0
- package/assets/board/_nuxt/8QIcohze.js +1 -0
- package/assets/board/_nuxt/B0YDpoC7.js +1 -0
- package/assets/board/_nuxt/B3oUyqcV.js +1 -0
- package/assets/board/_nuxt/B43-KCi6.js +1 -0
- package/assets/board/_nuxt/B5oiGeHN.js +1 -0
- package/assets/board/_nuxt/BGssl5Ao.js +1 -0
- package/assets/board/_nuxt/BJW3UkS7.js +1 -0
- package/assets/board/_nuxt/BJcBC4jN.js +1 -0
- package/assets/board/_nuxt/BNKWWG8o.js +1 -0
- package/assets/board/_nuxt/BPTrRhcw.js +1 -0
- package/assets/board/_nuxt/BSov4ehT.js +1 -0
- package/assets/board/_nuxt/BTxVIV74.js +1 -0
- package/assets/board/_nuxt/B_SlFcWp.js +1 -0
- package/assets/board/_nuxt/Baq-Hrpf.js +1 -0
- package/assets/board/_nuxt/Bb3Limos.js +1 -0
- package/assets/board/_nuxt/Bh7eUS6e.js +1 -0
- package/assets/board/_nuxt/Bhg7noz0.js +1 -0
- package/assets/board/_nuxt/Bu60uYgs.js +1 -0
- package/assets/board/_nuxt/BuBpFHLu.js +2 -0
- package/assets/board/_nuxt/BuOKDFiJ.js +1 -0
- package/assets/board/_nuxt/BuuAjxsV.js +1 -0
- package/assets/board/_nuxt/C-GYjxwr.js +13 -0
- package/assets/board/_nuxt/C6wyeu66.js +1 -0
- package/assets/board/_nuxt/C9MiPNdJ.js +1 -0
- package/assets/board/_nuxt/C9StZL3D.js +3 -0
- package/assets/board/_nuxt/CD0uJuyA.js +1 -0
- package/assets/board/_nuxt/CDL4GvLz.js +1 -0
- package/assets/board/_nuxt/CHZ_IHOa.js +1 -0
- package/assets/board/_nuxt/CK9_veoz.js +1 -0
- package/assets/board/_nuxt/CNbS93H9.js +1 -0
- package/assets/board/_nuxt/CQTvWh4i.js +1 -0
- package/assets/board/_nuxt/CUnX_QKi.js +1 -0
- package/assets/board/_nuxt/C_uy5_kh.js +1 -0
- package/assets/board/_nuxt/CeiBZIn1.js +95 -0
- package/assets/board/_nuxt/Cfk_R787.js +1 -0
- package/assets/board/_nuxt/ChJuu-Ky.js +1 -0
- package/assets/board/_nuxt/CjRYYbsC.js +1 -0
- package/assets/board/_nuxt/Ck3md8pL.js +1 -0
- package/assets/board/_nuxt/CkDrD28D.js +1 -0
- package/assets/board/_nuxt/CmvybFI5.js +1 -0
- package/assets/board/_nuxt/CoBNWjS2.js +1 -0
- package/assets/board/_nuxt/CoPhTDCT.js +1 -0
- package/assets/board/_nuxt/Cq4Q0czX.js +1 -0
- package/assets/board/_nuxt/CsyY7ot8.js +1 -0
- package/assets/board/_nuxt/CuJUHLl8.js +1 -0
- package/assets/board/_nuxt/Cu_-fa7D.js +1 -0
- package/assets/board/_nuxt/CvFE1CeN.js +1 -0
- package/assets/board/_nuxt/CyAQx5wv.js +1 -0
- package/assets/board/_nuxt/D13eMNHe.js +1 -0
- package/assets/board/_nuxt/D1Yxjnz9.js +1 -0
- package/assets/board/_nuxt/D1_aWe_t.js +1 -0
- package/assets/board/_nuxt/D3YCAmfu.js +1 -0
- package/assets/board/_nuxt/D8Bpf7sE.js +1 -0
- package/assets/board/_nuxt/DHihWhf5.js +1 -0
- package/assets/board/_nuxt/DJUwhJ8T.js +1 -0
- package/assets/board/_nuxt/DLkAKotw.js +1 -0
- package/assets/board/_nuxt/DSaWoFHS.js +1 -0
- package/assets/board/_nuxt/DZo3dYLJ.js +3 -0
- package/assets/board/_nuxt/DaqxYsbV.js +1 -0
- package/assets/board/_nuxt/DdjjthKs.js +1 -0
- package/assets/board/_nuxt/DhhR1iR4.js +1 -0
- package/assets/board/_nuxt/DmKZi-Wo.js +1 -0
- package/assets/board/_nuxt/DpXJ_tCU.js +1 -0
- package/assets/board/_nuxt/DrbU50Zd.js +9 -0
- package/assets/board/_nuxt/DsF2J4jZ.js +1 -0
- package/assets/board/_nuxt/DsNkyZPc.js +1 -0
- package/assets/board/_nuxt/DtVfI_h9.js +1 -0
- package/assets/board/_nuxt/DwcwzwSx.js +1 -0
- package/assets/board/_nuxt/Dwd1XRDX.js +1 -0
- package/assets/board/_nuxt/HclZy1k7.js +1 -0
- package/assets/board/_nuxt/HrhQecsY.js +6 -0
- package/assets/board/_nuxt/HvSJjbUd.js +1 -0
- package/assets/board/_nuxt/KhBLkIKl.js +1 -0
- package/assets/board/_nuxt/MTucdeiW.js +1 -0
- package/assets/board/_nuxt/Oe3jsM_c.js +1 -0
- package/assets/board/_nuxt/RJtjdZeG.js +1 -0
- package/assets/board/_nuxt/RM4VQc4e.js +1 -0
- package/assets/board/_nuxt/Vo4wMbnS.js +1 -0
- package/assets/board/_nuxt/ZuoAH0hh.js +1 -0
- package/assets/board/_nuxt/_id_.B2NDKSlX.css +1 -0
- package/assets/board/_nuxt/builds/latest.json +1 -1
- package/assets/board/_nuxt/builds/meta/ecbff4a6-6538-49b0-9844-64f03ebd103a.json +1 -0
- package/assets/board/_nuxt/burndown.BCLMmigw.css +1 -0
- package/assets/board/_nuxt/entry.nk2xQ-sa.css +2 -0
- package/assets/board/_nuxt/epics.B4-eK1Py.css +1 -0
- package/assets/board/_nuxt/fFGyRlCx.js +1 -0
- package/assets/board/_nuxt/gantt.DATOqoZf.css +1 -0
- package/assets/board/_nuxt/l05SqxhY.js +1 -0
- package/assets/board/_nuxt/milestones.z-UuT44X.css +1 -0
- package/assets/board/_nuxt/oXSDGTSr.js +1 -0
- package/assets/board/_nuxt/obNw9aRV.js +3 -0
- package/assets/board/_nuxt/pages.Bi6nErnd.css +1 -0
- package/assets/board/_nuxt/u88eXCXy.js +1 -0
- package/assets/board/_nuxt/uGmbQYdY.js +1 -0
- package/assets/board/burndown/index.html +1 -1
- package/assets/board/epics/index.html +1 -1
- package/assets/board/gantt/index.html +1 -1
- package/assets/board/index.html +1 -1
- package/assets/board/milestones/index.html +1 -1
- package/bin/scrum-skills.mjs +34 -11
- package/package.json +40 -41
- package/templates/AGENTS.md +1 -1
- package/tools/agile-tools.mjs +504 -0
- package/tools/ai.mjs +464 -0
- package/tools/projects.mjs +140 -0
- package/tools/serve.mjs +60 -17
- package/tools/validate.mjs +21 -7
- package/assets/board/_nuxt/4lorSwrA.js +0 -1
- package/assets/board/_nuxt/7WA2NiBu.js +0 -1
- package/assets/board/_nuxt/BMkghBSN.js +0 -6
- package/assets/board/_nuxt/BO7jzDkR.js +0 -1
- package/assets/board/_nuxt/BZ3zxHIj.js +0 -1
- package/assets/board/_nuxt/BhF-44v-.js +0 -13
- package/assets/board/_nuxt/Brv_Bdja.js +0 -3
- package/assets/board/_nuxt/C3UUYAQd.js +0 -1
- package/assets/board/_nuxt/CJAcsUQO.js +0 -3
- package/assets/board/_nuxt/CNsYxQaQ.js +0 -1
- package/assets/board/_nuxt/CRaaiMq0.js +0 -1
- package/assets/board/_nuxt/CW444i7s.js +0 -1
- package/assets/board/_nuxt/CfONUjDo.js +0 -1
- package/assets/board/_nuxt/DKNZ_ohS.js +0 -1
- package/assets/board/_nuxt/DuWpPgcw.js +0 -3
- package/assets/board/_nuxt/LjrS__tx.js +0 -1
- package/assets/board/_nuxt/_id_.DhbZaLbc.css +0 -1
- package/assets/board/_nuxt/builds/meta/460252c3-0ea6-40d0-8f13-d20a01a88ad5.json +0 -1
- package/assets/board/_nuxt/burndown.BENzf335.css +0 -1
- package/assets/board/_nuxt/entry.CRMqPpqu.css +0 -2
- package/assets/board/_nuxt/epics.BeC881O2.css +0 -1
- package/assets/board/_nuxt/gantt.B1Ztrpq6.css +0 -1
- package/assets/board/_nuxt/laFvd4Y3.js +0 -16
- package/assets/board/_nuxt/milestones.B2QTaR0Y.css +0 -1
- package/assets/board/_nuxt/pages.DuMz_V7L.css +0 -1
package/bin/scrum-skills.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* scrum-skills CLI(零依赖,node >= 18)
|
|
4
4
|
* 命令:
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* scrum-skills validate [dir] 校验敏捷数据(默认当前目录)
|
|
13
13
|
*/
|
|
14
14
|
import { cpSync, mkdirSync, existsSync, writeFileSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
15
|
-
import { join, resolve, dirname } from 'node:path';
|
|
15
|
+
import { join, resolve, dirname, basename } from 'node:path';
|
|
16
16
|
import { spawnSync } from 'node:child_process';
|
|
17
17
|
import { fileURLToPath } from 'node:url';
|
|
18
18
|
|
|
@@ -31,6 +31,20 @@ scsk 是 scrum-skills 的等价简写,如: scsk serve`;
|
|
|
31
31
|
const [cmd, ...args] = process.argv.slice(2);
|
|
32
32
|
const fail = msg => { console.error(`✘ ${msg}`); process.exit(1); };
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* 备份一个即将被覆盖的文件,返回备份路径。
|
|
36
|
+
* 名字带时间戳:老做法固定叫 `*.bak`,第二次 update 就把上一次的备份顶掉了,
|
|
37
|
+
* 而 AGENTS.md 几乎一定会被本地改过,备份互相覆盖等于没备份。
|
|
38
|
+
*/
|
|
39
|
+
function backupFile(file) {
|
|
40
|
+
const d = new Date();
|
|
41
|
+
const pad = n => String(n).padStart(2, '0');
|
|
42
|
+
const stamp = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;
|
|
43
|
+
let target = `${file}.${stamp}.bak`;
|
|
44
|
+
for (let i = 2; existsSync(target); i += 1) target = `${file}.${stamp}-${i}.bak`;
|
|
45
|
+
cpSync(file, target);
|
|
46
|
+
return target;
|
|
47
|
+
}
|
|
34
48
|
function init() {
|
|
35
49
|
const force = args.includes('--force');
|
|
36
50
|
const dir = resolve(args.find(a => !a.startsWith('--')) || process.cwd());
|
|
@@ -38,9 +52,9 @@ function init() {
|
|
|
38
52
|
|
|
39
53
|
const agentsMd = join(dir, 'AGENTS.md');
|
|
40
54
|
if (existsSync(agentsMd) && !force)
|
|
41
|
-
fail(`目标目录已有 AGENTS.md。确认覆盖请加 --force
|
|
42
|
-
const backed = existsSync(agentsMd);
|
|
43
|
-
if (backed)
|
|
55
|
+
fail(`目标目录已有 AGENTS.md。确认覆盖请加 --force(旧文件会先备份成 AGENTS.md.<时间戳>.bak)`);
|
|
56
|
+
const backed = existsSync(agentsMd) ? backupFile(agentsMd) : null;
|
|
57
|
+
if (backed) console.log(`· 已把现有 AGENTS.md 备份为 ${basename(backed)}`);
|
|
44
58
|
|
|
45
59
|
cpSync(join(PKG_ROOT, '.agents'), join(dir, '.agents'), { recursive: true, force: true });
|
|
46
60
|
writeFileSync(agentsMd, readFileSync(join(PKG_ROOT, 'templates/AGENTS.md'), 'utf8'));
|
|
@@ -65,7 +79,7 @@ function init() {
|
|
|
65
79
|
|
|
66
80
|
console.log(`✔ 已初始化到 ${dir}
|
|
67
81
|
- .agents/skills/ 四个敏捷 skill(planning / sprint / tdd / report)
|
|
68
|
-
- AGENTS.md agent 入口纪律文件${backed ?
|
|
82
|
+
- AGENTS.md agent 入口纪律文件${backed ? `(旧文件已备份为 ${basename(backed)})` : ''}
|
|
69
83
|
- tools/validate.mjs 数据校验脚本
|
|
70
84
|
- agile/ 三文件结构${created.length ? `(新建 ${created.join('、')})` : '(已存在,未覆盖)'}
|
|
71
85
|
|
|
@@ -104,6 +118,8 @@ function update() {
|
|
|
104
118
|
fail(`${dir} 未初始化(找不到 .agents/ 与 AGENTS.md)。请先运行: scrum-skills init`);
|
|
105
119
|
|
|
106
120
|
const added = [], changed = [], same = [];
|
|
121
|
+
// 相对路径 → 备份文件名,覆盖完统一提示怎么把本地改动捞回来
|
|
122
|
+
const backups = [];
|
|
107
123
|
for (const { rel, src } of frameworkFiles()) {
|
|
108
124
|
const dest = join(dir, rel);
|
|
109
125
|
const srcText = readFileSync(src, 'utf8');
|
|
@@ -114,19 +130,26 @@ function update() {
|
|
|
114
130
|
if (readFileSync(dest, 'utf8') === srcText) { same.push(rel); continue; }
|
|
115
131
|
changed.push(rel);
|
|
116
132
|
if (!dryRun) {
|
|
117
|
-
|
|
133
|
+
const bak = backupFile(dest); // 覆盖前备份,本地自定义不丢
|
|
134
|
+
backups.push({ rel, bak: basename(bak) });
|
|
118
135
|
writeFileSync(dest, srcText);
|
|
119
136
|
}
|
|
120
137
|
}
|
|
121
138
|
|
|
122
139
|
const verb = dryRun ? '(dry-run,未写入)' : '';
|
|
140
|
+
const bakLines = backups.map(b => ` - ${b.rel} 的旧版本 → ${b.bak}`).join('\n');
|
|
123
141
|
console.log(`✔ skill 框架文件更新完成${verb} — ${dir}
|
|
124
142
|
- 新增 ${added.length} 个${added.length ? `: ${added.join(', ')}` : ''}
|
|
125
|
-
- 更新 ${changed.length}
|
|
143
|
+
- 更新 ${changed.length} 个${changed.length ? `: ${changed.join(', ')}` : ''}
|
|
126
144
|
- 未变 ${same.length} 个
|
|
127
|
-
- agile/
|
|
128
|
-
|
|
129
|
-
${
|
|
145
|
+
- agile/ 数据目录未做任何改动${bakLines ? `\n - 覆盖前已备份${bakLines.replace(/^ {2}/gm, '\n ')}` : ''}
|
|
146
|
+
|
|
147
|
+
${backups.length
|
|
148
|
+
? `提示: 框架文件是整篇覆盖的,你在这几个文件里的本地改动都在上面的备份里。
|
|
149
|
+
让 agent 助手(CodeBuddy / Claude Code 等)合并回来即可,直接说:
|
|
150
|
+
「对比 ${backups[0].rel} 与 ${backups[0].bak},把我的本地改动合并回来」${backups.length > 1 ? `\n (其余 ${backups.length - 1} 个文件同理,备份文件名见上方)` : ''}
|
|
151
|
+
确认合并无误后再删掉备份。AGENTS.md 是 agent 的入口纪律文件,先合并它、再让它去改别的文件最稳。`
|
|
152
|
+
: '已是最新,无需操作。'}`);
|
|
130
153
|
}
|
|
131
154
|
|
|
132
155
|
function runTool(script, needPort) {
|
package/package.json
CHANGED
|
@@ -1,41 +1,40 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "scrum-skills",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "结构化敏捷开发管理 skills + CLI:AI 对话产出结构化敏捷数据,TDD 驱动实施,Nuxt 看板可视化",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"agile",
|
|
8
|
-
"scrum",
|
|
9
|
-
"sprint",
|
|
10
|
-
"tdd",
|
|
11
|
-
"kanban",
|
|
12
|
-
"gantt",
|
|
13
|
-
"burndown",
|
|
14
|
-
"skills",
|
|
15
|
-
"cli"
|
|
16
|
-
],
|
|
17
|
-
"bin": {
|
|
18
|
-
"scrum-skills": "./bin/scrum-skills.mjs",
|
|
19
|
-
"scsk": "./bin/scrum-skills.mjs"
|
|
20
|
-
},
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "scrum-skills",
|
|
3
|
+
"version": "0.2.4",
|
|
4
|
+
"description": "结构化敏捷开发管理 skills + CLI:AI 对话产出结构化敏捷数据,TDD 驱动实施,Nuxt 看板可视化",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"agile",
|
|
8
|
+
"scrum",
|
|
9
|
+
"sprint",
|
|
10
|
+
"tdd",
|
|
11
|
+
"kanban",
|
|
12
|
+
"gantt",
|
|
13
|
+
"burndown",
|
|
14
|
+
"skills",
|
|
15
|
+
"cli"
|
|
16
|
+
],
|
|
17
|
+
"bin": {
|
|
18
|
+
"scrum-skills": "./bin/scrum-skills.mjs",
|
|
19
|
+
"scsk": "./bin/scrum-skills.mjs"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"bin/",
|
|
23
|
+
"tools/",
|
|
24
|
+
"templates/",
|
|
25
|
+
".agents/",
|
|
26
|
+
"assets/",
|
|
27
|
+
"docs/"
|
|
28
|
+
],
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"scripts": {
|
|
34
|
+
"validate": "node tools/validate.mjs",
|
|
35
|
+
"serve": "node tools/serve.mjs",
|
|
36
|
+
"test": "node --test",
|
|
37
|
+
"dev": "pnpm --dir apps/board run dev",
|
|
38
|
+
"build": "node scripts/build-board.mjs"
|
|
39
|
+
}
|
|
40
|
+
}
|
package/templates/AGENTS.md
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
## 状态机(摘要)
|
|
34
34
|
|
|
35
|
-
- story: `draft → ready → in-progress → review → done`
|
|
35
|
+
- story: `draft → ready → in-progress → review → done`;不做就走 `cancelled`(已取消,终态,不要求验收与任务全 done)
|
|
36
36
|
- task: `todo → red → green → refactored → done`(只能前进;task 状态编码了 TDD 阶段)
|
|
37
37
|
- 详细规则与硬约束见 `.agents/skills/scrum-planning/references/schema.md`。
|
|
38
38
|
|