blue-gardener 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 (143) hide show
  1. package/README.md +88 -0
  2. package/agents/CATALOG.md +272 -0
  3. package/agents/blockchain/blue-blockchain-architecture-designer.md +518 -0
  4. package/agents/blockchain/blue-blockchain-backend-integrator.md +784 -0
  5. package/agents/blockchain/blue-blockchain-code-reviewer.md +523 -0
  6. package/agents/blockchain/blue-blockchain-defi-specialist.md +551 -0
  7. package/agents/blockchain/blue-blockchain-ethereum-developer.md +707 -0
  8. package/agents/blockchain/blue-blockchain-frontend-integrator.md +732 -0
  9. package/agents/blockchain/blue-blockchain-gas-optimizer.md +508 -0
  10. package/agents/blockchain/blue-blockchain-product-strategist.md +439 -0
  11. package/agents/blockchain/blue-blockchain-security-auditor.md +517 -0
  12. package/agents/blockchain/blue-blockchain-solana-developer.md +760 -0
  13. package/agents/blockchain/blue-blockchain-tokenomics-designer.md +412 -0
  14. package/agents/configuration/blue-ai-platform-configuration-specialist.md +587 -0
  15. package/agents/development/blue-animation-specialist.md +439 -0
  16. package/agents/development/blue-api-integration-expert.md +681 -0
  17. package/agents/development/blue-go-backend-implementation-specialist.md +702 -0
  18. package/agents/development/blue-node-backend-implementation-specialist.md +543 -0
  19. package/agents/development/blue-react-developer.md +425 -0
  20. package/agents/development/blue-state-management-expert.md +557 -0
  21. package/agents/development/blue-storybook-specialist.md +450 -0
  22. package/agents/development/blue-third-party-api-strategist.md +391 -0
  23. package/agents/development/blue-ui-styling-specialist.md +557 -0
  24. package/agents/infrastructure/blue-cron-job-implementation-specialist.md +589 -0
  25. package/agents/infrastructure/blue-database-architecture-specialist.md +515 -0
  26. package/agents/infrastructure/blue-docker-specialist.md +407 -0
  27. package/agents/infrastructure/blue-document-database-specialist.md +695 -0
  28. package/agents/infrastructure/blue-github-actions-specialist.md +148 -0
  29. package/agents/infrastructure/blue-keyvalue-database-specialist.md +678 -0
  30. package/agents/infrastructure/blue-monorepo-specialist.md +431 -0
  31. package/agents/infrastructure/blue-relational-database-specialist.md +557 -0
  32. package/agents/infrastructure/blue-typescript-cli-developer.md +310 -0
  33. package/agents/orchestrators/blue-app-quality-gate-keeper.md +299 -0
  34. package/agents/orchestrators/blue-architecture-designer.md +319 -0
  35. package/agents/orchestrators/blue-feature-specification-analyst.md +212 -0
  36. package/agents/orchestrators/blue-implementation-review-coordinator.md +497 -0
  37. package/agents/orchestrators/blue-refactoring-strategy-planner.md +307 -0
  38. package/agents/quality/blue-accessibility-specialist.md +588 -0
  39. package/agents/quality/blue-e2e-testing-specialist.md +613 -0
  40. package/agents/quality/blue-frontend-code-reviewer.md +528 -0
  41. package/agents/quality/blue-go-backend-code-reviewer.md +610 -0
  42. package/agents/quality/blue-node-backend-code-reviewer.md +486 -0
  43. package/agents/quality/blue-performance-specialist.md +595 -0
  44. package/agents/quality/blue-security-specialist.md +616 -0
  45. package/agents/quality/blue-seo-specialist.md +477 -0
  46. package/agents/quality/blue-unit-testing-specialist.md +560 -0
  47. package/dist/commands/add.d.ts +4 -0
  48. package/dist/commands/add.d.ts.map +1 -0
  49. package/dist/commands/add.js +154 -0
  50. package/dist/commands/add.js.map +1 -0
  51. package/dist/commands/entrypoints.d.ts +2 -0
  52. package/dist/commands/entrypoints.d.ts.map +1 -0
  53. package/dist/commands/entrypoints.js +37 -0
  54. package/dist/commands/entrypoints.js.map +1 -0
  55. package/dist/commands/list.d.ts +2 -0
  56. package/dist/commands/list.d.ts.map +1 -0
  57. package/dist/commands/list.js +28 -0
  58. package/dist/commands/list.js.map +1 -0
  59. package/dist/commands/profiles.d.ts +2 -0
  60. package/dist/commands/profiles.d.ts.map +1 -0
  61. package/dist/commands/profiles.js +12 -0
  62. package/dist/commands/profiles.js.map +1 -0
  63. package/dist/commands/remove.d.ts +2 -0
  64. package/dist/commands/remove.d.ts.map +1 -0
  65. package/dist/commands/remove.js +46 -0
  66. package/dist/commands/remove.js.map +1 -0
  67. package/dist/commands/repair.d.ts +2 -0
  68. package/dist/commands/repair.d.ts.map +1 -0
  69. package/dist/commands/repair.js +38 -0
  70. package/dist/commands/repair.js.map +1 -0
  71. package/dist/commands/search.d.ts +2 -0
  72. package/dist/commands/search.d.ts.map +1 -0
  73. package/dist/commands/search.js +85 -0
  74. package/dist/commands/search.js.map +1 -0
  75. package/dist/commands/sync.d.ts +6 -0
  76. package/dist/commands/sync.d.ts.map +1 -0
  77. package/dist/commands/sync.js +31 -0
  78. package/dist/commands/sync.js.map +1 -0
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +49 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lib/adapters/base.d.ts +52 -0
  84. package/dist/lib/adapters/base.d.ts.map +1 -0
  85. package/dist/lib/adapters/base.js +100 -0
  86. package/dist/lib/adapters/base.js.map +1 -0
  87. package/dist/lib/adapters/claude-desktop.d.ts +14 -0
  88. package/dist/lib/adapters/claude-desktop.d.ts.map +1 -0
  89. package/dist/lib/adapters/claude-desktop.js +38 -0
  90. package/dist/lib/adapters/claude-desktop.js.map +1 -0
  91. package/dist/lib/adapters/codex.d.ts +19 -0
  92. package/dist/lib/adapters/codex.d.ts.map +1 -0
  93. package/dist/lib/adapters/codex.js +97 -0
  94. package/dist/lib/adapters/codex.js.map +1 -0
  95. package/dist/lib/adapters/cursor.d.ts +14 -0
  96. package/dist/lib/adapters/cursor.d.ts.map +1 -0
  97. package/dist/lib/adapters/cursor.js +38 -0
  98. package/dist/lib/adapters/cursor.js.map +1 -0
  99. package/dist/lib/adapters/github-copilot.d.ts +19 -0
  100. package/dist/lib/adapters/github-copilot.d.ts.map +1 -0
  101. package/dist/lib/adapters/github-copilot.js +107 -0
  102. package/dist/lib/adapters/github-copilot.js.map +1 -0
  103. package/dist/lib/adapters/index.d.ts +8 -0
  104. package/dist/lib/adapters/index.d.ts.map +1 -0
  105. package/dist/lib/adapters/index.js +29 -0
  106. package/dist/lib/adapters/index.js.map +1 -0
  107. package/dist/lib/adapters/opencode.d.ts +14 -0
  108. package/dist/lib/adapters/opencode.d.ts.map +1 -0
  109. package/dist/lib/adapters/opencode.js +38 -0
  110. package/dist/lib/adapters/opencode.js.map +1 -0
  111. package/dist/lib/adapters/windsurf.d.ts +16 -0
  112. package/dist/lib/adapters/windsurf.d.ts.map +1 -0
  113. package/dist/lib/adapters/windsurf.js +66 -0
  114. package/dist/lib/adapters/windsurf.js.map +1 -0
  115. package/dist/lib/agents.d.ts +58 -0
  116. package/dist/lib/agents.d.ts.map +1 -0
  117. package/dist/lib/agents.js +340 -0
  118. package/dist/lib/agents.js.map +1 -0
  119. package/dist/lib/entrypoints.d.ts +9 -0
  120. package/dist/lib/entrypoints.d.ts.map +1 -0
  121. package/dist/lib/entrypoints.js +72 -0
  122. package/dist/lib/entrypoints.js.map +1 -0
  123. package/dist/lib/manifest.d.ts +41 -0
  124. package/dist/lib/manifest.d.ts.map +1 -0
  125. package/dist/lib/manifest.js +84 -0
  126. package/dist/lib/manifest.js.map +1 -0
  127. package/dist/lib/paths.d.ts +23 -0
  128. package/dist/lib/paths.d.ts.map +1 -0
  129. package/dist/lib/paths.js +64 -0
  130. package/dist/lib/paths.js.map +1 -0
  131. package/dist/lib/platform.d.ts +20 -0
  132. package/dist/lib/platform.d.ts.map +1 -0
  133. package/dist/lib/platform.js +86 -0
  134. package/dist/lib/platform.js.map +1 -0
  135. package/dist/lib/profiles.d.ts +14 -0
  136. package/dist/lib/profiles.d.ts.map +1 -0
  137. package/dist/lib/profiles.js +138 -0
  138. package/dist/lib/profiles.js.map +1 -0
  139. package/dist/ui/menu.d.ts +2 -0
  140. package/dist/ui/menu.d.ts.map +1 -0
  141. package/dist/ui/menu.js +88 -0
  142. package/dist/ui/menu.js.map +1 -0
  143. package/package.json +73 -0
