@specsafe/cli 0.3.6 → 0.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/dist/commands/apply.d.ts +3 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +182 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/complete.d.ts.map +1 -1
- package/dist/commands/complete.js +4 -1
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/delta.d.ts +3 -0
- package/dist/commands/delta.d.ts.map +1 -0
- package/dist/commands/delta.js +82 -0
- package/dist/commands/delta.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +102 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/done.d.ts +3 -0
- package/dist/commands/done.d.ts.map +1 -0
- package/dist/commands/done.js +237 -0
- package/dist/commands/done.js.map +1 -0
- package/dist/commands/explore.d.ts +3 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +236 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/init-old.d.ts +3 -0
- package/dist/commands/init-old.d.ts.map +1 -0
- package/dist/commands/init-old.js +146 -0
- package/dist/commands/init-old.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +195 -43
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +332 -29
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/qa.d.ts.map +1 -1
- package/dist/commands/qa.js +37 -1
- package/dist/commands/qa.js.map +1 -1
- package/dist/commands/rules.d.ts.map +1 -1
- package/dist/commands/rules.js +182 -97
- package/dist/commands/rules.js.map +1 -1
- package/dist/commands/spec.d.ts.map +1 -1
- package/dist/commands/spec.js +257 -25
- package/dist/commands/spec.js.map +1 -1
- package/dist/commands/test-apply.d.ts +3 -0
- package/dist/commands/test-apply.d.ts.map +1 -0
- package/dist/commands/test-apply.js +228 -0
- package/dist/commands/test-apply.js.map +1 -0
- package/dist/commands/test-create.d.ts +3 -0
- package/dist/commands/test-create.d.ts.map +1 -0
- package/dist/commands/{test.js → test-create.js} +79 -30
- package/dist/commands/test-create.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +288 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/generateToolConfig.d.ts +1 -1
- package/dist/utils/generateToolConfig.d.ts.map +1 -1
- package/dist/utils/generateToolConfig.js +980 -209
- package/dist/utils/generateToolConfig.js.map +1 -1
- package/dist/utils/testRunner.d.ts +39 -0
- package/dist/utils/testRunner.d.ts.map +1 -0
- package/dist/utils/testRunner.js +325 -0
- package/dist/utils/testRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/commands/code.d.ts +0 -3
- package/dist/commands/code.d.ts.map +0 -1
- package/dist/commands/code.js +0 -53
- package/dist/commands/code.js.map +0 -1
- package/dist/commands/test.d.ts +0 -3
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js.map +0 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
5
|
+
import { ProjectTracker } from '@specsafe/core';
|
|
6
|
+
import { checkbox, select, confirm, input } from '@inquirer/prompts';
|
|
7
|
+
import { detectInstalledTools, availableTools } from '../utils/detectTools.js';
|
|
8
|
+
import { generateToolConfig, generateGitHooks } from '../utils/generateToolConfig.js';
|
|
9
|
+
export const initCommand = new Command('init')
|
|
10
|
+
.description('Initialize a new SpecSafe project')
|
|
11
|
+
.argument('[name]', 'Project name', 'my-project')
|
|
12
|
+
.action(async (defaultName) => {
|
|
13
|
+
const spinner = ora('Initializing SpecSafe project...').start();
|
|
14
|
+
try {
|
|
15
|
+
// Interactive prompts for project name
|
|
16
|
+
spinner.stop();
|
|
17
|
+
const name = await input({
|
|
18
|
+
message: 'Project name:',
|
|
19
|
+
default: defaultName,
|
|
20
|
+
});
|
|
21
|
+
// 1. Detect existing tools
|
|
22
|
+
const detectedTools = detectInstalledTools();
|
|
23
|
+
// 2. Prompt user to confirm/select tools
|
|
24
|
+
const toolChoices = availableTools.map((tool) => ({
|
|
25
|
+
name: tool.displayName + (detectedTools.includes(tool.name) ? ' (detected)' : ''),
|
|
26
|
+
value: tool.name,
|
|
27
|
+
checked: detectedTools.includes(tool.name),
|
|
28
|
+
}));
|
|
29
|
+
const selectedTools = await checkbox({
|
|
30
|
+
message: 'Which AI coding assistants do you use?',
|
|
31
|
+
choices: toolChoices,
|
|
32
|
+
});
|
|
33
|
+
// 3. Prompt for test framework
|
|
34
|
+
const testFramework = await select({
|
|
35
|
+
message: 'Select testing framework:',
|
|
36
|
+
choices: [
|
|
37
|
+
{ name: 'Vitest (recommended)', value: 'vitest' },
|
|
38
|
+
{ name: 'Jest', value: 'jest' },
|
|
39
|
+
{ name: 'Playwright (E2E)', value: 'playwright' },
|
|
40
|
+
],
|
|
41
|
+
default: 'vitest',
|
|
42
|
+
});
|
|
43
|
+
// 4. Prompt for git hooks
|
|
44
|
+
const useGitHooks = await confirm({
|
|
45
|
+
message: 'Enable git hooks for spec validation?',
|
|
46
|
+
default: true,
|
|
47
|
+
});
|
|
48
|
+
spinner.start('Creating project structure...');
|
|
49
|
+
// Create directory structure
|
|
50
|
+
await mkdir('specs/active', { recursive: true });
|
|
51
|
+
await mkdir('specs/completed', { recursive: true });
|
|
52
|
+
await mkdir('specs/archive', { recursive: true });
|
|
53
|
+
await mkdir('src', { recursive: true });
|
|
54
|
+
await mkdir('tests', { recursive: true });
|
|
55
|
+
// Create PROJECT_STATE.md
|
|
56
|
+
const tracker = new ProjectTracker(process.cwd());
|
|
57
|
+
await tracker.initialize(name);
|
|
58
|
+
// Create spec template
|
|
59
|
+
const template = `# Spec Template
|
|
60
|
+
|
|
61
|
+
## Metadata
|
|
62
|
+
- **ID**: SPEC-{YYYYMMDD}-{NNN}
|
|
63
|
+
- **Status**: draft
|
|
64
|
+
- **Priority**: P1
|
|
65
|
+
|
|
66
|
+
## 1. Purpose (WHY)
|
|
67
|
+
|
|
68
|
+
## 2. Scope (WHAT)
|
|
69
|
+
### In Scope
|
|
70
|
+
-
|
|
71
|
+
|
|
72
|
+
### Out of Scope
|
|
73
|
+
-
|
|
74
|
+
|
|
75
|
+
## 3. Requirements
|
|
76
|
+
| ID | Requirement | Priority | Acceptance Criteria |
|
|
77
|
+
|----|-------------|----------|---------------------|
|
|
78
|
+
| | | | |
|
|
79
|
+
|
|
80
|
+
## 4. Technical Approach (HOW)
|
|
81
|
+
|
|
82
|
+
## 5. Test Strategy
|
|
83
|
+
|
|
84
|
+
## 6. Implementation Plan
|
|
85
|
+
|
|
86
|
+
## 7. Success Criteria
|
|
87
|
+
- [ ]
|
|
88
|
+
|
|
89
|
+
## 8. Risks & Mitigations
|
|
90
|
+
|
|
91
|
+
## 9. Notes & References
|
|
92
|
+
`;
|
|
93
|
+
await writeFile('specs/template.md', template);
|
|
94
|
+
// Create config file with selected tools
|
|
95
|
+
const toolsConfig = {};
|
|
96
|
+
for (const tool of selectedTools) {
|
|
97
|
+
toolsConfig[tool] = { enabled: true };
|
|
98
|
+
}
|
|
99
|
+
const config = {
|
|
100
|
+
project: name,
|
|
101
|
+
version: '1.0.0',
|
|
102
|
+
stages: ['spec', 'test', 'code', 'qa', 'complete'],
|
|
103
|
+
testFramework,
|
|
104
|
+
language: 'typescript',
|
|
105
|
+
tools: toolsConfig,
|
|
106
|
+
gitHooks: {
|
|
107
|
+
enabled: useGitHooks,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
await writeFile('specsafe.config.json', JSON.stringify(config, null, 2));
|
|
111
|
+
spinner.text = 'Generating tool configurations...';
|
|
112
|
+
// Generate tool configs for selected tools
|
|
113
|
+
for (const tool of selectedTools) {
|
|
114
|
+
await generateToolConfig(tool, '.');
|
|
115
|
+
}
|
|
116
|
+
// Generate git hooks if enabled
|
|
117
|
+
if (useGitHooks) {
|
|
118
|
+
await generateGitHooks('.');
|
|
119
|
+
}
|
|
120
|
+
spinner.succeed(chalk.green(`Initialized SpecSafe project: ${name}`));
|
|
121
|
+
console.log('\n' + chalk.blue('Generated configurations:'));
|
|
122
|
+
for (const tool of selectedTools) {
|
|
123
|
+
console.log(chalk.green(` ✓ ${tool} configuration`));
|
|
124
|
+
}
|
|
125
|
+
if (useGitHooks) {
|
|
126
|
+
console.log(chalk.green(' ✓ Git hooks enabled'));
|
|
127
|
+
}
|
|
128
|
+
console.log(chalk.green(` ✓ ${testFramework} configuration`));
|
|
129
|
+
console.log('\n' + chalk.blue('Next steps:'));
|
|
130
|
+
console.log(' 1. specsafe new <spec-name> - Create a new spec');
|
|
131
|
+
console.log(' 2. specsafe status - View project status');
|
|
132
|
+
console.log(' 3. Edit specs/active/ to define requirements');
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
spinner.fail(chalk.red(`Failed to initialize: ${error.message}`));
|
|
136
|
+
if (error.message.includes('EEXIST')) {
|
|
137
|
+
console.log(chalk.gray("💡 Tip: Directory already exists. Use 'specsafe init <name>' to create elsewhere."));
|
|
138
|
+
}
|
|
139
|
+
if (error.message.includes('User force closed')) {
|
|
140
|
+
console.log(chalk.gray('💡 Tip: Init was cancelled by user.'));
|
|
141
|
+
process.exit(0);
|
|
142
|
+
}
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=init-old.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-old.js","sourceRoot":"","sources":["../../src/commands/init-old.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,eAAO,MAAM,WAAW,SA4PpB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,15 +1,78 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
-
import { writeFile, mkdir } from 'fs/promises';
|
|
5
|
-
import {
|
|
4
|
+
import { writeFile, mkdir, access, chmod } from 'fs/promises';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { join, dirname } from 'path';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import { ProjectTracker, getSupportedAgents, getAgent, AGENT_DEFINITIONS } from '@specsafe/core';
|
|
6
9
|
import { checkbox, select, confirm, input } from '@inquirer/prompts';
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Detect which agents are already configured in the project
|
|
12
|
+
*/
|
|
13
|
+
async function detectConfiguredAgents(projectDir) {
|
|
14
|
+
const detected = [];
|
|
15
|
+
for (const agentDef of AGENT_DEFINITIONS) {
|
|
16
|
+
for (const file of agentDef.detectionFiles) {
|
|
17
|
+
const filePath = join(projectDir, file);
|
|
18
|
+
try {
|
|
19
|
+
await access(filePath);
|
|
20
|
+
detected.push(agentDef.id);
|
|
21
|
+
break; // Found one file, that's enough
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// File doesn't exist, continue
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return detected;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate configurations for selected agents
|
|
32
|
+
*/
|
|
33
|
+
async function generateAgentConfigs(agents, projectDir, projectName) {
|
|
34
|
+
for (const agentId of agents) {
|
|
35
|
+
const agentEntry = getAgent(agentId);
|
|
36
|
+
if (!agentEntry) {
|
|
37
|
+
console.warn(chalk.yellow(`Warning: Agent ${agentId} not found in registry`));
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
// Generate main config files
|
|
42
|
+
const configFiles = await agentEntry.adapter.generateConfig(projectDir, {
|
|
43
|
+
projectName,
|
|
44
|
+
});
|
|
45
|
+
// Generate command files
|
|
46
|
+
const commandFiles = await agentEntry.adapter.generateCommands(projectDir, {
|
|
47
|
+
projectName,
|
|
48
|
+
});
|
|
49
|
+
const allFiles = [...configFiles, ...commandFiles];
|
|
50
|
+
// Write files
|
|
51
|
+
for (const file of allFiles) {
|
|
52
|
+
const filePath = join(projectDir, file.path);
|
|
53
|
+
const fileDir = dirname(filePath);
|
|
54
|
+
// Create directory if needed (mkdir recursive is idempotent, no need to check existsSync)
|
|
55
|
+
await mkdir(fileDir, { recursive: true });
|
|
56
|
+
// Skip if file exists
|
|
57
|
+
if (existsSync(filePath)) {
|
|
58
|
+
console.log(chalk.yellow(` ⚠ ${file.path} already exists, skipping`));
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Write file
|
|
62
|
+
await writeFile(filePath, file.content);
|
|
63
|
+
console.log(chalk.green(` ✓ Created ${file.path}`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error(chalk.red(` ✗ Failed to generate ${agentId} config: ${error.message}`));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
9
71
|
export const initCommand = new Command('init')
|
|
10
72
|
.description('Initialize a new SpecSafe project')
|
|
11
73
|
.argument('[name]', 'Project name', 'my-project')
|
|
12
|
-
.
|
|
74
|
+
.option('--agent <agents...>', 'AI coding agents to configure (can be repeated)')
|
|
75
|
+
.action(async (defaultName, options) => {
|
|
13
76
|
const spinner = ora('Initializing SpecSafe project...').start();
|
|
14
77
|
try {
|
|
15
78
|
// Interactive prompts for project name
|
|
@@ -18,19 +81,61 @@ export const initCommand = new Command('init')
|
|
|
18
81
|
message: 'Project name:',
|
|
19
82
|
default: defaultName,
|
|
20
83
|
});
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
84
|
+
const projectDir = process.cwd();
|
|
85
|
+
// 1. Determine which agents to configure
|
|
86
|
+
let selectedAgents = [];
|
|
87
|
+
if (options.agent && options.agent.length > 0) {
|
|
88
|
+
// Agents specified via CLI flag - validate each one
|
|
89
|
+
const supportedAgents = getSupportedAgents();
|
|
90
|
+
const invalidAgents = options.agent.filter(id => !supportedAgents.includes(id));
|
|
91
|
+
if (invalidAgents.length > 0) {
|
|
92
|
+
console.error(chalk.red(`Error: Invalid agent(s): ${invalidAgents.join(', ')}`));
|
|
93
|
+
console.log(chalk.gray(`\nSupported agents: ${supportedAgents.join(', ')}`));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
selectedAgents = options.agent;
|
|
97
|
+
console.log(chalk.blue(`Using agents from CLI: ${selectedAgents.join(', ')}`));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Auto-detect or prompt
|
|
101
|
+
const detectedAgents = await detectConfiguredAgents(projectDir);
|
|
102
|
+
if (detectedAgents.length > 0) {
|
|
103
|
+
console.log(chalk.green(`Detected agents: ${detectedAgents.join(', ')}`));
|
|
104
|
+
const useDetected = await confirm({
|
|
105
|
+
message: 'Use detected agents?',
|
|
106
|
+
default: true,
|
|
107
|
+
});
|
|
108
|
+
if (useDetected) {
|
|
109
|
+
selectedAgents = detectedAgents;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (selectedAgents.length === 0) {
|
|
113
|
+
// Prompt user to select
|
|
114
|
+
const agentChoices = AGENT_DEFINITIONS.map((agent) => ({
|
|
115
|
+
name: agent.name,
|
|
116
|
+
value: agent.id,
|
|
117
|
+
checked: detectedAgents.includes(agent.id),
|
|
118
|
+
}));
|
|
119
|
+
selectedAgents = await checkbox({
|
|
120
|
+
message: 'Which AI coding agents do you use?',
|
|
121
|
+
choices: agentChoices,
|
|
122
|
+
required: false,
|
|
123
|
+
});
|
|
124
|
+
// Default to all if none selected
|
|
125
|
+
if (selectedAgents.length === 0) {
|
|
126
|
+
const useAll = await confirm({
|
|
127
|
+
message: 'No agents selected. Generate configs for all supported agents?',
|
|
128
|
+
default: false,
|
|
129
|
+
});
|
|
130
|
+
if (useAll) {
|
|
131
|
+
// Filter to only agents that have registered adapters
|
|
132
|
+
selectedAgents = getSupportedAgents().filter(id => getAgent(id) !== undefined);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// 2. Prompt for test framework
|
|
138
|
+
spinner.stop();
|
|
34
139
|
const testFramework = await select({
|
|
35
140
|
message: 'Select testing framework:',
|
|
36
141
|
choices: [
|
|
@@ -40,20 +145,22 @@ export const initCommand = new Command('init')
|
|
|
40
145
|
],
|
|
41
146
|
default: 'vitest',
|
|
42
147
|
});
|
|
43
|
-
//
|
|
148
|
+
// 3. Prompt for git hooks
|
|
44
149
|
const useGitHooks = await confirm({
|
|
45
150
|
message: 'Enable git hooks for spec validation?',
|
|
46
151
|
default: true,
|
|
47
152
|
});
|
|
48
153
|
spinner.start('Creating project structure...');
|
|
49
|
-
// Create directory structure
|
|
50
|
-
await mkdir('specs/active', { recursive: true });
|
|
51
|
-
await mkdir('specs/completed', { recursive: true });
|
|
52
|
-
await mkdir('specs/archive', { recursive: true });
|
|
53
|
-
await mkdir('
|
|
54
|
-
await mkdir('
|
|
154
|
+
// Create directory structure (relative to projectDir)
|
|
155
|
+
await mkdir(join(projectDir, 'specs/active'), { recursive: true });
|
|
156
|
+
await mkdir(join(projectDir, 'specs/completed'), { recursive: true });
|
|
157
|
+
await mkdir(join(projectDir, 'specs/archive'), { recursive: true });
|
|
158
|
+
await mkdir(join(projectDir, 'specs/drafts'), { recursive: true });
|
|
159
|
+
await mkdir(join(projectDir, 'specs/exploration'), { recursive: true });
|
|
160
|
+
await mkdir(join(projectDir, 'src'), { recursive: true });
|
|
161
|
+
await mkdir(join(projectDir, 'tests'), { recursive: true });
|
|
55
162
|
// Create PROJECT_STATE.md
|
|
56
|
-
const tracker = new ProjectTracker(
|
|
163
|
+
const tracker = new ProjectTracker(projectDir);
|
|
57
164
|
await tracker.initialize(name);
|
|
58
165
|
// Create spec template
|
|
59
166
|
const template = `# Spec Template
|
|
@@ -90,37 +197,71 @@ export const initCommand = new Command('init')
|
|
|
90
197
|
|
|
91
198
|
## 9. Notes & References
|
|
92
199
|
`;
|
|
93
|
-
await writeFile('specs/template.md', template);
|
|
94
|
-
// Create config file with selected
|
|
95
|
-
const
|
|
96
|
-
for (const
|
|
97
|
-
|
|
200
|
+
await writeFile(join(projectDir, 'specs/template.md'), template);
|
|
201
|
+
// Create config file with selected agents
|
|
202
|
+
const agentsConfig = {};
|
|
203
|
+
for (const agentId of selectedAgents) {
|
|
204
|
+
agentsConfig[agentId] = { enabled: true };
|
|
98
205
|
}
|
|
99
206
|
const config = {
|
|
100
207
|
project: name,
|
|
101
208
|
version: '1.0.0',
|
|
102
|
-
stages: ['spec', 'test', '
|
|
209
|
+
stages: ['explore', 'draft', 'spec', 'test-create', 'test-apply', 'verify', 'complete'],
|
|
103
210
|
testFramework,
|
|
104
211
|
language: 'typescript',
|
|
105
|
-
|
|
212
|
+
agents: agentsConfig,
|
|
106
213
|
gitHooks: {
|
|
107
214
|
enabled: useGitHooks,
|
|
108
215
|
},
|
|
109
216
|
};
|
|
110
|
-
await writeFile('specsafe.config.json', JSON.stringify(config, null, 2));
|
|
111
|
-
spinner.text = 'Generating
|
|
112
|
-
// Generate
|
|
113
|
-
|
|
114
|
-
await generateToolConfig(tool, '.');
|
|
115
|
-
}
|
|
217
|
+
await writeFile(join(projectDir, 'specsafe.config.json'), JSON.stringify(config, null, 2));
|
|
218
|
+
spinner.text = 'Generating agent configurations...';
|
|
219
|
+
// Generate configs for selected agents
|
|
220
|
+
await generateAgentConfigs(selectedAgents, projectDir, name);
|
|
116
221
|
// Generate git hooks if enabled
|
|
117
222
|
if (useGitHooks) {
|
|
118
|
-
|
|
223
|
+
const hooksDir = join(projectDir, '.githooks');
|
|
224
|
+
await mkdir(hooksDir, { recursive: true });
|
|
225
|
+
const preCommitPath = join(hooksDir, 'pre-commit');
|
|
226
|
+
if (!existsSync(preCommitPath)) {
|
|
227
|
+
const preCommitContent = `#!/bin/bash
|
|
228
|
+
# SpecSafe pre-commit hook v1.0
|
|
229
|
+
set -e
|
|
230
|
+
|
|
231
|
+
echo "Running SpecSafe pre-commit checks..."
|
|
232
|
+
|
|
233
|
+
# Check PROJECT_STATE.md exists
|
|
234
|
+
if [ ! -f "PROJECT_STATE.md" ]; then
|
|
235
|
+
echo "PROJECT_STATE.md not found."
|
|
236
|
+
exit 1
|
|
237
|
+
fi
|
|
238
|
+
|
|
239
|
+
# Run specsafe doctor if available
|
|
240
|
+
if command -v specsafe >/dev/null 2>&1; then
|
|
241
|
+
specsafe doctor --silent || true
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
echo "Pre-commit checks passed"
|
|
245
|
+
exit 0
|
|
246
|
+
`;
|
|
247
|
+
await writeFile(preCommitPath, preCommitContent);
|
|
248
|
+
// Make the hook executable
|
|
249
|
+
await chmod(preCommitPath, 0o755);
|
|
250
|
+
// Configure git to use .githooks directory
|
|
251
|
+
try {
|
|
252
|
+
execSync('git config --local core.hooksPath .githooks', { cwd: projectDir });
|
|
253
|
+
console.log(chalk.green(' ✓ Created .githooks/pre-commit'));
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
console.log(chalk.yellow(' ⚠ Created .githooks/pre-commit (run: git config --local core.hooksPath .githooks)'));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
119
259
|
}
|
|
120
260
|
spinner.succeed(chalk.green(`Initialized SpecSafe project: ${name}`));
|
|
121
261
|
console.log('\n' + chalk.blue('Generated configurations:'));
|
|
122
|
-
for (const
|
|
123
|
-
|
|
262
|
+
for (const agentId of selectedAgents) {
|
|
263
|
+
const agentDef = AGENT_DEFINITIONS.find((a) => a.id === agentId);
|
|
264
|
+
console.log(chalk.green(` ✓ ${agentDef?.name || agentId}`));
|
|
124
265
|
}
|
|
125
266
|
if (useGitHooks) {
|
|
126
267
|
console.log(chalk.green(' ✓ Git hooks enabled'));
|
|
@@ -130,11 +271,22 @@ export const initCommand = new Command('init')
|
|
|
130
271
|
console.log(' 1. specsafe new <spec-name> - Create a new spec');
|
|
131
272
|
console.log(' 2. specsafe status - View project status');
|
|
132
273
|
console.log(' 3. Edit specs/active/ to define requirements');
|
|
274
|
+
if (selectedAgents.length > 0) {
|
|
275
|
+
console.log('\n' + chalk.blue('Agent commands:'));
|
|
276
|
+
for (const agentId of selectedAgents.slice(0, 3)) {
|
|
277
|
+
const agentEntry = getAgent(agentId);
|
|
278
|
+
if (agentEntry) {
|
|
279
|
+
// Use regex for whole-word replacement
|
|
280
|
+
const cmdFormat = agentEntry.commandFormat.replace(/\bcommand\b/, 'specsafe');
|
|
281
|
+
console.log(` ${agentEntry.name}: ${cmdFormat}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
133
285
|
}
|
|
134
286
|
catch (error) {
|
|
135
287
|
spinner.fail(chalk.red(`Failed to initialize: ${error.message}`));
|
|
136
288
|
if (error.message.includes('EEXIST')) {
|
|
137
|
-
console.log(chalk.gray("💡 Tip: Directory already exists.
|
|
289
|
+
console.log(chalk.gray("💡 Tip: Directory already exists."));
|
|
138
290
|
}
|
|
139
291
|
if (error.message.includes('User force closed')) {
|
|
140
292
|
console.log(chalk.gray('💡 Tip: Init was cancelled by user.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,SAgdnB,CAAC"}
|