@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.
Files changed (98) hide show
  1. package/dist/commands/help.d.ts +5 -0
  2. package/dist/commands/help.d.ts.map +1 -0
  3. package/dist/commands/help.js +23 -0
  4. package/dist/commands/help.js.map +1 -0
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +30 -14
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/install.d.ts +5 -0
  9. package/dist/commands/install.d.ts.map +1 -0
  10. package/dist/commands/install.js +88 -0
  11. package/dist/commands/install.js.map +1 -0
  12. package/dist/commands/update.d.ts +5 -0
  13. package/dist/commands/update.d.ts.map +1 -0
  14. package/dist/commands/update.js +72 -0
  15. package/dist/commands/update.js.map +1 -0
  16. package/dist/commands/workspace.d.ts +5 -0
  17. package/dist/commands/workspace.d.ts.map +1 -0
  18. package/dist/commands/workspace.js +17 -0
  19. package/dist/commands/workspace.js.map +1 -0
  20. package/dist/index.js +42 -9
  21. package/dist/index.js.map +1 -1
  22. package/dist/lib/backup-cursor.d.ts +16 -0
  23. package/dist/lib/backup-cursor.d.ts.map +1 -0
  24. package/dist/lib/backup-cursor.js +50 -0
  25. package/dist/lib/backup-cursor.js.map +1 -0
  26. package/dist/lib/copy-template.d.ts +9 -1
  27. package/dist/lib/copy-template.d.ts.map +1 -1
  28. package/dist/lib/copy-template.js +94 -3
  29. package/dist/lib/copy-template.js.map +1 -1
  30. package/dist/lib/cursor-detection.d.ts +6 -0
  31. package/dist/lib/cursor-detection.d.ts.map +1 -0
  32. package/dist/lib/cursor-detection.js +31 -0
  33. package/dist/lib/cursor-detection.js.map +1 -0
  34. package/dist/lib/detection.d.ts +25 -0
  35. package/dist/lib/detection.d.ts.map +1 -0
  36. package/dist/lib/detection.js +186 -0
  37. package/dist/lib/detection.js.map +1 -0
  38. package/dist/lib/install-existing.d.ts +6 -0
  39. package/dist/lib/install-existing.d.ts.map +1 -0
  40. package/dist/lib/install-existing.js +63 -0
  41. package/dist/lib/install-existing.js.map +1 -0
  42. package/dist/lib/project-name.d.ts +7 -0
  43. package/dist/lib/project-name.d.ts.map +1 -0
  44. package/dist/lib/project-name.js +13 -0
  45. package/dist/lib/project-name.js.map +1 -0
  46. package/dist/lib/prompts.d.ts +6 -5
  47. package/dist/lib/prompts.d.ts.map +1 -1
  48. package/dist/lib/prompts.js +114 -0
  49. package/dist/lib/prompts.js.map +1 -1
  50. package/dist/lib/version-check.d.ts +21 -0
  51. package/dist/lib/version-check.d.ts.map +1 -0
  52. package/dist/lib/version-check.js +49 -0
  53. package/dist/lib/version-check.js.map +1 -0
  54. package/dist/lib/workspace.d.ts +7 -0
  55. package/dist/lib/workspace.d.ts.map +1 -0
  56. package/dist/lib/workspace.js +38 -0
  57. package/dist/lib/workspace.js.map +1 -0
  58. package/dist/types.d.ts +32 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +2 -2
  63. package/template/.cursor/commands/_shared/activation.md +220 -0
  64. package/template/.cursor/commands/_shared/coderabbit-integration.md +278 -0
  65. package/template/.cursor/commands/_shared/command-stacks.md +124 -0
  66. package/template/.cursor/commands/_shared/deployment-detection.md +294 -0
  67. package/template/.cursor/commands/_shared/detection.md +277 -0
  68. package/template/.cursor/commands/_shared/documentation-lookup.md +321 -0
  69. package/template/.cursor/commands/_shared/git-workflow.md +288 -0
  70. package/template/.cursor/commands/_shared/github-helpers.md +337 -0
  71. package/template/.cursor/commands/_shared/github-workflows.md +351 -0
  72. package/template/.cursor/commands/_shared/helper-metadata.md +481 -0
  73. package/template/.cursor/commands/_shared/linear-automation.md +388 -0
  74. package/template/.cursor/commands/_shared/linear-helpers.md +254 -0
  75. package/template/.cursor/commands/_shared/performance-monitoring.md +369 -0
  76. package/template/.cursor/commands/_shared/pr-description.md +279 -0
  77. package/template/.cursor/commands/_shared/retrospective-spec-creation.md +977 -0
  78. package/template/.cursor/commands/_shared/scaling.md +264 -0
  79. package/template/.cursor/commands/_shared/state-assertions.md +174 -0
  80. package/template/.cursor/commands/_shared/test-automation.md +388 -0
  81. package/template/.cursor/commands/_shared/verification-checkpoints.md +145 -0
  82. package/template/.cursor/commands/spec/audit.md +240 -0
  83. package/template/.cursor/commands/spec/evolve.md +163 -0
  84. package/template/.cursor/commands/spec/sync.md +196 -0
  85. package/template/.cursor/commands/tools/refactor.md +555 -0
  86. package/template/.cursor/rules/10-engineering.mdc +149 -0
  87. package/template/.cursor/rules/11-design.mdc +129 -0
  88. package/template/.cursor/rules/12-business.mdc +132 -0
  89. package/template/.cursor/rules/20-nextjs.mdc +146 -0
  90. package/template/.cursor/rules/21-api-design.mdc +176 -0
  91. package/template/.cursor/rules/30-database.mdc +183 -0
  92. package/template/.cursor/rules/31-testing.mdc +191 -0
  93. package/template/.cursor/scripts/validate-helpers.js +254 -0
  94. package/template/.sdd/detection-cache.json +1 -0
  95. package/template/.sdd/install-info.json +1 -0
  96. package/template/.sdd/version +1 -0
  97. package/template/spec/00-root-spec.md +8 -1
  98. package/template/work/backlog/tasks.local.md +92 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Displays help information for the CLI
