@oevery/rsp 1.0.1 → 1.0.3
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 +3 -3
- package/README.zh-CN.md +3 -3
- package/bin/rsp.mjs +5 -0
- package/dist/cli.mjs +9 -8
- package/package.json +6 -5
- package/rules/rsp-rules.md +4 -4
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# RSP: Rules,
|
|
1
|
+
# RSP: Rules, Specs, Plans
|
|
2
2
|
|
|
3
|
-
RSP = **Rules,
|
|
3
|
+
RSP = **Rules, Specs, Plans** — a lightweight AI-assisted development workflow.
|
|
4
4
|
|
|
5
5
|
## Quick start
|
|
6
6
|
|
|
@@ -34,7 +34,7 @@ For other tools (Cursor, Claude Code, Copilot), add the path to the appropriate
|
|
|
34
34
|
├── config.yaml # project config (custom statuses, priorities, sections)
|
|
35
35
|
├── rules/ # technical constraints, long-lived
|
|
36
36
|
│ └── rsp-rules.md
|
|
37
|
-
├──
|
|
37
|
+
├── specs/ # project-level architecture
|
|
38
38
|
│ └── INDEX.md # extracted spec summaries from archived features
|
|
39
39
|
├── features/ # feature files (flat or nested)
|
|
40
40
|
│ ├── login.md
|
package/README.zh-CN.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# RSP:Rules,
|
|
1
|
+
# RSP:Rules, Specs, Plans
|
|
2
2
|
|
|
3
|
-
RSP = **Rules(规则)、
|
|
3
|
+
RSP = **Rules(规则)、Specs(规格)、Plans(计划)** — 轻量级 AI 辅助开发工作流。
|
|
4
4
|
|
|
5
5
|
## 快速开始
|
|
6
6
|
|
|
@@ -33,7 +33,7 @@ cd my-project && rsp init
|
|
|
33
33
|
.rsp/
|
|
34
34
|
├── config.yaml # 项目配置
|
|
35
35
|
├── rules/ # 技术约束
|
|
36
|
-
├──
|
|
36
|
+
├── specs/ # 项目级架构
|
|
37
37
|
│ └── INDEX.md # 从归档提取的 spec 摘要
|
|
38
38
|
├── features/ # 特性文件
|
|
39
39
|
│ ├── auth/
|
package/bin/rsp.mjs
ADDED
package/dist/cli.mjs
CHANGED
|
@@ -595,7 +595,7 @@ async function runCheckIfHasDependents(name) {
|
|
|
595
595
|
}
|
|
596
596
|
}
|
|
597
597
|
async function updateSpecIndex(name, date) {
|
|
598
|
-
const specIndexPath = join5(RSP_DIR, "
|
|
598
|
+
const specIndexPath = join5(RSP_DIR, "specs", "INDEX.md");
|
|
599
599
|
const archiveDir = join5(RSP_DIR, "archive");
|
|
600
600
|
const escaped = name.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
601
601
|
const lineRe = new RegExp(`^\\| \\d{4}-\\d{2}-\\d{2} \\| ${escaped} \\|`, "m");
|
|
@@ -626,7 +626,7 @@ async function updateSpecIndex(name, date) {
|
|
|
626
626
|
if (lineRe.test(existing))
|
|
627
627
|
return;
|
|
628
628
|
if (!existing.includes("| Date | Feature | Summary |")) {
|
|
629
|
-
await writeFile3(specIndexPath, `#
|
|
629
|
+
await writeFile3(specIndexPath, `# Specs Index
|
|
630
630
|
|
|
631
631
|
| Date | Feature | Summary |
|
|
632
632
|
|------|---------|---------|
|
|
@@ -721,10 +721,11 @@ async function detectProjectName() {
|
|
|
721
721
|
return basename3(process.cwd());
|
|
722
722
|
}
|
|
723
723
|
var AGENTS_BODY = `## Collaboration Mode
|
|
724
|
-
This project uses **RSP** (Rules,
|
|
724
|
+
This project uses **RSP** (Rules, Specs, Plans) \u2014 see \`.rsp/rules/\` for the full workflow definition (start with \`rsp-rules.md\`).
|
|
725
725
|
|
|
726
726
|
Key conventions:
|
|
727
727
|
- \`.rsp/rules/\` \u2014 technical constraints and coding conventions
|
|
728
|
+
- \`.rsp/specs/\` \u2014 project-level architecture and design reference
|
|
728
729
|
- \`.rsp/features/<name>.md\` \u2014 feature definitions (spec + plan + tests)
|
|
729
730
|
- \`.rsp/active.d/\` \u2014 currently active features (path = feature name)
|
|
730
731
|
- \`.rsp/archive/\` \u2014 completed features
|
|
@@ -763,7 +764,7 @@ async function initProject() {
|
|
|
763
764
|
return withRspLock("init", async () => {
|
|
764
765
|
const dirs = [
|
|
765
766
|
join7(RSP_DIR, "rules"),
|
|
766
|
-
join7(RSP_DIR, "
|
|
767
|
+
join7(RSP_DIR, "specs"),
|
|
767
768
|
join7(RSP_DIR, "features"),
|
|
768
769
|
join7(RSP_DIR, "archive")
|
|
769
770
|
];
|
|
@@ -780,9 +781,9 @@ async function initProject() {
|
|
|
780
781
|
await writeFile4(configPath, CONFIG_TEMPLATE);
|
|
781
782
|
created = true;
|
|
782
783
|
}
|
|
783
|
-
const specIndexPath = join7(RSP_DIR, "
|
|
784
|
+
const specIndexPath = join7(RSP_DIR, "specs", "INDEX.md");
|
|
784
785
|
if (!existsSync7(specIndexPath)) {
|
|
785
|
-
await writeFile4(specIndexPath, "#
|
|
786
|
+
await writeFile4(specIndexPath, "# Specs Index\n\n_Extracted from archived features._\n");
|
|
786
787
|
created = true;
|
|
787
788
|
}
|
|
788
789
|
const gitignorePath = join7(RSP_DIR, ".gitignore");
|
|
@@ -826,7 +827,7 @@ ${AGENTS_BODY}
|
|
|
826
827
|
${pc.green("RSP scaffolded.")}
|
|
827
828
|
`);
|
|
828
829
|
console.log(` Created: .rsp/rules/
|
|
829
|
-
.rsp/
|
|
830
|
+
.rsp/specs/
|
|
830
831
|
.rsp/features/
|
|
831
832
|
.rsp/archive/
|
|
832
833
|
.rsp/.gitignore
|
|
@@ -1110,7 +1111,7 @@ async function runCli(rawArgs = process.argv.slice(2)) {
|
|
|
1110
1111
|
meta: {
|
|
1111
1112
|
name: "rsp",
|
|
1112
1113
|
version,
|
|
1113
|
-
description: "RSP (Rules,
|
|
1114
|
+
description: "RSP (Rules, Specs, Plans) workflow for AI-assisted development"
|
|
1114
1115
|
},
|
|
1115
1116
|
subCommands: {
|
|
1116
1117
|
"init": initCommand,
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oevery/rsp",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.
|
|
5
|
-
"description": "RSP (Rules,
|
|
4
|
+
"version": "1.0.3",
|
|
5
|
+
"description": "RSP (Rules, Specs, Plans) workflow for AI-assisted development",
|
|
6
6
|
"author": "oevery",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"homepage": "https://github.com/oevery/rsp#readme",
|
|
@@ -14,16 +14,17 @@
|
|
|
14
14
|
"keywords": [
|
|
15
15
|
"rsp",
|
|
16
16
|
"rules",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"specs",
|
|
18
|
+
"plans",
|
|
19
19
|
"ai",
|
|
20
20
|
"coding",
|
|
21
21
|
"workflow"
|
|
22
22
|
],
|
|
23
23
|
"bin": {
|
|
24
|
-
"rsp": "
|
|
24
|
+
"rsp": "bin/rsp.mjs"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
|
+
"bin/",
|
|
27
28
|
"dist/",
|
|
28
29
|
"rules/"
|
|
29
30
|
],
|
package/rules/rsp-rules.md
CHANGED
|
@@ -5,14 +5,14 @@ description: RSP rules for Rules, Spec, and Plan driven development.
|
|
|
5
5
|
|
|
6
6
|
# RSP
|
|
7
7
|
|
|
8
|
-
RSP = Rules,
|
|
8
|
+
RSP = Rules, Specs, Plans.
|
|
9
9
|
|
|
10
10
|
## Structure
|
|
11
11
|
|
|
12
12
|
```text
|
|
13
13
|
.rsp/
|
|
14
14
|
├── rules/ # technical constraints, long-lived
|
|
15
|
-
├──
|
|
15
|
+
├── specs/ # project-level architecture (optional)
|
|
16
16
|
├── features/ # active features
|
|
17
17
|
│ ├── <name>.md # or <domain>/<name>.md for grouping
|
|
18
18
|
├── active.d/ # active feature markers
|
|
@@ -25,7 +25,7 @@ RSP = Rules, Spec, Plan.
|
|
|
25
25
|
## File roles
|
|
26
26
|
|
|
27
27
|
- `rules/` — stable technical constraints, coding conventions, architecture decisions. One or more files, split by domain (e.g., `frontend.md`, `api.md`). Do not put business requirements here.
|
|
28
|
-
-
|
|
28
|
+
- \`specs/\` — project-level architecture and design reference. Use for cross-cutting concerns, system diagrams, ADRs. Per-feature details go in \`features/\`.
|
|
29
29
|
- `features/<name>.md` — a complete feature definition, optionally grouped by domain subdirectory (e.g., `features/auth/login.md`). Contains YAML frontmatter, `## Spec` (what), `## Plan` (how), `## Tests`, and optional `## Notes`.
|
|
30
30
|
- `active.d/` — active feature tracking. Mirrors the `features/` directory structure (e.g., `active.d/payments/checkout`). Each file is an empty marker; the file path is the source of truth. All features in `active.d/` are considered active.
|
|
31
31
|
|
|
@@ -36,7 +36,7 @@ RSP = Rules, Spec, Plan.
|
|
|
36
36
|
3. If empty, ask the user or suggest `rsp new <name>`.
|
|
37
37
|
4. Read the referenced `features/<name>.md`.
|
|
38
38
|
5. Read `rules/` for technical constraints.
|
|
39
|
-
6. Optionally read
|
|
39
|
+
6. Optionally read \`specs/\` for architecture context and \`config.yaml\` for customized statuses/priorities.
|
|
40
40
|
|
|
41
41
|
## Token optimization
|
|
42
42
|
|