@lbruton/specflow 3.4.0 → 3.5.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/CHANGELOG.md +7 -0
- package/README.ar.md +6 -6
- package/README.de.md +6 -6
- package/README.es.md +6 -6
- package/README.fr.md +6 -6
- package/README.it.md +6 -6
- package/README.ja.md +6 -6
- package/README.ko.md +6 -6
- package/README.md +2 -2
- package/README.pt.md +6 -6
- package/README.ru.md +6 -6
- package/README.zh.md +6 -6
- package/dist/__tests__/config.test.js +2 -2
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/__tests__/config-loader.test.d.ts +2 -0
- package/dist/core/__tests__/config-loader.test.d.ts.map +1 -0
- package/dist/core/__tests__/config-loader.test.js +184 -0
- package/dist/core/__tests__/config-loader.test.js.map +1 -0
- package/dist/core/__tests__/convention-detector.test.js +2 -2
- package/dist/core/__tests__/convention-detector.test.js.map +1 -1
- package/dist/core/__tests__/index-updater.test.d.ts +2 -0
- package/dist/core/__tests__/index-updater.test.d.ts.map +1 -0
- package/dist/core/__tests__/index-updater.test.js +122 -0
- package/dist/core/__tests__/index-updater.test.js.map +1 -0
- package/dist/core/__tests__/migration.test.d.ts +2 -0
- package/dist/core/__tests__/migration.test.d.ts.map +1 -0
- package/dist/core/__tests__/migration.test.js +151 -0
- package/dist/core/__tests__/migration.test.js.map +1 -0
- package/dist/core/__tests__/path-utils.test.js +120 -0
- package/dist/core/__tests__/path-utils.test.js.map +1 -1
- package/dist/core/__tests__/security-utils.test.js +2 -2
- package/dist/core/__tests__/security-utils.test.js.map +1 -1
- package/dist/core/__tests__/template-generator.test.js +4 -4
- package/dist/core/__tests__/template-generator.test.js.map +1 -1
- package/dist/core/archive-service.d.ts.map +1 -1
- package/dist/core/archive-service.js +22 -0
- package/dist/core/archive-service.js.map +1 -1
- package/dist/core/config-loader.d.ts +31 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +162 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/convention-detector.d.ts +2 -2
- package/dist/core/convention-detector.js +3 -3
- package/dist/core/convention-detector.js.map +1 -1
- package/dist/core/dashboard-session.d.ts +1 -1
- package/dist/core/dashboard-session.js +1 -1
- package/dist/core/global-dir.d.ts +4 -4
- package/dist/core/global-dir.js +8 -8
- package/dist/core/global-dir.js.map +1 -1
- package/dist/core/index-updater.d.ts +17 -0
- package/dist/core/index-updater.d.ts.map +1 -0
- package/dist/core/index-updater.js +86 -0
- package/dist/core/index-updater.js.map +1 -0
- package/dist/core/migration.d.ts +30 -0
- package/dist/core/migration.d.ts.map +1 -0
- package/dist/core/migration.js +99 -0
- package/dist/core/migration.js.map +1 -0
- package/dist/core/path-utils.d.ts +7 -0
- package/dist/core/path-utils.d.ts.map +1 -1
- package/dist/core/path-utils.js +31 -10
- package/dist/core/path-utils.js.map +1 -1
- package/dist/core/security-utils.js +1 -1
- package/dist/core/security-utils.js.map +1 -1
- package/dist/core/template-generator.d.ts +2 -2
- package/dist/core/template-generator.d.ts.map +1 -1
- package/dist/core/template-generator.js +35 -14
- package/dist/core/template-generator.js.map +1 -1
- package/dist/core/workspace-initializer.d.ts +6 -1
- package/dist/core/workspace-initializer.d.ts.map +1 -1
- package/dist/core/workspace-initializer.js +69 -9
- package/dist/core/workspace-initializer.js.map +1 -1
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +2 -2
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -1
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +3 -3
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -1
- package/dist/dashboard/__tests__/watcher-error-handling.test.js +5 -5
- package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -1
- package/dist/dashboard/approval-storage.js +2 -2
- package/dist/dashboard/approval-storage.js.map +1 -1
- package/dist/dashboard/job-scheduler.js +2 -2
- package/dist/dashboard/job-scheduler.js.map +1 -1
- package/dist/dashboard/multi-server.js +15 -15
- package/dist/dashboard/multi-server.js.map +1 -1
- package/dist/dashboard/watcher.js +2 -2
- package/dist/dashboard/watcher.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/prompts/create-spec.js +4 -4
- package/dist/prompts/create-spec.js.map +1 -1
- package/dist/prompts/create-steering-doc.js +5 -5
- package/dist/prompts/create-steering-doc.js.map +1 -1
- package/dist/prompts/implement-task.js +11 -11
- package/dist/prompts/implement-task.js.map +1 -1
- package/dist/prompts/inject-steering-guide.js +2 -2
- package/dist/prompts/spec-status.js +2 -2
- package/dist/prompts/spec-status.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/__tests__/projectPath.test.js +2 -2
- package/dist/tools/__tests__/projectPath.test.js.map +1 -1
- package/dist/tools/approvals.d.ts.map +1 -1
- package/dist/tools/approvals.js +17 -3
- package/dist/tools/approvals.js.map +1 -1
- package/dist/tools/log-implementation.js +2 -2
- package/dist/tools/log-implementation.js.map +1 -1
- package/dist/tools/spec-list.js +1 -1
- package/dist/tools/spec-list.js.map +1 -1
- package/dist/tools/spec-status.js +11 -11
- package/dist/tools/spec-status.js.map +1 -1
- package/dist/tools/spec-workflow-guide.js +41 -41
- package/dist/tools/steering-guide.js +24 -24
- package/package.json +1 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config loader for .specflow/config.json
|
|
3
|
+
*
|
|
4
|
+
* Reads, validates, and auto-creates project-level configuration
|
|
5
|
+
* that maps a project to its DocVault location.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, access, mkdir } from 'fs/promises';
|
|
8
|
+
import { join, resolve, basename } from 'path';
|
|
9
|
+
import { constants } from 'fs';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Validation
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const PROJECT_RE = /^[A-Za-z0-9_-]+$/;
|
|
14
|
+
const ISSUE_PREFIX_RE = /^[A-Z0-9]+$/;
|
|
15
|
+
function validateConfig(config, projectPath) {
|
|
16
|
+
if (!config.project || !PROJECT_RE.test(config.project)) {
|
|
17
|
+
throw new Error(`Invalid project name "${config.project}": must match ${PROJECT_RE.source}`);
|
|
18
|
+
}
|
|
19
|
+
if (!config.issue_prefix || !ISSUE_PREFIX_RE.test(config.issue_prefix)) {
|
|
20
|
+
throw new Error(`Invalid issue_prefix "${config.issue_prefix}": must be non-empty uppercase alphanumeric (${ISSUE_PREFIX_RE.source})`);
|
|
21
|
+
}
|
|
22
|
+
if (!config.docvault || typeof config.docvault !== 'string') {
|
|
23
|
+
throw new Error('docvault path must be a non-empty string');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function validateDocvaultPath(docvaultAbsolute) {
|
|
27
|
+
// Existence check
|
|
28
|
+
try {
|
|
29
|
+
await access(docvaultAbsolute, constants.F_OK);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new Error(`DocVault path does not exist: ${docvaultAbsolute}`);
|
|
33
|
+
}
|
|
34
|
+
// Writable check
|
|
35
|
+
try {
|
|
36
|
+
await access(docvaultAbsolute, constants.W_OK);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new Error(`DocVault path is not writable: ${docvaultAbsolute}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Path resolution (shared by load and create)
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
function resolvePaths(config, projectPath) {
|
|
46
|
+
const docvaultAbsolute = resolve(projectPath, config.docvault);
|
|
47
|
+
// Reject resolved paths that still contain ".."
|
|
48
|
+
if (docvaultAbsolute.includes('..')) {
|
|
49
|
+
throw new Error(`Resolved docvault path contains "..": ${docvaultAbsolute}`);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
...config,
|
|
53
|
+
docvaultAbsolute,
|
|
54
|
+
specflowRoot: join(docvaultAbsolute, 'specflow', config.project),
|
|
55
|
+
globalTemplatesPath: join(docvaultAbsolute, 'specflow', 'templates'),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Auto-detection helpers (for createDefaultConfig)
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
function deriveProjectName(projectPath) {
|
|
62
|
+
const name = basename(resolve(projectPath));
|
|
63
|
+
if (!PROJECT_RE.test(name)) {
|
|
64
|
+
throw new Error(`Cannot derive a valid project name from path "${projectPath}" (got "${name}")`);
|
|
65
|
+
}
|
|
66
|
+
return name;
|
|
67
|
+
}
|
|
68
|
+
async function detectDocvaultPath(projectPath) {
|
|
69
|
+
const candidate = resolve(projectPath, '..', 'DocVault');
|
|
70
|
+
try {
|
|
71
|
+
await access(candidate, constants.F_OK);
|
|
72
|
+
return '../DocVault';
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw new Error(`Could not auto-detect DocVault: expected sibling directory at ${candidate}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function detectIssuePrefix(projectPath, projectName) {
|
|
79
|
+
// Try .claude/project.json first
|
|
80
|
+
const claudeProjectPath = join(projectPath, '.claude', 'project.json');
|
|
81
|
+
try {
|
|
82
|
+
const raw = await readFile(claudeProjectPath, 'utf-8');
|
|
83
|
+
const parsed = JSON.parse(raw);
|
|
84
|
+
if (parsed.issuePrefix &&
|
|
85
|
+
typeof parsed.issuePrefix === 'string' &&
|
|
86
|
+
ISSUE_PREFIX_RE.test(parsed.issuePrefix)) {
|
|
87
|
+
return parsed.issuePrefix;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// File doesn't exist or isn't parseable — fall through
|
|
92
|
+
}
|
|
93
|
+
// Derive from project name: uppercase first 3-4 chars
|
|
94
|
+
const upper = projectName.replace(/[^A-Za-z0-9]/g, '').toUpperCase();
|
|
95
|
+
if (upper.length === 0) {
|
|
96
|
+
throw new Error(`Cannot derive issue_prefix from project name "${projectName}"`);
|
|
97
|
+
}
|
|
98
|
+
return upper.length <= 4 ? upper : upper.slice(0, 4);
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Public API
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
/**
|
|
104
|
+
* Read and validate an existing .specflow/config.json.
|
|
105
|
+
* Throws on missing file, invalid JSON, or failed validation.
|
|
106
|
+
*/
|
|
107
|
+
export async function loadConfig(projectPath) {
|
|
108
|
+
const configPath = join(projectPath, '.specflow', 'config.json');
|
|
109
|
+
const raw = await readFile(configPath, 'utf-8'); // throws ENOENT naturally
|
|
110
|
+
let parsed;
|
|
111
|
+
try {
|
|
112
|
+
parsed = JSON.parse(raw);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new Error(`Invalid JSON in ${configPath}`);
|
|
116
|
+
}
|
|
117
|
+
const config = parsed;
|
|
118
|
+
validateConfig(config, projectPath);
|
|
119
|
+
const resolved = resolvePaths(config, projectPath);
|
|
120
|
+
await validateDocvaultPath(resolved.docvaultAbsolute);
|
|
121
|
+
return resolved;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Auto-detect values, write .specflow/config.json, and return resolved config.
|
|
125
|
+
* Throws if DocVault sibling directory does not exist.
|
|
126
|
+
*/
|
|
127
|
+
export async function createDefaultConfig(projectPath) {
|
|
128
|
+
const project = deriveProjectName(projectPath);
|
|
129
|
+
const docvault = await detectDocvaultPath(projectPath);
|
|
130
|
+
const issue_prefix = await detectIssuePrefix(projectPath, project);
|
|
131
|
+
const config = { project, docvault, issue_prefix };
|
|
132
|
+
validateConfig(config, projectPath);
|
|
133
|
+
const resolved = resolvePaths(config, projectPath);
|
|
134
|
+
await validateDocvaultPath(resolved.docvaultAbsolute);
|
|
135
|
+
// Ensure .specflow/ directory exists
|
|
136
|
+
const specflowDir = join(projectPath, '.specflow');
|
|
137
|
+
try {
|
|
138
|
+
await access(specflowDir, constants.F_OK);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
await mkdir(specflowDir, { recursive: true });
|
|
142
|
+
}
|
|
143
|
+
const configPath = join(specflowDir, 'config.json');
|
|
144
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
145
|
+
return resolved;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Load existing config, or create one with auto-detected defaults on ENOENT.
|
|
149
|
+
*/
|
|
150
|
+
export async function loadOrCreateConfig(projectPath) {
|
|
151
|
+
try {
|
|
152
|
+
return await loadConfig(projectPath);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error instanceof Error &&
|
|
156
|
+
error.code === 'ENOENT') {
|
|
157
|
+
return createDefaultConfig(projectPath);
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAkB/B,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,GAAG,kBAAkB,CAAC;AACtC,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,SAAS,cAAc,CAAC,MAAsB,EAAE,WAAmB;IACjE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,OAAO,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,YAAY,gDAAgD,eAAe,CAAC,MAAM,GAAG,CACtH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,gBAAwB;IAExB,kBAAkB;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,iCAAiC,gBAAgB,EAAE,CACpD,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,kCAAkC,gBAAgB,EAAE,CACrD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E,SAAS,YAAY,CACnB,MAAsB,EACtB,WAAmB;IAEnB,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/D,gDAAgD;IAChD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,yCAAyC,gBAAgB,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,gBAAgB;QAChB,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC;QAChE,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,WAAW,CAAC;KACrE,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,iDAAiD,WAAW,WAAW,IAAI,IAAI,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,iEAAiE,SAAS,EAAE,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,WAAmB;IAEnB,iCAAiC;IACjC,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IACE,MAAM,CAAC,WAAW;YAClB,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;YACtC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EACxC,CAAC;YACD,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;IAED,sDAAsD;IACtD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,iDAAiD,WAAW,GAAG,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B;IAC3E,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,GAAG,MAAwB,CAAC;IACxC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,oBAAoB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAEtD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB;IAEnB,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACnE,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,oBAAoB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAEtD,qCAAqC;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IACE,KAAK,YAAY,KAAK;YACrB,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAClD,CAAC;YACD,OAAO,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -29,8 +29,8 @@ export interface ProjectConventions {
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function detectConventions(projectPath: string): Promise<ProjectConventions>;
|
|
31
31
|
/**
|
|
32
|
-
* Write detected conventions to `.
|
|
33
|
-
* Creates the `.
|
|
32
|
+
* Write detected conventions to `.specflow/project-conventions.json`.
|
|
33
|
+
* Creates the `.specflow` directory if it does not exist.
|
|
34
34
|
*/
|
|
35
35
|
export declare function writeConventions(projectPath: string, conventions: ProjectConventions): Promise<void>;
|
|
36
36
|
//# sourceMappingURL=convention-detector.d.ts.map
|
|
@@ -281,11 +281,11 @@ export async function detectConventions(projectPath) {
|
|
|
281
281
|
};
|
|
282
282
|
}
|
|
283
283
|
/**
|
|
284
|
-
* Write detected conventions to `.
|
|
285
|
-
* Creates the `.
|
|
284
|
+
* Write detected conventions to `.specflow/project-conventions.json`.
|
|
285
|
+
* Creates the `.specflow` directory if it does not exist.
|
|
286
286
|
*/
|
|
287
287
|
export async function writeConventions(projectPath, conventions) {
|
|
288
|
-
const dir = join(projectPath, '.
|
|
288
|
+
const dir = join(projectPath, '.specflow');
|
|
289
289
|
try {
|
|
290
290
|
await mkdir(dir, { recursive: true });
|
|
291
291
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convention-detector.js","sourceRoot":"","sources":["../../src/core/convention-detector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"convention-detector.js","sourceRoot":"","sources":["../../src/core/convention-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export interface DashboardSessionEntry {
|
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* Manages the global dashboard session
|
|
9
|
-
* Stores dashboard connection info in ~/.
|
|
9
|
+
* Stores dashboard connection info in ~/.specflow-mcp/activeSession.json
|
|
10
10
|
* (or SPEC_WORKFLOW_HOME if set)
|
|
11
11
|
*/
|
|
12
12
|
export declare class DashboardSessionManager {
|
|
@@ -3,7 +3,7 @@ import { promises as fs } from 'fs';
|
|
|
3
3
|
import { getGlobalDir, getPermissionErrorHelp } from './global-dir.js';
|
|
4
4
|
/**
|
|
5
5
|
* Manages the global dashboard session
|
|
6
|
-
* Stores dashboard connection info in ~/.
|
|
6
|
+
* Stores dashboard connection info in ~/.specflow-mcp/activeSession.json
|
|
7
7
|
* (or SPEC_WORKFLOW_HOME if set)
|
|
8
8
|
*/
|
|
9
9
|
export class DashboardSessionManager {
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Environment variable name for overriding the global directory location.
|
|
3
|
-
* When set, all global state files will be stored in this location instead of ~/.
|
|
3
|
+
* When set, all global state files will be stored in this location instead of ~/.specflow-mcp
|
|
4
4
|
*
|
|
5
5
|
* This is useful for sandboxed environments (e.g., Codex CLI with sandbox_mode=workspace-write)
|
|
6
6
|
* where $HOME is read-only.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* // Set to an absolute path
|
|
10
|
-
* SPEC_WORKFLOW_HOME=/workspace/.
|
|
10
|
+
* SPEC_WORKFLOW_HOME=/workspace/.specflow-mcp npx spec-workflow-mcp /workspace
|
|
11
11
|
*
|
|
12
12
|
* // Set to a relative path (resolved against current working directory)
|
|
13
|
-
* SPEC_WORKFLOW_HOME=./.
|
|
13
|
+
* SPEC_WORKFLOW_HOME=./.specflow-mcp npx spec-workflow-mcp /workspace
|
|
14
14
|
*/
|
|
15
15
|
export declare const SPEC_WORKFLOW_HOME_ENV = "SPEC_WORKFLOW_HOME";
|
|
16
16
|
/**
|
|
@@ -20,7 +20,7 @@ export declare const SPEC_WORKFLOW_HOME_ENV = "SPEC_WORKFLOW_HOME";
|
|
|
20
20
|
* 1. SPEC_WORKFLOW_HOME environment variable (if set)
|
|
21
21
|
* - Absolute paths are used as-is
|
|
22
22
|
* - Relative paths are resolved against process.cwd()
|
|
23
|
-
* 2. Default: ~/.
|
|
23
|
+
* 2. Default: ~/.specflow-mcp
|
|
24
24
|
*
|
|
25
25
|
* Files stored in this directory:
|
|
26
26
|
* - activeProjects.json - Project registry
|
package/dist/core/global-dir.js
CHANGED
|
@@ -2,20 +2,20 @@ import { homedir } from 'os';
|
|
|
2
2
|
import { join, isAbsolute } from 'path';
|
|
3
3
|
/**
|
|
4
4
|
* Environment variable name for overriding the global directory location.
|
|
5
|
-
* When set, all global state files will be stored in this location instead of ~/.
|
|
5
|
+
* When set, all global state files will be stored in this location instead of ~/.specflow-mcp
|
|
6
6
|
*
|
|
7
7
|
* This is useful for sandboxed environments (e.g., Codex CLI with sandbox_mode=workspace-write)
|
|
8
8
|
* where $HOME is read-only.
|
|
9
9
|
*
|
|
10
10
|
* @example
|
|
11
11
|
* // Set to an absolute path
|
|
12
|
-
* SPEC_WORKFLOW_HOME=/workspace/.
|
|
12
|
+
* SPEC_WORKFLOW_HOME=/workspace/.specflow-mcp npx spec-workflow-mcp /workspace
|
|
13
13
|
*
|
|
14
14
|
* // Set to a relative path (resolved against current working directory)
|
|
15
|
-
* SPEC_WORKFLOW_HOME=./.
|
|
15
|
+
* SPEC_WORKFLOW_HOME=./.specflow-mcp npx spec-workflow-mcp /workspace
|
|
16
16
|
*/
|
|
17
17
|
export const SPEC_WORKFLOW_HOME_ENV = 'SPEC_WORKFLOW_HOME';
|
|
18
|
-
const DEFAULT_DIR_NAME = '.
|
|
18
|
+
const DEFAULT_DIR_NAME = '.specflow-mcp';
|
|
19
19
|
/**
|
|
20
20
|
* Get the global directory path for storing spec-workflow-mcp state files.
|
|
21
21
|
*
|
|
@@ -23,7 +23,7 @@ const DEFAULT_DIR_NAME = '.spec-workflow-mcp';
|
|
|
23
23
|
* 1. SPEC_WORKFLOW_HOME environment variable (if set)
|
|
24
24
|
* - Absolute paths are used as-is
|
|
25
25
|
* - Relative paths are resolved against process.cwd()
|
|
26
|
-
* 2. Default: ~/.
|
|
26
|
+
* 2. Default: ~/.specflow-mcp
|
|
27
27
|
*
|
|
28
28
|
* Files stored in this directory:
|
|
29
29
|
* - activeProjects.json - Project registry
|
|
@@ -41,7 +41,7 @@ export function getGlobalDir() {
|
|
|
41
41
|
// Handle both absolute and relative paths
|
|
42
42
|
return isAbsolute(envPath) ? envPath : join(process.cwd(), envPath);
|
|
43
43
|
}
|
|
44
|
-
// Default to ~/.
|
|
44
|
+
// Default to ~/.specflow-mcp
|
|
45
45
|
return join(homedir(), DEFAULT_DIR_NAME);
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
@@ -64,11 +64,11 @@ To fix this, set the SPEC_WORKFLOW_HOME environment variable to a writable locat
|
|
|
64
64
|
|
|
65
65
|
For example, to store state files in your workspace:
|
|
66
66
|
|
|
67
|
-
SPEC_WORKFLOW_HOME=/workspace/.
|
|
67
|
+
SPEC_WORKFLOW_HOME=/workspace/.specflow-mcp npx spec-workflow-mcp /workspace
|
|
68
68
|
|
|
69
69
|
Or use a relative path:
|
|
70
70
|
|
|
71
|
-
SPEC_WORKFLOW_HOME=./.
|
|
71
|
+
SPEC_WORKFLOW_HOME=./.specflow-mcp npx spec-workflow-mcp .
|
|
72
72
|
`.trim();
|
|
73
73
|
}
|
|
74
74
|
//# sourceMappingURL=global-dir.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-dir.js","sourceRoot":"","sources":["../../src/core/global-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"global-dir.js","sourceRoot":"","sources":["../../src/core/global-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpD,IAAI,OAAO,EAAE,CAAC;QACZ,4CAA4C;QAC5C,0CAA0C;QAC1C,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,6BAA6B;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,IAAY;IACpE,OAAO;YACG,SAAS,KAAK,IAAI;;;;;;;;;;;;;;;CAe7B,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ResolvedConfig } from './config-loader.js';
|
|
2
|
+
/**
|
|
3
|
+
* Ensure an _Index.md file exists in the given directory.
|
|
4
|
+
* If it already exists, this is a no-op (idempotent).
|
|
5
|
+
*/
|
|
6
|
+
export declare function ensureIndexExists(dirPath: string, heading: string): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Add a spec entry to the specs/_Index.md under the project's specflowRoot.
|
|
9
|
+
* Skips silently if the spec is already listed (no duplicates).
|
|
10
|
+
*/
|
|
11
|
+
export declare function addSpecToIndex(config: ResolvedConfig, specName: string, description?: string): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Remove a spec entry from the specs/_Index.md.
|
|
14
|
+
* If the file doesn't exist or the spec isn't listed, this is a no-op.
|
|
15
|
+
*/
|
|
16
|
+
export declare function removeSpecFromIndex(config: ResolvedConfig, specName: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=index-updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-updater.d.ts","sourceRoot":"","sources":["../../src/core/index-updater.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA4BzD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// DocVault _Index.md manager — creates and maintains Obsidian index tables
|
|
3
|
+
// for spec lifecycle events.
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Safely read a file, returning null if it doesn't exist or can't be read.
|
|
12
|
+
*/
|
|
13
|
+
async function safeRead(filePath) {
|
|
14
|
+
try {
|
|
15
|
+
return await readFile(filePath, 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build the initial content for a new _Index.md file.
|
|
23
|
+
*/
|
|
24
|
+
function indexSkeleton(heading) {
|
|
25
|
+
return `# ${heading}\n\n| Page | Description |\n|------|-------------|\n`;
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Public API
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/**
|
|
31
|
+
* Ensure an _Index.md file exists in the given directory.
|
|
32
|
+
* If it already exists, this is a no-op (idempotent).
|
|
33
|
+
*/
|
|
34
|
+
export async function ensureIndexExists(dirPath, heading) {
|
|
35
|
+
const indexPath = join(dirPath, '_Index.md');
|
|
36
|
+
const existing = await safeRead(indexPath);
|
|
37
|
+
if (existing !== null)
|
|
38
|
+
return;
|
|
39
|
+
// Create the directory tree if it doesn't exist yet.
|
|
40
|
+
try {
|
|
41
|
+
await mkdir(dirPath, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Directory may already exist — ignore.
|
|
45
|
+
}
|
|
46
|
+
await writeFile(indexPath, indexSkeleton(heading), 'utf-8');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Add a spec entry to the specs/_Index.md under the project's specflowRoot.
|
|
50
|
+
* Skips silently if the spec is already listed (no duplicates).
|
|
51
|
+
*/
|
|
52
|
+
export async function addSpecToIndex(config, specName, description) {
|
|
53
|
+
const specsDir = join(config.specflowRoot, 'specs');
|
|
54
|
+
const indexPath = join(specsDir, '_Index.md');
|
|
55
|
+
// Ensure the index file exists before we try to read-modify-write.
|
|
56
|
+
await ensureIndexExists(specsDir, 'Specs');
|
|
57
|
+
const content = await safeRead(indexPath);
|
|
58
|
+
if (content === null)
|
|
59
|
+
return; // Should not happen after ensureIndexExists, but be safe.
|
|
60
|
+
// Check for existing entry — look for the wikilink anywhere in the file.
|
|
61
|
+
if (content.includes(`[[${specName}]]`))
|
|
62
|
+
return;
|
|
63
|
+
const desc = description ?? '';
|
|
64
|
+
const newRow = `| [[${specName}]] | ${desc} |\n`;
|
|
65
|
+
await writeFile(indexPath, content + newRow, 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Remove a spec entry from the specs/_Index.md.
|
|
69
|
+
* If the file doesn't exist or the spec isn't listed, this is a no-op.
|
|
70
|
+
*/
|
|
71
|
+
export async function removeSpecFromIndex(config, specName) {
|
|
72
|
+
const specsDir = join(config.specflowRoot, 'specs');
|
|
73
|
+
const indexPath = join(specsDir, '_Index.md');
|
|
74
|
+
const content = await safeRead(indexPath);
|
|
75
|
+
if (content === null)
|
|
76
|
+
return;
|
|
77
|
+
const wikilink = `[[${specName}]]`;
|
|
78
|
+
// Filter out any line containing the wikilink.
|
|
79
|
+
const lines = content.split('\n');
|
|
80
|
+
const filtered = lines.filter((line) => !line.includes(wikilink));
|
|
81
|
+
// Only write back if we actually removed something.
|
|
82
|
+
if (filtered.length < lines.length) {
|
|
83
|
+
await writeFile(indexPath, filtered.join('\n'), 'utf-8');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=index-updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-updater.js","sourceRoot":"","sources":["../../src/core/index-updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time migration of existing `.specflow/` content to DocVault.
|
|
3
|
+
*
|
|
4
|
+
* Copies (never moves) migratable subdirectories from the local `.specflow/`
|
|
5
|
+
* folder to the corresponding DocVault location defined in ResolvedConfig.
|
|
6
|
+
* Skips destinations that already contain files to prevent data loss.
|
|
7
|
+
*/
|
|
8
|
+
import type { ResolvedConfig } from './config-loader.js';
|
|
9
|
+
export interface MigrationResult {
|
|
10
|
+
migratedDirs: string[];
|
|
11
|
+
skippedDirs: string[];
|
|
12
|
+
errors: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check whether the local `.specflow/` directory contains any content
|
|
16
|
+
* that should be migrated to DocVault.
|
|
17
|
+
*/
|
|
18
|
+
export declare function needsMigration(projectPath: string, _config: ResolvedConfig): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Copy migratable content from `.specflow/` to DocVault.
|
|
21
|
+
*
|
|
22
|
+
* For each mapping in MIGRATION_MAP:
|
|
23
|
+
* - If the source directory doesn't exist or is empty, skip silently.
|
|
24
|
+
* - If the destination directory already has files, skip with a warning.
|
|
25
|
+
* - Otherwise, copy recursively.
|
|
26
|
+
*
|
|
27
|
+
* Originals are left in place (copy, not move).
|
|
28
|
+
*/
|
|
29
|
+
export declare function migrateToDocVault(projectPath: string, config: ResolvedConfig): Promise<MigrationResult>;
|
|
30
|
+
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/core/migration.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgBD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,eAAe,CAAC,CA0C1B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time migration of existing `.specflow/` content to DocVault.
|
|
3
|
+
*
|
|
4
|
+
* Copies (never moves) migratable subdirectories from the local `.specflow/`
|
|
5
|
+
* folder to the corresponding DocVault location defined in ResolvedConfig.
|
|
6
|
+
* Skips destinations that already contain files to prevent data loss.
|
|
7
|
+
*/
|
|
8
|
+
import { readdir, cp, access } from 'fs/promises';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { constants } from 'fs';
|
|
11
|
+
import { ensureDirectoryExists } from './path-utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* Migration source-to-destination mapping.
|
|
14
|
+
* Keys are local `.specflow/` subdirectory names.
|
|
15
|
+
* Values are the corresponding subdirectory names under `config.specflowRoot`.
|
|
16
|
+
* Note: `user-templates/` is renamed to `templates/` in DocVault.
|
|
17
|
+
*/
|
|
18
|
+
const MIGRATION_MAP = {
|
|
19
|
+
'steering': 'steering',
|
|
20
|
+
'specs': 'specs',
|
|
21
|
+
'user-templates': 'templates',
|
|
22
|
+
'approvals': 'approvals',
|
|
23
|
+
'archive': 'archive',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Check whether the local `.specflow/` directory contains any content
|
|
27
|
+
* that should be migrated to DocVault.
|
|
28
|
+
*/
|
|
29
|
+
export async function needsMigration(projectPath, _config) {
|
|
30
|
+
const localRoot = join(projectPath, '.specflow');
|
|
31
|
+
for (const srcDir of Object.keys(MIGRATION_MAP)) {
|
|
32
|
+
const srcPath = join(localRoot, srcDir);
|
|
33
|
+
if (await dirHasFiles(srcPath)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Copy migratable content from `.specflow/` to DocVault.
|
|
41
|
+
*
|
|
42
|
+
* For each mapping in MIGRATION_MAP:
|
|
43
|
+
* - If the source directory doesn't exist or is empty, skip silently.
|
|
44
|
+
* - If the destination directory already has files, skip with a warning.
|
|
45
|
+
* - Otherwise, copy recursively.
|
|
46
|
+
*
|
|
47
|
+
* Originals are left in place (copy, not move).
|
|
48
|
+
*/
|
|
49
|
+
export async function migrateToDocVault(projectPath, config) {
|
|
50
|
+
const result = {
|
|
51
|
+
migratedDirs: [],
|
|
52
|
+
skippedDirs: [],
|
|
53
|
+
errors: [],
|
|
54
|
+
};
|
|
55
|
+
const localRoot = join(projectPath, '.specflow');
|
|
56
|
+
for (const [srcDir, destDir] of Object.entries(MIGRATION_MAP)) {
|
|
57
|
+
const srcPath = join(localRoot, srcDir);
|
|
58
|
+
const destPath = join(config.specflowRoot, destDir);
|
|
59
|
+
try {
|
|
60
|
+
// Skip if source doesn't exist or is empty
|
|
61
|
+
if (!(await dirHasFiles(srcPath))) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Safety: never overwrite existing content
|
|
65
|
+
if (await dirHasFiles(destPath)) {
|
|
66
|
+
const msg = `Skipping ${srcDir}/ — destination already has content: ${destPath}`;
|
|
67
|
+
console.error(`[migration] ${msg}`);
|
|
68
|
+
result.skippedDirs.push(srcDir);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Ensure destination parent exists
|
|
72
|
+
await ensureDirectoryExists(destPath);
|
|
73
|
+
// Copy recursively
|
|
74
|
+
await cp(srcPath, destPath, { recursive: true });
|
|
75
|
+
console.error(`[migration] Copied ${srcDir}/ → ${destPath}`);
|
|
76
|
+
result.migratedDirs.push(srcDir);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
80
|
+
console.error(`[migration] Error migrating ${srcDir}/: ${msg}`);
|
|
81
|
+
result.errors.push(`${srcDir}: ${msg}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check whether a directory exists and contains at least one entry.
|
|
88
|
+
*/
|
|
89
|
+
async function dirHasFiles(dirPath) {
|
|
90
|
+
try {
|
|
91
|
+
await access(dirPath, constants.F_OK);
|
|
92
|
+
const entries = await readdir(dirPath);
|
|
93
|
+
return entries.length > 0;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/core/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import type { ResolvedConfig } from './config-loader.js';
|
|
1
2
|
export declare class PathUtils {
|
|
2
3
|
/** macOS and Windows are case-insensitive filesystems */
|
|
3
4
|
private static readonly IS_CASE_INSENSITIVE;
|
|
4
5
|
/** Cached path configuration (undefined = not checked, null = invalid/missing) */
|
|
5
6
|
private static pathConfig;
|
|
7
|
+
/** DocVault resolved configuration (null = not configured) */
|
|
8
|
+
private static docvaultConfig;
|
|
6
9
|
/**
|
|
7
10
|
* Get cached path configuration from environment variables.
|
|
8
11
|
* Caches result to prevent race conditions from env var changes mid-operation.
|
|
@@ -12,6 +15,10 @@ export declare class PathUtils {
|
|
|
12
15
|
private static isAbsolutePath;
|
|
13
16
|
/** Reset cached config (for testing) */
|
|
14
17
|
static resetPathConfig(): void;
|
|
18
|
+
static initializeDocVault(config: ResolvedConfig): void;
|
|
19
|
+
static isDocVaultConfigured(): boolean;
|
|
20
|
+
static getGlobalTemplatesPath(): string;
|
|
21
|
+
static resetDocVaultConfig(): void;
|
|
15
22
|
/**
|
|
16
23
|
* Normalize path for cross-platform comparison using built-in path.posix.
|
|
17
24
|
* Converts backslashes to forward slashes, removes trailing slashes.
|