@specsafe/cli 0.7.1 → 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.
Files changed (242) hide show
  1. package/README.md +100 -279
  2. package/canonical/personas/bolt-zane.md +29 -0
  3. package/canonical/personas/forge-reva.md +29 -0
  4. package/canonical/personas/herald-cass.md +30 -0
  5. package/canonical/personas/mason-kai.md +30 -0
  6. package/canonical/personas/scout-elena.md +27 -0
  7. package/canonical/personas/warden-lyra.md +30 -0
  8. package/canonical/rules/.cursorrules.mdc +53 -0
  9. package/canonical/rules/.rules +48 -0
  10. package/canonical/rules/AGENTS.md +48 -0
  11. package/canonical/rules/CLAUDE.md +48 -0
  12. package/canonical/rules/CONVENTIONS.md +41 -0
  13. package/canonical/rules/GEMINI.md +50 -0
  14. package/canonical/rules/continue-config.yaml +5 -0
  15. package/canonical/skills/specsafe-archive/SKILL.md +63 -0
  16. package/canonical/skills/specsafe-code/SKILL.md +7 -0
  17. package/canonical/skills/specsafe-code/workflow.md +212 -0
  18. package/canonical/skills/specsafe-complete/SKILL.md +7 -0
  19. package/canonical/skills/specsafe-complete/workflow.md +130 -0
  20. package/canonical/skills/specsafe-doctor/SKILL.md +103 -0
  21. package/canonical/skills/specsafe-explore/SKILL.md +7 -0
  22. package/canonical/skills/specsafe-explore/workflow.md +100 -0
  23. package/canonical/skills/specsafe-init/SKILL.md +119 -0
  24. package/canonical/skills/specsafe-new/SKILL.md +7 -0
  25. package/canonical/skills/specsafe-new/workflow.md +156 -0
  26. package/canonical/skills/specsafe-qa/SKILL.md +7 -0
  27. package/canonical/skills/specsafe-qa/workflow.md +223 -0
  28. package/canonical/skills/specsafe-spec/SKILL.md +7 -0
  29. package/canonical/skills/specsafe-spec/workflow.md +158 -0
  30. package/canonical/skills/specsafe-status/SKILL.md +77 -0
  31. package/canonical/skills/specsafe-test/SKILL.md +7 -0
  32. package/canonical/skills/specsafe-test/workflow.md +210 -0
  33. package/canonical/skills/specsafe-verify/SKILL.md +7 -0
  34. package/canonical/skills/specsafe-verify/workflow.md +143 -0
  35. package/canonical/templates/project-state-template.md +33 -0
  36. package/canonical/templates/qa-report-template.md +55 -0
  37. package/canonical/templates/spec-template.md +52 -0
  38. package/canonical/templates/specsafe-config-template.json +10 -0
  39. package/generators/dist/adapters/aider.d.ts +2 -0
  40. package/generators/dist/adapters/aider.js +23 -0
  41. package/generators/dist/adapters/aider.js.map +1 -0
  42. package/generators/dist/adapters/antigravity.d.ts +2 -0
  43. package/generators/dist/adapters/antigravity.js +33 -0
  44. package/generators/dist/adapters/antigravity.js.map +1 -0
  45. package/generators/dist/adapters/claude-code.d.ts +2 -0
  46. package/generators/dist/adapters/claude-code.js +31 -0
  47. package/generators/dist/adapters/claude-code.js.map +1 -0
  48. package/generators/dist/adapters/continue.d.ts +2 -0
  49. package/generators/dist/adapters/continue.js +33 -0
  50. package/generators/dist/adapters/continue.js.map +1 -0
  51. package/generators/dist/adapters/cursor.d.ts +2 -0
  52. package/generators/dist/adapters/cursor.js +32 -0
  53. package/generators/dist/adapters/cursor.js.map +1 -0
  54. package/generators/dist/adapters/gemini.d.ts +2 -0
  55. package/generators/dist/adapters/gemini.js +36 -0
  56. package/generators/dist/adapters/gemini.js.map +1 -0
  57. package/generators/dist/adapters/index.d.ts +13 -0
  58. package/generators/dist/adapters/index.js +29 -0
  59. package/generators/dist/adapters/index.js.map +1 -0
  60. package/generators/dist/adapters/opencode.d.ts +2 -0
  61. package/generators/dist/adapters/opencode.js +32 -0
  62. package/generators/dist/adapters/opencode.js.map +1 -0
  63. package/generators/dist/adapters/types.d.ts +49 -0
  64. package/generators/dist/adapters/types.js +14 -0
  65. package/generators/dist/adapters/types.js.map +1 -0
  66. package/generators/dist/adapters/utils.d.ts +12 -0
  67. package/generators/dist/adapters/utils.js +68 -0
  68. package/generators/dist/adapters/utils.js.map +1 -0
  69. package/generators/dist/adapters/zed.d.ts +2 -0
  70. package/generators/dist/adapters/zed.js +31 -0
  71. package/generators/dist/adapters/zed.js.map +1 -0
  72. package/generators/dist/doctor.d.ts +10 -0
  73. package/generators/dist/doctor.js +123 -0
  74. package/generators/dist/doctor.js.map +1 -0
  75. package/generators/dist/index.d.ts +2 -0
  76. package/generators/dist/index.js +45 -0
  77. package/generators/dist/index.js.map +1 -0
  78. package/generators/dist/init.d.ts +9 -0
  79. package/generators/dist/init.js +167 -0
  80. package/generators/dist/init.js.map +1 -0
  81. package/generators/dist/install.d.ts +5 -0
  82. package/generators/dist/install.js +66 -0
  83. package/generators/dist/install.js.map +1 -0
  84. package/generators/dist/registry.d.ts +3 -0
  85. package/generators/dist/registry.js +8 -0
  86. package/generators/dist/registry.js.map +1 -0
  87. package/generators/dist/update.d.ts +5 -0
  88. package/generators/dist/update.js +40 -0
  89. package/generators/dist/update.js.map +1 -0
  90. package/package.json +32 -27
  91. package/dist/commands/apply.d.ts +0 -3
  92. package/dist/commands/apply.d.ts.map +0 -1
  93. package/dist/commands/apply.js +0 -182
  94. package/dist/commands/apply.js.map +0 -1
  95. package/dist/commands/archive.d.ts +0 -3
  96. package/dist/commands/archive.d.ts.map +0 -1
  97. package/dist/commands/archive.js +0 -99
  98. package/dist/commands/archive.js.map +0 -1
  99. package/dist/commands/capsule.d.ts +0 -8
  100. package/dist/commands/capsule.d.ts.map +0 -1
  101. package/dist/commands/capsule.js +0 -466
  102. package/dist/commands/capsule.js.map +0 -1
  103. package/dist/commands/complete.d.ts +0 -3
  104. package/dist/commands/complete.d.ts.map +0 -1
  105. package/dist/commands/complete.js +0 -140
  106. package/dist/commands/complete.js.map +0 -1
  107. package/dist/commands/constitution.d.ts +0 -3
  108. package/dist/commands/constitution.d.ts.map +0 -1
  109. package/dist/commands/constitution.js +0 -192
  110. package/dist/commands/constitution.js.map +0 -1
  111. package/dist/commands/create.d.ts +0 -10
  112. package/dist/commands/create.d.ts.map +0 -1
  113. package/dist/commands/create.js +0 -120
  114. package/dist/commands/create.js.map +0 -1
  115. package/dist/commands/delta.d.ts +0 -3
  116. package/dist/commands/delta.d.ts.map +0 -1
  117. package/dist/commands/delta.js +0 -82
  118. package/dist/commands/delta.js.map +0 -1
  119. package/dist/commands/diff.d.ts +0 -3
  120. package/dist/commands/diff.d.ts.map +0 -1
  121. package/dist/commands/diff.js +0 -102
  122. package/dist/commands/diff.js.map +0 -1
  123. package/dist/commands/doctor.d.ts +0 -3
  124. package/dist/commands/doctor.d.ts.map +0 -1
  125. package/dist/commands/doctor.js +0 -204
  126. package/dist/commands/doctor.js.map +0 -1
  127. package/dist/commands/done.d.ts +0 -3
  128. package/dist/commands/done.d.ts.map +0 -1
  129. package/dist/commands/done.js +0 -237
  130. package/dist/commands/done.js.map +0 -1
  131. package/dist/commands/explore.d.ts +0 -3
  132. package/dist/commands/explore.d.ts.map +0 -1
  133. package/dist/commands/explore.js +0 -236
  134. package/dist/commands/explore.js.map +0 -1
  135. package/dist/commands/export.d.ts +0 -7
  136. package/dist/commands/export.d.ts.map +0 -1
  137. package/dist/commands/export.js +0 -179
  138. package/dist/commands/export.js.map +0 -1
  139. package/dist/commands/extend.d.ts +0 -6
  140. package/dist/commands/extend.d.ts.map +0 -1
  141. package/dist/commands/extend.js +0 -167
  142. package/dist/commands/extend.js.map +0 -1
  143. package/dist/commands/init-old.d.ts +0 -3
  144. package/dist/commands/init-old.d.ts.map +0 -1
  145. package/dist/commands/init-old.js +0 -146
  146. package/dist/commands/init-old.js.map +0 -1
  147. package/dist/commands/init.d.ts +0 -3
  148. package/dist/commands/init.d.ts.map +0 -1
  149. package/dist/commands/init.js +0 -298
  150. package/dist/commands/init.js.map +0 -1
  151. package/dist/commands/list.d.ts +0 -3
  152. package/dist/commands/list.d.ts.map +0 -1
  153. package/dist/commands/list.js +0 -122
  154. package/dist/commands/list.js.map +0 -1
  155. package/dist/commands/memory.d.ts +0 -3
  156. package/dist/commands/memory.d.ts.map +0 -1
  157. package/dist/commands/memory.js +0 -166
  158. package/dist/commands/memory.js.map +0 -1
  159. package/dist/commands/new.d.ts +0 -3
  160. package/dist/commands/new.d.ts.map +0 -1
  161. package/dist/commands/new.js +0 -508
  162. package/dist/commands/new.js.map +0 -1
  163. package/dist/commands/qa.d.ts +0 -3
  164. package/dist/commands/qa.d.ts.map +0 -1
  165. package/dist/commands/qa.js +0 -179
  166. package/dist/commands/qa.js.map +0 -1
  167. package/dist/commands/rules.d.ts +0 -6
  168. package/dist/commands/rules.d.ts.map +0 -1
  169. package/dist/commands/rules.js +0 -232
  170. package/dist/commands/rules.js.map +0 -1
  171. package/dist/commands/shard.d.ts +0 -6
  172. package/dist/commands/shard.d.ts.map +0 -1
  173. package/dist/commands/shard.js +0 -199
  174. package/dist/commands/shard.js.map +0 -1
  175. package/dist/commands/spec.d.ts +0 -3
  176. package/dist/commands/spec.d.ts.map +0 -1
  177. package/dist/commands/spec.js +0 -302
  178. package/dist/commands/spec.js.map +0 -1
  179. package/dist/commands/status.d.ts +0 -3
  180. package/dist/commands/status.d.ts.map +0 -1
  181. package/dist/commands/status.js +0 -47
  182. package/dist/commands/status.js.map +0 -1
  183. package/dist/commands/test-apply.d.ts +0 -3
  184. package/dist/commands/test-apply.d.ts.map +0 -1
  185. package/dist/commands/test-apply.js +0 -228
  186. package/dist/commands/test-apply.js.map +0 -1
  187. package/dist/commands/test-create.d.ts +0 -3
  188. package/dist/commands/test-create.d.ts.map +0 -1
  189. package/dist/commands/test-create.js +0 -183
  190. package/dist/commands/test-create.js.map +0 -1
  191. package/dist/commands/test-guide.d.ts +0 -3
  192. package/dist/commands/test-guide.d.ts.map +0 -1
  193. package/dist/commands/test-guide.js +0 -190
  194. package/dist/commands/test-guide.js.map +0 -1
  195. package/dist/commands/test-report.d.ts +0 -3
  196. package/dist/commands/test-report.d.ts.map +0 -1
  197. package/dist/commands/test-report.js +0 -196
  198. package/dist/commands/test-report.js.map +0 -1
  199. package/dist/commands/test-submit.d.ts +0 -6
  200. package/dist/commands/test-submit.d.ts.map +0 -1
  201. package/dist/commands/test-submit.js +0 -236
  202. package/dist/commands/test-submit.js.map +0 -1
  203. package/dist/commands/verify.d.ts +0 -3
  204. package/dist/commands/verify.d.ts.map +0 -1
  205. package/dist/commands/verify.js +0 -288
  206. package/dist/commands/verify.js.map +0 -1
  207. package/dist/config.d.ts +0 -23
  208. package/dist/config.d.ts.map +0 -1
  209. package/dist/config.js +0 -44
  210. package/dist/config.js.map +0 -1
  211. package/dist/index.d.ts +0 -8
  212. package/dist/index.d.ts.map +0 -1
  213. package/dist/index.js +0 -129
  214. package/dist/index.js.map +0 -1
  215. package/dist/rules/downloader.d.ts +0 -40
  216. package/dist/rules/downloader.d.ts.map +0 -1
  217. package/dist/rules/downloader.js +0 -253
  218. package/dist/rules/downloader.js.map +0 -1
  219. package/dist/rules/index.d.ts +0 -8
  220. package/dist/rules/index.d.ts.map +0 -1
  221. package/dist/rules/index.js +0 -8
  222. package/dist/rules/index.js.map +0 -1
  223. package/dist/rules/registry.d.ts +0 -45
  224. package/dist/rules/registry.d.ts.map +0 -1
  225. package/dist/rules/registry.js +0 -158
  226. package/dist/rules/registry.js.map +0 -1
  227. package/dist/rules/types.d.ts +0 -86
  228. package/dist/rules/types.d.ts.map +0 -1
  229. package/dist/rules/types.js +0 -6
  230. package/dist/rules/types.js.map +0 -1
  231. package/dist/utils/detectTools.d.ts +0 -15
  232. package/dist/utils/detectTools.d.ts.map +0 -1
  233. package/dist/utils/detectTools.js +0 -54
  234. package/dist/utils/detectTools.js.map +0 -1
  235. package/dist/utils/generateToolConfig.d.ts +0 -12
  236. package/dist/utils/generateToolConfig.d.ts.map +0 -1
  237. package/dist/utils/generateToolConfig.js +0 -1179
  238. package/dist/utils/generateToolConfig.js.map +0 -1
  239. package/dist/utils/testRunner.d.ts +0 -39
  240. package/dist/utils/testRunner.d.ts.map +0 -1
  241. package/dist/utils/testRunner.js +0 -325
  242. package/dist/utils/testRunner.js.map +0 -1
