@namewta/speculo 0.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/LICENSE +21 -0
- package/README.md +89 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +58 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +60 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.js +11 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +54 -0
- package/speculo/.speculo/.config/LESSONS.md +9 -0
- package/speculo/.speculo/.config/RULES.md +9 -0
- package/speculo/.speculo/.config/adr/.gitkeep +1 -0
- package/speculo/.speculo/.config/context/.gitkeep +1 -0
- package/speculo/.speculo/archive/dev/.gitkeep +0 -0
- package/speculo/.speculo/archive/doc/.gitkeep +1 -0
- package/speculo/.speculo/commands/.gitkeep +0 -0
- package/speculo/.speculo/dev/.gitkeep +0 -0
- package/speculo/.speculo/dev/docs-sync-state.json +14 -0
- package/speculo/.speculo/dev-status.json +3 -0
- package/speculo/.speculo/doc/.gitkeep +1 -0
- package/speculo/.speculo/doc-status.json +3 -0
- package/speculo/commands/archive.md +53 -0
- package/speculo/commands/caveman.md +43 -0
- package/speculo/commands/grill-me.md +42 -0
- package/speculo/commands/handoff.md +42 -0
- package/speculo/commands/scaffold-exercises.md +50 -0
- package/speculo/commands/status.md +51 -0
- package/speculo/commands/write-a-skill.md +46 -0
- package/speculo/skills/caveman/SKILL.md +38 -0
- package/speculo/skills/caveman/references/compression-rules.md +102 -0
- package/speculo/skills/github-npm-ops/SKILL.md +53 -0
- package/speculo/skills/github-npm-ops/references/ci-and-security-ops.md +178 -0
- package/speculo/skills/github-npm-ops/references/failure-recovery.md +132 -0
- package/speculo/skills/github-npm-ops/references/issue-pr-triage.md +219 -0
- package/speculo/skills/github-npm-ops/references/package-json-checklist.md +171 -0
- package/speculo/skills/github-npm-ops/references/preflight-checklist.md +39 -0
- package/speculo/skills/github-npm-ops/references/publish-detection.md +68 -0
- package/speculo/skills/github-npm-ops/references/release-notes-injection.md +236 -0
- package/speculo/skills/github-npm-ops/references/release-pipeline.md +108 -0
- package/speculo/skills/github-npm-ops/references/setup-npm-token.md +63 -0
- package/speculo/skills/github-npm-ops/references/troubleshooting-playbook.md +305 -0
- package/speculo/skills/github-npm-ops/references/version-bump-flow.md +232 -0
- package/speculo/skills/github-npm-ops/references/workflow-yaml-reference.md +268 -0
- package/speculo/skills/grill-me/SKILL.md +40 -0
- package/speculo/skills/handoff/SKILL.md +41 -0
- package/speculo/skills/scaffold-exercises/SKILL.md +41 -0
- package/speculo/skills/scaffold-exercises/references/exercise-structure.md +85 -0
- package/speculo/skills/scaffold-exercises/references/lint-and-git.md +54 -0
- package/speculo/skills/speculo-write/SKILL.md +53 -0
- package/speculo/skills/speculo-write/references/asset-selection-sop.md +65 -0
- package/speculo/skills/speculo-write/references/command-authoring-sop.md +92 -0
- package/speculo/skills/speculo-write/references/migration-sop.md +101 -0
- package/speculo/skills/speculo-write/references/persistence-contract-sop.md +123 -0
- package/speculo/skills/speculo-write/references/skill-authoring-sop.md +195 -0
- package/speculo/skills/speculo-write/references/validation-checklist.md +73 -0
- package/speculo/skills/speculo-write/references/workflow-authoring-sop.md +130 -0
- package/speculo/workflows/dev/00-INDEX.md +56 -0
- package/speculo/workflows/dev/01-grill-with-docs/01-grill-with-docs.md +79 -0
- package/speculo/workflows/dev/01-grill-with-docs/ADR-FORMAT.md +49 -0
- package/speculo/workflows/dev/01-grill-with-docs/CONTEXT-FORMAT.md +65 -0
- package/speculo/workflows/dev/01-grill-with-docs/grill-context-scan.md +30 -0
- package/speculo/workflows/dev/01-grill-with-docs/grill-decision.md +38 -0
- package/speculo/workflows/dev/02-prd/02-prd.md +64 -0
- package/speculo/workflows/dev/02-prd/prd-synthesis.md +30 -0
- package/speculo/workflows/dev/02-prd/prd-zoom-out.md +29 -0
- package/speculo/workflows/dev/03-tdd/03-tdd.md +80 -0
- package/speculo/workflows/dev/03-tdd/deep-modules.md +33 -0
- package/speculo/workflows/dev/03-tdd/interface-design.md +31 -0
- package/speculo/workflows/dev/03-tdd/mocking.md +60 -0
- package/speculo/workflows/dev/03-tdd/refactoring.md +10 -0
- package/speculo/workflows/dev/03-tdd/tdd-finish.md +28 -0
- package/speculo/workflows/dev/03-tdd/tdd-loop.md +33 -0
- package/speculo/workflows/dev/03-tdd/tdd-plan.md +30 -0
- package/speculo/workflows/dev/03-tdd/tests.md +61 -0
- package/speculo/workflows/dev/D-docs-sync/D-docs-sync.md +97 -0
- package/speculo/workflows/dev/D-docs-sync/agents-contract.md +95 -0
- package/speculo/workflows/dev/D-docs-sync/changelog-contract.md +155 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-diff.md +50 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-finish.md +33 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-state.md +32 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-update.md +35 -0
- package/speculo/workflows/dev/D-docs-sync/readme-contract.md +124 -0
- package/speculo/workflows/dev/D-docs-sync/state-json-schema.md +155 -0
- package/speculo/workflows/dev/H-diagnose/H-diagnose.md +80 -0
- package/speculo/workflows/dev/H-diagnose/diagnose-fix.md +34 -0
- package/speculo/workflows/dev/H-diagnose/diagnose-guide.md +114 -0
- package/speculo/workflows/dev/H-diagnose/diagnose-loop.md +32 -0
- package/speculo/workflows/dev/H-diagnose/scripts/hitl-loop.template.sh +41 -0
- package/speculo/workflows/dev/I-to-issues/I-to-issues.md +70 -0
- package/speculo/workflows/dev/I-to-issues/issues-slices.md +31 -0
- package/speculo/workflows/dev/R-review/R-review.md +82 -0
- package/speculo/workflows/dev/R-review/review-setup.md +39 -0
- package/speculo/workflows/dev/R-review/review-two-axis.md +33 -0
- package/speculo/workflows/dev/_templates/diagnosis-template.md +19 -0
- package/speculo/workflows/dev/_templates/docs-sync-report-template.md +28 -0
- package/speculo/workflows/dev/_templates/docs-sync-state-template.json +14 -0
- package/speculo/workflows/dev/_templates/grill-context-map-template.md +19 -0
- package/speculo/workflows/dev/_templates/grill-decision-log-template.md +19 -0
- package/speculo/workflows/dev/_templates/issues-slices-template.md +19 -0
- package/speculo/workflows/dev/_templates/prd-overview-template.md +19 -0
- package/speculo/workflows/dev/_templates/prd-template.md +25 -0
- package/speculo/workflows/dev/_templates/regression-template.md +19 -0
- package/speculo/workflows/dev/_templates/review-report-template.md +16 -0
- package/speculo/workflows/dev/_templates/review-sources-template.md +24 -0
- package/speculo/workflows/dev/_templates/tdd-log-template.md +16 -0
- package/speculo/workflows/dev/_templates/tdd-plan-template.md +19 -0
- package/speculo/workflows/dev/_templates/tdd-verification-template.md +16 -0
- package/speculo/workflows/doc/00-INDEX.md +51 -0
- package/speculo/workflows/doc/B-writing-beats/B-writing-beats.md +77 -0
- package/speculo/workflows/doc/B-writing-beats/writing-beats-append.md +31 -0
- package/speculo/workflows/doc/B-writing-beats/writing-beats-options.md +29 -0
- package/speculo/workflows/doc/E-edit-article/E-edit-article.md +77 -0
- package/speculo/workflows/doc/E-edit-article/edit-article-plan.md +30 -0
- package/speculo/workflows/doc/E-edit-article/edit-article-rewrite.md +31 -0
- package/speculo/workflows/doc/F-writing-fragments/F-writing-fragments.md +78 -0
- package/speculo/workflows/doc/F-writing-fragments/writing-fragments-interview.md +32 -0
- package/speculo/workflows/doc/F-writing-fragments/writing-fragments-log.md +29 -0
- package/speculo/workflows/doc/S-writing-shape/S-writing-shape.md +79 -0
- package/speculo/workflows/doc/S-writing-shape/writing-shape-block.md +32 -0
- package/speculo/workflows/doc/S-writing-shape/writing-shape-opening.md +27 -0
- package/speculo/workflows/doc/_templates/edit-article-plan-template.md +24 -0
- package/speculo/workflows/doc/_templates/edit-article-template.md +6 -0
- package/speculo/workflows/doc/_templates/writing-article-template.md +6 -0
- package/speculo/workflows/doc/_templates/writing-beat-options-template.md +20 -0
- package/speculo/workflows/doc/_templates/writing-fragments-template.md +6 -0
- package/speculo/workflows/doc/_templates/writing-interview-log-template.md +20 -0
- package/speculo/workflows/doc/_templates/writing-shape-log-template.md +24 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 wta
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Speculo
|
|
2
|
+
|
|
3
|
+
> 以结构化文档驱动 AI Coding 的标准化赋能体系
|
|
4
|
+
> **SDD (Specification-Driven Development for AI)**
|
|
5
|
+
|
|
6
|
+
[](https://github.com/NAMEWTA/Speculo/actions/workflows/ci.yml)
|
|
7
|
+
[](https://www.npmjs.com/package/@namewta/speculo)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](./package.json)
|
|
10
|
+
|
|
11
|
+
**版本:** v2.3
|
|
12
|
+
**核心原则:** 工具无关 · CLI 接入 · workflow 自治
|
|
13
|
+
|
|
14
|
+
## 这是什么
|
|
15
|
+
|
|
16
|
+
Speculo 是一套结构化文档框架。它通过可复制的 `commands/`、`workflows/`、`skills/` 和 `.speculo/` 状态骨架,让 AI Coding 在不同工具中按标准化、可追溯、可复用的方式执行开发、文档和运维任务。
|
|
17
|
+
|
|
18
|
+
仓库同时提供一个很小的 CLI:
|
|
19
|
+
|
|
20
|
+
- `speculo init [target]`:把框架资产安装到目标项目;遇到已有文件冲突时失败,不覆盖。
|
|
21
|
+
- `speculo update [target]`:覆盖目标项目的 `commands/`、`skills/`、`workflows/`;保留 `.speculo/` 下的状态和产物。
|
|
22
|
+
|
|
23
|
+
## 仓库布局
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
Speculo/
|
|
27
|
+
├── README.md
|
|
28
|
+
├── docs/ # 框架文档
|
|
29
|
+
├── src/ # speculo CLI
|
|
30
|
+
├── test/ # CLI 测试
|
|
31
|
+
└── speculo/ # 包内框架资产源
|
|
32
|
+
├── commands/ # 一次性独立命令
|
|
33
|
+
├── workflows/ # 多阶段工作流
|
|
34
|
+
├── skills/ # command 可调用的可复用 skill
|
|
35
|
+
└── .speculo/ # 项目状态与产物骨架
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 三分钟接入
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 全局安装 CLI(npm 包名为 @namewta/speculo,命令名为 speculo)
|
|
42
|
+
npm install -g @namewta/speculo
|
|
43
|
+
|
|
44
|
+
# 安装框架资产到目标项目
|
|
45
|
+
speculo init my-project
|
|
46
|
+
|
|
47
|
+
# 更新框架资产,不覆盖 .speculo 状态
|
|
48
|
+
speculo update my-project
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`init` 会带上 `.speculo/.config/RULES.md` 和 `.speculo/.config/LESSONS.md` 作为最小项目规则/经验库;`update` 不会覆盖它们。
|
|
52
|
+
|
|
53
|
+
详见 [docs/adopting.md](docs/adopting.md)。
|
|
54
|
+
|
|
55
|
+
## 内置入口
|
|
56
|
+
|
|
57
|
+
- `workflows/dev/00-INDEX.md`:开发工作流导航
|
|
58
|
+
- `workflows/dev/01-grill-with-docs/01-grill-with-docs.md`:领域澄清与决策拷问
|
|
59
|
+
- `workflows/dev/02-prd/02-prd.md`:全景理解与 PRD
|
|
60
|
+
- `workflows/dev/03-tdd/03-tdd.md`:TDD 实现
|
|
61
|
+
- `workflows/dev/I-to-issues/I-to-issues.md`:`dev/I` 垂直切片分解
|
|
62
|
+
- `workflows/dev/H-diagnose/H-diagnose.md`:`dev/H` hotfix / diagnose
|
|
63
|
+
- `workflows/dev/R-review/R-review.md`:`dev/R` 双维度 diff 审查
|
|
64
|
+
- `workflows/dev/D-docs-sync/D-docs-sync.md`:`dev/D` git diff 驱动文档同步
|
|
65
|
+
- `workflows/doc/00-INDEX.md`:文档写作 workflow 导航
|
|
66
|
+
- `commands/status.md`:聚合当前状态
|
|
67
|
+
- `commands/archive.md`:归档 completed change
|
|
68
|
+
- `commands/{caveman,grill-me,handoff,write-a-skill,scaffold-exercises}.md`:生产力命令
|
|
69
|
+
|
|
70
|
+
## 开发
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pnpm install
|
|
74
|
+
pnpm build
|
|
75
|
+
pnpm test
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
运行环境锁定为 Node `22.22.3`、pnpm `11.1.3`。
|
|
79
|
+
|
|
80
|
+
## 文档导航
|
|
81
|
+
|
|
82
|
+
- 使用者必读:[adopting.md](docs/adopting.md) · [quick-reference.md](docs/quick-reference.md)
|
|
83
|
+
- 架构原理:[Speculo-architecture.md](docs/Speculo-architecture.md)
|
|
84
|
+
- 机器契约:[persistence-contract.md](docs/persistence-contract.md)
|
|
85
|
+
- 扩展开发:[workflow-authoring.md](docs/workflow-authoring.md) · [skill-authoring.md](docs/skill-authoring.md) · [command-authoring.md](docs/command-authoring.md)
|
|
86
|
+
|
|
87
|
+
## License
|
|
88
|
+
|
|
89
|
+
[MIT](./LICENSE) © wta
|
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { initSpeculo, updateSpeculo } from "./index.js";
|
|
5
|
+
function usage() {
|
|
6
|
+
return [
|
|
7
|
+
"Usage:",
|
|
8
|
+
" speculo init [target]",
|
|
9
|
+
" speculo update [target]",
|
|
10
|
+
"",
|
|
11
|
+
"Commands:",
|
|
12
|
+
" init Copy .speculo, commands, skills, and workflows. Fails on conflicts.",
|
|
13
|
+
" update Replace commands, skills, and workflows. Keeps .speculo untouched."
|
|
14
|
+
].join("\n");
|
|
15
|
+
}
|
|
16
|
+
async function main(argv) {
|
|
17
|
+
const [command, targetArg, extra] = argv;
|
|
18
|
+
if (!command || command === "--help" || command === "-h") {
|
|
19
|
+
console.log(usage());
|
|
20
|
+
return command ? 0 : 1;
|
|
21
|
+
}
|
|
22
|
+
if (extra) {
|
|
23
|
+
console.error(`Unexpected argument: ${extra}`);
|
|
24
|
+
console.error(usage());
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
const target = resolve(targetArg ?? ".");
|
|
28
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
29
|
+
try {
|
|
30
|
+
if (command === "init") {
|
|
31
|
+
const result = await initSpeculo(target, { packageRoot });
|
|
32
|
+
console.log(`Speculo initialized in ${result.target}`);
|
|
33
|
+
for (const copied of result.copied ?? []) {
|
|
34
|
+
console.log(`copied ${copied}`);
|
|
35
|
+
}
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
if (command === "update") {
|
|
39
|
+
const result = await updateSpeculo(target, { packageRoot });
|
|
40
|
+
console.log(`Speculo updated in ${result.target}`);
|
|
41
|
+
for (const updated of result.updated ?? []) {
|
|
42
|
+
console.log(`updated ${updated}`);
|
|
43
|
+
}
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
console.error(`Unknown command: ${command}`);
|
|
47
|
+
console.error(usage());
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
52
|
+
console.error(message);
|
|
53
|
+
return 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const exitCode = await main(process.argv.slice(2));
|
|
57
|
+
process.exitCode = exitCode;
|
|
58
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type SpeculoCommandResult = {
|
|
2
|
+
target: string;
|
|
3
|
+
copied?: string[];
|
|
4
|
+
updated?: string[];
|
|
5
|
+
};
|
|
6
|
+
export type SpeculoOptions = {
|
|
7
|
+
packageRoot?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function initSpeculo(targetArg?: string, options?: SpeculoOptions): Promise<SpeculoCommandResult>;
|
|
10
|
+
export declare function updateSpeculo(targetArg?: string, options?: SpeculoOptions): Promise<SpeculoCommandResult>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { cp, mkdir, rm } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { pathExists } from "./utils.js";
|
|
4
|
+
const INIT_ASSETS = [".speculo", "commands", "skills", "workflows"];
|
|
5
|
+
const UPDATE_ASSETS = ["commands", "skills", "workflows"];
|
|
6
|
+
function assetRoot(packageRoot) {
|
|
7
|
+
return join(packageRoot, "speculo");
|
|
8
|
+
}
|
|
9
|
+
async function ensureAssetSource(packageRoot, asset) {
|
|
10
|
+
const source = join(assetRoot(packageRoot), asset);
|
|
11
|
+
if (!(await pathExists(source))) {
|
|
12
|
+
throw new Error(`Missing packaged Speculo asset: speculo/${asset}`);
|
|
13
|
+
}
|
|
14
|
+
return source;
|
|
15
|
+
}
|
|
16
|
+
async function collectConflicts(target, assets) {
|
|
17
|
+
const conflicts = [];
|
|
18
|
+
for (const asset of assets) {
|
|
19
|
+
const destination = join(target, asset);
|
|
20
|
+
if (await pathExists(destination)) {
|
|
21
|
+
conflicts.push(destination);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return conflicts;
|
|
25
|
+
}
|
|
26
|
+
export async function initSpeculo(targetArg = ".", options = {}) {
|
|
27
|
+
const target = resolve(targetArg);
|
|
28
|
+
const packageRoot = resolve(options.packageRoot ?? process.cwd());
|
|
29
|
+
await mkdir(target, { recursive: true });
|
|
30
|
+
const conflicts = await collectConflicts(target, INIT_ASSETS);
|
|
31
|
+
if (conflicts.length > 0) {
|
|
32
|
+
throw new Error([
|
|
33
|
+
"Speculo init refused to overwrite existing paths:",
|
|
34
|
+
...conflicts.map((conflict) => `- ${conflict}`)
|
|
35
|
+
].join("\n"));
|
|
36
|
+
}
|
|
37
|
+
const copied = [];
|
|
38
|
+
for (const asset of INIT_ASSETS) {
|
|
39
|
+
const source = await ensureAssetSource(packageRoot, asset);
|
|
40
|
+
const destination = join(target, asset);
|
|
41
|
+
await cp(source, destination, { recursive: true, force: false, errorOnExist: true });
|
|
42
|
+
copied.push(asset);
|
|
43
|
+
}
|
|
44
|
+
return { target, copied };
|
|
45
|
+
}
|
|
46
|
+
export async function updateSpeculo(targetArg = ".", options = {}) {
|
|
47
|
+
const target = resolve(targetArg);
|
|
48
|
+
const packageRoot = resolve(options.packageRoot ?? process.cwd());
|
|
49
|
+
await mkdir(target, { recursive: true });
|
|
50
|
+
const updated = [];
|
|
51
|
+
for (const asset of UPDATE_ASSETS) {
|
|
52
|
+
const source = await ensureAssetSource(packageRoot, asset);
|
|
53
|
+
const destination = join(target, asset);
|
|
54
|
+
await rm(destination, { recursive: true, force: true });
|
|
55
|
+
await cp(source, destination, { recursive: true, force: true });
|
|
56
|
+
updated.push(asset);
|
|
57
|
+
}
|
|
58
|
+
return { target, updated };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAYxC,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC;AAC7E,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC;AAEnE,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,KAAa;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,MAAyB;IACvE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAS,GAAG,GAAG,EACf,UAA0B,EAAE;IAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAElE,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb;YACE,mDAAmD;YACnD,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC;SAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAS,GAAG,GAAG,EACf,UAA0B,EAAE;IAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAElE,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@namewta/speculo",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Speculo — specification-driven development framework assets, with a CLI to install and update them across AI coding tools.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"speculo": "./dist/src/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc -p tsconfig.json",
|
|
11
|
+
"test": "node --test dist/test/*.test.js",
|
|
12
|
+
"pretest": "pnpm build",
|
|
13
|
+
"check": "pnpm build && pnpm test",
|
|
14
|
+
"verify-bin": "node scripts/verify-bin.mjs",
|
|
15
|
+
"prepack": "pnpm build",
|
|
16
|
+
"prepublishOnly": "pnpm build && pnpm test"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/src",
|
|
20
|
+
"speculo"
|
|
21
|
+
],
|
|
22
|
+
"keywords": [
|
|
23
|
+
"speculo",
|
|
24
|
+
"sdd",
|
|
25
|
+
"spec-driven-development",
|
|
26
|
+
"ai-coding",
|
|
27
|
+
"workflows",
|
|
28
|
+
"skills",
|
|
29
|
+
"cli",
|
|
30
|
+
"scaffolding"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/NAMEWTA/Speculo.git"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/NAMEWTA/Speculo#readme",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/NAMEWTA/Speculo/issues"
|
|
39
|
+
},
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"author": "wta",
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public",
|
|
44
|
+
"provenance": true
|
|
45
|
+
},
|
|
46
|
+
"packageManager": "pnpm@11.1.3",
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": "22.22.3"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.15.30",
|
|
52
|
+
"typescript": "^5.8.3"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"skill": "docs-sync",
|
|
4
|
+
"state_path": ".speculo/dev/docs-sync-state.json",
|
|
5
|
+
"tracked_docs": [],
|
|
6
|
+
"last_sync_sha": null,
|
|
7
|
+
"last_sync_short": null,
|
|
8
|
+
"last_sync_commit_subject": null,
|
|
9
|
+
"last_sync_commit_date": null,
|
|
10
|
+
"last_sync_run_at": null,
|
|
11
|
+
"previous_sync_sha": null,
|
|
12
|
+
"total_syncs": 0,
|
|
13
|
+
"synced_docs": []
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: archive
|
|
3
|
+
type: command
|
|
4
|
+
name: Archive Changes
|
|
5
|
+
description: 归档已完成的 change 到 archive/<cat>/<YYYY-MM>/
|
|
6
|
+
keywords: [archive, 归档, 清理]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Archive 命令
|
|
10
|
+
|
|
11
|
+
⚠️ **本命令是破坏性目录移动操作。AI 必须先列出待归档清单并征求用户确认才能执行。**
|
|
12
|
+
|
|
13
|
+
## 归档路径模式
|
|
14
|
+
|
|
15
|
+
产物归档至:`../.speculo/commands/<YYYY-MM-DD>-archive-<topic>/`
|
|
16
|
+
|
|
17
|
+
## 调用的 skills
|
|
18
|
+
|
|
19
|
+
无
|
|
20
|
+
|
|
21
|
+
## 执行步骤
|
|
22
|
+
|
|
23
|
+
1. 扫描 `../.speculo/<cat>/*/.status.json`,当前内置分类至少包括 `dev` 与 `doc`,仅选择 `change_status: completed` 的 change。
|
|
24
|
+
2. 排除已经位于 `../.speculo/archive/` 下的目录;若目标归档路径已存在,标记为冲突并停止,不覆盖。
|
|
25
|
+
3. 列出待归档清单:源路径、目标路径、当前分类、`updated_at`、最后 phase、是否仍在 `<cat>-status.json active[]`。
|
|
26
|
+
4. 向用户展示清单并等待明确确认。没有确认时只输出计划,不移动目录、不改索引。
|
|
27
|
+
5. 用户确认后逐项执行:
|
|
28
|
+
- 创建 `../.speculo/archive/<cat>/<YYYY-MM>/`
|
|
29
|
+
- 移动 change 目录到 `../.speculo/archive/<cat>/<YYYY-MM>/<change-name>/`
|
|
30
|
+
- 从对应 `../.speculo/<cat>-status.json` 的 `active[]` 删除该 change
|
|
31
|
+
- 写入本次命令报告 `../.speculo/commands/<YYYY-MM-DD>-archive-<topic>/report.md`
|
|
32
|
+
6. 若任一移动失败,停止后续移动,报告已完成与未完成清单;不要回滚已经成功移动的目录,除非用户明确要求。
|
|
33
|
+
|
|
34
|
+
## 产物模板(report.md)
|
|
35
|
+
|
|
36
|
+
> **服务命令:** `archive.md`
|
|
37
|
+
> **产物文件名:** `report.md`
|
|
38
|
+
|
|
39
|
+
```markdown
|
|
40
|
+
# Archive Report
|
|
41
|
+
|
|
42
|
+
## 执行时间
|
|
43
|
+
[TODO: ISO 时间戳]
|
|
44
|
+
|
|
45
|
+
## 归档清单
|
|
46
|
+
[TODO: 列出本次归档的所有 change,格式 "<source-path> → <dest-path>"]
|
|
47
|
+
|
|
48
|
+
## 用户确认记录
|
|
49
|
+
[TODO: 记录用户确认的原始内容]
|
|
50
|
+
|
|
51
|
+
## 执行结果
|
|
52
|
+
[TODO: 成功 / 失败 / 部分成功]
|
|
53
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: caveman
|
|
3
|
+
type: command
|
|
4
|
+
name: Caveman Mode
|
|
5
|
+
description: 启用或关闭超压缩沟通模式
|
|
6
|
+
keywords: [caveman, brief, tokens, 简洁]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Caveman 命令
|
|
10
|
+
|
|
11
|
+
## 归档路径模式
|
|
12
|
+
|
|
13
|
+
可选产物归档至:`../.speculo/commands/<YYYY-MM-DD>-caveman-<topic>/`
|
|
14
|
+
(通常只改变对话风格,不需要持久化。)
|
|
15
|
+
|
|
16
|
+
## 调用的 skills
|
|
17
|
+
|
|
18
|
+
- `../skills/caveman/SKILL.md` — 用户要求启用、关闭或检查 caveman mode 时读取。
|
|
19
|
+
|
|
20
|
+
## 执行步骤
|
|
21
|
+
|
|
22
|
+
1. 读取 `../skills/caveman/SKILL.md`。
|
|
23
|
+
2. 根据用户意图启用或关闭压缩沟通模式。
|
|
24
|
+
3. 若用户只要求启用模式,在对话中确认当前模式即可,不写文件。
|
|
25
|
+
4. 若用户要求记录模式切换,把报告写入 `../.speculo/commands/<YYYY-MM-DD>-caveman-<topic>/mode.md`。
|
|
26
|
+
|
|
27
|
+
## 产物模板(mode.md,可选)
|
|
28
|
+
|
|
29
|
+
> **服务命令:** `caveman.md`
|
|
30
|
+
> **产物文件名:** `mode.md`
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
# Caveman Mode
|
|
34
|
+
|
|
35
|
+
## 时间
|
|
36
|
+
[TODO: ISO 8601 时间戳。]
|
|
37
|
+
|
|
38
|
+
## 动作
|
|
39
|
+
[TODO: 记录启用、关闭或检查模式。]
|
|
40
|
+
|
|
41
|
+
## 用户原始请求
|
|
42
|
+
[TODO: 记录触发命令的用户请求摘要。]
|
|
43
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: grill-me
|
|
3
|
+
type: command
|
|
4
|
+
name: Grill Me
|
|
5
|
+
description: 对计划或设计进行逐问式压力测试
|
|
6
|
+
keywords: [grill, 追问, pressure-test, 方案]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Grill Me 命令
|
|
10
|
+
|
|
11
|
+
## 归档路径模式
|
|
12
|
+
|
|
13
|
+
可选产物归档至:`../.speculo/commands/<YYYY-MM-DD>-grill-me-<topic>/`
|
|
14
|
+
|
|
15
|
+
## 调用的 skills
|
|
16
|
+
|
|
17
|
+
- `../skills/grill-me/SKILL.md` — 用户要求拷问计划、设计或决策时读取。
|
|
18
|
+
|
|
19
|
+
## 执行步骤
|
|
20
|
+
|
|
21
|
+
1. 读取 `../skills/grill-me/SKILL.md`。
|
|
22
|
+
2. 先探索可从仓库确认的事实。
|
|
23
|
+
3. 对无法从仓库确认且会改变决策树的问题,每次只问一个。
|
|
24
|
+
4. 用户要求持久化时,把已确认决策和开放问题写入 `../.speculo/commands/<YYYY-MM-DD>-grill-me-<topic>/report.md`。
|
|
25
|
+
|
|
26
|
+
## 产物模板(report.md,可选)
|
|
27
|
+
|
|
28
|
+
> **服务命令:** `grill-me.md`
|
|
29
|
+
> **产物文件名:** `report.md`
|
|
30
|
+
|
|
31
|
+
```markdown
|
|
32
|
+
# Grill Me Report
|
|
33
|
+
|
|
34
|
+
## 主题
|
|
35
|
+
[TODO: 记录被压力测试的计划或设计。]
|
|
36
|
+
|
|
37
|
+
## 已确认决策
|
|
38
|
+
[TODO: 列出已确认决策和用户确认依据。]
|
|
39
|
+
|
|
40
|
+
## 开放问题
|
|
41
|
+
[TODO: 列出仍未解决的问题、推荐答案和阻塞原因。]
|
|
42
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: handoff
|
|
3
|
+
type: command
|
|
4
|
+
name: Handoff
|
|
5
|
+
description: 生成脱敏交接文档,供另一个 agent 或会话接手
|
|
6
|
+
keywords: [handoff, 交接, summary, resume]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Handoff 命令
|
|
10
|
+
|
|
11
|
+
## 归档路径模式
|
|
12
|
+
|
|
13
|
+
可选产物归档至:`../.speculo/commands/<YYYY-MM-DD>-handoff-<topic>/`
|
|
14
|
+
|
|
15
|
+
## 调用的 skills
|
|
16
|
+
|
|
17
|
+
- `../skills/handoff/SKILL.md` — 需要把当前对话压缩成交接文档时读取。
|
|
18
|
+
|
|
19
|
+
## 执行步骤
|
|
20
|
+
|
|
21
|
+
1. 读取 `../skills/handoff/SKILL.md`。
|
|
22
|
+
2. 按 source skill 要求,把交接文档保存到用户操作系统临时目录,而不是当前工作区。
|
|
23
|
+
3. 删除 API key、密码、PII 和其他敏感信息。
|
|
24
|
+
4. 若用户要求项目内留痕,只把交接文档路径、摘要和推荐技能写入 `../.speculo/commands/<YYYY-MM-DD>-handoff-<topic>/pointer.md`。
|
|
25
|
+
|
|
26
|
+
## 产物模板(pointer.md,可选)
|
|
27
|
+
|
|
28
|
+
> **服务命令:** `handoff.md`
|
|
29
|
+
> **产物文件名:** `pointer.md`
|
|
30
|
+
|
|
31
|
+
```markdown
|
|
32
|
+
# Handoff Pointer
|
|
33
|
+
|
|
34
|
+
## 临时文件路径
|
|
35
|
+
[TODO: 记录操作系统临时目录中的交接文档路径。]
|
|
36
|
+
|
|
37
|
+
## 摘要
|
|
38
|
+
[TODO: 用 3-5 条概括交接内容,不复制敏感信息。]
|
|
39
|
+
|
|
40
|
+
## 推荐技能
|
|
41
|
+
[TODO: 列出下一个 agent 推荐读取的 skill。]
|
|
42
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: scaffold-exercises
|
|
3
|
+
type: command
|
|
4
|
+
name: Scaffold Exercises
|
|
5
|
+
description: 创建课程练习目录骨架并运行练习 lint
|
|
6
|
+
keywords: [exercises, scaffold, course, lint, 练习]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Scaffold Exercises 命令
|
|
10
|
+
|
|
11
|
+
⚠️ **本命令会创建或移动项目文件,且 source skill 可能执行 git commit。AI 必须先列出影响清单并征求用户确认才能执行。**
|
|
12
|
+
|
|
13
|
+
## 归档路径模式
|
|
14
|
+
|
|
15
|
+
产物归档至:`../.speculo/commands/<YYYY-MM-DD>-scaffold-exercises-<topic>/`
|
|
16
|
+
|
|
17
|
+
## 调用的 skills
|
|
18
|
+
|
|
19
|
+
- `../skills/scaffold-exercises/SKILL.md` — 用户要求创建课程章节或练习桩时读取。
|
|
20
|
+
|
|
21
|
+
## 执行步骤
|
|
22
|
+
|
|
23
|
+
1. 读取 `../skills/scaffold-exercises/SKILL.md`。
|
|
24
|
+
2. 解析章节、练习、编号、名称、变体类型和目标路径。
|
|
25
|
+
3. 列出将创建、移动或提交的路径,以及将运行的 lint / git 命令。
|
|
26
|
+
4. 等待用户明确确认;没有确认时只输出计划,不创建目录、不提交 git。
|
|
27
|
+
5. 用户确认后执行创建、lint 和修复循环。
|
|
28
|
+
6. 只有用户明确要求时才执行 git commit。
|
|
29
|
+
7. 写入 `../.speculo/commands/<YYYY-MM-DD>-scaffold-exercises-<topic>/report.md`。
|
|
30
|
+
|
|
31
|
+
## 产物模板(report.md)
|
|
32
|
+
|
|
33
|
+
> **服务命令:** `scaffold-exercises.md`
|
|
34
|
+
> **产物文件名:** `report.md`
|
|
35
|
+
|
|
36
|
+
```markdown
|
|
37
|
+
# Scaffold Exercises Report
|
|
38
|
+
|
|
39
|
+
## 影响清单
|
|
40
|
+
[TODO: 列出将创建或移动的章节、练习和变体路径。]
|
|
41
|
+
|
|
42
|
+
## 用户确认
|
|
43
|
+
[TODO: 记录用户确认执行的原始内容摘要。]
|
|
44
|
+
|
|
45
|
+
## 执行结果
|
|
46
|
+
[TODO: 记录目录创建、lint、修复和可选 git commit 结果。]
|
|
47
|
+
|
|
48
|
+
## 后续事项
|
|
49
|
+
[TODO: 列出仍需补充内容、失败 lint 或阻塞原因。]
|
|
50
|
+
```
|