requ-mcp 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.
@@ -0,0 +1,184 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import YAML from "yaml";
4
+ import { Config, Execution, ExecutionLog, Phase, Requirement, UserStory, } from "./schema.js";
5
+ /**
6
+ * File-backed store for the `.requ/` directory.
7
+ *
8
+ * <root>/.requ/config.yaml
9
+ * <root>/.requ/requirements/REQ-001.yaml
10
+ * <root>/.requ/stories/US-001.yaml
11
+ * <root>/.requ/phases/PHASE-001.yaml
12
+ * <root>/.requ/executions/PHASE-001.yaml (append-style run log)
13
+ */
14
+ export class Store {
15
+ root;
16
+ baseDir;
17
+ constructor(root) {
18
+ this.root = path.resolve(root);
19
+ this.baseDir = path.join(this.root, ".requ");
20
+ }
21
+ get reqDir() {
22
+ return path.join(this.baseDir, "requirements");
23
+ }
24
+ get storyDir() {
25
+ return path.join(this.baseDir, "stories");
26
+ }
27
+ get phaseDir() {
28
+ return path.join(this.baseDir, "phases");
29
+ }
30
+ get execDir() {
31
+ return path.join(this.baseDir, "executions");
32
+ }
33
+ get configPath() {
34
+ return path.join(this.baseDir, "config.yaml");
35
+ }
36
+ async isInitialized() {
37
+ try {
38
+ await fs.access(this.configPath);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ async init(config) {
46
+ await fs.mkdir(this.reqDir, { recursive: true });
47
+ await fs.mkdir(this.storyDir, { recursive: true });
48
+ await fs.mkdir(this.phaseDir, { recursive: true });
49
+ await fs.mkdir(this.execDir, { recursive: true });
50
+ await this.writeConfig(config);
51
+ }
52
+ // --- config ---
53
+ async readConfig() {
54
+ const raw = await fs.readFile(this.configPath, "utf8");
55
+ return Config.parse(YAML.parse(raw));
56
+ }
57
+ async writeConfig(config) {
58
+ await fs.mkdir(this.baseDir, { recursive: true });
59
+ await fs.writeFile(this.configPath, YAML.stringify(Config.parse(config)), "utf8");
60
+ }
61
+ async conductorRoot() {
62
+ const cfg = await this.readConfig();
63
+ return path.isAbsolute(cfg.conductorPath)
64
+ ? cfg.conductorPath
65
+ : path.resolve(this.root, cfg.conductorPath);
66
+ }
67
+ /** Resolve a possibly-relative path against the repo root. */
68
+ resolvePath(p) {
69
+ return path.isAbsolute(p) ? p : path.resolve(this.root, p);
70
+ }
71
+ // --- requirements ---
72
+ async listRequirements() {
73
+ return this.readAll(this.reqDir, Requirement);
74
+ }
75
+ async getRequirement(id) {
76
+ return this.readOne(path.join(this.reqDir, `${id}.yaml`), Requirement);
77
+ }
78
+ async writeRequirement(req) {
79
+ await fs.mkdir(this.reqDir, { recursive: true });
80
+ const v = Requirement.parse(req);
81
+ await fs.writeFile(path.join(this.reqDir, `${v.id}.yaml`), YAML.stringify(v), "utf8");
82
+ }
83
+ // --- stories ---
84
+ async listStories() {
85
+ return this.readAll(this.storyDir, UserStory);
86
+ }
87
+ async getStory(id) {
88
+ return this.readOne(path.join(this.storyDir, `${id}.yaml`), UserStory);
89
+ }
90
+ async writeStory(story) {
91
+ await fs.mkdir(this.storyDir, { recursive: true });
92
+ const v = UserStory.parse(story);
93
+ await fs.writeFile(path.join(this.storyDir, `${v.id}.yaml`), YAML.stringify(v), "utf8");
94
+ }
95
+ // --- phases ---
96
+ async listPhases() {
97
+ const phases = await this.readAll(this.phaseDir, Phase);
98
+ return phases.sort((a, b) => a.order - b.order);
99
+ }
100
+ async getPhase(id) {
101
+ return this.readOne(path.join(this.phaseDir, `${id}.yaml`), Phase);
102
+ }
103
+ async writePhase(phase) {
104
+ await fs.mkdir(this.phaseDir, { recursive: true });
105
+ const v = Phase.parse(phase);
106
+ await fs.writeFile(path.join(this.phaseDir, `${v.id}.yaml`), YAML.stringify(v), "utf8");
107
+ }
108
+ /** The phase to operate on by default: explicit active phase, else latest by order. */
109
+ async resolvePhaseId(explicit) {
110
+ if (explicit)
111
+ return explicit;
112
+ const cfg = await this.readConfig();
113
+ if (cfg.activePhase)
114
+ return cfg.activePhase;
115
+ const phases = await this.listPhases();
116
+ return phases.length ? phases[phases.length - 1].id : null;
117
+ }
118
+ // --- executions ---
119
+ execPath(phaseId) {
120
+ return path.join(this.execDir, `${phaseId}.yaml`);
121
+ }
122
+ async readExecutionLog(phaseId) {
123
+ const log = await this.readOne(this.execPath(phaseId), ExecutionLog);
124
+ return log?.runs ?? [];
125
+ }
126
+ /** Append execution records to a phase's log (creating it if needed). */
127
+ async appendExecutions(phaseId, runs) {
128
+ await fs.mkdir(this.execDir, { recursive: true });
129
+ const existing = await this.readExecutionLog(phaseId);
130
+ const parsed = runs.map((r) => Execution.parse(r));
131
+ const log = ExecutionLog.parse({ phase: phaseId, runs: [...existing, ...parsed] });
132
+ await fs.writeFile(this.execPath(phaseId), YAML.stringify(log), "utf8");
133
+ }
134
+ /** All execution logs keyed by phase id. */
135
+ async readAllExecutions() {
136
+ const phases = await this.listPhases();
137
+ const out = new Map();
138
+ for (const p of phases)
139
+ out.set(p.id, await this.readExecutionLog(p.id));
140
+ return out;
141
+ }
142
+ // --- helpers ---
143
+ async readOne(file, schema) {
144
+ try {
145
+ const raw = await fs.readFile(file, "utf8");
146
+ return schema.parse(YAML.parse(raw));
147
+ }
148
+ catch (err) {
149
+ if (err?.code === "ENOENT")
150
+ return null;
151
+ throw err;
152
+ }
153
+ }
154
+ async readAll(dir, schema) {
155
+ let names;
156
+ try {
157
+ names = await fs.readdir(dir);
158
+ }
159
+ catch (err) {
160
+ if (err?.code === "ENOENT")
161
+ return [];
162
+ throw err;
163
+ }
164
+ const files = names.filter((n) => n.endsWith(".yaml") || n.endsWith(".yml"));
165
+ const out = [];
166
+ for (const f of files.sort()) {
167
+ const raw = await fs.readFile(path.join(dir, f), "utf8");
168
+ out.push(schema.parse(YAML.parse(raw)));
169
+ }
170
+ return out;
171
+ }
172
+ /** Next numeric id for a prefix, e.g. nextId("REQ", existing) -> "REQ-003". */
173
+ static nextId(prefix, existing) {
174
+ let max = 0;
175
+ const re = new RegExp(`^${prefix}-(\\d+)$`);
176
+ for (const id of existing) {
177
+ const m = id.match(re);
178
+ if (m)
179
+ max = Math.max(max, parseInt(m[1], 10));
180
+ }
181
+ return `${prefix}-${String(max + 1).padStart(3, "0")}`;
182
+ }
183
+ }
184
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "requ-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server to track requirements coverage and its evolution across phases/releases. Pairs with Conductor for e2e tests; links scenarios to user stories via @US-xxx tags.",
5
+ "type": "module",
6
+ "bin": {
7
+ "requ-mcp": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "engines": {
13
+ "node": ">=18"
14
+ },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx src/index.ts",
18
+ "smoke": "tsx scripts/smoke.ts",
19
+ "prepare": "tsc",
20
+ "prepublishOnly": "tsc"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "model-context-protocol",
25
+ "requirements",
26
+ "traceability",
27
+ "coverage",
28
+ "cucumber",
29
+ "conductor",
30
+ "e2e"
31
+ ],
32
+ "author": "Nourreddine HOUARI <houarinourredine@gmail.com>",
33
+ "license": "MIT",
34
+ "homepage": "https://github.com/nouhouari/requ-mcp#readme",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/nouhouari/requ-mcp.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/nouhouari/requ-mcp/issues"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "dependencies": {
46
+ "@modelcontextprotocol/sdk": "^1.0.0",
47
+ "yaml": "^2.5.0",
48
+ "zod": "^3.23.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^22.0.0",
52
+ "tsx": "^4.19.0",
53
+ "typescript": "^5.6.0"
54
+ }
55
+ }