@@ -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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAY,EAAE,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAErD,0CAA0C;AAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,6CAA6C;IAC7C,oDAAoD;IACpD,MAAM,aAAa,GAAG;QACpB,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,EAAE,wCAAwC;QACjF,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,mBAAmB;QACtD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB;KACnD,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzC,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,sDAAsD;IACtD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,UAA2B,EAAE;IAE7B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,iBAAiB,QAAQ,EAAE;YACpC,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,8BAA8B,QAAQ,EAAE;YACjD,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,uBAAuB,QAAQ,OAAO,SAAS,EAAE;gBAC1D,IAAI,EAAE,QAAQ;aACf,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,uEAAuE;YACvE,oFAAoF;YACpF,mDAAmD;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAEnC,sCAAsC;YACtC,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACpD,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAErC,wCAAwC;gBACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;oBAC7E,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,+DAA+D;gBAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5B,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtD,MAAM,SAAS,CAAC,UAAU,EAAE,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;oBAEnE,wCAAwC;oBACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;wBAC7E,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,aAAa,QAAQ,YAAY,OAAO,GAAG;YACpD,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,qBAAqB,QAAQ,WAAW,KAAK,CAAC,OAAO,EAAE;YAChE,IAAI,EAAE,QAAQ;YACd,KAAK;SACN,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,iBAAiB,QAAQ,EAAE;YACpC,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,8BAA8B,QAAQ,EAAE;YACjD,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACnB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,MAAM,QAAQ,wBAAwB;gBAC/C,IAAI,EAAE,QAAQ;aACf,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,WAAW,QAAQ,QAAQ;YACpC,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,oBAAoB,QAAQ,WAAW,KAAK,CAAC,OAAO,EAAE;YAC/D,IAAI,EAAE,QAAQ;YACd,KAAK;SACN,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,sDAAsD;IACtD,qEAAqE;IACrE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,GAAG,WAAW,QAAQ,cAAc,OAAO,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,QAAgB,EAAE,QAAgB;IAC/D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAE5C,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,sBAAsB,QAAQ,EAAE;gBAC7C,IAAI,EAAE,kEAAkE;aACzE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEd,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACT,OAAO,wBAAwB,QAAQ;;;CAG5C,CAAC;QAEE,KAAK,IAAI;YACP,OAAO,wBAAwB,QAAQ;;;;;CAK5C,CAAC;QAEE;YACE,OAAO,wBAAwB,QAAQ;;;CAG5C,CAAC;IACA,CAAC;AACH,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Rules Module
3
- * Main entry point for rule management functionality
4
- */
5
- export * from './types.js';
6
- export * from './registry.js';
7
- export * from './downloader.js';
8
- //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Rules Module
3
- * Main entry point for rule management functionality
4
- */
5
- export * from './types.js';
6
- export * from './registry.js';
7
- export * from './downloader.js';
8
- //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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"}
@@ -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":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAS,SAAS,EAAE,QAAQ,EAAM,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wBAAwB;QACrC,KAAK,EAAE,CAAC,cAAc,CAAC;KACxB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,0BAA0B;QACvC,KAAK,EAAE,CAAC,uBAAuB,CAAC;KACjC;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,CAAC,iBAAiB,CAAC;KAC3B;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,wBAAwB;QACrC,KAAK,EAAE,CAAC,oBAAoB,CAAC;KAC9B;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,CAAC,sBAAsB,CAAC;KAChC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,0BAA0B;QACvC,KAAK,EAAE,CAAC,WAAW,CAAC;KACrB;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,4CAA4C;QACzD,KAAK,EAAE,CAAC,gCAAgC,EAAE,4BAA4B,EAAE,gCAAgC,CAAC;KAC1G;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5E,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,eAAe,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEjC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI;YACJ,GAAI,UAA0C;SAC/C,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAA6C,EAC7C,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACrD,IAAI,cAAc,GAA4B,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,cAAc,CAAC,KAAK,GAAG;QACrB,GAAG,CAAE,cAAc,CAAC,KAA6C,IAAI,EAAE,CAAC;QACxE,CAAC,QAAQ,CAAC,EAAE,MAAM;KACnB,CAAC;IAEF,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACrD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,MAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;QAC/C,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Types for the rules module
3
- * TypeScript interfaces for tool registry and rule management
4
- */
5
- export {};
6
- //# sourceMappingURL=types.js.map
@@ -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"}