@dedesfr/prompter 0.9.0 → 1.1.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.
Files changed (225) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +105 -77
  3. package/dist/cli/index.js +25 -1
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +35 -9
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/login.d.ts +4 -0
  9. package/dist/commands/login.d.ts.map +1 -0
  10. package/dist/commands/login.js +56 -0
  11. package/dist/commands/login.js.map +1 -0
  12. package/dist/commands/logout.d.ts +4 -0
  13. package/dist/commands/logout.d.ts.map +1 -0
  14. package/dist/commands/logout.js +14 -0
  15. package/dist/commands/logout.js.map +1 -0
  16. package/dist/commands/update.d.ts +0 -2
  17. package/dist/commands/update.d.ts.map +1 -1
  18. package/dist/commands/update.js +19 -48
  19. package/dist/commands/update.js.map +1 -1
  20. package/dist/commands/whoami.d.ts +4 -0
  21. package/dist/commands/whoami.d.ts.map +1 -0
  22. package/dist/commands/whoami.js +42 -0
  23. package/dist/commands/whoami.js.map +1 -0
  24. package/dist/core/auth-store.d.ts +10 -0
  25. package/dist/core/auth-store.d.ts.map +1 -0
  26. package/dist/core/auth-store.js +39 -0
  27. package/dist/core/auth-store.js.map +1 -0
  28. package/dist/core/config.d.ts +0 -7
  29. package/dist/core/config.d.ts.map +1 -1
  30. package/dist/core/config.js +0 -128
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/registry.d.ts +18 -0
  33. package/dist/core/registry.d.ts.map +1 -0
  34. package/dist/core/registry.js +94 -0
  35. package/dist/core/registry.js.map +1 -0
  36. package/package.json +7 -1
  37. package/AGENTS.md +0 -123
  38. package/CLAUDE.md +0 -17
  39. package/build.js +0 -20
  40. package/convex-setup.md +0 -403
  41. package/dist/core/prompt-templates.d.ts +0 -23
  42. package/dist/core/prompt-templates.d.ts.map +0 -1
  43. package/dist/core/prompt-templates.js +0 -3485
  44. package/dist/core/prompt-templates.js.map +0 -1
  45. package/prompt/ai-humanizer.md +0 -45
  46. package/prompt/api-contract-generator.md +0 -234
  47. package/prompt/apply.md +0 -17
  48. package/prompt/archive.md +0 -21
  49. package/prompt/design-system.md +0 -210
  50. package/prompt/document-explainer.md +0 -149
  51. package/prompt/epic-generator.md +0 -198
  52. package/prompt/epic-single.md +0 -47
  53. package/prompt/erd-generator.md +0 -130
  54. package/prompt/fsd-generator.md +0 -157
  55. package/prompt/prd-agent-generator.md +0 -147
  56. package/prompt/prd-generator.md +0 -195
  57. package/prompt/product-brief.md +0 -289
  58. package/prompt/proposal.md +0 -22
  59. package/prompt/qa-test-scenario.md +0 -133
  60. package/prompt/skill-creator.md +0 -350
  61. package/prompt/story-generator.md +0 -278
  62. package/prompt/story-single.md +0 -70
  63. package/prompt/tdd-generator.md +0 -294
  64. package/prompt/tdd-lite-generator.md +0 -224
  65. package/prompt/wireframe-generator.md +0 -219
  66. package/skills/ai-context-generator/SKILL.md +0 -54
  67. package/skills/ai-context-generator/references/AGENTS.template.md +0 -83
  68. package/skills/ai-context-generator/references/CLAUDE.template.md +0 -39
  69. package/skills/ai-context-generator/references/behavioral-guidelines.md +0 -71
  70. package/skills/ai-context-generator/references/discovery-checklist.md +0 -40
  71. package/skills/ai-context-generator/references/examples/AGENTS.good.md +0 -103
  72. package/skills/ai-context-generator/references/extraction-checklist.md +0 -23
  73. package/skills/ai-context-generator/references/overlays/laravel.md +0 -44
  74. package/skills/ai-humanizer/SKILL.md +0 -50
  75. package/skills/api-contract-generator/SKILL.md +0 -243
  76. package/skills/apply/SKILL.md +0 -23
  77. package/skills/archive/SKILL.md +0 -27
  78. package/skills/cerebro/SKILL.md +0 -187
  79. package/skills/cerebro/references/agents.md +0 -213
  80. package/skills/code-review/SKILL.md +0 -373
  81. package/skills/code-review/assets/report-template-agent.md +0 -212
  82. package/skills/code-review/assets/report-template-compact.md +0 -81
  83. package/skills/code-review/assets/report-template-full.md +0 -264
  84. package/skills/code-review/assets/report-template-human.md +0 -168
  85. package/skills/code-review/references/universal-patterns.md +0 -495
  86. package/skills/design-md/README.md +0 -34
  87. package/skills/design-md/SKILL.md +0 -172
  88. package/skills/design-md/examples/DESIGN.md +0 -154
  89. package/skills/design-system/SKILL.md +0 -216
  90. package/skills/design-system-generator/SKILL.md +0 -324
  91. package/skills/design-system-generator/assets/design-system-template.md +0 -348
  92. package/skills/design-system-generator/references/extraction-patterns.md +0 -321
  93. package/skills/doc-builder/SKILL.md +0 -115
  94. package/skills/doc-builder/references/ui-patterns.md +0 -394
  95. package/skills/document-explainer/SKILL.md +0 -155
  96. package/skills/document-translator/SKILL.md +0 -58
  97. package/skills/enhance/SKILL.md +0 -47
  98. package/skills/enhance-prompt/README.md +0 -34
  99. package/skills/enhance-prompt/SKILL.md +0 -204
  100. package/skills/enhance-prompt/references/KEYWORDS.md +0 -114
  101. package/skills/epic-generator/SKILL.md +0 -204
  102. package/skills/epic-single/SKILL.md +0 -63
  103. package/skills/erd-generator/SKILL.md +0 -138
  104. package/skills/feature-planner/SKILL.md +0 -305
  105. package/skills/feature-planner/assets/implementation-plan-template.md +0 -85
  106. package/skills/frontend-design/LICENSE.txt +0 -177
  107. package/skills/frontend-design/SKILL.md +0 -42
  108. package/skills/fsd-generator/SKILL.md +0 -163
  109. package/skills/gamma-builder/SKILL.md +0 -134
  110. package/skills/laravel-code-review/SKILL.md +0 -383
  111. package/skills/laravel-code-review/assets/report-template-agent.md +0 -195
  112. package/skills/laravel-code-review/assets/report-template-compact.md +0 -79
  113. package/skills/laravel-code-review/assets/report-template-full.md +0 -253
  114. package/skills/laravel-code-review/assets/report-template-human.md +0 -159
  115. package/skills/laravel-code-review/references/laravel-patterns.md +0 -571
  116. package/skills/laravel-code-review/references/php84-features.md +0 -442
  117. package/skills/mcp-builder/LICENSE.txt +0 -202
  118. package/skills/mcp-builder/SKILL.md +0 -236
  119. package/skills/mcp-builder/reference/evaluation.md +0 -602
  120. package/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
  121. package/skills/mcp-builder/reference/node_mcp_server.md +0 -970
  122. package/skills/mcp-builder/reference/python_mcp_server.md +0 -719
  123. package/skills/mcp-builder/scripts/connections.py +0 -151
  124. package/skills/mcp-builder/scripts/evaluation.py +0 -373
  125. package/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
  126. package/skills/mcp-builder/scripts/requirements.txt +0 -2
  127. package/skills/meeting-notes/SKILL.md +0 -159
  128. package/skills/meeting-notes/evals/evals.json +0 -23
  129. package/skills/prd-agent-generator/SKILL.md +0 -132
  130. package/skills/prd-generator/SKILL.md +0 -211
  131. package/skills/product-brief/SKILL.md +0 -141
  132. package/skills/project-orchestrator/SKILL.md +0 -487
  133. package/skills/project-orchestrator/assets/caddy-vps-setup.md +0 -180
  134. package/skills/project-orchestrator/assets/plan-summary-template.md +0 -159
  135. package/skills/prompter-specs/SKILL.md +0 -115
  136. package/skills/prompter-workflow/SKILL.md +0 -166
  137. package/skills/prompter-workflow/evals/evals.json +0 -89
  138. package/skills/proposal/SKILL.md +0 -28
  139. package/skills/qa-test-scenario/SKILL.md +0 -149
  140. package/skills/skill-creator/SKILL.md +0 -173
  141. package/skills/sph-generator/SKILL.md +0 -488
  142. package/skills/story-generator/SKILL.md +0 -285
  143. package/skills/story-single/SKILL.md +0 -86
  144. package/skills/tdd-generator/SKILL.md +0 -300
  145. package/skills/tdd-lite-generator/SKILL.md +0 -230
  146. package/skills/ui-ux-pro/SKILL.md +0 -199
  147. package/skills/ui-ux-pro/assets/design-spec-template.md +0 -173
  148. package/skills/ui-ux-pro/references/component-patterns.md +0 -255
  149. package/skills/ui-ux-pro/references/design-principles.md +0 -167
  150. package/skills/wireframe-generator/SKILL.md +0 -227
  151. package/src/cli/index.ts +0 -223
  152. package/src/commands/archive.ts +0 -302
  153. package/src/commands/change.ts +0 -292
  154. package/src/commands/config.ts +0 -233
  155. package/src/commands/guide.ts +0 -50
  156. package/src/commands/init.ts +0 -597
  157. package/src/commands/list.ts +0 -194
  158. package/src/commands/show.ts +0 -138
  159. package/src/commands/spec.ts +0 -251
  160. package/src/commands/update.ts +0 -129
  161. package/src/commands/upgrade.ts +0 -30
  162. package/src/commands/validate.ts +0 -326
  163. package/src/core/artifact-graph/graph.ts +0 -167
  164. package/src/core/artifact-graph/index.ts +0 -44
  165. package/src/core/artifact-graph/instruction-loader.ts +0 -302
  166. package/src/core/artifact-graph/resolver.ts +0 -226
  167. package/src/core/artifact-graph/schema.ts +0 -124
  168. package/src/core/artifact-graph/state.ts +0 -64
  169. package/src/core/artifact-graph/types.ts +0 -65
  170. package/src/core/completions/command-registry.ts +0 -382
  171. package/src/core/completions/completion-provider.ts +0 -128
  172. package/src/core/completions/generators/bash-generator.ts +0 -191
  173. package/src/core/completions/generators/fish-generator.ts +0 -188
  174. package/src/core/completions/generators/powershell-generator.ts +0 -223
  175. package/src/core/completions/generators/zsh-generator.ts +0 -281
  176. package/src/core/completions/templates/bash-templates.ts +0 -24
  177. package/src/core/completions/templates/fish-templates.ts +0 -40
  178. package/src/core/completions/templates/powershell-templates.ts +0 -25
  179. package/src/core/completions/templates/zsh-templates.ts +0 -36
  180. package/src/core/completions/types.ts +0 -90
  181. package/src/core/config-schema.ts +0 -230
  182. package/src/core/config.ts +0 -181
  183. package/src/core/configurators/slash/antigravity.ts +0 -10
  184. package/src/core/configurators/slash/base.ts +0 -109
  185. package/src/core/configurators/slash/claude.ts +0 -10
  186. package/src/core/configurators/slash/codex.ts +0 -10
  187. package/src/core/configurators/slash/droid.ts +0 -10
  188. package/src/core/configurators/slash/forge.ts +0 -10
  189. package/src/core/configurators/slash/github-copilot.ts +0 -10
  190. package/src/core/configurators/slash/index.ts +0 -10
  191. package/src/core/configurators/slash/kilocode.ts +0 -10
  192. package/src/core/configurators/slash/opencode.ts +0 -10
  193. package/src/core/configurators/slash/registry.ts +0 -51
  194. package/src/core/converters/json-converter.ts +0 -62
  195. package/src/core/global-config.ts +0 -136
  196. package/src/core/parsers/change-parser.ts +0 -234
  197. package/src/core/parsers/markdown-parser.ts +0 -237
  198. package/src/core/parsers/requirement-blocks.ts +0 -234
  199. package/src/core/prompt-templates.ts +0 -3504
  200. package/src/core/schemas/base.schema.ts +0 -20
  201. package/src/core/schemas/change.schema.ts +0 -42
  202. package/src/core/schemas/index.ts +0 -20
  203. package/src/core/schemas/spec.schema.ts +0 -17
  204. package/src/core/skill-discovery.ts +0 -68
  205. package/src/core/specs-apply.ts +0 -483
  206. package/src/core/styles/palette.ts +0 -8
  207. package/src/core/templates/agents-template.ts +0 -459
  208. package/src/core/templates/claude-template.ts +0 -2
  209. package/src/core/templates/index.ts +0 -3
  210. package/src/core/templates/project-template.ts +0 -32
  211. package/src/core/validation/constants.ts +0 -48
  212. package/src/core/validation/types.ts +0 -19
  213. package/src/core/validation/validator.ts +0 -449
  214. package/src/core/view.ts +0 -219
  215. package/src/index.ts +0 -1
  216. package/src/utils/change-metadata.ts +0 -171
  217. package/src/utils/change-utils.ts +0 -131
  218. package/src/utils/file-system.ts +0 -252
  219. package/src/utils/index.ts +0 -12
  220. package/src/utils/interactive.ts +0 -29
  221. package/src/utils/item-discovery.ts +0 -66
  222. package/src/utils/match.ts +0 -26
  223. package/src/utils/shell-detection.ts +0 -62
  224. package/src/utils/task-progress.ts +0 -43
  225. package/tsconfig.json +0 -28
