@deimoscloud/coreai 0.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 (216) hide show
  1. package/.prettierrc +9 -0
  2. package/AGENT_SPEC.md +347 -0
  3. package/ARCHITECTURE.md +547 -0
  4. package/DRAFT_PRD.md +1440 -0
  5. package/IMPLEMENTATION_PLAN.md +256 -0
  6. package/PRODUCT.md +473 -0
  7. package/README.md +303 -0
  8. package/WORKFLOWS.md +295 -0
  9. package/agents/_templates/ic-engineer.md +185 -0
  10. package/agents/_templates/reviewer.md +182 -0
  11. package/agents/backend-engineer.yaml +72 -0
  12. package/agents/devops-engineer.yaml +72 -0
  13. package/agents/engineering-manager.yaml +70 -0
  14. package/agents/examples/android-engineer.md +302 -0
  15. package/agents/examples/backend-engineer.md +320 -0
  16. package/agents/examples/devops-engineer.md +742 -0
  17. package/agents/examples/engineering-manager.md +469 -0
  18. package/agents/examples/frontend-engineer.md +58 -0
  19. package/agents/examples/product-manager.md +315 -0
  20. package/agents/examples/qa-engineer.md +371 -0
  21. package/agents/examples/security-engineer.md +525 -0
  22. package/agents/examples/solutions-architect.md +351 -0
  23. package/agents/examples/wearos-engineer.md +359 -0
  24. package/agents/frontend-engineer.yaml +72 -0
  25. package/commands/core/check-inbox.md +34 -0
  26. package/commands/core/delegate.md +30 -0
  27. package/commands/core/git-commit.md +144 -0
  28. package/commands/core/pr-create.md +193 -0
  29. package/commands/core/review.md +56 -0
  30. package/commands/core/sprint-status.md +65 -0
  31. package/commands/optional/docs-update.md +200 -0
  32. package/commands/optional/jira-create.md +200 -0
  33. package/commands/optional/jira-transition.md +184 -0
  34. package/commands/optional/worktree-cleanup.md +167 -0
  35. package/commands/optional/worktree-setup.md +110 -0
  36. package/dist/cli/index.js +4037 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/index.d.ts +2978 -0
  39. package/dist/index.js +3867 -0
  40. package/dist/index.js.map +1 -0
  41. package/eslint.config.js +29 -0
  42. package/jest.config.js +22 -0
  43. package/knowledge-library/README.md +118 -0
  44. package/knowledge-library/android-engineer/context/current.txt +42 -0
  45. package/knowledge-library/android-engineer/control/decisions.txt +9 -0
  46. package/knowledge-library/android-engineer/control/dependencies.txt +19 -0
  47. package/knowledge-library/android-engineer/control/objectives.txt +26 -0
  48. package/knowledge-library/android-engineer/history/.gitkeep +0 -0
  49. package/knowledge-library/android-engineer/inbox/processed/.gitkeep +0 -0
  50. package/knowledge-library/android-engineer/outbox/.gitkeep +0 -0
  51. package/knowledge-library/android-engineer/tech/.gitkeep +0 -0
  52. package/knowledge-library/architecture.txt +61 -0
  53. package/knowledge-library/backend-engineer/context/current.txt +42 -0
  54. package/knowledge-library/backend-engineer/control/decisions.txt +9 -0
  55. package/knowledge-library/backend-engineer/control/dependencies.txt +19 -0
  56. package/knowledge-library/backend-engineer/control/objectives.txt +26 -0
  57. package/knowledge-library/backend-engineer/history/.gitkeep +0 -0
  58. package/knowledge-library/backend-engineer/inbox/processed/.gitkeep +0 -0
  59. package/knowledge-library/backend-engineer/outbox/.gitkeep +0 -0
  60. package/knowledge-library/backend-engineer/tech/.gitkeep +0 -0
  61. package/knowledge-library/context.txt +52 -0
  62. package/knowledge-library/devops-engineer/context/current.txt +42 -0
  63. package/knowledge-library/devops-engineer/control/decisions.txt +9 -0
  64. package/knowledge-library/devops-engineer/control/dependencies.txt +19 -0
  65. package/knowledge-library/devops-engineer/control/objectives.txt +26 -0
  66. package/knowledge-library/devops-engineer/history/.gitkeep +0 -0
  67. package/knowledge-library/devops-engineer/inbox/processed/.gitkeep +0 -0
  68. package/knowledge-library/devops-engineer/outbox/.gitkeep +0 -0
  69. package/knowledge-library/devops-engineer/tech/.gitkeep +0 -0
  70. package/knowledge-library/engineering-manager/context/current.txt +40 -0
  71. package/knowledge-library/engineering-manager/control/decisions.txt +9 -0
  72. package/knowledge-library/engineering-manager/control/objectives.txt +27 -0
  73. package/knowledge-library/engineering-manager/history/.gitkeep +0 -0
  74. package/knowledge-library/engineering-manager/inbox/processed/.gitkeep +0 -0
  75. package/knowledge-library/engineering-manager/outbox/.gitkeep +0 -0
  76. package/knowledge-library/engineering-manager/tech/.gitkeep +0 -0
  77. package/knowledge-library/prd.txt +81 -0
  78. package/knowledge-library/product-manager/context/current.txt +42 -0
  79. package/knowledge-library/product-manager/control/decisions.txt +9 -0
  80. package/knowledge-library/product-manager/control/dependencies.txt +19 -0
  81. package/knowledge-library/product-manager/control/objectives.txt +26 -0
  82. package/knowledge-library/product-manager/history/.gitkeep +0 -0
  83. package/knowledge-library/product-manager/inbox/processed/.gitkeep +0 -0
  84. package/knowledge-library/product-manager/outbox/.gitkeep +0 -0
  85. package/knowledge-library/product-manager/tech/.gitkeep +0 -0
  86. package/knowledge-library/qa-engineer/context/current.txt +42 -0
  87. package/knowledge-library/qa-engineer/control/decisions.txt +9 -0
  88. package/knowledge-library/qa-engineer/control/dependencies.txt +19 -0
  89. package/knowledge-library/qa-engineer/control/objectives.txt +26 -0
  90. package/knowledge-library/qa-engineer/history/.gitkeep +0 -0
  91. package/knowledge-library/qa-engineer/inbox/processed/.gitkeep +0 -0
  92. package/knowledge-library/qa-engineer/outbox/.gitkeep +0 -0
  93. package/knowledge-library/qa-engineer/tech/.gitkeep +0 -0
  94. package/knowledge-library/security-engineer/context/current.txt +42 -0
  95. package/knowledge-library/security-engineer/control/decisions.txt +9 -0
  96. package/knowledge-library/security-engineer/control/dependencies.txt +19 -0
  97. package/knowledge-library/security-engineer/control/objectives.txt +26 -0
  98. package/knowledge-library/security-engineer/history/.gitkeep +0 -0
  99. package/knowledge-library/security-engineer/inbox/processed/.gitkeep +0 -0
  100. package/knowledge-library/security-engineer/outbox/.gitkeep +0 -0
  101. package/knowledge-library/security-engineer/tech/.gitkeep +0 -0
  102. package/knowledge-library/solutions-architect/context/current.txt +42 -0
  103. package/knowledge-library/solutions-architect/control/decisions.txt +9 -0
  104. package/knowledge-library/solutions-architect/control/dependencies.txt +19 -0
  105. package/knowledge-library/solutions-architect/control/objectives.txt +26 -0
  106. package/knowledge-library/solutions-architect/history/.gitkeep +0 -0
  107. package/knowledge-library/solutions-architect/inbox/processed/.gitkeep +0 -0
  108. package/knowledge-library/solutions-architect/outbox/.gitkeep +0 -0
  109. package/knowledge-library/solutions-architect/tech/.gitkeep +0 -0
  110. package/knowledge-library/wearos-engineer/context/current.txt +42 -0
  111. package/knowledge-library/wearos-engineer/control/decisions.txt +9 -0
  112. package/knowledge-library/wearos-engineer/control/dependencies.txt +19 -0
  113. package/knowledge-library/wearos-engineer/control/objectives.txt +26 -0
  114. package/knowledge-library/wearos-engineer/history/.gitkeep +0 -0
  115. package/knowledge-library/wearos-engineer/inbox/processed/.gitkeep +0 -0
  116. package/knowledge-library/wearos-engineer/outbox/.gitkeep +0 -0
  117. package/knowledge-library/wearos-engineer/tech/.gitkeep +0 -0
  118. package/package.json +66 -0
  119. package/schemas/agent.schema.json +171 -0
  120. package/schemas/coreai.config.schema.json +257 -0
  121. package/scripts/add-agent.sh +323 -0
  122. package/scripts/install.sh +354 -0
  123. package/src/adapters/factory.test.ts +386 -0
  124. package/src/adapters/factory.ts +305 -0
  125. package/src/adapters/index.ts +113 -0
  126. package/src/adapters/interfaces.ts +268 -0
  127. package/src/adapters/mcp/client.test.ts +130 -0
  128. package/src/adapters/mcp/client.ts +451 -0
  129. package/src/adapters/mcp/discovery.test.ts +315 -0
  130. package/src/adapters/mcp/discovery.ts +340 -0
  131. package/src/adapters/mcp/index.ts +66 -0
  132. package/src/adapters/mcp/mapper.test.ts +218 -0
  133. package/src/adapters/mcp/mapper.ts +536 -0
  134. package/src/adapters/mcp/registry.test.ts +433 -0
  135. package/src/adapters/mcp/registry.ts +550 -0
  136. package/src/adapters/mcp/types.ts +258 -0
  137. package/src/adapters/native/filesystem.test.ts +350 -0
  138. package/src/adapters/native/filesystem.ts +393 -0
  139. package/src/adapters/native/github.test.ts +173 -0
  140. package/src/adapters/native/github.ts +627 -0
  141. package/src/adapters/native/index.ts +22 -0
  142. package/src/adapters/native/selector.test.ts +224 -0
  143. package/src/adapters/native/selector.ts +150 -0
  144. package/src/adapters/types.ts +270 -0
  145. package/src/agents/compiler.test.ts +399 -0
  146. package/src/agents/compiler.ts +359 -0
  147. package/src/agents/index.ts +36 -0
  148. package/src/agents/loader.test.ts +319 -0
  149. package/src/agents/loader.ts +143 -0
  150. package/src/agents/resolver.test.ts +282 -0
  151. package/src/agents/resolver.ts +262 -0
  152. package/src/agents/types.ts +87 -0
  153. package/src/cache/index.ts +38 -0
  154. package/src/cache/interfaces.ts +283 -0
  155. package/src/cache/manager.test.ts +266 -0
  156. package/src/cache/manager.ts +388 -0
  157. package/src/cache/provider.test.ts +485 -0
  158. package/src/cache/provider.ts +745 -0
  159. package/src/cache/types.test.ts +192 -0
  160. package/src/cache/types.ts +313 -0
  161. package/src/cli/commands/build.test.ts +248 -0
  162. package/src/cli/commands/build.ts +244 -0
  163. package/src/cli/commands/cache.test.ts +221 -0
  164. package/src/cli/commands/cache.ts +229 -0
  165. package/src/cli/commands/index.ts +63 -0
  166. package/src/cli/commands/init.test.ts +173 -0
  167. package/src/cli/commands/init.ts +296 -0
  168. package/src/cli/commands/skills.test.ts +272 -0
  169. package/src/cli/commands/skills.ts +348 -0
  170. package/src/cli/commands/status.test.ts +392 -0
  171. package/src/cli/commands/status.ts +332 -0
  172. package/src/cli/commands/sync.test.ts +213 -0
  173. package/src/cli/commands/sync.ts +251 -0
  174. package/src/cli/commands/validate.test.ts +216 -0
  175. package/src/cli/commands/validate.ts +340 -0
  176. package/src/cli/index.test.ts +190 -0
  177. package/src/cli/index.ts +493 -0
  178. package/src/commands/context.test.ts +163 -0
  179. package/src/commands/context.ts +111 -0
  180. package/src/commands/index.ts +56 -0
  181. package/src/commands/loader.test.ts +273 -0
  182. package/src/commands/loader.ts +355 -0
  183. package/src/commands/registry.test.ts +384 -0
  184. package/src/commands/registry.ts +248 -0
  185. package/src/commands/runner.test.ts +297 -0
  186. package/src/commands/runner.ts +222 -0
  187. package/src/commands/types.ts +361 -0
  188. package/src/config/index.ts +19 -0
  189. package/src/config/loader.test.ts +262 -0
  190. package/src/config/loader.ts +188 -0
  191. package/src/config/types.ts +154 -0
  192. package/src/context/index.ts +14 -0
  193. package/src/context/loader.test.ts +334 -0
  194. package/src/context/loader.ts +357 -0
  195. package/src/index.test.ts +13 -0
  196. package/src/index.ts +244 -0
  197. package/src/knowledge-library/index.ts +44 -0
  198. package/src/knowledge-library/manager.test.ts +536 -0
  199. package/src/knowledge-library/manager.ts +804 -0
  200. package/src/knowledge-library/types.ts +432 -0
  201. package/src/skills/generator.test.ts +602 -0
  202. package/src/skills/generator.ts +491 -0
  203. package/src/skills/index.ts +27 -0
  204. package/src/skills/templates.ts +520 -0
  205. package/src/skills/types.ts +251 -0
  206. package/templates/completion-report.md +72 -0
  207. package/templates/feedback.md +56 -0
  208. package/templates/project-files/CLAUDE.md.template +109 -0
  209. package/templates/project-files/coreai.json.example +47 -0
  210. package/templates/project-files/mcp.json.template +20 -0
  211. package/templates/review-complete.md +64 -0
  212. package/templates/review-request.md +67 -0
  213. package/templates/task-assignment.md +51 -0
  214. package/tsconfig.build.json +4 -0
  215. package/tsconfig.json +26 -0
  216. package/tsup.config.ts +23 -0
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Skills Command
3
+ *
4
+ * Generates Claude skills from templates based on project configuration.
5
+ */
6
+
7
+ import { configExists, loadConfig, ConfigError } from '../../config/loader.js';
8
+ import type { ResolvedCoreAIConfig } from '../../config/types.js';
9
+ import {
10
+ generateSkills,
11
+ formatGenerateResult,
12
+ builtInSkills,
13
+ loadCustomTemplates,
14
+ type GenerateSkillsOptions,
15
+ type GenerateSkillsResult,
16
+ } from '../../skills/index.js';
17
+
18
+ /**
19
+ * Options for skills generate command
20
+ */
21
+ export interface SkillsGenerateOptions {
22
+ /**
23
+ * Project root directory
24
+ */
25
+ projectRoot?: string;
26
+
27
+ /**
28
+ * Output directory for generated skills
29
+ */
30
+ outputDir?: string;
31
+
32
+ /**
33
+ * Directory containing custom skill templates
34
+ */
35
+ customTemplatesDir?: string;
36
+
37
+ /**
38
+ * Only generate specific skills
39
+ */
40
+ skills?: string[];
41
+
42
+ /**
43
+ * Include core skills (default: true)
44
+ */
45
+ includeCoreSkills?: boolean;
46
+
47
+ /**
48
+ * Include optional skills (default: true)
49
+ */
50
+ includeOptionalSkills?: boolean;
51
+
52
+ /**
53
+ * Overwrite existing skill files
54
+ */
55
+ overwrite?: boolean;
56
+
57
+ /**
58
+ * Additional variables for template substitution
59
+ */
60
+ variables?: Record<string, string>;
61
+ }
62
+
63
+ /**
64
+ * Result of skills generate command
65
+ */
66
+ export interface SkillsGenerateResult {
67
+ success: boolean;
68
+ result?: GenerateSkillsResult;
69
+ config?: ResolvedCoreAIConfig;
70
+ error?: string;
71
+ warnings?: string[];
72
+ }
73
+
74
+ /**
75
+ * Generate skills from templates
76
+ */
77
+ export function skillsGenerate(options: SkillsGenerateOptions = {}): SkillsGenerateResult {
78
+ const projectRoot = options.projectRoot ?? process.cwd();
79
+ const warnings: string[] = [];
80
+
81
+ // Load config if available
82
+ let config: ResolvedCoreAIConfig | undefined;
83
+ if (configExists(projectRoot)) {
84
+ try {
85
+ config = loadConfig(projectRoot);
86
+ } catch (error) {
87
+ if (error instanceof ConfigError) {
88
+ return {
89
+ success: false,
90
+ error: `Configuration error: ${error.message}`,
91
+ };
92
+ }
93
+ return {
94
+ success: false,
95
+ error: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,
96
+ };
97
+ }
98
+ } else {
99
+ warnings.push('No configuration file found. Generating skills with defaults.');
100
+ }
101
+
102
+ // Set up generate options
103
+ const generateOptions: GenerateSkillsOptions = {
104
+ projectRoot,
105
+ includeCoreSkills: options.includeCoreSkills ?? true,
106
+ includeOptionalSkills: options.includeOptionalSkills ?? true,
107
+ overwrite: options.overwrite ?? false,
108
+ };
109
+
110
+ if (options.outputDir) {
111
+ generateOptions.outputDir = options.outputDir;
112
+ }
113
+
114
+ if (options.customTemplatesDir) {
115
+ generateOptions.customTemplatesDir = options.customTemplatesDir;
116
+ }
117
+
118
+ if (options.skills && options.skills.length > 0) {
119
+ generateOptions.skills = options.skills;
120
+ }
121
+
122
+ if (options.variables) {
123
+ generateOptions.variables = options.variables;
124
+ }
125
+
126
+ // Generate skills
127
+ try {
128
+ const result = generateSkills(config, generateOptions);
129
+
130
+ // Check for errors
131
+ if (result.errors.length > 0) {
132
+ return {
133
+ success: false,
134
+ result,
135
+ config,
136
+ error: `Failed to generate ${result.errors.length} skill(s)`,
137
+ warnings: warnings.length > 0 ? warnings : undefined,
138
+ };
139
+ }
140
+
141
+ return {
142
+ success: true,
143
+ result,
144
+ config,
145
+ warnings: warnings.length > 0 ? warnings : undefined,
146
+ };
147
+ } catch (error) {
148
+ return {
149
+ success: false,
150
+ error: `Skill generation failed: ${error instanceof Error ? error.message : String(error)}`,
151
+ warnings: warnings.length > 0 ? warnings : undefined,
152
+ };
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Format skills generate result for display
158
+ */
159
+ export function formatSkillsGenerateResult(result: SkillsGenerateResult): string {
160
+ const lines: string[] = [];
161
+
162
+ // Warnings
163
+ if (result.warnings && result.warnings.length > 0) {
164
+ for (const warning of result.warnings) {
165
+ lines.push(`⚠ ${warning}`);
166
+ }
167
+ lines.push('');
168
+ }
169
+
170
+ if (!result.success) {
171
+ lines.push(`Skill generation failed: ${result.error}`);
172
+
173
+ // Show individual errors
174
+ if (result.result?.errors && result.result.errors.length > 0) {
175
+ lines.push('');
176
+ for (const error of result.result.errors) {
177
+ lines.push(` ✗ ${error.name}: ${error.error}`);
178
+ }
179
+ }
180
+
181
+ return lines.join('\n');
182
+ }
183
+
184
+ // Use the generator's format function for the detailed output
185
+ if (result.result) {
186
+ return formatGenerateResult(result.result);
187
+ }
188
+
189
+ lines.push('No skills to generate.');
190
+ return lines.join('\n');
191
+ }
192
+
193
+ /**
194
+ * List available skills
195
+ */
196
+ export interface SkillsListOptions {
197
+ /**
198
+ * Project root directory
199
+ */
200
+ projectRoot?: string;
201
+
202
+ /**
203
+ * Directory containing custom skill templates
204
+ */
205
+ customTemplatesDir?: string;
206
+
207
+ /**
208
+ * Include core skills
209
+ */
210
+ includeCoreSkills?: boolean;
211
+
212
+ /**
213
+ * Include optional skills
214
+ */
215
+ includeOptionalSkills?: boolean;
216
+ }
217
+
218
+ /**
219
+ * Information about an available skill
220
+ */
221
+ export interface SkillInfo {
222
+ name: string;
223
+ description: string;
224
+ category: string;
225
+ dependencies?: string[];
226
+ argumentHint?: string;
227
+ }
228
+
229
+ /**
230
+ * Result of skills list command
231
+ */
232
+ export interface SkillsListResult {
233
+ success: boolean;
234
+ skills?: SkillInfo[];
235
+ error?: string;
236
+ }
237
+
238
+ /**
239
+ * List available skills
240
+ */
241
+ export function skillsList(options: SkillsListOptions = {}): SkillsListResult {
242
+ try {
243
+ const skills: SkillInfo[] = [];
244
+
245
+ // Add built-in skills
246
+ const includeCoreSkills = options.includeCoreSkills ?? true;
247
+ const includeOptionalSkills = options.includeOptionalSkills ?? true;
248
+
249
+ for (const skill of builtInSkills) {
250
+ if (skill.category === 'core' && !includeCoreSkills) continue;
251
+ if (skill.category === 'optional' && !includeOptionalSkills) continue;
252
+
253
+ skills.push({
254
+ name: skill.name,
255
+ description: skill.description,
256
+ category: skill.category,
257
+ dependencies: skill.dependencies?.filter((d) => d.required).map((d) => d.type),
258
+ argumentHint: skill.argumentHint,
259
+ });
260
+ }
261
+
262
+ // Add custom skills if directory specified
263
+ if (options.customTemplatesDir) {
264
+ const customSkills = loadCustomTemplates(options.customTemplatesDir);
265
+ for (const skill of customSkills) {
266
+ skills.push({
267
+ name: skill.name,
268
+ description: skill.description,
269
+ category: skill.category,
270
+ dependencies: skill.dependencies?.filter((d) => d.required).map((d) => d.type),
271
+ argumentHint: skill.argumentHint,
272
+ });
273
+ }
274
+ }
275
+
276
+ return {
277
+ success: true,
278
+ skills,
279
+ };
280
+ } catch (error) {
281
+ return {
282
+ success: false,
283
+ error: `Failed to list skills: ${error instanceof Error ? error.message : String(error)}`,
284
+ };
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Format skills list result for display
290
+ */
291
+ export function formatSkillsListResult(result: SkillsListResult): string {
292
+ if (!result.success) {
293
+ return `Error: ${result.error}`;
294
+ }
295
+
296
+ if (!result.skills || result.skills.length === 0) {
297
+ return 'No skills available.';
298
+ }
299
+
300
+ const lines: string[] = [];
301
+ lines.push('Available skills:\n');
302
+
303
+ // Group by category
304
+ const coreSkills = result.skills.filter((s) => s.category === 'core');
305
+ const optionalSkills = result.skills.filter((s) => s.category === 'optional');
306
+ const customSkills = result.skills.filter((s) => s.category === 'custom');
307
+
308
+ if (coreSkills.length > 0) {
309
+ lines.push('Core skills:');
310
+ for (const skill of coreSkills) {
311
+ lines.push(` ${skill.name}`);
312
+ lines.push(` ${skill.description}`);
313
+ if (skill.argumentHint) {
314
+ lines.push(` Argument: ${skill.argumentHint}`);
315
+ }
316
+ }
317
+ lines.push('');
318
+ }
319
+
320
+ if (optionalSkills.length > 0) {
321
+ lines.push('Optional skills:');
322
+ for (const skill of optionalSkills) {
323
+ const deps = skill.dependencies?.length
324
+ ? ` (requires: ${skill.dependencies.join(', ')})`
325
+ : '';
326
+ lines.push(` ${skill.name}${deps}`);
327
+ lines.push(` ${skill.description}`);
328
+ if (skill.argumentHint) {
329
+ lines.push(` Argument: ${skill.argumentHint}`);
330
+ }
331
+ }
332
+ lines.push('');
333
+ }
334
+
335
+ if (customSkills.length > 0) {
336
+ lines.push('Custom skills:');
337
+ for (const skill of customSkills) {
338
+ lines.push(` ${skill.name}`);
339
+ lines.push(` ${skill.description}`);
340
+ if (skill.argumentHint) {
341
+ lines.push(` Argument: ${skill.argumentHint}`);
342
+ }
343
+ }
344
+ lines.push('');
345
+ }
346
+
347
+ return lines.join('\n');
348
+ }