3
+ */
4
+ export declare function runHelp(): void;
5
+ //# sourceMappingURL=help.d.ts.map
@@ -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":"AAMA;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAmD7C"}
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"}
@@ -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
- console.log(' 2. Open the project in Cursor');
48
+ if (!isRunningInCursor()) {
49
+ console.log(' 2. Open the project in Cursor');
50
+ }
42
51
  if (answers.taskMode === 'linear') {
43
- console.log(' 3. Configure Linear MCP in Cursor (see .cursor/MCP-SETUP.md if needed)');
44
- console.log(' 4. Run `/spec/init` to begin defining your project specification\n');
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(' 3. Run `/spec/init` to begin defining your project specification\n');
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,6BAA6B;IAC7B,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAExD,8BAA8B;IAC9B,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,WAAW,mBAAmB,CAAC,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,WAAW,MAAM,CAAC,CAAC;QACpE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE7B,iCAAiC;QACjC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Installs SDD system to an existing project
3
+ */
4
+ export declare function runInstall(projectPath?: string): Promise<void>;
5
+ //# sourceMappingURL=install.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Updates SDD system in an existing installation
3
+ */
4
+ export declare function runUpdate(projectPath?: string): Promise<void>;
5
+ //# sourceMappingURL=update.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Opens a project in Cursor workspace
3
+ */
4
+ export declare function runWorkspace(projectPath?: string): Promise<void>;
5
+ //# sourceMappingURL=workspace.d.ts.map
@@ -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 || args[0] !== 'init') {
5
- console.log('Spec-Driven Development CLI\n');
6
- console.log('Usage:');
7
- console.log(' spec init Initialize a new SDD project\n');
8
- process.exit(1);
8
+ if (args.length === 0) {
9
+ // No command provided, show help
10
+ runHelp();
11
+ process.exit(0);
9
12
  }
10
- if (args[0] === 'init') {
11
- runInit().catch((error) => {
12
- console.error('Fatal error:', error);
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;IAC5C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,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":"AA+BA;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAclE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E"}
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"}