@specsafe/cli 0.8.0 → 2.0.2
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/README.md +100 -279
- package/canonical/personas/bolt-zane.md +29 -0
- package/canonical/personas/forge-reva.md +29 -0
- package/canonical/personas/herald-cass.md +30 -0
- package/canonical/personas/mason-kai.md +30 -0
- package/canonical/personas/scout-elena.md +27 -0
- package/canonical/personas/warden-lyra.md +30 -0
- package/canonical/rules/.cursorrules.mdc +53 -0
- package/canonical/rules/.rules +48 -0
- package/canonical/rules/AGENTS.md +48 -0
- package/canonical/rules/CLAUDE.md +48 -0
- package/canonical/rules/CONVENTIONS.md +41 -0
- package/canonical/rules/GEMINI.md +50 -0
- package/canonical/rules/continue-config.yaml +5 -0
- package/canonical/skills/specsafe-archive/SKILL.md +63 -0
- package/canonical/skills/specsafe-code/SKILL.md +7 -0
- package/canonical/skills/specsafe-code/workflow.md +212 -0
- package/canonical/skills/specsafe-complete/SKILL.md +7 -0
- package/canonical/skills/specsafe-complete/workflow.md +130 -0
- package/canonical/skills/specsafe-doctor/SKILL.md +103 -0
- package/canonical/skills/specsafe-explore/SKILL.md +7 -0
- package/canonical/skills/specsafe-explore/workflow.md +100 -0
- package/canonical/skills/specsafe-init/SKILL.md +119 -0
- package/canonical/skills/specsafe-new/SKILL.md +7 -0
- package/canonical/skills/specsafe-new/workflow.md +156 -0
- package/canonical/skills/specsafe-qa/SKILL.md +7 -0
- package/canonical/skills/specsafe-qa/workflow.md +223 -0
- package/canonical/skills/specsafe-spec/SKILL.md +7 -0
- package/canonical/skills/specsafe-spec/workflow.md +158 -0
- package/canonical/skills/specsafe-status/SKILL.md +77 -0
- package/canonical/skills/specsafe-test/SKILL.md +7 -0
- package/canonical/skills/specsafe-test/workflow.md +210 -0
- package/canonical/skills/specsafe-verify/SKILL.md +7 -0
- package/canonical/skills/specsafe-verify/workflow.md +143 -0
- package/canonical/templates/project-state-template.md +33 -0
- package/canonical/templates/qa-report-template.md +55 -0
- package/canonical/templates/spec-template.md +52 -0
- package/canonical/templates/specsafe-config-template.json +10 -0
- package/generators/dist/adapters/aider.d.ts +2 -0
- package/generators/dist/adapters/aider.js +23 -0
- package/generators/dist/adapters/aider.js.map +1 -0
- package/generators/dist/adapters/antigravity.d.ts +2 -0
- package/generators/dist/adapters/antigravity.js +33 -0
- package/generators/dist/adapters/antigravity.js.map +1 -0
- package/generators/dist/adapters/claude-code.d.ts +2 -0
- package/generators/dist/adapters/claude-code.js +31 -0
- package/generators/dist/adapters/claude-code.js.map +1 -0
- package/generators/dist/adapters/continue.d.ts +2 -0
- package/generators/dist/adapters/continue.js +33 -0
- package/generators/dist/adapters/continue.js.map +1 -0
- package/generators/dist/adapters/cursor.d.ts +2 -0
- package/generators/dist/adapters/cursor.js +32 -0
- package/generators/dist/adapters/cursor.js.map +1 -0
- package/generators/dist/adapters/gemini.d.ts +2 -0
- package/generators/dist/adapters/gemini.js +36 -0
- package/generators/dist/adapters/gemini.js.map +1 -0
- package/generators/dist/adapters/index.d.ts +13 -0
- package/generators/dist/adapters/index.js +29 -0
- package/generators/dist/adapters/index.js.map +1 -0
- package/generators/dist/adapters/opencode.d.ts +2 -0
- package/generators/dist/adapters/opencode.js +32 -0
- package/generators/dist/adapters/opencode.js.map +1 -0
- package/generators/dist/adapters/types.d.ts +49 -0
- package/generators/dist/adapters/types.js +14 -0
- package/generators/dist/adapters/types.js.map +1 -0
- package/generators/dist/adapters/utils.d.ts +12 -0
- package/generators/dist/adapters/utils.js +68 -0
- package/generators/dist/adapters/utils.js.map +1 -0
- package/generators/dist/adapters/zed.d.ts +2 -0
- package/generators/dist/adapters/zed.js +31 -0
- package/generators/dist/adapters/zed.js.map +1 -0
- package/generators/dist/doctor.d.ts +10 -0
- package/generators/dist/doctor.js +123 -0
- package/generators/dist/doctor.js.map +1 -0
- package/generators/dist/index.d.ts +2 -0
- package/generators/dist/index.js +45 -0
- package/generators/dist/index.js.map +1 -0
- package/generators/dist/init.d.ts +9 -0
- package/generators/dist/init.js +167 -0
- package/generators/dist/init.js.map +1 -0
- package/generators/dist/install.d.ts +5 -0
- package/generators/dist/install.js +66 -0
- package/generators/dist/install.js.map +1 -0
- package/generators/dist/registry.d.ts +3 -0
- package/generators/dist/registry.js +8 -0
- package/generators/dist/registry.js.map +1 -0
- package/generators/dist/update.d.ts +5 -0
- package/generators/dist/update.js +40 -0
- package/generators/dist/update.js.map +1 -0
- package/package.json +31 -27
- package/dist/commands/apply.d.ts +0 -3
- package/dist/commands/apply.d.ts.map +0 -1
- package/dist/commands/apply.js +0 -182
- package/dist/commands/apply.js.map +0 -1
- package/dist/commands/archive.d.ts +0 -3
- package/dist/commands/archive.d.ts.map +0 -1
- package/dist/commands/archive.js +0 -99
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/capsule.d.ts +0 -8
- package/dist/commands/capsule.d.ts.map +0 -1
- package/dist/commands/capsule.js +0 -466
- package/dist/commands/capsule.js.map +0 -1
- package/dist/commands/complete.d.ts +0 -3
- package/dist/commands/complete.d.ts.map +0 -1
- package/dist/commands/complete.js +0 -140
- package/dist/commands/complete.js.map +0 -1
- package/dist/commands/constitution.d.ts +0 -3
- package/dist/commands/constitution.d.ts.map +0 -1
- package/dist/commands/constitution.js +0 -192
- package/dist/commands/constitution.js.map +0 -1
- package/dist/commands/create.d.ts +0 -10
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -120
- package/dist/commands/create.js.map +0 -1
- package/dist/commands/delta.d.ts +0 -3
- package/dist/commands/delta.d.ts.map +0 -1
- package/dist/commands/delta.js +0 -82
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -3
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -102
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -204
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/done.d.ts +0 -3
- package/dist/commands/done.d.ts.map +0 -1
- package/dist/commands/done.js +0 -237
- package/dist/commands/done.js.map +0 -1
- package/dist/commands/explore.d.ts +0 -3
- package/dist/commands/explore.d.ts.map +0 -1
- package/dist/commands/explore.js +0 -236
- package/dist/commands/explore.js.map +0 -1
- package/dist/commands/export.d.ts +0 -7
- package/dist/commands/export.d.ts.map +0 -1
- package/dist/commands/export.js +0 -179
- package/dist/commands/export.js.map +0 -1
- package/dist/commands/extend.d.ts +0 -6
- package/dist/commands/extend.d.ts.map +0 -1
- package/dist/commands/extend.js +0 -167
- package/dist/commands/extend.js.map +0 -1
- package/dist/commands/init-old.d.ts +0 -3
- package/dist/commands/init-old.d.ts.map +0 -1
- package/dist/commands/init-old.js +0 -146
- package/dist/commands/init-old.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -298
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.d.ts +0 -3
- package/dist/commands/list.d.ts.map +0 -1
- package/dist/commands/list.js +0 -122
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -3
- package/dist/commands/memory.d.ts.map +0 -1
- package/dist/commands/memory.js +0 -166
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/new.d.ts +0 -3
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -508
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/qa.d.ts +0 -3
- package/dist/commands/qa.d.ts.map +0 -1
- package/dist/commands/qa.js +0 -179
- package/dist/commands/qa.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -6
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js +0 -232
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/shard.d.ts +0 -6
- package/dist/commands/shard.d.ts.map +0 -1
- package/dist/commands/shard.js +0 -199
- package/dist/commands/shard.js.map +0 -1
- package/dist/commands/spec.d.ts +0 -3
- package/dist/commands/spec.d.ts.map +0 -1
- package/dist/commands/spec.js +0 -302
- package/dist/commands/spec.js.map +0 -1
- package/dist/commands/status.d.ts +0 -3
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -47
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/test-apply.d.ts +0 -3
- package/dist/commands/test-apply.d.ts.map +0 -1
- package/dist/commands/test-apply.js +0 -228
- package/dist/commands/test-apply.js.map +0 -1
- package/dist/commands/test-create.d.ts +0 -3
- package/dist/commands/test-create.d.ts.map +0 -1
- package/dist/commands/test-create.js +0 -183
- package/dist/commands/test-create.js.map +0 -1
- package/dist/commands/test-guide.d.ts +0 -3
- package/dist/commands/test-guide.d.ts.map +0 -1
- package/dist/commands/test-guide.js +0 -190
- package/dist/commands/test-guide.js.map +0 -1
- package/dist/commands/test-report.d.ts +0 -3
- package/dist/commands/test-report.d.ts.map +0 -1
- package/dist/commands/test-report.js +0 -196
- package/dist/commands/test-report.js.map +0 -1
- package/dist/commands/test-submit.d.ts +0 -6
- package/dist/commands/test-submit.d.ts.map +0 -1
- package/dist/commands/test-submit.js +0 -236
- package/dist/commands/test-submit.js.map +0 -1
- package/dist/commands/verify.d.ts +0 -3
- package/dist/commands/verify.d.ts.map +0 -1
- package/dist/commands/verify.js +0 -288
- package/dist/commands/verify.js.map +0 -1
- package/dist/config.d.ts +0 -23
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -44
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -129
- package/dist/index.js.map +0 -1
- package/dist/rules/downloader.d.ts +0 -40
- package/dist/rules/downloader.d.ts.map +0 -1
- package/dist/rules/downloader.js +0 -253
- package/dist/rules/downloader.js.map +0 -1
- package/dist/rules/index.d.ts +0 -8
- package/dist/rules/index.d.ts.map +0 -1
- package/dist/rules/index.js +0 -8
- package/dist/rules/index.js.map +0 -1
- package/dist/rules/registry.d.ts +0 -45
- package/dist/rules/registry.d.ts.map +0 -1
- package/dist/rules/registry.js +0 -158
- package/dist/rules/registry.js.map +0 -1
- package/dist/rules/types.d.ts +0 -86
- package/dist/rules/types.d.ts.map +0 -1
- package/dist/rules/types.js +0 -6
- package/dist/rules/types.js.map +0 -1
- package/dist/utils/detectTools.d.ts +0 -15
- package/dist/utils/detectTools.d.ts.map +0 -1
- package/dist/utils/detectTools.js +0 -54
- package/dist/utils/detectTools.js.map +0 -1
- package/dist/utils/generateToolConfig.d.ts +0 -12
- package/dist/utils/generateToolConfig.d.ts.map +0 -1
- package/dist/utils/generateToolConfig.js +0 -1179
- package/dist/utils/generateToolConfig.js.map +0 -1
- package/dist/utils/testRunner.d.ts +0 -39
- package/dist/utils/testRunner.d.ts.map +0 -1
- package/dist/utils/testRunner.js +0 -325
- package/dist/utils/testRunner.js.map +0 -1
package/dist/rules/downloader.js
DELETED
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rules Downloader
|
|
3
|
-
* Downloads rules from the GitHub repository or local source
|
|
4
|
-
*/
|
|
5
|
-
import { readFile, access, mkdir, writeFile, rm, chmod } from 'fs/promises';
|
|
6
|
-
import { join, dirname } from 'path';
|
|
7
|
-
import { fileURLToPath } from 'url';
|
|
8
|
-
import { existsSync } from 'fs';
|
|
9
|
-
import { getTool, isValidTool } from './registry.js';
|
|
10
|
-
// Get the directory of the current module
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = dirname(__filename);
|
|
13
|
-
/**
|
|
14
|
-
* Path to the rules directory in the repository
|
|
15
|
-
*/
|
|
16
|
-
export function getRulesSourcePath() {
|
|
17
|
-
// In development: rules are in the repo root
|
|
18
|
-
// In production: rules are bundled with the package
|
|
19
|
-
const possiblePaths = [
|
|
20
|
-
join(__dirname, '../../../../../rules'), // From dist/cli/src/rules/ to repo root
|
|
21
|
-
join(__dirname, '../../../rules'), // Alternative path
|
|
22
|
-
join(process.cwd(), 'rules'), // Local development
|
|
23
|
-
];
|
|
24
|
-
for (const p of possiblePaths) {
|
|
25
|
-
if (existsSync(p))
|
|
26
|
-
return p;
|
|
27
|
-
}
|
|
28
|
-
return possiblePaths[0];
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Get the path to a specific tool's rules
|
|
32
|
-
*/
|
|
33
|
-
export function getToolRulesPath(toolName) {
|
|
34
|
-
return join(getRulesSourcePath(), toolName);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Check if rules exist for a tool in the source
|
|
38
|
-
*/
|
|
39
|
-
export async function rulesExist(toolName) {
|
|
40
|
-
if (!isValidTool(toolName))
|
|
41
|
-
return false;
|
|
42
|
-
const toolRulesPath = getToolRulesPath(toolName);
|
|
43
|
-
try {
|
|
44
|
-
await access(toolRulesPath);
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Get the content of a rule file from the source
|
|
53
|
-
*/
|
|
54
|
-
export async function getRuleContent(toolName, fileName) {
|
|
55
|
-
const filePath = join(getToolRulesPath(toolName), fileName);
|
|
56
|
-
try {
|
|
57
|
-
return await readFile(filePath, 'utf-8');
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Get the version of rules for a tool
|
|
65
|
-
* Currently returns '1.0.0' as placeholder
|
|
66
|
-
* In the future, this could read from a manifest.json
|
|
67
|
-
*/
|
|
68
|
-
export async function getRulesVersion(_toolName) {
|
|
69
|
-
// Placeholder: in the future, read from manifest.json
|
|
70
|
-
return '1.0.0';
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Download and install rules for a tool
|
|
74
|
-
*/
|
|
75
|
-
export async function downloadRules(toolName, cwd = process.cwd(), options = {}) {
|
|
76
|
-
if (!isValidTool(toolName)) {
|
|
77
|
-
return {
|
|
78
|
-
success: false,
|
|
79
|
-
message: `Unknown tool: ${toolName}`,
|
|
80
|
-
tool: toolName,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
const tool = getTool(toolName);
|
|
84
|
-
if (!tool) {
|
|
85
|
-
return {
|
|
86
|
-
success: false,
|
|
87
|
-
message: `Tool definition not found: ${toolName}`,
|
|
88
|
-
tool: toolName,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
try {
|
|
92
|
-
// Check if rules exist in source
|
|
93
|
-
const rulesPath = getToolRulesPath(toolName);
|
|
94
|
-
try {
|
|
95
|
-
await access(rulesPath);
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return {
|
|
99
|
-
success: false,
|
|
100
|
-
message: `Rules not found for ${toolName} at ${rulesPath}`,
|
|
101
|
-
tool: toolName,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
// Install each file defined for the tool
|
|
105
|
-
for (const file of tool.files) {
|
|
106
|
-
// tool.files contains destination paths (e.g. ".continue/config.yaml")
|
|
107
|
-
// Source files are stored flat in rules/<tool>/ (e.g. "rules/continue/config.yaml")
|
|
108
|
-
// Extract just the filename for source path lookup
|
|
109
|
-
const sourceFile = file.split('/').pop();
|
|
110
|
-
const sourcePath = join(rulesPath, sourceFile);
|
|
111
|
-
const targetPath = join(cwd, file);
|
|
112
|
-
// Create parent directories if needed
|
|
113
|
-
await mkdir(dirname(targetPath), { recursive: true });
|
|
114
|
-
try {
|
|
115
|
-
const content = await readFile(sourcePath, 'utf-8');
|
|
116
|
-
await writeFile(targetPath, content);
|
|
117
|
-
// Set execute permission for hook files
|
|
118
|
-
if (file.includes('hook') || file === 'pre-commit' || file === 'post-commit') {
|
|
119
|
-
await chmod(targetPath, 0o755);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
// If file doesn't exist in source, create an empty placeholder
|
|
124
|
-
if (error.code === 'ENOENT') {
|
|
125
|
-
await mkdir(dirname(targetPath), { recursive: true });
|
|
126
|
-
await writeFile(targetPath, getPlaceholderContent(toolName, file));
|
|
127
|
-
// Set execute permission for hook files
|
|
128
|
-
if (file.includes('hook') || file === 'pre-commit' || file === 'post-commit') {
|
|
129
|
-
await chmod(targetPath, 0o755);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
throw error;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
const version = await getRulesVersion(toolName);
|
|
138
|
-
return {
|
|
139
|
-
success: true,
|
|
140
|
-
message: `Installed ${toolName} rules (v${version})`,
|
|
141
|
-
tool: toolName,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
return {
|
|
146
|
-
success: false,
|
|
147
|
-
message: `Failed to install ${toolName} rules: ${error.message}`,
|
|
148
|
-
tool: toolName,
|
|
149
|
-
error,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Remove rules for a tool
|
|
155
|
-
*/
|
|
156
|
-
export async function removeRules(toolName, cwd = process.cwd()) {
|
|
157
|
-
if (!isValidTool(toolName)) {
|
|
158
|
-
return {
|
|
159
|
-
success: false,
|
|
160
|
-
message: `Unknown tool: ${toolName}`,
|
|
161
|
-
tool: toolName,
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
const tool = getTool(toolName);
|
|
165
|
-
if (!tool) {
|
|
166
|
-
return {
|
|
167
|
-
success: false,
|
|
168
|
-
message: `Tool definition not found: ${toolName}`,
|
|
169
|
-
tool: toolName,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
try {
|
|
173
|
-
const removedFiles = [];
|
|
174
|
-
for (const file of tool.files) {
|
|
175
|
-
const filePath = join(cwd, file);
|
|
176
|
-
try {
|
|
177
|
-
await access(filePath);
|
|
178
|
-
await rm(filePath);
|
|
179
|
-
removedFiles.push(file);
|
|
180
|
-
}
|
|
181
|
-
catch {
|
|
182
|
-
// File doesn't exist, skip
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
if (removedFiles.length === 0) {
|
|
186
|
-
return {
|
|
187
|
-
success: true,
|
|
188
|
-
message: `No ${toolName} rules found to remove`,
|
|
189
|
-
tool: toolName,
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
return {
|
|
193
|
-
success: true,
|
|
194
|
-
message: `Removed ${toolName} rules`,
|
|
195
|
-
tool: toolName,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
return {
|
|
200
|
-
success: false,
|
|
201
|
-
message: `Failed to remove ${toolName} rules: ${error.message}`,
|
|
202
|
-
tool: toolName,
|
|
203
|
-
error,
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Update rules for a tool to the latest version
|
|
209
|
-
*/
|
|
210
|
-
export async function updateRules(toolName, cwd = process.cwd()) {
|
|
211
|
-
// For now, update is the same as download (overwrite)
|
|
212
|
-
// In the future, this could check versions and only update if needed
|
|
213
|
-
const result = await downloadRules(toolName, cwd, { force: true });
|
|
214
|
-
if (result.success) {
|
|
215
|
-
const version = await getRulesVersion(toolName);
|
|
216
|
-
result.message = `Updated ${toolName} rules to v${version}`;
|
|
217
|
-
}
|
|
218
|
-
return result;
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Get placeholder content for a rule file
|
|
222
|
-
*/
|
|
223
|
-
function getPlaceholderContent(toolName, fileName) {
|
|
224
|
-
const extension = fileName.split('.').pop();
|
|
225
|
-
switch (extension) {
|
|
226
|
-
case 'json':
|
|
227
|
-
return JSON.stringify({
|
|
228
|
-
name: toolName,
|
|
229
|
-
version: '1.0.0',
|
|
230
|
-
description: `SpecSafe rules for ${toolName}`,
|
|
231
|
-
note: 'This is a placeholder. Content will be added in a future update.',
|
|
232
|
-
}, null, 2);
|
|
233
|
-
case 'yml':
|
|
234
|
-
case 'yaml':
|
|
235
|
-
return `# SpecSafe Rules for ${toolName}
|
|
236
|
-
# Version: 1.0.0
|
|
237
|
-
# This is a placeholder. Content will be added in a future update.
|
|
238
|
-
`;
|
|
239
|
-
case 'md':
|
|
240
|
-
return `# SpecSafe Rules for ${toolName}
|
|
241
|
-
|
|
242
|
-
## Version: 1.0.0
|
|
243
|
-
|
|
244
|
-
> This is a placeholder. Content will be added in a future update.
|
|
245
|
-
`;
|
|
246
|
-
default:
|
|
247
|
-
return `# SpecSafe Rules for ${toolName}
|
|
248
|
-
# Version: 1.0.0
|
|
249
|
-
# This is a placeholder. Content will be added in a future update.
|
|
250
|
-
`;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
//# sourceMappingURL=downloader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../src/rules/downloader.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
package/dist/rules/index.js
DELETED
package/dist/rules/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
package/dist/rules/registry.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Registry
|
|
3
|
-
* Manages available tools and their detection logic
|
|
4
|
-
*/
|
|
5
|
-
import type { ToolDefinition, InstalledTool } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Hardcoded list of available rules/tools
|
|
8
|
-
*/
|
|
9
|
-
export declare const AVAILABLE_RULES: ToolDefinition[];
|
|
10
|
-
/**
|
|
11
|
-
* Detect if a tool is configured by checking for its config files
|
|
12
|
-
*/
|
|
13
|
-
export declare function detectTool(toolName: string, cwd?: string): Promise<boolean>;
|
|
14
|
-
/**
|
|
15
|
-
* Detect all available tools in the project
|
|
16
|
-
*/
|
|
17
|
-
export declare function detectAllTools(cwd?: string): Promise<string[]>;
|
|
18
|
-
/**
|
|
19
|
-
* Get tool definition by name
|
|
20
|
-
*/
|
|
21
|
-
export declare function getTool(name: string): ToolDefinition | undefined;
|
|
22
|
-
/**
|
|
23
|
-
* Check if a tool name is valid
|
|
24
|
-
*/
|
|
25
|
-
export declare function isValidTool(name: string): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Get all available tools
|
|
28
|
-
*/
|
|
29
|
-
export declare function getAllTools(): ToolDefinition[];
|
|
30
|
-
/**
|
|
31
|
-
* Load installed tools from config
|
|
32
|
-
*/
|
|
33
|
-
export declare function loadInstalledTools(cwd?: string): Promise<InstalledTool[]>;
|
|
34
|
-
/**
|
|
35
|
-
* Save tool configuration to specsafe.config.json
|
|
36
|
-
*/
|
|
37
|
-
export declare function saveToolConfig(toolName: string, config: {
|
|
38
|
-
enabled: boolean;
|
|
39
|
-
version: string;
|
|
40
|
-
}, cwd?: string): Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
* Remove tool configuration from specsafe.config.json
|
|
43
|
-
*/
|
|
44
|
-
export declare function removeToolConfig(toolName: string, cwd?: string): Promise<void>;
|
|
45
|
-
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/rules/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAqB,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,EAoC3C,CAAC;AAEF;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAchG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAE9C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAc9F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC7C,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
|
package/dist/rules/registry.js
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Registry
|
|
3
|
-
* Manages available tools and their detection logic
|
|
4
|
-
*/
|
|
5
|
-
import { access, writeFile, readFile } from 'fs/promises';
|
|
6
|
-
import { join } from 'path';
|
|
7
|
-
/**
|
|
8
|
-
* Hardcoded list of available rules/tools
|
|
9
|
-
*/
|
|
10
|
-
export const AVAILABLE_RULES = [
|
|
11
|
-
{
|
|
12
|
-
name: 'cursor',
|
|
13
|
-
description: 'Cursor IDE integration',
|
|
14
|
-
files: ['.cursorrules'],
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
name: 'continue',
|
|
18
|
-
description: 'Continue.dev for VS Code',
|
|
19
|
-
files: ['.continue/config.yaml'],
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
name: 'aider',
|
|
23
|
-
description: 'Aider CLI integration',
|
|
24
|
-
files: ['.aider.conf.yml'],
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: 'zed',
|
|
28
|
-
description: 'Zed Editor integration',
|
|
29
|
-
files: ['.zed/settings.json'],
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
name: 'git-hooks',
|
|
33
|
-
description: 'Pre-commit validation',
|
|
34
|
-
files: ['.githooks/pre-commit'],
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: 'claude-code',
|
|
38
|
-
description: 'Claude Code by Anthropic',
|
|
39
|
-
files: ['CLAUDE.md'],
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: 'crush',
|
|
43
|
-
description: 'Crush (formerly OpenCode) by Charmbracelet',
|
|
44
|
-
files: ['.opencode/commands/specsafe.md', '.opencode/commands/spec.md', '.opencode/commands/validate.md'],
|
|
45
|
-
},
|
|
46
|
-
];
|
|
47
|
-
/**
|
|
48
|
-
* Detect if a tool is configured by checking for its config files
|
|
49
|
-
*/
|
|
50
|
-
export async function detectTool(toolName, cwd = process.cwd()) {
|
|
51
|
-
const tool = AVAILABLE_RULES.find((t) => t.name === toolName);
|
|
52
|
-
if (!tool)
|
|
53
|
-
return false;
|
|
54
|
-
for (const file of tool.files) {
|
|
55
|
-
const filePath = join(cwd, file);
|
|
56
|
-
try {
|
|
57
|
-
await access(filePath);
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
// File doesn't exist, continue checking
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Detect all available tools in the project
|
|
68
|
-
*/
|
|
69
|
-
export async function detectAllTools(cwd = process.cwd()) {
|
|
70
|
-
const detected = [];
|
|
71
|
-
for (const tool of AVAILABLE_RULES) {
|
|
72
|
-
if (await detectTool(tool.name, cwd)) {
|
|
73
|
-
detected.push(tool.name);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return detected;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Get tool definition by name
|
|
80
|
-
*/
|
|
81
|
-
export function getTool(name) {
|
|
82
|
-
return AVAILABLE_RULES.find((t) => t.name === name);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Check if a tool name is valid
|
|
86
|
-
*/
|
|
87
|
-
export function isValidTool(name) {
|
|
88
|
-
return AVAILABLE_RULES.some((t) => t.name === name);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Get all available tools
|
|
92
|
-
*/
|
|
93
|
-
export function getAllTools() {
|
|
94
|
-
return [...AVAILABLE_RULES];
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Load installed tools from config
|
|
98
|
-
*/
|
|
99
|
-
export async function loadInstalledTools(cwd = process.cwd()) {
|
|
100
|
-
const configPath = join(cwd, 'specsafe.config.json');
|
|
101
|
-
try {
|
|
102
|
-
const content = await readFile(configPath, 'utf-8');
|
|
103
|
-
const config = JSON.parse(content);
|
|
104
|
-
const tools = config.tools || {};
|
|
105
|
-
return Object.entries(tools).map(([name, toolConfig]) => ({
|
|
106
|
-
name,
|
|
107
|
-
...toolConfig,
|
|
108
|
-
}));
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return [];
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Save tool configuration to specsafe.config.json
|
|
116
|
-
*/
|
|
117
|
-
export async function saveToolConfig(toolName, config, cwd = process.cwd()) {
|
|
118
|
-
const configPath = join(cwd, 'specsafe.config.json');
|
|
119
|
-
let existingConfig = {};
|
|
120
|
-
try {
|
|
121
|
-
const content = await readFile(configPath, 'utf-8');
|
|
122
|
-
existingConfig = JSON.parse(content);
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
// Config doesn't exist yet, start fresh
|
|
126
|
-
}
|
|
127
|
-
existingConfig.tools = {
|
|
128
|
-
...(existingConfig.tools || {}),
|
|
129
|
-
[toolName]: config,
|
|
130
|
-
};
|
|
131
|
-
await writeFile(configPath, JSON.stringify(existingConfig, null, 2));
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Remove tool configuration from specsafe.config.json
|
|
135
|
-
*/
|
|
136
|
-
export async function removeToolConfig(toolName, cwd = process.cwd()) {
|
|
137
|
-
const configPath = join(cwd, 'specsafe.config.json');
|
|
138
|
-
let content;
|
|
139
|
-
try {
|
|
140
|
-
content = await readFile(configPath, 'utf-8');
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
let config;
|
|
146
|
-
try {
|
|
147
|
-
config = JSON.parse(content);
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
// Config is malformed JSON, nothing safe to do
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
if (config.tools && config.tools[toolName]) {
|
|
154
|
-
delete config.tools[toolName];
|
|
155
|
-
await writeFile(configPath, JSON.stringify(config, null, 2));
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/rules/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/types.d.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types for the rules module
|
|
3
|
-
* TypeScript interfaces for tool registry and rule management
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Represents a tool that can be integrated with SpecSafe
|
|
7
|
-
*/
|
|
8
|
-
export interface ToolDefinition {
|
|
9
|
-
/** Unique identifier for the tool */
|
|
10
|
-
name: string;
|
|
11
|
-
/** Human-readable description */
|
|
12
|
-
description: string;
|
|
13
|
-
/** Configuration files that this tool uses */
|
|
14
|
-
files: string[];
|
|
15
|
-
/** Optional: Additional metadata */
|
|
16
|
-
metadata?: Record<string, unknown>;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Represents an installed tool configuration
|
|
20
|
-
*/
|
|
21
|
-
export interface InstalledTool {
|
|
22
|
-
/** Tool name */
|
|
23
|
-
name: string;
|
|
24
|
-
/** Whether the tool is enabled */
|
|
25
|
-
enabled: boolean;
|
|
26
|
-
/** Installed version of the rules */
|
|
27
|
-
version: string;
|
|
28
|
-
/** When the tool was installed */
|
|
29
|
-
installedAt?: string;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Tool registry entry with detection logic
|
|
33
|
-
*/
|
|
34
|
-
export interface ToolRegistryEntry extends ToolDefinition {
|
|
35
|
-
/** Detect if this tool is already configured in the project */
|
|
36
|
-
detect(): Promise<boolean> | boolean;
|
|
37
|
-
/** Install rules for this tool */
|
|
38
|
-
install(cwd: string): Promise<void>;
|
|
39
|
-
/** Remove rules for this tool */
|
|
40
|
-
remove(cwd: string): Promise<void>;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Configuration for tools in specsafe.config.json
|
|
44
|
-
*/
|
|
45
|
-
export interface ToolsConfig {
|
|
46
|
-
[toolName: string]: {
|
|
47
|
-
enabled: boolean;
|
|
48
|
-
version: string;
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Extended SpecSafe config with tools support
|
|
53
|
-
*/
|
|
54
|
-
export interface SpecSafeConfigWithTools {
|
|
55
|
-
projectName: string;
|
|
56
|
-
version: string;
|
|
57
|
-
stages: string[];
|
|
58
|
-
testFramework: 'vitest' | 'jest';
|
|
59
|
-
language: 'typescript';
|
|
60
|
-
tools?: ToolsConfig;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Result of a rule operation
|
|
64
|
-
*/
|
|
65
|
-
export interface RuleOperationResult {
|
|
66
|
-
success: boolean;
|
|
67
|
-
message: string;
|
|
68
|
-
tool?: string;
|
|
69
|
-
error?: Error;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Available rule sources
|
|
73
|
-
*/
|
|
74
|
-
export type RuleSource = 'github' | 'local';
|
|
75
|
-
/**
|
|
76
|
-
* Download options for rules
|
|
77
|
-
*/
|
|
78
|
-
export interface DownloadOptions {
|
|
79
|
-
/** Source to download from */
|
|
80
|
-
source?: RuleSource;
|
|
81
|
-
/** Specific version to download */
|
|
82
|
-
version?: string;
|
|
83
|
-
/** Force overwrite existing files */
|
|
84
|
-
force?: boolean;
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,+DAA+D;IAC/D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACrC,kCAAkC;IAClC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,iCAAiC;IACjC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
|
package/dist/rules/types.js
DELETED
package/dist/rules/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detects installed AI coding tools by checking for their config files
|
|
3
|
-
* @returns Array of detected tool names
|
|
4
|
-
*/
|
|
5
|
-
export declare function detectInstalledTools(): string[];
|
|
6
|
-
/**
|
|
7
|
-
* Tool configuration mapping
|
|
8
|
-
*/
|
|
9
|
-
export interface ToolConfig {
|
|
10
|
-
name: string;
|
|
11
|
-
displayName: string;
|
|
12
|
-
configFiles: string[];
|
|
13
|
-
}
|
|
14
|
-
export declare const availableTools: ToolConfig[];
|
|
15
|
-
//# sourceMappingURL=detectTools.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detectTools.d.ts","sourceRoot":"","sources":["../../src/utils/detectTools.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAW/C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAE,UAAU,EA+BtC,CAAC"}
|