@@ -0,0 +1,52 @@
1
+ import { Platform } from "../platform.js";
2
+ import { AgentInfo } from "../agents.js";
3
+ export interface ParsedAgent {
4
+ frontmatter: Record<string, any>;
5
+ systemPrompt: string;
6
+ sections: AgentSection[];
7
+ }
8
+ export interface AgentSection {
9
+ header: string;
10
+ level: number;
11
+ content: string;
12
+ }
13
+ /**
14
+ * Base adapter interface for platform-specific agent installation
15
+ */
16
+ export declare abstract class PlatformAdapter {
17
+ abstract readonly platform: Platform;
18
+ abstract readonly isSingleFile: boolean;
19
+ /**
20
+ * Install a single agent
21
+ */
22
+ abstract installAgent(agentName: string, agentInfo: AgentInfo): void;
23
+ /**
24
+ * Remove a single agent
25
+ */
26
+ abstract removeAgent(agentName: string, agentInfo: AgentInfo): void;
27
+ /**
28
+ * Sync all installed agents
29
+ */
30
+ abstract syncAgents(installedAgents: AgentInfo[]): void;
31
+ /**
32
+ * Get output path for this platform
33
+ */
34
+ abstract getOutputPath(): string;
35
+ /**
36
+ * Load agent content from bundled source
37
+ */
38
+ protected loadAgentContent(agentInfo: AgentInfo): string;
39
+ /**
40
+ * Parse agent markdown into structured format
41
+ */
42
+ protected parseAgentMarkdown(content: string): ParsedAgent;
43
+ /**
44
+ * Remove agent delegation references for platforms that don't support it
45
+ */
46
+ protected removeAgentReferences(content: string): string;
47
+ /**
48
+ * Transform header text based on platform conventions
49
+ */
50
+ protected transformHeader(header: string, mappings: Record<string, string | null>): string | null;
51
+ }
52
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/base.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,8BAAsB,eAAe;IACnC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAEpE;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAEnE;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,IAAI;IAEvD;;OAEG;IACH,QAAQ,CAAC,aAAa,IAAI,MAAM;IAEhC;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM;IAKxD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IA6E1D;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAKxD;;OAEG;IACH,SAAS,CAAC,eAAe,CACvB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GACtC,MAAM,GAAG,IAAI;CAOjB"}
@@ -0,0 +1,100 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { getBundledAgentsDir } from "../paths.js";
4
+ /**
5
+ * Base adapter interface for platform-specific agent installation
6
+ */
7
+ export class PlatformAdapter {
8
+ /**
9
+ * Load agent content from bundled source
10
+ */
11
+ loadAgentContent(agentInfo) {
12
+ const sourcePath = path.join(getBundledAgentsDir(), agentInfo.sourcePath);
13
+ return fs.readFileSync(sourcePath, "utf-8");
14
+ }
15
+ /**
16
+ * Parse agent markdown into structured format
17
+ */
18
+ parseAgentMarkdown(content) {
19
+ // Extract frontmatter
20
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n/);
21
+ let remainingContent = content;
22
+ let frontmatter = {};
23
+ if (frontmatterMatch) {
24
+ const frontmatterText = frontmatterMatch[1];
25
+ remainingContent = content.substring(frontmatterMatch[0].length);
26
+ // Parse YAML frontmatter (simple parser)
27
+ const lines = frontmatterText.split("\n");
28
+ for (const line of lines) {
29
+ const match = line.match(/^(\w+):\s*(.+)$/);
30
+ if (match) {
31
+ const [, key, value] = match;
32
+ // Handle arrays: tags: [tag1, tag2]
33
+ if (value.startsWith("[") && value.endsWith("]")) {
34
+ frontmatter[key] = value
35
+ .slice(1, -1)
36
+ .split(",")
37
+ .map((v) => v.trim());
38
+ }
39
+ else {
40
+ frontmatter[key] = value.trim();
41
+ }
42
+ }
43
+ }
44
+ }
45
+ // Extract system prompt (first paragraph before first header)
46
+ const firstHeaderMatch = remainingContent.match(/\n##\s+/);
47
+ const systemPrompt = firstHeaderMatch
48
+ ? remainingContent.substring(0, firstHeaderMatch.index).trim()
49
+ : remainingContent.trim();
50
+ // Parse sections
51
+ const sections = [];
52
+ const sectionRegex = /^(#{2,})\s+(.+)$/gm;
53
+ let match;
54
+ const headerPositions = [];
55
+ while ((match = sectionRegex.exec(remainingContent)) !== null) {
56
+ headerPositions.push({
57
+ level: match[1].length,
58
+ header: match[2],
59
+ pos: match.index,
60
+ });
61
+ }
62
+ for (let i = 0; i < headerPositions.length; i++) {
63
+ const current = headerPositions[i];
64
+ const next = headerPositions[i + 1];
65
+ const contentStart = current.pos + current.header.length + current.level + 1;
66
+ const contentEnd = next ? next.pos : remainingContent.length;
67
+ const sectionContent = remainingContent
68
+ .substring(contentStart, contentEnd)
69
+ .trim();
70
+ sections.push({
71
+ header: current.header,
72
+ level: current.level,
73
+ content: sectionContent,
74
+ });
75
+ }
76
+ return {
77
+ frontmatter,
78
+ systemPrompt,
79
+ sections,
80
+ };
81
+ }
82
+ /**
83
+ * Remove agent delegation references for platforms that don't support it
84
+ */
85
+ removeAgentReferences(content) {
86
+ // Remove @blue-agent-name references
87
+ return content.replace(/@blue-[\w-]+/g, "the appropriate specialist");
88
+ }
89
+ /**
90
+ * Transform header text based on platform conventions
91
+ */
92
+ transformHeader(header, mappings) {
93
+ const mapping = mappings[header];
94
+ if (mapping === null) {
95
+ return null; // Skip this section
96
+ }
97
+ return mapping || header; // Use mapping or keep original
98
+ }
99
+ }
100
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/lib/adapters/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { PlatformAdapter } from "./base.js";
2
+ import { AgentInfo } from "../agents.js";
3
+ /**
4
+ * Claude Desktop adapter - nearly identical to Cursor
5
+ */
6
+ export declare class ClaudeDesktopAdapter extends PlatformAdapter {
7
+ readonly platform: "claude-desktop";
8
+ readonly isSingleFile = false;
9
+ getOutputPath(): string;
10
+ installAgent(agentName: string, agentInfo: AgentInfo): void;
11
+ removeAgent(agentName: string, agentInfo: AgentInfo): void;
12
+ syncAgents(installedAgents: AgentInfo[]): void;
13
+ }
14
+ //# sourceMappingURL=claude-desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/claude-desktop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;IACvD,QAAQ,CAAC,QAAQ,EAAG,gBAAgB,CAAU;IAC9C,QAAQ,CAAC,YAAY,SAAS;IAE9B,aAAa,IAAI,MAAM;IAIvB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAc3D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAO1D,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,IAAI;CAM/C"}
@@ -0,0 +1,38 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { PlatformAdapter } from "./base.js";
4
+ import { getProjectAgentsDir } from "../paths.js";
5
+ /**
6
+ * Claude Desktop adapter - nearly identical to Cursor
7
+ */
8
+ export class ClaudeDesktopAdapter extends PlatformAdapter {
9
+ platform = "claude-desktop";
10
+ isSingleFile = false;
11
+ getOutputPath() {
12
+ return getProjectAgentsDir("claude-desktop");
13
+ }
14
+ installAgent(agentName, agentInfo) {
15
+ const content = this.loadAgentContent(agentInfo);
16
+ const outputDir = this.getOutputPath();
17
+ const outputPath = path.join(outputDir, agentInfo.filename);
18
+ // Ensure directory exists
19
+ if (!fs.existsSync(outputDir)) {
20
+ fs.mkdirSync(outputDir, { recursive: true });
21
+ }
22
+ // Claude Desktop uses same format as Cursor
23
+ fs.writeFileSync(outputPath, content);
24
+ }
25
+ removeAgent(agentName, agentInfo) {
26
+ const outputPath = path.join(this.getOutputPath(), agentInfo.filename);
27
+ if (fs.existsSync(outputPath)) {
28
+ fs.unlinkSync(outputPath);
29
+ }
30
+ }
31
+ syncAgents(installedAgents) {
32
+ // Update each file individually
33
+ for (const agent of installedAgents) {
34
+ this.installAgent(agent.name, agent);
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=claude-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../../src/lib/adapters/claude-desktop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,eAAe;IAC9C,QAAQ,GAAG,gBAAyB,CAAC;IACrC,YAAY,GAAG,KAAK,CAAC;IAE9B,aAAa;QACX,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,SAAoB;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE5D,0BAA0B;QAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,4CAA4C;QAC5C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,SAAoB;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,eAA4B;QACrC,gCAAgC;QAChC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { PlatformAdapter } from "./base.js";
2
+ import { AgentInfo } from "../agents.js";
3
+ /**
4
+ * Codex adapter - combines agents into single AGENTS.md file
5
+ */
6
+ export declare class CodexAdapter extends PlatformAdapter {
7
+ readonly platform: "codex";
8
+ readonly isSingleFile = true;
9
+ private readonly AGENTS_FILE;
10
+ private readonly HEADER_MAPPINGS;
11
+ getOutputPath(): string;
12
+ installAgent(agentName: string, agentInfo: AgentInfo): void;
13
+ removeAgent(agentName: string, agentInfo: AgentInfo): void;
14
+ syncAgents(installedAgents: AgentInfo[]): void;
15
+ private transformAgent;
16
+ private parseSections;
17
+ private rebuildFile;
18
+ }
19
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/codex.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;GAEG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;IACrC,QAAQ,CAAC,YAAY,QAAQ;IAE7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAK9B;IAEF,aAAa,IAAI,MAAM;IAIvB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAc3D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAmB1D,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,IAAI;IAW9C,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,WAAW;CAQpB"}
@@ -0,0 +1,97 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { PlatformAdapter } from "./base.js";
4
+ /**
5
+ * Codex adapter - combines agents into single AGENTS.md file
6
+ */
7
+ export class CodexAdapter extends PlatformAdapter {
8
+ platform = "codex";
9
+ isSingleFile = true;
10
+ AGENTS_FILE = "AGENTS.md";
11
+ HEADER_MAPPINGS = {
12
+ "When Invoked": "Guidelines",
13
+ "Core Responsibilities": "Overview",
14
+ "Delegation Guidelines": null, // Skip - Codex doesn't have delegation
15
+ "Output Format": "Expected Output",
16
+ };
17
+ getOutputPath() {
18
+ return path.join(process.cwd(), this.AGENTS_FILE);
19
+ }
20
+ installAgent(agentName, agentInfo) {
21
+ const agentContent = this.transformAgent(agentInfo);
22
+ const agentsFilePath = this.getOutputPath();
23
+ if (!fs.existsSync(agentsFilePath)) {
24
+ // First agent - create file with header
25
+ const header = "# Blue Gardener AI Agents\n\n";
26
+ fs.writeFileSync(agentsFilePath, header + agentContent);
27
+ }
28
+ else {
29
+ // Append to existing file
30
+ fs.appendFileSync(agentsFilePath, "\n\n---\n\n" + agentContent);
31
+ }
32
+ }
33
+ removeAgent(agentName, agentInfo) {
34
+ const agentsFilePath = this.getOutputPath();
35
+ if (!fs.existsSync(agentsFilePath))
36
+ return;
37
+ const content = fs.readFileSync(agentsFilePath, "utf-8");
38
+ const sections = this.parseSections(content);
39
+ // Filter out the agent section
40
+ const filtered = sections.filter((s) => s.agentName !== agentName);
41
+ if (filtered.length === 0) {
42
+ // No agents left - remove file
43
+ fs.unlinkSync(agentsFilePath);
44
+ }
45
+ else {
46
+ // Rebuild file with remaining sections
47
+ this.rebuildFile(agentsFilePath, filtered);
48
+ }
49
+ }
50
+ syncAgents(installedAgents) {
51
+ const agentsFilePath = this.getOutputPath();
52
+ // Regenerate entire file from scratch
53
+ const header = "# Blue Gardener AI Agents\n\n";
54
+ const sections = installedAgents.map((agent) => this.transformAgent(agent));
55
+ const content = header + sections.join("\n\n---\n\n");
56
+ fs.writeFileSync(agentsFilePath, content);
57
+ }
58
+ transformAgent(agentInfo) {
59
+ const content = this.loadAgentContent(agentInfo);
60
+ const parsed = this.parseAgentMarkdown(content);
61
+ let output = `## ${parsed.frontmatter.description || agentInfo.description}\n\n`;
62
+ output += this.removeAgentReferences(parsed.systemPrompt) + "\n\n";
63
+ // Transform and add sections
64
+ for (const section of parsed.sections) {
65
+ const newHeader = this.transformHeader(section.header, this.HEADER_MAPPINGS);
66
+ if (newHeader === null) {
67
+ continue; // Skip this section
68
+ }
69
+ output += `### ${newHeader}\n\n`;
70
+ output += this.removeAgentReferences(section.content) + "\n\n";
71
+ }
72
+ return output.trim();
73
+ }
74
+ parseSections(content) {
75
+ const parts = content.split(/\n---\n/);
76
+ const sections = [];
77
+ for (const part of parts) {
78
+ const trimmed = part.trim();
79
+ if (!trimmed || trimmed.startsWith("# Blue Gardener"))
80
+ continue;
81
+ // Try to extract agent name from first header
82
+ const headerMatch = trimmed.match(/^##\s+(.+?)$/m);
83
+ const agentName = headerMatch ? headerMatch[1] : "unknown";
84
+ sections.push({
85
+ agentName,
86
+ content: trimmed,
87
+ });
88
+ }
89
+ return sections;
90
+ }
91
+ rebuildFile(filePath, sections) {
92
+ const header = "# Blue Gardener AI Agents\n\n";
93
+ const content = header + sections.map((s) => s.content).join("\n\n---\n\n");
94
+ fs.writeFileSync(filePath, content);
95
+ }
96
+ }
97
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/lib/adapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { PlatformAdapter } from "./base.js";
2
+ import { AgentInfo } from "../agents.js";
3
+ /**
4
+ * Cursor adapter - minimal transformation, current format
5
+ */
6
+ export declare class CursorAdapter extends PlatformAdapter {
7
+ readonly platform: "cursor";
8
+ readonly isSingleFile = false;
9
+ getOutputPath(): string;
10
+ installAgent(agentName: string, agentInfo: AgentInfo): void;
11
+ removeAgent(agentName: string, agentInfo: AgentInfo): void;
12
+ syncAgents(installedAgents: AgentInfo[]): void;
13
+ }
14
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/cursor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;GAEG;AACH,qBAAa,aAAc,SAAQ,eAAe;IAChD,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,QAAQ,CAAC,YAAY,SAAS;IAE9B,aAAa,IAAI,MAAM;IAIvB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAc3D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAO1D,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,IAAI;CAM/C"}
@@ -0,0 +1,38 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { PlatformAdapter } from "./base.js";
4
+ import { getProjectAgentsDir } from "../paths.js";
5
+ /**
6
+ * Cursor adapter - minimal transformation, current format
7
+ */
8
+ export class CursorAdapter extends PlatformAdapter {
9
+ platform = "cursor";
10
+ isSingleFile = false;
11
+ getOutputPath() {
12
+ return getProjectAgentsDir("cursor");
13
+ }
14
+ installAgent(agentName, agentInfo) {
15
+ const content = this.loadAgentContent(agentInfo);
16
+ const outputDir = this.getOutputPath();
17
+ const outputPath = path.join(outputDir, agentInfo.filename);
18
+ // Ensure directory exists
19
+ if (!fs.existsSync(outputDir)) {
20
+ fs.mkdirSync(outputDir, { recursive: true });
21
+ }
22
+ // Cursor format is the source format - just copy
23
+ fs.writeFileSync(outputPath, content);
24
+ }
25
+ removeAgent(agentName, agentInfo) {
26
+ const outputPath = path.join(this.getOutputPath(), agentInfo.filename);
27
+ if (fs.existsSync(outputPath)) {
28
+ fs.unlinkSync(outputPath);
29
+ }
30
+ }
31
+ syncAgents(installedAgents) {
32
+ // Update each file individually
33
+ for (const agent of installedAgents) {
34
+ this.installAgent(agent.name, agent);
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/lib/adapters/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,eAAe;IACvC,QAAQ,GAAG,QAAiB,CAAC;IAC7B,YAAY,GAAG,KAAK,CAAC;IAE9B,aAAa;QACX,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,SAAoB;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE5D,0BAA0B;QAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,iDAAiD;QACjD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,SAAoB;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,UAAU,CAAC,eAA4B;QACrC,gCAAgC;QAChC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { PlatformAdapter } from "./base.js";
2
+ import { AgentInfo } from "../agents.js";
3
+ /**
4
+ * GitHub Copilot adapter - combines agents into single .github/copilot-instructions.md file
5
+ */
6
+ export declare class GitHubCopilotAdapter extends PlatformAdapter {
7
+ readonly platform: "github-copilot";
8
+ readonly isSingleFile = true;
9
+ private readonly COPILOT_FILE;
10
+ private readonly HEADER_MAPPINGS;
11
+ getOutputPath(): string;
12
+ installAgent(agentName: string, agentInfo: AgentInfo): void;
13
+ removeAgent(agentName: string, agentInfo: AgentInfo): void;
14
+ syncAgents(installedAgents: AgentInfo[]): void;
15
+ private transformAgent;
16
+ private parseSections;
17
+ private rebuildFile;
18
+ }
19
+ //# sourceMappingURL=github-copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-copilot.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/github-copilot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;IACvD,QAAQ,CAAC,QAAQ,EAAG,gBAAgB,CAAU;IAC9C,QAAQ,CAAC,YAAY,QAAQ;IAE7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAClE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAK9B;IAEF,aAAa,IAAI,MAAM;IAIvB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAqB3D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAmB1D,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,IAAI;IAkB9C,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,WAAW;CASpB"}
@@ -0,0 +1,107 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { PlatformAdapter } from "./base.js";
4
+ /**
5
+ * GitHub Copilot adapter - combines agents into single .github/copilot-instructions.md file
6
+ */
7
+ export class GitHubCopilotAdapter extends PlatformAdapter {
8
+ platform = "github-copilot";
9
+ isSingleFile = true;
10
+ COPILOT_FILE = ".github/copilot-instructions.md";
11
+ HEADER_MAPPINGS = {
12
+ "When Invoked": "Guidelines",
13
+ "Core Responsibilities": "Overview",
14
+ "Delegation Guidelines": null, // Skip - Copilot doesn't have delegation
15
+ "Output Format": "Expected Output",
16
+ };
17
+ getOutputPath() {
18
+ return path.join(process.cwd(), this.COPILOT_FILE);
19
+ }
20
+ installAgent(agentName, agentInfo) {
21
+ const agentContent = this.transformAgent(agentInfo);
22
+ const copilotFilePath = this.getOutputPath();
23
+ const copilotDir = path.dirname(copilotFilePath);
24
+ // Ensure .github directory exists
25
+ if (!fs.existsSync(copilotDir)) {
26
+ fs.mkdirSync(copilotDir, { recursive: true });
27
+ }
28
+ if (!fs.existsSync(copilotFilePath)) {
29
+ // First agent - create file with header
30
+ const header = "# Blue Gardener AI Agents\n\nThis project uses specialized AI agents from Blue Gardener.\n\n";
31
+ fs.writeFileSync(copilotFilePath, header + agentContent);
32
+ }
33
+ else {
34
+ // Append to existing file
35
+ fs.appendFileSync(copilotFilePath, "\n\n---\n\n" + agentContent);
36
+ }
37
+ }
38
+ removeAgent(agentName, agentInfo) {
39
+ const copilotFilePath = this.getOutputPath();
40
+ if (!fs.existsSync(copilotFilePath))
41
+ return;
42
+ const content = fs.readFileSync(copilotFilePath, "utf-8");
43
+ const sections = this.parseSections(content);
44
+ // Filter out the agent section
45
+ const filtered = sections.filter((s) => s.agentName !== agentName);
46
+ if (filtered.length === 0) {
47
+ // No agents left - remove file
48
+ fs.unlinkSync(copilotFilePath);
49
+ }
50
+ else {
51
+ // Rebuild file with remaining sections
52
+ this.rebuildFile(copilotFilePath, filtered);
53
+ }
54
+ }
55
+ syncAgents(installedAgents) {
56
+ const copilotFilePath = this.getOutputPath();
57
+ const copilotDir = path.dirname(copilotFilePath);
58
+ // Ensure .github directory exists
59
+ if (!fs.existsSync(copilotDir)) {
60
+ fs.mkdirSync(copilotDir, { recursive: true });
61
+ }
62
+ // Regenerate entire file from scratch
63
+ const header = "# Blue Gardener AI Agents\n\nThis project uses specialized AI agents from Blue Gardener.\n\n";
64
+ const sections = installedAgents.map((agent) => this.transformAgent(agent));
65
+ const content = header + sections.join("\n\n---\n\n");
66
+ fs.writeFileSync(copilotFilePath, content);
67
+ }
68
+ transformAgent(agentInfo) {
69
+ const content = this.loadAgentContent(agentInfo);
70
+ const parsed = this.parseAgentMarkdown(content);
71
+ let output = `## ${parsed.frontmatter.description || agentInfo.description}\n\n`;
72
+ output += this.removeAgentReferences(parsed.systemPrompt) + "\n\n";
73
+ // Transform and add sections
74
+ for (const section of parsed.sections) {
75
+ const newHeader = this.transformHeader(section.header, this.HEADER_MAPPINGS);
76
+ if (newHeader === null) {
77
+ continue; // Skip this section
78
+ }
79
+ output += `### ${newHeader}\n\n`;
80
+ output += this.removeAgentReferences(section.content) + "\n\n";
81
+ }
82
+ return output.trim();
83
+ }
84
+ parseSections(content) {
85
+ const parts = content.split(/\n---\n/);
86
+ const sections = [];
87
+ for (const part of parts) {
88
+ const trimmed = part.trim();
89
+ if (!trimmed || trimmed.startsWith("# Blue Gardener"))
90
+ continue;
91
+ // Try to extract agent name from first header
92
+ const headerMatch = trimmed.match(/^##\s+(.+?)$/m);
93
+ const agentName = headerMatch ? headerMatch[1] : "unknown";
94
+ sections.push({
95
+ agentName,
96
+ content: trimmed,
97
+ });
98
+ }
99
+ return sections;
100
+ }
101
+ rebuildFile(filePath, sections) {
102
+ const header = "# Blue Gardener AI Agents\n\nThis project uses specialized AI agents from Blue Gardener.\n\n";
103
+ const content = header + sections.map((s) => s.content).join("\n\n---\n\n");
104
+ fs.writeFileSync(filePath, content);
105
+ }
106
+ }
107
+ //# sourceMappingURL=github-copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-copilot.js","sourceRoot":"","sources":["../../../src/lib/adapters/github-copilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Platform } from "../platform.js";
2
+ import { PlatformAdapter } from "./base.js";
3
+ /**
4
+ * Factory to get the appropriate adapter for a platform
5
+ */
6
+ export declare function getAdapter(platform: Platform): PlatformAdapter;
7
+ export * from "./base.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAQ5C;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAiB9D;AAED,cAAc,WAAW,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { CursorAdapter } from "./cursor.js";
2
+ import { ClaudeDesktopAdapter } from "./claude-desktop.js";
3
+ import { CodexAdapter } from "./codex.js";
4
+ import { GitHubCopilotAdapter } from "./github-copilot.js";
5
+ import { WindsurfAdapter } from "./windsurf.js";
6
+ import { OpenCodeAdapter } from "./opencode.js";
7
+ /**
8
+ * Factory to get the appropriate adapter for a platform
9
+ */
10
+ export function getAdapter(platform) {
11
+ switch (platform) {
12
+ case "cursor":
13
+ return new CursorAdapter();
14
+ case "claude-desktop":
15
+ return new ClaudeDesktopAdapter();
16
+ case "codex":
17
+ return new CodexAdapter();
18
+ case "github-copilot":
19
+ return new GitHubCopilotAdapter();
20
+ case "windsurf":
21
+ return new WindsurfAdapter();
22
+ case "opencode":
23
+ return new OpenCodeAdapter();
24
+ default:
25
+ throw new Error(`Unknown platform: ${platform}`);
26
+ }
27
+ }
28
+ export * from "./base.js";
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/adapters/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAkB;IAC3C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,KAAK,gBAAgB;YACnB,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,KAAK,gBAAgB;YACnB,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/B,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/B;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,cAAc,WAAW,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { PlatformAdapter } from "./base.js";
2
+ import { AgentInfo } from "../agents.js";
3
+ /**
4
+ * OpenCode adapter - similar to Cursor with minor frontmatter adjustments
5
+ */
6
+ export declare class OpenCodeAdapter extends PlatformAdapter {
7
+ readonly platform: "opencode";
8
+ readonly isSingleFile = false;
9
+ getOutputPath(): string;
10
+ installAgent(agentName: string, agentInfo: AgentInfo): void;
11
+ removeAgent(agentName: string, agentInfo: AgentInfo): void;
12
+ syncAgents(installedAgents: AgentInfo[]): void;
13
+ }
14
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;GAEG;AACH,qBAAa,eAAgB,SAAQ,eAAe;IAClD,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IACxC,QAAQ,CAAC,YAAY,SAAS;IAE9B,aAAa,IAAI,MAAM;IAIvB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAc3D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAO1D,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,IAAI;CAM/C"}