@eskoubar95/spec 0.1.0 → 0.1.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/dist/commands/help.d.ts +5 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +23 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +30 -14
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +5 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +88 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +72 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/workspace.d.ts +5 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +17 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.js +42 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/backup-cursor.d.ts +16 -0
- package/dist/lib/backup-cursor.d.ts.map +1 -0
- package/dist/lib/backup-cursor.js +50 -0
- package/dist/lib/backup-cursor.js.map +1 -0
- package/dist/lib/copy-template.d.ts +9 -1
- package/dist/lib/copy-template.d.ts.map +1 -1
- package/dist/lib/copy-template.js +94 -3
- package/dist/lib/copy-template.js.map +1 -1
- package/dist/lib/cursor-detection.d.ts +6 -0
- package/dist/lib/cursor-detection.d.ts.map +1 -0
- package/dist/lib/cursor-detection.js +31 -0
- package/dist/lib/cursor-detection.js.map +1 -0
- package/dist/lib/detection.d.ts +25 -0
- package/dist/lib/detection.d.ts.map +1 -0
- package/dist/lib/detection.js +186 -0
- package/dist/lib/detection.js.map +1 -0
- package/dist/lib/install-existing.d.ts +6 -0
- package/dist/lib/install-existing.d.ts.map +1 -0
- package/dist/lib/install-existing.js +63 -0
- package/dist/lib/install-existing.js.map +1 -0
- package/dist/lib/project-name.d.ts +7 -0
- package/dist/lib/project-name.d.ts.map +1 -0
- package/dist/lib/project-name.js +13 -0
- package/dist/lib/project-name.js.map +1 -0
- package/dist/lib/prompts.d.ts +6 -5
- package/dist/lib/prompts.d.ts.map +1 -1
- package/dist/lib/prompts.js +114 -0
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/version-check.d.ts +21 -0
- package/dist/lib/version-check.d.ts.map +1 -0
- package/dist/lib/version-check.js +49 -0
- package/dist/lib/version-check.js.map +1 -0
- package/dist/lib/workspace.d.ts +7 -0
- package/dist/lib/workspace.d.ts.map +1 -0
- package/dist/lib/workspace.js +38 -0
- package/dist/lib/workspace.js.map +1 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +2 -2
- package/template/.cursor/commands/_shared/activation.md +220 -0
- package/template/.cursor/commands/_shared/coderabbit-integration.md +278 -0
- package/template/.cursor/commands/_shared/command-stacks.md +124 -0
- package/template/.cursor/commands/_shared/deployment-detection.md +294 -0
- package/template/.cursor/commands/_shared/detection.md +277 -0
- package/template/.cursor/commands/_shared/documentation-lookup.md +321 -0
- package/template/.cursor/commands/_shared/git-workflow.md +288 -0
- package/template/.cursor/commands/_shared/github-helpers.md +337 -0
- package/template/.cursor/commands/_shared/github-workflows.md +351 -0
- package/template/.cursor/commands/_shared/helper-metadata.md +481 -0
- package/template/.cursor/commands/_shared/linear-automation.md +388 -0
- package/template/.cursor/commands/_shared/linear-helpers.md +254 -0
- package/template/.cursor/commands/_shared/performance-monitoring.md +369 -0
- package/template/.cursor/commands/_shared/pr-description.md +279 -0
- package/template/.cursor/commands/_shared/retrospective-spec-creation.md +977 -0
- package/template/.cursor/commands/_shared/scaling.md +264 -0
- package/template/.cursor/commands/_shared/state-assertions.md +174 -0
- package/template/.cursor/commands/_shared/test-automation.md +388 -0
- package/template/.cursor/commands/_shared/verification-checkpoints.md +145 -0
- package/template/.cursor/commands/spec/audit.md +240 -0
- package/template/.cursor/commands/spec/evolve.md +163 -0
- package/template/.cursor/commands/spec/sync.md +196 -0
- package/template/.cursor/commands/tools/refactor.md +555 -0
- package/template/.cursor/rules/10-engineering.mdc +149 -0
- package/template/.cursor/rules/11-design.mdc +129 -0
- package/template/.cursor/rules/12-business.mdc +132 -0
- package/template/.cursor/rules/20-nextjs.mdc +146 -0
- package/template/.cursor/rules/21-api-design.mdc +176 -0
- package/template/.cursor/rules/30-database.mdc +183 -0
- package/template/.cursor/rules/31-testing.mdc +191 -0
- package/template/.cursor/scripts/validate-helpers.js +254 -0
- package/template/.sdd/detection-cache.json +1 -0
- package/template/.sdd/install-info.json +1 -0
- package/template/.sdd/version +1 -0
- package/template/spec/00-root-spec.md +8 -1
- package/template/work/backlog/tasks.local.md +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAkB9B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Displays help information for the CLI
|
|
3
|
+
*/
|
|
4
|
+
export function runHelp() {
|
|
5
|
+
console.log('Spec-Driven Development CLI\n');
|
|
6
|
+
console.log('Usage:');
|
|
7
|
+
console.log(' spec <command> [options]\n');
|
|
8
|
+
console.log('Commands:');
|
|
9
|
+
console.log(' init Create a new SDD project');
|
|
10
|
+
console.log(' install Install SDD to an existing project');
|
|
11
|
+
console.log(' update Update SDD system in an existing installation');
|
|
12
|
+
console.log(' workspace Open a project in Cursor IDE');
|
|
13
|
+
console.log(' help Show this help message\n');
|
|
14
|
+
console.log('Examples:');
|
|
15
|
+
console.log(' spec init Create a new project');
|
|
16
|
+
console.log(' spec install Install to current directory');
|
|
17
|
+
console.log(' spec install ./my-project Install to specific directory');
|
|
18
|
+
console.log(' spec update Update SDD in current directory');
|
|
19
|
+
console.log(' spec workspace Open current directory in Cursor\n');
|
|
20
|
+
console.log('For more information, see the README at:');
|
|
21
|
+
console.log(' https://github.com/eskoubar95/spec-driven-development\n');
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAkE7C"}
|
package/dist/commands/init.js
CHANGED
|
@@ -2,6 +2,9 @@ import path from 'path';
|
|
|
2
2
|
import { copyTemplate, createLinearConfig } from '../lib/copy-template.js';
|
|
3
3
|
import { initGit } from '../lib/git.js';
|
|
4
4
|
import { promptInit } from '../lib/prompts.js';
|
|
5
|
+
import { openInCursor } from '../lib/workspace.js';
|
|
6
|
+
import { isRunningInCursor } from '../lib/cursor-detection.js';
|
|
7
|
+
import { runInstall } from './install.js';
|
|
5
8
|
import fs from 'fs-extra';
|
|
6
9
|
/**
|
|
7
10
|
* Initializes a new SDD project
|
|
@@ -10,17 +13,17 @@ export async function runInit() {
|
|
|
10
13
|
console.log('🚀 Spec-Driven Development Project Initializer\n');
|
|
11
14
|
// Get current working directory
|
|
12
15
|
const cwd = process.cwd();
|
|
13
|
-
// Prompt for project details
|
|
14
|
-
const answers = await promptInit();
|
|
15
|
-
// Resolve destination path
|
|
16
|
-
const destPath = path.resolve(cwd, answers.projectName);
|
|
17
|
-
// Check if destination exists
|
|
18
|
-
if (await fs.pathExists(destPath)) {
|
|
19
|
-
console.error(`\n❌ Error: Directory "${answers.projectName}" already exists.`);
|
|
20
|
-
console.error(' Please choose a different name or remove the existing directory.\n');
|
|
21
|
-
process.exit(1);
|
|
22
|
-
}
|
|
23
16
|
try {
|
|
17
|
+
// Prompt for project details (includes smart detection)
|
|
18
|
+
const answers = await promptInit();
|
|
19
|
+
// Resolve destination path
|
|
20
|
+
const destPath = path.resolve(cwd, answers.projectName);
|
|
21
|
+
// Check if destination exists
|
|
22
|
+
if (await fs.pathExists(destPath)) {
|
|
23
|
+
console.error(`\n❌ Error: Directory "${answers.projectName}" already exists.`);
|
|
24
|
+
console.error(' Please choose a different name or remove the existing directory.\n');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
24
27
|
// Copy template
|
|
25
28
|
console.log(`\n📦 Copying template to "${answers.projectName}"...`);
|
|
26
29
|
await copyTemplate(destPath);
|
|
@@ -34,20 +37,33 @@ export async function runInit() {
|
|
|
34
37
|
console.log('🔧 Initializing git repository...');
|
|
35
38
|
initGit(destPath);
|
|
36
39
|
}
|
|
40
|
+
// Open in Cursor if requested (and not already in Cursor)
|
|
41
|
+
if (answers.openInCursor) {
|
|
42
|
+
await openInCursor(destPath);
|
|
43
|
+
}
|
|
37
44
|
// Success message
|
|
38
45
|
console.log('\n✅ Project initialized successfully!\n');
|
|
39
46
|
console.log('Next steps:');
|
|
40
47
|
console.log(` 1. cd ${answers.projectName}`);
|
|
41
|
-
|
|
48
|
+
if (!isRunningInCursor()) {
|
|
49
|
+
console.log(' 2. Open the project in Cursor');
|
|
50
|
+
}
|
|
42
51
|
if (answers.taskMode === 'linear') {
|
|
43
|
-
console.log('
|
|
44
|
-
console.log('
|
|
52
|
+
console.log(` ${isRunningInCursor() ? '2' : '3'}. Configure Linear MCP in Cursor (see .cursor/MCP-SETUP.md if needed)`);
|
|
53
|
+
console.log(` ${isRunningInCursor() ? '3' : '4'}. Run \`/spec/init\` to begin defining your project specification\n`);
|
|
45
54
|
}
|
|
46
55
|
else {
|
|
47
|
-
console.log('
|
|
56
|
+
console.log(` ${isRunningInCursor() ? '2' : '3'}. Run \`/spec/init\` to begin defining your project specification\n`);
|
|
48
57
|
}
|
|
49
58
|
}
|
|
50
59
|
catch (error) {
|
|
60
|
+
// Check if promptInit suggests switching to install mode
|
|
61
|
+
if (error instanceof Error && error.message === 'SWITCH_TO_INSTALL') {
|
|
62
|
+
// Run install command instead
|
|
63
|
+
console.log('\n🔄 Switching to install mode...\n');
|
|
64
|
+
await runInstall();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
51
67
|
console.error(`\n❌ Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
52
68
|
process.exit(1);
|
|
53
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAEhE,gCAAgC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFpE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { installTemplate } from '../lib/copy-template.js';
|
|
3
|
+
import { promptInstall } from '../lib/prompts.js';
|
|
4
|
+
import { openInCursor } from '../lib/workspace.js';
|
|
5
|
+
import { isRunningInCursor } from '../lib/cursor-detection.js';
|
|
6
|
+
import { runDetection } from '../lib/detection.js';
|
|
7
|
+
import { createSpecForExistingProject } from '../lib/install-existing.js';
|
|
8
|
+
import { updateVersionFile, getPackageVersion } from '../lib/version-check.js';
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
/**
|
|
11
|
+
* Installs SDD system to an existing project
|
|
12
|
+
*/
|
|
13
|
+
export async function runInstall(projectPath) {
|
|
14
|
+
console.log('🔧 Spec-Driven Development Installer\n');
|
|
15
|
+
// Get current working directory
|
|
16
|
+
const cwd = process.cwd();
|
|
17
|
+
// Use provided path or current directory
|
|
18
|
+
const initialPath = projectPath ? path.resolve(cwd, projectPath) : cwd;
|
|
19
|
+
try {
|
|
20
|
+
// Prompt for installation options
|
|
21
|
+
const answers = await promptInstall(initialPath);
|
|
22
|
+
// Resolve final project path
|
|
23
|
+
const finalProjectPath = path.resolve(cwd, answers.projectPath);
|
|
24
|
+
// Check if project path exists
|
|
25
|
+
if (!(await fs.pathExists(finalProjectPath))) {
|
|
26
|
+
console.error(`\n❌ Error: Directory "${finalProjectPath}" does not exist.`);
|
|
27
|
+
console.error(' Please provide a valid project path.\n');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
// Install template with backup/merge strategy
|
|
31
|
+
console.log(`\n📦 Installing SDD system to "${answers.projectPath}"...`);
|
|
32
|
+
await installTemplate(finalProjectPath, answers.backupStrategy);
|
|
33
|
+
// Install spec/ and work/ folders if requested
|
|
34
|
+
if (answers.installSpecFolders) {
|
|
35
|
+
// Already done by installTemplate, but check if spec/00-root-spec.md should be created
|
|
36
|
+
if (answers.createRootSpec) {
|
|
37
|
+
await createSpecForExistingProject(finalProjectPath);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Create .sdd/ folder and initialize version
|
|
41
|
+
const sddPath = path.join(finalProjectPath, '.sdd');
|
|
42
|
+
await fs.ensureDir(sddPath);
|
|
43
|
+
const packageVersion = await getPackageVersion();
|
|
44
|
+
await updateVersionFile(finalProjectPath, packageVersion);
|
|
45
|
+
// Create install-info.json
|
|
46
|
+
const installInfoPath = path.join(sddPath, 'install-info.json');
|
|
47
|
+
const installInfo = {
|
|
48
|
+
version: packageVersion,
|
|
49
|
+
installed_date: new Date().toISOString().split('T')[0],
|
|
50
|
+
installed_by: 'cli',
|
|
51
|
+
installation_type: 'existing',
|
|
52
|
+
};
|
|
53
|
+
await fs.writeJson(installInfoPath, installInfo, { spaces: 2 });
|
|
54
|
+
// Initialize detection cache if requested
|
|
55
|
+
if (answers.initializeDetection) {
|
|
56
|
+
console.log('🔍 Running project detection...');
|
|
57
|
+
const detectionResults = await runDetection(finalProjectPath);
|
|
58
|
+
const detectionCachePath = path.join(sddPath, 'detection-cache.json');
|
|
59
|
+
await fs.writeJson(detectionCachePath, detectionResults, { spaces: 2 });
|
|
60
|
+
console.log(` Detected: ${detectionResults.projectType} (${detectionResults.projectSize})`);
|
|
61
|
+
if (detectionResults.technologies.length > 0) {
|
|
62
|
+
console.log(` Technologies: ${detectionResults.technologies.join(', ')}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Open in Cursor if requested (and not already in Cursor)
|
|
66
|
+
if (answers.openInCursor) {
|
|
67
|
+
await openInCursor(finalProjectPath);
|
|
68
|
+
}
|
|
69
|
+
// Success message
|
|
70
|
+
console.log('\n✅ SDD system installed successfully!\n');
|
|
71
|
+
console.log('Next steps:');
|
|
72
|
+
if (!isRunningInCursor()) {
|
|
73
|
+
console.log(' 1. Open the project in Cursor');
|
|
74
|
+
}
|
|
75
|
+
if (answers.createRootSpec) {
|
|
76
|
+
console.log(` ${isRunningInCursor() ? '1' : '2'}. Review and update spec/00-root-spec.md for your existing project`);
|
|
77
|
+
console.log(` ${isRunningInCursor() ? '2' : '3'}. Run \`/spec/init\` to begin defining your project specification\n`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log(` ${isRunningInCursor() ? '1' : '2'}. Run \`/spec/init\` to begin defining your project specification\n`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error(`\n❌ Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEnE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { checkVersion, updateVersionFile } from '../lib/version-check.js';
|
|
3
|
+
import { backupCursorFolder } from '../lib/backup-cursor.js';
|
|
4
|
+
import { installTemplate } from '../lib/copy-template.js';
|
|
5
|
+
import { runDetection } from '../lib/detection.js';
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
/**
|
|
8
|
+
* Updates SDD system in an existing installation
|
|
9
|
+
*/
|
|
10
|
+
export async function runUpdate(projectPath) {
|
|
11
|
+
console.log('🔄 Spec-Driven Development Updater\n');
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
const finalPath = projectPath ? path.resolve(cwd, projectPath) : cwd;
|
|
14
|
+
try {
|
|
15
|
+
// Check if .sdd folder exists (indicates SDD is installed)
|
|
16
|
+
const sddPath = path.join(finalPath, '.sdd');
|
|
17
|
+
if (!(await fs.pathExists(sddPath))) {
|
|
18
|
+
console.error(`\n❌ Error: SDD is not installed in this project.`);
|
|
19
|
+
console.error(' Run `spec install` to install SDD first.\n');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
// Check current version
|
|
23
|
+
const versionInfo = await checkVersion(finalPath);
|
|
24
|
+
if (!versionInfo.needsUpdate && versionInfo.currentVersion) {
|
|
25
|
+
console.log(`✓ SDD is already up to date (version ${versionInfo.currentVersion}).\n`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (versionInfo.currentVersion) {
|
|
29
|
+
console.log(`📊 Current version: ${versionInfo.currentVersion}`);
|
|
30
|
+
console.log(`📊 Latest version: ${versionInfo.latestVersion}\n`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(`📊 Installing SDD (version ${versionInfo.latestVersion})...\n`);
|
|
34
|
+
}
|
|
35
|
+
// Backup .cursor/ folder before update
|
|
36
|
+
console.log('💾 Backing up current .cursor/ folder...');
|
|
37
|
+
const backupPath = await backupCursorFolder(finalPath);
|
|
38
|
+
console.log(` Backed up to: ${path.basename(backupPath)}\n`);
|
|
39
|
+
// Update template files (using merge strategy to preserve user customizations)
|
|
40
|
+
console.log('📦 Updating SDD system files...');
|
|
41
|
+
await installTemplate(finalPath, 'merge');
|
|
42
|
+
// Update version file
|
|
43
|
+
await updateVersionFile(finalPath, versionInfo.latestVersion);
|
|
44
|
+
// Update install-info.json
|
|
45
|
+
const installInfoPath = path.join(sddPath, 'install-info.json');
|
|
46
|
+
let installInfo = {};
|
|
47
|
+
if (await fs.pathExists(installInfoPath)) {
|
|
48
|
+
try {
|
|
49
|
+
installInfo = await fs.readJson(installInfoPath);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Ignore read errors
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
installInfo.version = versionInfo.latestVersion;
|
|
56
|
+
installInfo.update_date = new Date().toISOString().split('T')[0];
|
|
57
|
+
await fs.writeJson(installInfoPath, installInfo, { spaces: 2 });
|
|
58
|
+
// Update detection cache
|
|
59
|
+
console.log('🔍 Updating detection cache...');
|
|
60
|
+
const detectionResults = await runDetection(finalPath);
|
|
61
|
+
const detectionCachePath = path.join(sddPath, 'detection-cache.json');
|
|
62
|
+
await fs.writeJson(detectionCachePath, detectionResults, { spaces: 2 });
|
|
63
|
+
console.log('\n✅ SDD system updated successfully!\n');
|
|
64
|
+
console.log(` Version: ${versionInfo.currentVersion || 'new'} → ${versionInfo.latestVersion}`);
|
|
65
|
+
console.log(` Backup: ${path.basename(backupPath)}\n`);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(`\n❌ Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { openInCursor } from '../lib/workspace.js';
|
|
3
|
+
import { isRunningInCursor } from '../lib/cursor-detection.js';
|
|
4
|
+
/**
|
|
5
|
+
* Opens a project in Cursor workspace
|
|
6
|
+
*/
|
|
7
|
+
export async function runWorkspace(projectPath) {
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
const finalPath = projectPath ? path.resolve(cwd, projectPath) : cwd;
|
|
10
|
+
if (isRunningInCursor()) {
|
|
11
|
+
console.log('\n✓ You are already in Cursor IDE.');
|
|
12
|
+
console.log(` Current directory: ${finalPath}\n`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
await openInCursor(finalPath, false); // Don't skip even if in Cursor (check is done above)
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAoB;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAErE,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,IAAI,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,qDAAqD;AAC7F,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { runInit } from './commands/init.js';
|
|
3
|
+
import { runInstall } from './commands/install.js';
|
|
4
|
+
import { runUpdate } from './commands/update.js';
|
|
5
|
+
import { runWorkspace } from './commands/workspace.js';
|
|
6
|
+
import { runHelp } from './commands/help.js';
|
|
3
7
|
const args = process.argv.slice(2);
|
|
4
|
-
if (args.length === 0
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
process.exit(1);
|
|
8
|
+
if (args.length === 0) {
|
|
9
|
+
// No command provided, show help
|
|
10
|
+
runHelp();
|
|
11
|
+
process.exit(0);
|
|
9
12
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
const command = args[0];
|
|
14
|
+
const projectPath = args[1]; // Optional project path for install/update/workspace
|
|
15
|
+
// Handle commands
|
|
16
|
+
switch (command) {
|
|
17
|
+
case 'init':
|
|
18
|
+
runInit().catch((error) => {
|
|
19
|
+
console.error('Fatal error:', error);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
});
|
|
22
|
+
break;
|
|
23
|
+
case 'install':
|
|
24
|
+
runInstall(projectPath).catch((error) => {
|
|
25
|
+
console.error('Fatal error:', error);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
break;
|
|
29
|
+
case 'update':
|
|
30
|
+
runUpdate(projectPath).catch((error) => {
|
|
31
|
+
console.error('Fatal error:', error);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
break;
|
|
35
|
+
case 'workspace':
|
|
36
|
+
runWorkspace(projectPath).catch((error) => {
|
|
37
|
+
console.error('Fatal error:', error);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|
|
40
|
+
break;
|
|
41
|
+
case 'help':
|
|
42
|
+
runHelp();
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
console.error(`Unknown command: ${command}\n`);
|
|
46
|
+
runHelp();
|
|
13
47
|
process.exit(1);
|
|
14
|
-
});
|
|
15
48
|
}
|
|
16
49
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,iCAAiC;IACjC,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,qDAAqD;AAElF,kBAAkB;AAClB,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,MAAM;QACT,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,SAAS;QACZ,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACtC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,QAAQ;QACX,SAAS,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,WAAW;QACd,YAAY,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,MAAM;QACT,OAAO,EAAE,CAAC;QACV,MAAM;IAER;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,IAAI,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a timestamp-based backup of the .cursor folder
|
|
3
|
+
* @param projectPath - Path to the project
|
|
4
|
+
* @returns Path to the backup directory
|
|
5
|
+
*/
|
|
6
|
+
export declare function backupCursorFolder(projectPath: string): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Checks if .cursor folder exists and has content
|
|
9
|
+
* @param projectPath - Path to the project
|
|
10
|
+
* @returns Object with hasCursorFolder and hasContent flags
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkCursorFolder(projectPath: string): Promise<{
|
|
13
|
+
hasCursorFolder: boolean;
|
|
14
|
+
hasContent: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=backup-cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-cursor.d.ts","sourceRoot":"","sources":["../../src/lib/backup-cursor.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7E;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,eAAe,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CA+BvH"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a timestamp-based backup of the .cursor folder
|
|
5
|
+
* @param projectPath - Path to the project
|
|
6
|
+
* @returns Path to the backup directory
|
|
7
|
+
*/
|
|
8
|
+
export async function backupCursorFolder(projectPath) {
|
|
9
|
+
const cursorPath = path.join(projectPath, '.cursor');
|
|
10
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_').split('.')[0];
|
|
11
|
+
const backupPath = path.join(cursorPath, `_backup_${timestamp}`);
|
|
12
|
+
// Ensure .cursor exists
|
|
13
|
+
if (!(await fs.pathExists(cursorPath))) {
|
|
14
|
+
throw new Error('.cursor folder does not exist');
|
|
15
|
+
}
|
|
16
|
+
// Create backup
|
|
17
|
+
await fs.copy(cursorPath, backupPath);
|
|
18
|
+
return backupPath;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Checks if .cursor folder exists and has content
|
|
22
|
+
* @param projectPath - Path to the project
|
|
23
|
+
* @returns Object with hasCursorFolder and hasContent flags
|
|
24
|
+
*/
|
|
25
|
+
export async function checkCursorFolder(projectPath) {
|
|
26
|
+
const cursorPath = path.join(projectPath, '.cursor');
|
|
27
|
+
if (!(await fs.pathExists(cursorPath))) {
|
|
28
|
+
return { hasCursorFolder: false, hasContent: false };
|
|
29
|
+
}
|
|
30
|
+
// Check if it has rules or commands
|
|
31
|
+
const rulesPath = path.join(cursorPath, 'rules');
|
|
32
|
+
const commandsPath = path.join(cursorPath, 'commands');
|
|
33
|
+
const hasRules = await fs.pathExists(rulesPath);
|
|
34
|
+
const hasCommands = await fs.pathExists(commandsPath);
|
|
35
|
+
let hasContent = false;
|
|
36
|
+
if (hasRules) {
|
|
37
|
+
const rulesFiles = await fs.readdir(rulesPath).catch(() => []);
|
|
38
|
+
if (rulesFiles.length > 0) {
|
|
39
|
+
hasContent = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (hasCommands && !hasContent) {
|
|
43
|
+
const commandsFiles = await fs.readdir(commandsPath).catch(() => []);
|
|
44
|
+
if (commandsFiles.length > 0) {
|
|
45
|
+
hasContent = true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { hasCursorFolder: true, hasContent };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=backup-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-cursor.js","sourceRoot":"","sources":["../../src/lib/backup-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,SAAS,EAAE,CAAC,CAAC;IAEjE,wBAAwB;IACxB,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,gBAAgB;IAChB,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEtC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAErD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,oCAAoC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAEtD,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copies the template directory to the destination
|
|
3
|
+
* @param destPath - Destination path
|
|
4
|
+
* @param allowOverwrite - Allow overwriting existing directory (for install mode)
|
|
3
5
|
*/
|
|
4
|
-
export declare function copyTemplate(destPath: string): Promise<void>;
|
|
6
|
+
export declare function copyTemplate(destPath: string, allowOverwrite?: boolean): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Installs template to existing project with backup/merge support
|
|
9
|
+
* @param projectPath - Path to the existing project
|
|
10
|
+
* @param backupStrategy - 'backup' or 'merge'
|
|
11
|
+
*/
|
|
12
|
+
export declare function installTemplate(projectPath: string, backupStrategy?: 'backup' | 'merge'): Promise<void>;
|
|
5
13
|
/**
|
|
6
14
|
* Creates the linear sync config file if mode is linear
|
|
7
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-template.d.ts","sourceRoot":"","sources":["../../src/lib/copy-template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copy-template.d.ts","sourceRoot":"","sources":["../../src/lib/copy-template.ts"],"names":[],"mappings":"AAgCA;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BnG;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,QAAQ,GAAG,OAAkB,GAC5C,OAAO,CAAC,IAAI,CAAC,CA4Ef;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E"}
|