sage-team 3.0.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 (178) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +180 -0
  3. package/dist/agents/__tests__/personas.test.d.ts +2 -0
  4. package/dist/agents/__tests__/personas.test.d.ts.map +1 -0
  5. package/dist/agents/__tests__/personas.test.js +47 -0
  6. package/dist/agents/__tests__/personas.test.js.map +1 -0
  7. package/dist/agents/personas.d.ts +3 -0
  8. package/dist/agents/personas.d.ts.map +1 -0
  9. package/dist/agents/personas.js +127 -0
  10. package/dist/agents/personas.js.map +1 -0
  11. package/dist/agents/skills-map.d.ts +7 -0
  12. package/dist/agents/skills-map.d.ts.map +1 -0
  13. package/dist/agents/skills-map.js +55 -0
  14. package/dist/agents/skills-map.js.map +1 -0
  15. package/dist/cli/__tests__/cli.test.d.ts +2 -0
  16. package/dist/cli/__tests__/cli.test.d.ts.map +1 -0
  17. package/dist/cli/__tests__/cli.test.js +65 -0
  18. package/dist/cli/__tests__/cli.test.js.map +1 -0
  19. package/dist/cli/commands/config.d.ts +3 -0
  20. package/dist/cli/commands/config.d.ts.map +1 -0
  21. package/dist/cli/commands/config.js +50 -0
  22. package/dist/cli/commands/config.js.map +1 -0
  23. package/dist/cli/commands/doctor.d.ts +9 -0
  24. package/dist/cli/commands/doctor.d.ts.map +1 -0
  25. package/dist/cli/commands/doctor.js +74 -0
  26. package/dist/cli/commands/doctor.js.map +1 -0
  27. package/dist/cli/commands/init.d.ts +3 -0
  28. package/dist/cli/commands/init.d.ts.map +1 -0
  29. package/dist/cli/commands/init.js +67 -0
  30. package/dist/cli/commands/init.js.map +1 -0
  31. package/dist/cli/commands/logs.d.ts +3 -0
  32. package/dist/cli/commands/logs.d.ts.map +1 -0
  33. package/dist/cli/commands/logs.js +51 -0
  34. package/dist/cli/commands/logs.js.map +1 -0
  35. package/dist/cli/commands/resume.d.ts +3 -0
  36. package/dist/cli/commands/resume.d.ts.map +1 -0
  37. package/dist/cli/commands/resume.js +106 -0
  38. package/dist/cli/commands/resume.js.map +1 -0
  39. package/dist/cli/commands/start.d.ts +3 -0
  40. package/dist/cli/commands/start.d.ts.map +1 -0
  41. package/dist/cli/commands/start.js +103 -0
  42. package/dist/cli/commands/start.js.map +1 -0
  43. package/dist/cli/commands/status.d.ts +3 -0
  44. package/dist/cli/commands/status.d.ts.map +1 -0
  45. package/dist/cli/commands/status.js +64 -0
  46. package/dist/cli/commands/status.js.map +1 -0
  47. package/dist/cli/commands/team.d.ts +4 -0
  48. package/dist/cli/commands/team.d.ts.map +1 -0
  49. package/dist/cli/commands/team.js +33 -0
  50. package/dist/cli/commands/team.js.map +1 -0
  51. package/dist/cli/index.d.ts +4 -0
  52. package/dist/cli/index.d.ts.map +1 -0
  53. package/dist/cli/index.js +35 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/cli/splash.d.ts +2 -0
  56. package/dist/cli/splash.d.ts.map +1 -0
  57. package/dist/cli/splash.js +20 -0
  58. package/dist/cli/splash.js.map +1 -0
  59. package/dist/engine/__tests__/ceo-brain.test.d.ts +2 -0
  60. package/dist/engine/__tests__/ceo-brain.test.d.ts.map +1 -0
  61. package/dist/engine/__tests__/ceo-brain.test.js +57 -0
  62. package/dist/engine/__tests__/ceo-brain.test.js.map +1 -0
  63. package/dist/engine/__tests__/dispatcher.test.d.ts +2 -0
  64. package/dist/engine/__tests__/dispatcher.test.d.ts.map +1 -0
  65. package/dist/engine/__tests__/dispatcher.test.js +60 -0
  66. package/dist/engine/__tests__/dispatcher.test.js.map +1 -0
  67. package/dist/engine/__tests__/orchestrator.test.d.ts +2 -0
  68. package/dist/engine/__tests__/orchestrator.test.d.ts.map +1 -0
  69. package/dist/engine/__tests__/orchestrator.test.js +83 -0
  70. package/dist/engine/__tests__/orchestrator.test.js.map +1 -0
  71. package/dist/engine/__tests__/pr-manager.test.d.ts +2 -0
  72. package/dist/engine/__tests__/pr-manager.test.d.ts.map +1 -0
  73. package/dist/engine/__tests__/pr-manager.test.js +44 -0
  74. package/dist/engine/__tests__/pr-manager.test.js.map +1 -0
  75. package/dist/engine/__tests__/prompt-builder.test.d.ts +2 -0
  76. package/dist/engine/__tests__/prompt-builder.test.d.ts.map +1 -0
  77. package/dist/engine/__tests__/prompt-builder.test.js +42 -0
  78. package/dist/engine/__tests__/prompt-builder.test.js.map +1 -0
  79. package/dist/engine/ceo-brain.d.ts +33 -0
  80. package/dist/engine/ceo-brain.d.ts.map +1 -0
  81. package/dist/engine/ceo-brain.js +94 -0
  82. package/dist/engine/ceo-brain.js.map +1 -0
  83. package/dist/engine/dispatcher.d.ts +40 -0
  84. package/dist/engine/dispatcher.d.ts.map +1 -0
  85. package/dist/engine/dispatcher.js +125 -0
  86. package/dist/engine/dispatcher.js.map +1 -0
  87. package/dist/engine/orchestrator.d.ts +49 -0
  88. package/dist/engine/orchestrator.d.ts.map +1 -0
  89. package/dist/engine/orchestrator.js +303 -0
  90. package/dist/engine/orchestrator.js.map +1 -0
  91. package/dist/engine/pr-manager.d.ts +14 -0
  92. package/dist/engine/pr-manager.d.ts.map +1 -0
  93. package/dist/engine/pr-manager.js +67 -0
  94. package/dist/engine/pr-manager.js.map +1 -0
  95. package/dist/engine/prompt-builder.d.ts +27 -0
  96. package/dist/engine/prompt-builder.d.ts.map +1 -0
  97. package/dist/engine/prompt-builder.js +73 -0
  98. package/dist/engine/prompt-builder.js.map +1 -0
  99. package/dist/server/__tests__/server.test.d.ts +2 -0
  100. package/dist/server/__tests__/server.test.d.ts.map +1 -0
  101. package/dist/server/__tests__/server.test.js +87 -0
  102. package/dist/server/__tests__/server.test.js.map +1 -0
  103. package/dist/server/index.d.ts +4 -0
  104. package/dist/server/index.d.ts.map +1 -0
  105. package/dist/server/index.js +72 -0
  106. package/dist/server/index.js.map +1 -0
  107. package/dist/server/routes/api.d.ts +4 -0
  108. package/dist/server/routes/api.d.ts.map +1 -0
  109. package/dist/server/routes/api.js +60 -0
  110. package/dist/server/routes/api.js.map +1 -0
  111. package/dist/skills/__tests__/loader.test.d.ts +2 -0
  112. package/dist/skills/__tests__/loader.test.d.ts.map +1 -0
  113. package/dist/skills/__tests__/loader.test.js +50 -0
  114. package/dist/skills/__tests__/loader.test.js.map +1 -0
  115. package/dist/skills/loader.d.ts +21 -0
  116. package/dist/skills/loader.d.ts.map +1 -0
  117. package/dist/skills/loader.js +190 -0
  118. package/dist/skills/loader.js.map +1 -0
  119. package/dist/state/__tests__/database.test.d.ts +2 -0
  120. package/dist/state/__tests__/database.test.d.ts.map +1 -0
  121. package/dist/state/__tests__/database.test.js +50 -0
  122. package/dist/state/__tests__/database.test.js.map +1 -0
  123. package/dist/state/database.d.ts +14 -0
  124. package/dist/state/database.d.ts.map +1 -0
  125. package/dist/state/database.js +164 -0
  126. package/dist/state/database.js.map +1 -0
  127. package/dist/state/repositories/__tests__/repositories.test.d.ts +2 -0
  128. package/dist/state/repositories/__tests__/repositories.test.d.ts.map +1 -0
  129. package/dist/state/repositories/__tests__/repositories.test.js +162 -0
  130. package/dist/state/repositories/__tests__/repositories.test.js.map +1 -0
  131. package/dist/state/repositories/agents.d.ts +14 -0
  132. package/dist/state/repositories/agents.d.ts.map +1 -0
  133. package/dist/state/repositories/agents.js +52 -0
  134. package/dist/state/repositories/agents.js.map +1 -0
  135. package/dist/state/repositories/events.d.ts +10 -0
  136. package/dist/state/repositories/events.d.ts.map +1 -0
  137. package/dist/state/repositories/events.js +27 -0
  138. package/dist/state/repositories/events.js.map +1 -0
  139. package/dist/state/repositories/messages.d.ts +15 -0
  140. package/dist/state/repositories/messages.d.ts.map +1 -0
  141. package/dist/state/repositories/messages.js +19 -0
  142. package/dist/state/repositories/messages.js.map +1 -0
  143. package/dist/state/repositories/pull-requests.d.ts +25 -0
  144. package/dist/state/repositories/pull-requests.d.ts.map +1 -0
  145. package/dist/state/repositories/pull-requests.js +40 -0
  146. package/dist/state/repositories/pull-requests.js.map +1 -0
  147. package/dist/state/repositories/sessions.d.ts +13 -0
  148. package/dist/state/repositories/sessions.d.ts.map +1 -0
  149. package/dist/state/repositories/sessions.js +41 -0
  150. package/dist/state/repositories/sessions.js.map +1 -0
  151. package/dist/state/repositories/sprints.d.ts +19 -0
  152. package/dist/state/repositories/sprints.d.ts.map +1 -0
  153. package/dist/state/repositories/sprints.js +26 -0
  154. package/dist/state/repositories/sprints.js.map +1 -0
  155. package/dist/state/repositories/tasks.d.ts +26 -0
  156. package/dist/state/repositories/tasks.d.ts.map +1 -0
  157. package/dist/state/repositories/tasks.js +43 -0
  158. package/dist/state/repositories/tasks.js.map +1 -0
  159. package/dist/types/__tests__/types.test.d.ts +2 -0
  160. package/dist/types/__tests__/types.test.d.ts.map +1 -0
  161. package/dist/types/__tests__/types.test.js +70 -0
  162. package/dist/types/__tests__/types.test.js.map +1 -0
  163. package/dist/types/index.d.ts +198 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/index.js +3 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/package.json +65 -0
  168. package/src/web/dist/assets/BufferResource-rnljfCCz.js +185 -0
  169. package/src/web/dist/assets/CanvasRenderer-BvTI2UTL.js +1 -0
  170. package/src/web/dist/assets/Filter-BzO9QkkB.js +1 -0
  171. package/src/web/dist/assets/RenderTargetSystem-CKlnKfTJ.js +172 -0
  172. package/src/web/dist/assets/WebGLRenderer-B5LAM4bk.js +156 -0
  173. package/src/web/dist/assets/WebGPURenderer-FkK3p3f4.js +41 -0
  174. package/src/web/dist/assets/browserAll-CDpBxY6s.js +14 -0
  175. package/src/web/dist/assets/index-B3XZpovA.js +298 -0
  176. package/src/web/dist/assets/index-BcX-h_hs.css +1 -0
  177. package/src/web/dist/assets/webworkerAll-B9AvsPZH.js +83 -0
  178. package/src/web/dist/index.html +18 -0
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromptBuilder = void 0;
4
+ const MAX_PROMPT_CHARS = 120000; // ~30k tokens at 4 chars/token
5
+ const CHARS_PER_TOKEN = 4;
6
+ class PromptBuilder {
7
+ build(input) {
8
+ const identity = this.buildIdentity(input);
9
+ const rules = this.buildRules(input.agent.id);
10
+ const taskSection = this.buildTask(input);
11
+ // Calculate remaining budget for skills
12
+ const fixedContent = identity + taskSection + rules;
13
+ const fixedChars = fixedContent.length;
14
+ const remainingChars = MAX_PROMPT_CHARS - fixedChars;
15
+ const skillsSection = this.buildSkills(input.skills, remainingChars);
16
+ return `${identity}\n${skillsSection}\n${taskSection}\n${rules}`;
17
+ }
18
+ buildIdentity(input) {
19
+ return `# Identity
20
+ You are ${input.agent.name}, ${input.agent.role} at ${input.company.name}.
21
+ ${input.agent.description}
22
+
23
+ Company mission: ${input.company.mission}
24
+ `;
25
+ }
26
+ buildSkills(skills, maxChars) {
27
+ if (skills.length === 0) {
28
+ return '# Active Skills\nNo specific skills activated for this task.\n';
29
+ }
30
+ let section = `# Active Skills
31
+ The following skill protocols are ACTIVE for this task. Follow them exactly.
32
+
33
+ `;
34
+ let remaining = maxChars - section.length;
35
+ for (const skill of skills) {
36
+ if (skill.length <= remaining) {
37
+ section += skill + '\n\n';
38
+ remaining -= skill.length + 2;
39
+ }
40
+ else if (remaining > 1000 * CHARS_PER_TOKEN) {
41
+ // Truncate but include partial
42
+ section += skill.slice(0, remaining - 50) + '\n\n[... truncated to fit token budget]\n';
43
+ break;
44
+ }
45
+ else {
46
+ break;
47
+ }
48
+ }
49
+ return section;
50
+ }
51
+ buildTask(input) {
52
+ let section = `# Current Task
53
+ Title: ${input.task.title}
54
+ Description: ${input.task.description}
55
+ Required skills: ${input.task.requiredSkills.join(', ') || 'none'}
56
+ `;
57
+ if (input.dependenciesSummary) {
58
+ section += `Dependencies completed: ${input.dependenciesSummary}\n`;
59
+ }
60
+ return section;
61
+ }
62
+ buildRules(agentId) {
63
+ return `# Rules
64
+ - Work ONLY on the assigned task
65
+ - Follow ALL active skill protocols exactly
66
+ - Commit with message: [sage:${agentId}] {semantic description}
67
+ - Do NOT push — CEO handles all push operations
68
+ - Run tests before marking complete
69
+ `;
70
+ }
71
+ }
72
+ exports.PromptBuilder = PromptBuilder;
73
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/engine/prompt-builder.ts"],"names":[],"mappings":";;;AAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,+BAA+B;AAChE,MAAM,eAAe,GAAG,CAAC,CAAC;AAsB1B,MAAa,aAAa;IACxB,KAAK,CAAC,KAAuB;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1C,wCAAwC;QACxC,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;QACpD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;QACvC,MAAM,cAAc,GAAG,gBAAgB,GAAG,UAAU,CAAC;QAErD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAErE,OAAO,GAAG,QAAQ,KAAK,aAAa,KAAK,WAAW,KAAK,KAAK,EAAE,CAAC;IACnE,CAAC;IAEO,aAAa,CAAC,KAAuB;QAC3C,OAAO;UACD,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI;EACtE,KAAK,CAAC,KAAK,CAAC,WAAW;;mBAEN,KAAK,CAAC,OAAO,CAAC,OAAO;CACvC,CAAC;IACA,CAAC;IAEO,WAAW,CAAC,MAAgB,EAAE,QAAgB;QACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,gEAAgE,CAAC;QAC1E,CAAC;QAED,IAAI,OAAO,GAAG;;;CAGjB,CAAC;QACE,IAAI,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;QAE1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC9B,OAAO,IAAI,KAAK,GAAG,MAAM,CAAC;gBAC1B,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,SAAS,GAAG,IAAI,GAAG,eAAe,EAAE,CAAC;gBAC9C,+BAA+B;gBAC/B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,GAAG,2CAA2C,CAAC;gBACxF,MAAM;YACR,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,SAAS,CAAC,KAAuB;QACvC,IAAI,OAAO,GAAG;SACT,KAAK,CAAC,IAAI,CAAC,KAAK;eACV,KAAK,CAAC,IAAI,CAAC,WAAW;mBAClB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;CAChE,CAAC;QACE,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC9B,OAAO,IAAI,2BAA2B,KAAK,CAAC,mBAAmB,IAAI,CAAC;QACtE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,UAAU,CAAC,OAAe;QAChC,OAAO;;;+BAGoB,OAAO;;;CAGrC,CAAC;IACA,CAAC;CACF;AAzED,sCAyEC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../../src/server/__tests__/server.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const database_1 = require("../../state/database");
8
+ const orchestrator_1 = require("../../engine/orchestrator");
9
+ const index_1 = require("../index");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ (0, vitest_1.describe)('Server', () => {
12
+ let db;
13
+ let orchestrator;
14
+ let server;
15
+ const testDbPath = '.sage-team/test-server.db';
16
+ const port = 0; // random port
17
+ (0, vitest_1.beforeAll)(async () => {
18
+ db = new database_1.Database(testDbPath);
19
+ orchestrator = new orchestrator_1.Orchestrator(db, {
20
+ apiKey: 'test',
21
+ model: 'claude-sonnet-4-20250514',
22
+ maxConcurrentAgents: 3,
23
+ autonomyMode: 'sandbox',
24
+ companyName: 'Test Co',
25
+ mission: 'Build great software',
26
+ });
27
+ orchestrator.start();
28
+ server = (0, index_1.createServer)(orchestrator, 0);
29
+ // Wait for server to be listening
30
+ await new Promise(resolve => {
31
+ if (server.listening)
32
+ return resolve();
33
+ server.on('listening', resolve);
34
+ });
35
+ });
36
+ (0, vitest_1.afterAll)(() => {
37
+ orchestrator.stop();
38
+ server.close();
39
+ db.close();
40
+ if (fs_1.default.existsSync(testDbPath))
41
+ fs_1.default.unlinkSync(testDbPath);
42
+ if (fs_1.default.existsSync(testDbPath + '-wal'))
43
+ fs_1.default.unlinkSync(testDbPath + '-wal');
44
+ if (fs_1.default.existsSync(testDbPath + '-shm'))
45
+ fs_1.default.unlinkSync(testDbPath + '-shm');
46
+ });
47
+ function getAddress() {
48
+ const addr = server.address();
49
+ return `http://localhost:${addr.port}`;
50
+ }
51
+ async function fetchJSON(path) {
52
+ const res = await fetch(`${getAddress()}${path}`);
53
+ return res.json();
54
+ }
55
+ (0, vitest_1.it)('should return agents from GET /api/agents', async () => {
56
+ const data = await fetchJSON('/api/agents');
57
+ (0, vitest_1.expect)(data.agents).toBeDefined();
58
+ (0, vitest_1.expect)(data.agents.length).toBe(11);
59
+ });
60
+ (0, vitest_1.it)('should return tasks from GET /api/tasks', async () => {
61
+ const data = await fetchJSON('/api/tasks');
62
+ (0, vitest_1.expect)(data.tasks).toBeDefined();
63
+ (0, vitest_1.expect)(Array.isArray(data.tasks)).toBe(true);
64
+ });
65
+ (0, vitest_1.it)('should return sprint from GET /api/sprint', async () => {
66
+ const data = await fetchJSON('/api/sprint');
67
+ (0, vitest_1.expect)(data).toBeDefined();
68
+ // sprint may be null if no goal was set
69
+ });
70
+ (0, vitest_1.it)('should return PRs from GET /api/prs', async () => {
71
+ const data = await fetchJSON('/api/prs');
72
+ (0, vitest_1.expect)(data.prs).toBeDefined();
73
+ (0, vitest_1.expect)(Array.isArray(data.prs)).toBe(true);
74
+ });
75
+ (0, vitest_1.it)('should return messages from GET /api/messages', async () => {
76
+ const data = await fetchJSON('/api/messages');
77
+ (0, vitest_1.expect)(data.messages).toBeDefined();
78
+ (0, vitest_1.expect)(Array.isArray(data.messages)).toBe(true);
79
+ });
80
+ (0, vitest_1.it)('should respond to GET /api/health', async () => {
81
+ const res = await fetch(`${getAddress()}/api/health`);
82
+ const data = await res.json();
83
+ (0, vitest_1.expect)(data.status).toBe('ok');
84
+ (0, vitest_1.expect)(data.sessionId).toBeTruthy();
85
+ });
86
+ });
87
+ //# sourceMappingURL=server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../src/server/__tests__/server.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import http from 'http';
2
+ import type { Orchestrator } from '../engine/orchestrator';
3
+ export declare function createServer(orchestrator: Orchestrator, port: number): http.Server;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,wBAAgB,YAAY,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAiElF"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createServer = createServer;
7
+ const express_1 = __importDefault(require("express"));
8
+ const http_1 = __importDefault(require("http"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const ws_1 = require("ws");
11
+ const api_1 = require("./routes/api");
12
+ function createServer(orchestrator, port) {
13
+ const app = (0, express_1.default)();
14
+ app.use(express_1.default.json());
15
+ // Static files (built frontend) — resolve from src or dist layout
16
+ const srcWebDist = path_1.default.join(__dirname, '..', 'web', 'dist');
17
+ const rootWebDist = path_1.default.resolve(__dirname, '..', '..', 'src', 'web', 'dist');
18
+ const staticPath = require('fs').existsSync(srcWebDist) ? srcWebDist : rootWebDist;
19
+ app.use(express_1.default.static(staticPath));
20
+ // REST API
21
+ app.use('/api', (0, api_1.createApiRouter)(orchestrator));
22
+ // Fallback to index.html for SPA routing (Express 5 compatible)
23
+ app.use((_req, res) => {
24
+ res.sendFile(path_1.default.join(staticPath, 'index.html'), (err) => {
25
+ if (err) {
26
+ res.status(200).json({ message: 'Sage Team API running. Frontend not built yet.' });
27
+ }
28
+ });
29
+ });
30
+ const server = http_1.default.createServer(app);
31
+ // WebSocket
32
+ const wss = new ws_1.WebSocketServer({ server });
33
+ wss.on('connection', (ws) => {
34
+ // Send current state snapshot
35
+ ws.send(JSON.stringify({
36
+ type: 'snapshot',
37
+ agents: orchestrator.getAgents(),
38
+ tasks: orchestrator.getTasks(),
39
+ prs: orchestrator.getPendingPRs(),
40
+ }));
41
+ // Handle client messages
42
+ ws.on('message', async (data) => {
43
+ try {
44
+ const msg = JSON.parse(data.toString());
45
+ if (msg.type === 'goal:submit' && msg.goal) {
46
+ await orchestrator.submitGoal(msg.goal);
47
+ }
48
+ else if (msg.type === 'pr:approve' && msg.prId) {
49
+ await orchestrator.approvePR(msg.prId);
50
+ }
51
+ else if (msg.type === 'pr:reject' && msg.prId) {
52
+ orchestrator.rejectPR(msg.prId, msg.feedback || '');
53
+ }
54
+ }
55
+ catch {
56
+ // Ignore malformed messages
57
+ }
58
+ });
59
+ });
60
+ // Forward orchestrator events to all WebSocket clients
61
+ orchestrator.on('event', (event) => {
62
+ const message = JSON.stringify(event);
63
+ wss.clients.forEach((client) => {
64
+ if (client.readyState === ws_1.WebSocket.OPEN) {
65
+ client.send(message);
66
+ }
67
+ });
68
+ });
69
+ server.listen(port);
70
+ return server;
71
+ }
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import type { Orchestrator } from '../../engine/orchestrator';
3
+ export declare function createApiRouter(orchestrator: Orchestrator): Router;
4
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/server/routes/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CA8DlE"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createApiRouter = createApiRouter;
4
+ const express_1 = require("express");
5
+ function createApiRouter(orchestrator) {
6
+ const router = (0, express_1.Router)();
7
+ router.get('/health', (_req, res) => {
8
+ res.json({
9
+ status: 'ok',
10
+ sessionId: orchestrator.sessionId,
11
+ timestamp: new Date().toISOString(),
12
+ });
13
+ });
14
+ router.get('/agents', (_req, res) => {
15
+ res.json({ agents: orchestrator.getAgents() });
16
+ });
17
+ router.get('/tasks', (_req, res) => {
18
+ res.json({ tasks: orchestrator.getTasks() });
19
+ });
20
+ router.get('/sprint', (_req, res) => {
21
+ // Return active sprint if available
22
+ res.json({ sprint: null }); // TODO: expose sprint from orchestrator
23
+ });
24
+ router.get('/prs', (_req, res) => {
25
+ res.json({ prs: orchestrator.getPendingPRs() });
26
+ });
27
+ router.get('/messages', (_req, res) => {
28
+ res.json({ messages: [] }); // TODO: expose messages from orchestrator
29
+ });
30
+ router.post('/goal', async (req, res) => {
31
+ const { goal } = req.body;
32
+ if (!goal) {
33
+ res.status(400).json({ error: 'Goal is required' });
34
+ return;
35
+ }
36
+ try {
37
+ await orchestrator.submitGoal(goal);
38
+ res.json({ success: true });
39
+ }
40
+ catch (err) {
41
+ res.status(500).json({ error: err.message });
42
+ }
43
+ });
44
+ router.post('/pr/:id/approve', async (req, res) => {
45
+ try {
46
+ await orchestrator.approvePR(req.params.id);
47
+ res.json({ success: true });
48
+ }
49
+ catch (err) {
50
+ res.status(500).json({ error: err.message });
51
+ }
52
+ });
53
+ router.post('/pr/:id/reject', (req, res) => {
54
+ const { feedback } = req.body;
55
+ orchestrator.rejectPR(req.params.id, feedback || '');
56
+ res.json({ success: true });
57
+ });
58
+ return router;
59
+ }
60
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/server/routes/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../../src/skills/__tests__/loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const loader_1 = require("../loader");
5
+ (0, vitest_1.describe)('SkillLoader', () => {
6
+ const loader = new loader_1.SkillLoader();
7
+ (0, vitest_1.it)('should detect superpowers installation path', () => {
8
+ const path = loader.getSuperpowersPath();
9
+ // May be null if not installed — test handles both
10
+ if (path) {
11
+ (0, vitest_1.expect)(path).toContain('superpowers');
12
+ }
13
+ });
14
+ (0, vitest_1.it)('should resolve sp- skill ID to file path', () => {
15
+ const resolved = loader.resolveSkillPath('sp-tdd-cycle');
16
+ if (resolved) {
17
+ (0, vitest_1.expect)(resolved).toContain('test-driven-development');
18
+ }
19
+ });
20
+ (0, vitest_1.it)('should load skill content as string', () => {
21
+ const content = loader.loadSkill('sp-brainstorming');
22
+ if (content) {
23
+ (0, vitest_1.expect)(content.length).toBeGreaterThan(100);
24
+ (0, vitest_1.expect)(content.toLowerCase()).toContain('brainstorm');
25
+ }
26
+ });
27
+ (0, vitest_1.it)('should return null for unknown skill ID', () => {
28
+ const content = loader.loadSkill('sp-nonexistent-skill');
29
+ (0, vitest_1.expect)(content).toBeNull();
30
+ });
31
+ (0, vitest_1.it)('should respect token budget', () => {
32
+ const skills = loader.loadSkillsForTask(['sp-tdd-cycle', 'sp-brainstorming', 'ag-clean-code'], 30000 // token budget
33
+ );
34
+ // Should load at least the first skill (if superpowers installed)
35
+ (0, vitest_1.expect)(skills.length).toBeGreaterThanOrEqual(0);
36
+ // Total content should be under budget (~4 chars/token)
37
+ const totalChars = skills.reduce((sum, s) => sum + s.content.length, 0);
38
+ (0, vitest_1.expect)(totalChars).toBeLessThanOrEqual(30000 * 4);
39
+ });
40
+ (0, vitest_1.it)('should have correct skill ID mappings', () => {
41
+ // Verify the internal mapping covers known skill IDs
42
+ const knownIds = ['sp-brainstorming', 'sp-tdd-cycle', 'sp-verification', 'sp-writing-plans'];
43
+ for (const id of knownIds) {
44
+ const path = loader.resolveSkillPath(id);
45
+ // Path may be null if not installed, but resolveSkillPath should know the mapping
46
+ (0, vitest_1.expect)(loader.hasMapping(id)).toBe(true);
47
+ }
48
+ });
49
+ });
50
+ //# sourceMappingURL=loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/skills/__tests__/loader.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,sCAAwC;AAExC,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,MAAM,GAAG,IAAI,oBAAW,EAAE,CAAC;IAEjC,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACzC,mDAAmD;QACnD,IAAI,IAAI,EAAE,CAAC;YACT,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACrD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAA,eAAM,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAA,eAAM,EAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACzD,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CACrC,CAAC,cAAc,EAAE,kBAAkB,EAAE,eAAe,CAAC,EACrD,KAAK,CAAC,eAAe;SACtB,CAAC;QACF,kEAAkE;QAClE,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAChD,wDAAwD;QACxD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,qDAAqD;QACrD,MAAM,QAAQ,GAAG,CAAC,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;QAC7F,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACzC,kFAAkF;YAClF,IAAA,eAAM,EAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface LoadedSkill {
2
+ id: string;
3
+ content: string;
4
+ source: 'superpowers' | 'antigravity' | 'built-in';
5
+ tokens: number;
6
+ }
7
+ export declare class SkillLoader {
8
+ private superpowersPath;
9
+ private antigravityPath;
10
+ constructor();
11
+ getSuperpowersPath(): string | null;
12
+ getAntigravityPath(): string | null;
13
+ hasMapping(skillId: string): boolean;
14
+ resolveSkillPath(skillId: string): string | null;
15
+ loadSkill(skillId: string): string | null;
16
+ loadSkillsForTask(skillIds: string[], tokenBudget: number): LoadedSkill[];
17
+ private getSource;
18
+ private discoverSuperpowersPath;
19
+ private discoverAntigravityPath;
20
+ }
21
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,GAAG,aAAa,GAAG,UAAU,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAuB;;IAO9C,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAInC,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAInC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUpC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsBhD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUzC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE;IAoCzE,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,uBAAuB;CA8BhC"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SkillLoader = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ /**
11
+ * Canonical skill ID → relative file path mapping.
12
+ * sp- prefix = Superpowers, ag- prefix = Antigravity.
13
+ */
14
+ const SP_SKILL_MAP = {
15
+ 'sp-brainstorming': 'brainstorming/brainstorming.md',
16
+ 'sp-tdd-cycle': 'test-driven-development/test-driven-development.md',
17
+ 'sp-tdd-red': 'test-driven-development/tdd-workflows/tdd-red.md',
18
+ 'sp-tdd-green': 'test-driven-development/tdd-workflows/tdd-green.md',
19
+ 'sp-tdd-refactor': 'test-driven-development/tdd-workflows/tdd-refactor.md',
20
+ 'sp-systematic-debugging': 'systematic-debugging/systematic-debugging.md',
21
+ 'sp-writing-plans': 'writing-plans/writing-plans.md',
22
+ 'sp-dispatching-parallel': 'dispatching-parallel-agents/dispatching-parallel-agents.md',
23
+ 'sp-verification': 'verification-before-completion/verification-before-completion.md',
24
+ 'sp-requesting-review': 'requesting-code-review/requesting-code-review.md',
25
+ 'sp-receiving-review': 'receiving-code-review/receiving-code-review.md',
26
+ 'sp-finishing-branch': 'finishing-a-development-branch/finishing-a-development-branch.md',
27
+ 'sp-subagent-dev': 'subagent-driven-development/subagent-driven-development.md',
28
+ 'sp-git-worktrees': 'using-git-worktrees/using-git-worktrees.md',
29
+ 'sp-writing-skills': 'writing-skills/writing-skills.md',
30
+ };
31
+ // Chars-per-token estimate for budget calculations
32
+ const CHARS_PER_TOKEN = 4;
33
+ class SkillLoader {
34
+ superpowersPath = null;
35
+ antigravityPath = null;
36
+ constructor() {
37
+ this.superpowersPath = this.discoverSuperpowersPath();
38
+ this.antigravityPath = this.discoverAntigravityPath();
39
+ }
40
+ getSuperpowersPath() {
41
+ return this.superpowersPath;
42
+ }
43
+ getAntigravityPath() {
44
+ return this.antigravityPath;
45
+ }
46
+ hasMapping(skillId) {
47
+ if (skillId.startsWith('sp-')) {
48
+ return skillId in SP_SKILL_MAP;
49
+ }
50
+ if (skillId.startsWith('ag-')) {
51
+ return true; // Antigravity uses convention-based resolution
52
+ }
53
+ return false;
54
+ }
55
+ resolveSkillPath(skillId) {
56
+ if (skillId.startsWith('sp-')) {
57
+ const relativePath = SP_SKILL_MAP[skillId];
58
+ if (!relativePath || !this.superpowersPath)
59
+ return null;
60
+ const fullPath = path_1.default.join(this.superpowersPath, relativePath);
61
+ return fs_1.default.existsSync(fullPath) ? fullPath : null;
62
+ }
63
+ if (skillId.startsWith('ag-')) {
64
+ if (!this.antigravityPath)
65
+ return null;
66
+ const name = skillId.slice(3); // remove 'ag-'
67
+ // Convention: ag-{name} → skills/{name}/{name}.md or skills/{name}.md
68
+ const dirPath = path_1.default.join(this.antigravityPath, name, `${name}.md`);
69
+ if (fs_1.default.existsSync(dirPath))
70
+ return dirPath;
71
+ const flatPath = path_1.default.join(this.antigravityPath, `${name}.md`);
72
+ if (fs_1.default.existsSync(flatPath))
73
+ return flatPath;
74
+ return null;
75
+ }
76
+ return null;
77
+ }
78
+ loadSkill(skillId) {
79
+ const skillPath = this.resolveSkillPath(skillId);
80
+ if (!skillPath)
81
+ return null;
82
+ try {
83
+ return fs_1.default.readFileSync(skillPath, 'utf-8');
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ loadSkillsForTask(skillIds, tokenBudget) {
90
+ const loaded = [];
91
+ let remainingBudget = tokenBudget;
92
+ for (const id of skillIds) {
93
+ const content = this.loadSkill(id);
94
+ if (!content)
95
+ continue;
96
+ const estimatedTokens = Math.ceil(content.length / CHARS_PER_TOKEN);
97
+ if (estimatedTokens > remainingBudget) {
98
+ // Try to fit a truncated version if budget allows at least 1000 tokens
99
+ if (remainingBudget >= 1000) {
100
+ const truncatedContent = content.slice(0, remainingBudget * CHARS_PER_TOKEN);
101
+ loaded.push({
102
+ id,
103
+ content: truncatedContent + '\n\n[... truncated to fit token budget]',
104
+ source: this.getSource(id),
105
+ tokens: remainingBudget,
106
+ });
107
+ }
108
+ break;
109
+ }
110
+ loaded.push({
111
+ id,
112
+ content,
113
+ source: this.getSource(id),
114
+ tokens: estimatedTokens,
115
+ });
116
+ remainingBudget -= estimatedTokens;
117
+ }
118
+ return loaded;
119
+ }
120
+ getSource(skillId) {
121
+ if (skillId.startsWith('sp-'))
122
+ return 'superpowers';
123
+ if (skillId.startsWith('ag-'))
124
+ return 'antigravity';
125
+ return 'built-in';
126
+ }
127
+ discoverSuperpowersPath() {
128
+ const homeDir = os_1.default.homedir();
129
+ const searchPaths = [
130
+ // Claude Code plugin cache (most common)
131
+ path_1.default.join(homeDir, '.claude', 'plugins', 'cache', 'claude-plugins-official', 'superpowers'),
132
+ // Direct install
133
+ path_1.default.join(homeDir, '.superpowers', 'skills'),
134
+ // NPM global
135
+ path_1.default.join(homeDir, 'node_modules', 'superpowers', 'skills'),
136
+ ];
137
+ for (const searchPath of searchPaths) {
138
+ if (fs_1.default.existsSync(searchPath)) {
139
+ // Check for versioned directories (e.g., 5.0.2/)
140
+ if (searchPath.includes('plugins/cache')) {
141
+ try {
142
+ const versions = fs_1.default.readdirSync(searchPath).filter(f => fs_1.default.statSync(path_1.default.join(searchPath, f)).isDirectory());
143
+ if (versions.length > 0) {
144
+ // Use latest version
145
+ const latest = versions.sort().pop();
146
+ const skillsDir = path_1.default.join(searchPath, latest, 'skills');
147
+ if (fs_1.default.existsSync(skillsDir))
148
+ return skillsDir;
149
+ }
150
+ }
151
+ catch {
152
+ continue;
153
+ }
154
+ }
155
+ return searchPath;
156
+ }
157
+ }
158
+ return null;
159
+ }
160
+ discoverAntigravityPath() {
161
+ const homeDir = os_1.default.homedir();
162
+ const searchPaths = [
163
+ path_1.default.join(homeDir, '.claude', 'plugins', 'cache', 'claude-plugins-official', 'antigravity-awesome-skills'),
164
+ path_1.default.join(homeDir, 'antigravity-awesome-skills', 'skills'),
165
+ ];
166
+ for (const searchPath of searchPaths) {
167
+ if (fs_1.default.existsSync(searchPath)) {
168
+ // Check for versioned directories
169
+ if (searchPath.includes('plugins/cache')) {
170
+ try {
171
+ const versions = fs_1.default.readdirSync(searchPath).filter(f => fs_1.default.statSync(path_1.default.join(searchPath, f)).isDirectory());
172
+ if (versions.length > 0) {
173
+ const latest = versions.sort().pop();
174
+ const skillsDir = path_1.default.join(searchPath, latest, 'skills');
175
+ if (fs_1.default.existsSync(skillsDir))
176
+ return skillsDir;
177
+ }
178
+ }
179
+ catch {
180
+ continue;
181
+ }
182
+ }
183
+ return searchPath;
184
+ }
185
+ }
186
+ return null;
187
+ }
188
+ }
189
+ exports.SkillLoader = SkillLoader;
190
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=database.test.d.ts.map