@@ -1,230 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- /**
4
- * Zod schema for global Prompter configuration.
5
- * Uses passthrough() to preserve unknown fields for forward compatibility.
6
- */
7
- export const GlobalConfigSchema = z
8
- .object({
9
- featureFlags: z
10
- .record(z.string(), z.boolean())
11
- .optional()
12
- .default({}),
13
- })
14
- .passthrough();
15
-
16
- export type GlobalConfigType = z.infer<typeof GlobalConfigSchema>;
17
-
18
- /**
19
- * Default configuration values.
20
- */
21
- export const DEFAULT_CONFIG: GlobalConfigType = {
22
- featureFlags: {},
23
- };
24
-
25
- const KNOWN_TOP_LEVEL_KEYS = new Set(Object.keys(DEFAULT_CONFIG));
26
-
27
- /**
28
- * Validate a config key path for CLI set operations.
29
- * Unknown top-level keys are rejected unless explicitly allowed by the caller.
30
- */
31
- export function validateConfigKeyPath(path: string): { valid: boolean; reason?: string } {
32
- const rawKeys = path.split('.');
33
-
34
- if (rawKeys.length === 0 || rawKeys.some((key) => key.trim() === '')) {
35
- return { valid: false, reason: 'Key path must not be empty' };
36
- }
37
-
38
- const rootKey = rawKeys[0];
39
- if (!KNOWN_TOP_LEVEL_KEYS.has(rootKey)) {
40
- return { valid: false, reason: `Unknown top-level key "${rootKey}"` };
41
- }
42
-
43
- if (rootKey === 'featureFlags') {
44
- if (rawKeys.length > 2) {
45
- return { valid: false, reason: 'featureFlags values are booleans and do not support nested keys' };
46
- }
47
- return { valid: true };
48
- }
49
-
50
- if (rawKeys.length > 1) {
51
- return { valid: false, reason: `"${rootKey}" does not support nested keys` };
52
- }
53
-
54
- return { valid: true };
55
- }
56
-
57
- /**
58
- * Get a nested value from an object using dot notation.
59
- *
60
- * @param obj - The object to access
61
- * @param path - Dot-separated path (e.g., "featureFlags.someFlag")
62
- * @returns The value at the path, or undefined if not found
63
- */
64
- export function getNestedValue(obj: Record<string, unknown>, path: string): unknown {
65
- const keys = path.split('.');
66
- let current: unknown = obj;
67
-
68
- for (const key of keys) {
69
- if (current === null || current === undefined) {
70
- return undefined;
71
- }
72
- if (typeof current !== 'object') {
73
- return undefined;
74
- }
75
- current = (current as Record<string, unknown>)[key];
76
- }
77
-
78
- return current;
79
- }
80
-
81
- /**
82
- * Set a nested value in an object using dot notation.
83
- * Creates intermediate objects as needed.
84
- *
85
- * @param obj - The object to modify (mutated in place)
86
- * @param path - Dot-separated path (e.g., "featureFlags.someFlag")
87
- * @param value - The value to set
88
- */
89
- export function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {
90
- const keys = path.split('.');
91
- let current: Record<string, unknown> = obj;
92
-
93
- for (let i = 0; i < keys.length - 1; i++) {
94
- const key = keys[i];
95
- if (current[key] === undefined || current[key] === null || typeof current[key] !== 'object') {
96
- current[key] = {};
97
- }
98
- current = current[key] as Record<string, unknown>;
99
- }
100
-
101
- const lastKey = keys[keys.length - 1];
102
- current[lastKey] = value;
103
- }
104
-
105
- /**
106
- * Delete a nested value from an object using dot notation.
107
- *
108
- * @param obj - The object to modify (mutated in place)
109
- * @param path - Dot-separated path (e.g., "featureFlags.someFlag")
110
- * @returns true if the key existed and was deleted, false otherwise
111
- */
112
- export function deleteNestedValue(obj: Record<string, unknown>, path: string): boolean {
113
- const keys = path.split('.');
114
- let current: Record<string, unknown> = obj;
115
-
116
- for (let i = 0; i < keys.length - 1; i++) {
117
- const key = keys[i];
118
- if (current[key] === undefined || current[key] === null || typeof current[key] !== 'object') {
119
- return false;
120
- }
121
- current = current[key] as Record<string, unknown>;
122
- }
123
-
124
- const lastKey = keys[keys.length - 1];
125
- if (lastKey in current) {
126
- delete current[lastKey];
127
- return true;
128
- }
129
- return false;
130
- }
131
-
132
- /**
133
- * Coerce a string value to its appropriate type.
134
- * - "true" / "false" -> boolean
135
- * - Numeric strings -> number
136
- * - Everything else -> string
137
- *
138
- * @param value - The string value to coerce
139
- * @param forceString - If true, always return the value as a string
140
- * @returns The coerced value
141
- */
142
- export function coerceValue(value: string, forceString: boolean = false): string | number | boolean {
143
- if (forceString) {
144
- return value;
145
- }
146
-
147
- // Boolean coercion
148
- if (value === 'true') {
149
- return true;
150
- }
151
- if (value === 'false') {
152
- return false;
153
- }
154
-
155
- // Number coercion - must be a valid finite number
156
- const num = Number(value);
157
- if (!isNaN(num) && isFinite(num) && value.trim() !== '') {
158
- return num;
159
- }
160
-
161
- return value;
162
- }
163
-
164
- /**
165
- * Format a value for YAML-like display.
166
- *
167
- * @param value - The value to format
168
- * @param indent - Current indentation level
169
- * @returns Formatted string
170
- */
171
- export function formatValueYaml(value: unknown, indent: number = 0): string {
172
- const indentStr = ' '.repeat(indent);
173
-
174
- if (value === null || value === undefined) {
175
- return 'null';
176
- }
177
-
178
- if (typeof value === 'boolean' || typeof value === 'number') {
179
- return String(value);
180
- }
181
-
182
- if (typeof value === 'string') {
183
- return value;
184
- }
185
-
186
- if (Array.isArray(value)) {
187
- if (value.length === 0) {
188
- return '[]';
189
- }
190
- return value.map((item) => `${indentStr}- ${formatValueYaml(item, indent + 1)}`).join('\n');
191
- }
192
-
193
- if (typeof value === 'object') {
194
- const entries = Object.entries(value as Record<string, unknown>);
195
- if (entries.length === 0) {
196
- return '{}';
197
- }
198
- return entries
199
- .map(([key, val]) => {
200
- const formattedVal = formatValueYaml(val, indent + 1);
201
- if (typeof val === 'object' && val !== null && Object.keys(val).length > 0) {
202
- return `${indentStr}${key}:\n${formattedVal}`;
203
- }
204
- return `${indentStr}${key}: ${formattedVal}`;
205
- })
206
- .join('\n');
207
- }
208
-
209
- return String(value);
210
- }
211
-
212
- /**
213
- * Validate a configuration object against the schema.
214
- *
215
- * @param config - The configuration to validate
216
- * @returns Validation result with success status and optional error message
217
- */
218
- export function validateConfig(config: unknown): { success: boolean; error?: string } {
219
- try {
220
- GlobalConfigSchema.parse(config);
221
- return { success: true };
222
- } catch (error) {
223
- if (error instanceof z.ZodError) {
224
- const zodError = error as z.ZodError;
225
- const messages = zodError.issues.map((e) => `${e.path.join('.')}: ${e.message}`);
226
- return { success: false, error: messages.join('; ') };
227
- }
228
- return { success: false, error: 'Unknown validation error' };
229
- }
230
- }
@@ -1,181 +0,0 @@
1
- import { promises as fs } from 'fs';
2
- import path from 'path';
3
-
4
- export const PROMPTER_DIR = 'prompter';
5
-
6
- export const PROMPTER_MARKERS = {
7
- start: '<!-- prompter-managed-start -->',
8
- end: '<!-- prompter-managed-end -->'
9
- };
10
-
11
- export interface ToolChoice {
12
- name: string;
13
- value: string;
14
- available: boolean;
15
- successLabel: string;
16
- }
17
-
18
- export interface PromptChoice {
19
- name: string;
20
- value: string;
21
- description: string;
22
- sourceFile: string;
23
- }
24
-
25
- export const SUPPORTED_TOOLS: ToolChoice[] = [
26
- { name: 'Antigravity', value: 'antigravity', available: true, successLabel: 'Antigravity' },
27
- { name: 'Claude Code', value: 'claude', available: true, successLabel: 'Claude Code' },
28
- { name: 'Codex', value: 'codex', available: true, successLabel: 'Codex' },
29
- { name: 'GitHub Copilot', value: 'github-copilot', available: true, successLabel: 'GitHub Copilot' },
30
- { name: 'OpenCode', value: 'opencode', available: true, successLabel: 'OpenCode' },
31
- { name: 'Kilo Code', value: 'kilocode', available: true, successLabel: 'Kilo Code' },
32
- { name: 'Forge', value: 'forge', available: true, successLabel: 'Forge' },
33
- { name: 'Droid', value: 'droid', available: true, successLabel: 'Droid' }
34
- ];
35
-
36
- export const AVAILABLE_PROMPTS: PromptChoice[] = [
37
- {
38
- name: 'AI Humanizer',
39
- value: 'ai-humanizer',
40
- description: 'Transform AI-generated text into natural, human-like content',
41
- sourceFile: 'ai-humanizer.md'
42
- },
43
- {
44
- name: 'API Contract Generator',
45
- value: 'api-contract-generator',
46
- description: 'Generate OpenAPI specification from FSD and ERD',
47
- sourceFile: 'api-contract-generator.md'
48
- },
49
- {
50
- name: 'Apply',
51
- value: 'apply',
52
- description: 'Implement and apply an approved change proposal',
53
- sourceFile: 'apply.md'
54
- },
55
- {
56
- name: 'Archive',
57
- value: 'archive',
58
- description: 'Archive a completed change and update specs',
59
- sourceFile: 'archive.md'
60
- },
61
- {
62
- name: 'Design System',
63
- value: 'design-system',
64
- description: 'Generate comprehensive design system documentation for components and tokens',
65
- sourceFile: 'design-system.md'
66
- },
67
- {
68
- name: 'Document Explainer',
69
- value: 'document-explainer',
70
- description: 'Analyze and explain complex documents into clear, actionable insights',
71
- sourceFile: 'document-explainer.md'
72
- },
73
- {
74
- name: 'Epic (Single)',
75
- value: 'epic-single',
76
- description: 'Generate comprehensive epic documentation',
77
- sourceFile: 'epic-single.md'
78
- },
79
- {
80
- name: 'Epic Generator',
81
- value: 'epic-generator',
82
- description: 'Generate comprehensive EPICs from FSD and TDD documentation',
83
- sourceFile: 'epic-generator.md'
84
- },
85
- {
86
- name: 'ERD Generator',
87
- value: 'erd-generator',
88
- description: 'Generate Entity Relationship Diagram from FSD',
89
- sourceFile: 'erd-generator.md'
90
- },
91
- {
92
- name: 'FSD Generator',
93
- value: 'fsd-generator',
94
- description: 'Generate Functional Specification Document from PRD',
95
- sourceFile: 'fsd-generator.md'
96
- },
97
- {
98
- name: 'PRD Agent Generator',
99
- value: 'prd-agent-generator',
100
- description: 'Create AGENT.md files with Product Requirements Document prompts',
101
- sourceFile: 'prd-agent-generator.md'
102
- },
103
- {
104
- name: 'PRD Generator',
105
- value: 'prd-generator',
106
- description: 'Generate detailed Product Requirements Documents',
107
- sourceFile: 'prd-generator.md'
108
- },
109
- {
110
- name: 'Product Brief',
111
- value: 'product-brief',
112
- description: 'Create concise product brief documents',
113
- sourceFile: 'product-brief.md'
114
- },
115
- {
116
- name: 'Proposal',
117
- value: 'proposal',
118
- description: 'Create a new change proposal with spec deltas',
119
- sourceFile: 'proposal.md'
120
- },
121
- {
122
- name: 'QA Test Scenario',
123
- value: 'qa-test-scenario',
124
- description: 'Generate comprehensive test scenarios and test cases',
125
- sourceFile: 'qa-test-scenario.md'
126
- },
127
- {
128
- name: 'Skill Creator',
129
- value: 'skill-creator',
130
- description: 'Create structured skill documentation for AI agents',
131
- sourceFile: 'skill-creator.md'
132
- },
133
- {
134
- name: 'Story (Single)',
135
- value: 'story-single',
136
- description: 'Generate detailed user story documentation',
137
- sourceFile: 'story-single.md'
138
- },
139
- {
140
- name: 'Story Generator',
141
- value: 'story-generator',
142
- description: 'Generate comprehensive user stories from EPICs and FSD',
143
- sourceFile: 'story-generator.md'
144
- },
145
- {
146
- name: 'TDD Generator',
147
- value: 'tdd-generator',
148
- description: 'Generate comprehensive Technical Design Document',
149
- sourceFile: 'tdd-generator.md'
150
- },
151
- {
152
- name: 'TDD-Lite Generator',
153
- value: 'tdd-lite-generator',
154
- description: 'Generate lean Technical Design Document (TDD-Lite)',
155
- sourceFile: 'tdd-lite-generator.md'
156
- },
157
- {
158
- name: 'Wireframe Generator',
159
- value: 'wireframe-generator',
160
- description: 'Generate UI/UX wireframes from technical specs',
161
- sourceFile: 'wireframe-generator.md'
162
- }
163
- ];
164
-
165
- export class PrompterConfig {
166
- static async ensurePrompterDir(projectPath: string): Promise<string> {
167
- const prompterPath = path.join(projectPath, PROMPTER_DIR);
168
- await fs.mkdir(prompterPath, { recursive: true });
169
- return prompterPath;
170
- }
171
-
172
- static async prompterDirExists(projectPath: string): Promise<boolean> {
173
- try {
174
- const prompterPath = path.join(projectPath, PROMPTER_DIR);
175
- await fs.access(prompterPath);
176
- return true;
177
- } catch {
178
- return false;
179
- }
180
- }
181
- }
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class AntigravityConfigurator extends ToolConfigurator {
4
- readonly toolId = 'antigravity';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.agent/skills/${skillName}`;
9
- }
10
- }
@@ -1,109 +0,0 @@
1
- import { promises as fs } from 'fs';
2
- import path from 'path';
3
- import { SkillMetadata } from '../../skill-discovery.js';
4
-
5
- export interface SkillTarget {
6
- name: string;
7
- path: string;
8
- kind: 'skill';
9
- }
10
-
11
- export abstract class ToolConfigurator {
12
- abstract readonly toolId: string;
13
- abstract readonly isAvailable: boolean;
14
-
15
- /**
16
- * Returns the relative directory path where a skill directory is placed
17
- * inside the tool's config dir. e.g. `.claude/skills/laravel-code-review`
18
- */
19
- protected abstract getSkillTargetDir(skillName: string): string;
20
-
21
- /** Returns the directory where all skills for this tool are placed, e.g. `.claude/skills` */
22
- getSkillsRootDir(): string {
23
- return path.dirname(this.getSkillTargetDir('__placeholder__'));
24
- }
25
-
26
- // --- Skill directory management ---
27
-
28
- getSkillTargets(skills: SkillMetadata[]): SkillTarget[] {
29
- return skills.map(skill => ({
30
- name: skill.name,
31
- path: this.getSkillTargetDir(skill.name),
32
- kind: 'skill'
33
- }));
34
- }
35
-
36
- async generateSkills(projectPath: string, skills: SkillMetadata[]): Promise<string[]> {
37
- const created: string[] = [];
38
-
39
- for (const skill of skills) {
40
- const targetDir = path.join(projectPath, this.getSkillTargetDir(skill.name));
41
- await this.copyDir(skill.sourcePath, targetDir);
42
- created.push(this.getSkillTargetDir(skill.name));
43
- }
44
-
45
- return created;
46
- }
47
-
48
- async updateExistingSkills(projectPath: string, skills: SkillMetadata[]): Promise<string[]> {
49
- const updated: string[] = [];
50
-
51
- for (const skill of skills) {
52
- const relativeDir = this.getSkillTargetDir(skill.name);
53
- const targetDir = path.join(projectPath, relativeDir);
54
-
55
- if (await this.dirExists(targetDir)) {
56
- await this.copyDir(skill.sourcePath, targetDir);
57
- updated.push(relativeDir);
58
- }
59
- }
60
-
61
- return updated;
62
- }
63
-
64
- async removeSkillFiles(projectPath: string, skillNames: string[]): Promise<string[]> {
65
- const removed: string[] = [];
66
-
67
- for (const name of skillNames) {
68
- const relativeDir = this.getSkillTargetDir(name);
69
- const targetDir = path.join(projectPath, relativeDir);
70
-
71
- if (await this.dirExists(targetDir)) {
72
- await fs.rm(targetDir, { recursive: true, force: true });
73
- removed.push(relativeDir);
74
- }
75
- }
76
-
77
- return removed;
78
- }
79
-
80
- async removeAllDeployedSkills(projectPath: string): Promise<void> {
81
- const dir = path.join(projectPath, this.getSkillsRootDir());
82
- await fs.rm(dir, { recursive: true, force: true });
83
- }
84
-
85
- private async copyDir(src: string, dest: string): Promise<void> {
86
- await fs.mkdir(dest, { recursive: true });
87
- const entries = await fs.readdir(src, { withFileTypes: true });
88
-
89
- for (const entry of entries) {
90
- const srcPath = path.join(src, entry.name);
91
- const destPath = path.join(dest, entry.name);
92
-
93
- if (entry.isDirectory()) {
94
- await this.copyDir(srcPath, destPath);
95
- } else {
96
- await fs.copyFile(srcPath, destPath);
97
- }
98
- }
99
- }
100
-
101
- private async dirExists(dirPath: string): Promise<boolean> {
102
- try {
103
- const stat = await fs.stat(dirPath);
104
- return stat.isDirectory();
105
- } catch {
106
- return false;
107
- }
108
- }
109
- }
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class ClaudeConfigurator extends ToolConfigurator {
4
- readonly toolId = 'claude';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.claude/skills/${skillName}`;
9
- }
10
- }
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class CodexConfigurator extends ToolConfigurator {
4
- readonly toolId = 'codex';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.codex/skills/${skillName}`;
9
- }
10
- }
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class DroidConfigurator extends ToolConfigurator {
4
- readonly toolId = 'droid';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.factory/skills/${skillName}`;
9
- }
10
- }
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class ForgeConfigurator extends ToolConfigurator {
4
- readonly toolId = 'forge';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.forge/skills/${skillName}`;
9
- }
10
- }
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class GithubCopilotConfigurator extends ToolConfigurator {
4
- readonly toolId = 'github-copilot';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.github/skills/${skillName}`;
9
- }
10
- }
@@ -1,10 +0,0 @@
1
- export { ToolConfigurator } from './base.js';
2
- export { ConfiguratorRegistry, registry } from './registry.js';
3
- export { AntigravityConfigurator } from './antigravity.js';
4
- export { ClaudeConfigurator } from './claude.js';
5
- export { CodexConfigurator } from './codex.js';
6
- export { GithubCopilotConfigurator } from './github-copilot.js';
7
- export { OpenCodeConfigurator } from './opencode.js';
8
- export { KiloCodeConfigurator } from './kilocode.js';
9
- export { ForgeConfigurator } from './forge.js';
10
- export { DroidConfigurator } from './droid.js';
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class KiloCodeConfigurator extends ToolConfigurator {
4
- readonly toolId = 'kilocode';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.kilocode/skills/${skillName}`;
9
- }
10
- }
@@ -1,10 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
-
3
- export class OpenCodeConfigurator extends ToolConfigurator {
4
- readonly toolId = 'opencode';
5
- readonly isAvailable = true;
6
-
7
- protected getSkillTargetDir(skillName: string): string {
8
- return `.opencode/skills/${skillName}`;
9
- }
10
- }
@@ -1,51 +0,0 @@
1
- import { ToolConfigurator } from './base.js';
2
- import { AntigravityConfigurator } from './antigravity.js';
3
- import { ClaudeConfigurator } from './claude.js';
4
- import { CodexConfigurator } from './codex.js';
5
- import { GithubCopilotConfigurator } from './github-copilot.js';
6
- import { OpenCodeConfigurator } from './opencode.js';
7
- import { KiloCodeConfigurator } from './kilocode.js';
8
- import { ForgeConfigurator } from './forge.js';
9
- import { DroidConfigurator } from './droid.js';
10
-
11
- export class ConfiguratorRegistry {
12
- private configurators: Map<string, ToolConfigurator> = new Map();
13
-
14
- constructor() {
15
- const antigravity = new AntigravityConfigurator();
16
- const claude = new ClaudeConfigurator();
17
- const codex = new CodexConfigurator();
18
- const githubCopilot = new GithubCopilotConfigurator();
19
- const opencode = new OpenCodeConfigurator();
20
- const kilocode = new KiloCodeConfigurator();
21
- const forge = new ForgeConfigurator();
22
- const droid = new DroidConfigurator();
23
-
24
- this.configurators.set(antigravity.toolId, antigravity);
25
- this.configurators.set(claude.toolId, claude);
26
- this.configurators.set(codex.toolId, codex);
27
- this.configurators.set(githubCopilot.toolId, githubCopilot);
28
- this.configurators.set(opencode.toolId, opencode);
29
- this.configurators.set(kilocode.toolId, kilocode);
30
- this.configurators.set(forge.toolId, forge);
31
- this.configurators.set(droid.toolId, droid);
32
- }
33
-
34
- get(toolId: string): ToolConfigurator | undefined {
35
- return this.configurators.get(toolId);
36
- }
37
-
38
- getAll(): ToolConfigurator[] {
39
- return Array.from(this.configurators.values());
40
- }
41
-
42
- getAvailable(): ToolConfigurator[] {
43
- return this.getAll().filter(c => c.isAvailable);
44
- }
45
-
46
- getToolIds(): string[] {
47
- return Array.from(this.configurators.keys());
48
- }
49
- }
50
-
51
- export const registry = new ConfiguratorRegistry();