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,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
+ * OpenCode adapter - similar to Cursor with minor frontmatter adjustments
7
+ */
8
+ export class OpenCodeAdapter extends PlatformAdapter {
9
+ platform = "opencode";
10
+ isSingleFile = false;
11
+ getOutputPath() {
12
+ return getProjectAgentsDir("opencode");
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
+ // OpenCode uses similar format to Cursor - minimal changes needed
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=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/lib/adapters/opencode.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,eAAgB,SAAQ,eAAe;IACzC,QAAQ,GAAG,UAAmB,CAAC;IAC/B,YAAY,GAAG,KAAK,CAAC;IAE9B,aAAa;QACX,OAAO,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzC,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,kEAAkE;QAClE,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,16 @@
1
+ import { PlatformAdapter } from "./base.js";
2
+ import { AgentInfo } from "../agents.js";
3
+ /**
4
+ * Windsurf adapter - converts agents to rule format
5
+ */
6
+ export declare class WindsurfAdapter extends PlatformAdapter {
7
+ readonly platform: "windsurf";
8
+ readonly isSingleFile = false;
9
+ private readonly HEADER_MAPPINGS;
10
+ getOutputPath(): string;
11
+ installAgent(agentName: string, agentInfo: AgentInfo): void;
12
+ removeAgent(agentName: string, agentInfo: AgentInfo): void;
13
+ syncAgents(installedAgents: AgentInfo[]): void;
14
+ private transformToRule;
15
+ }
16
+ //# sourceMappingURL=windsurf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/windsurf.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,OAAO,CAAC,QAAQ,CAAC,eAAe,CAM9B;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;IAO1D,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,GAAG,IAAI;IAO9C,OAAO,CAAC,eAAe;CA6BxB"}
@@ -0,0 +1,66 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { PlatformAdapter } from "./base.js";
4
+ import { getProjectAgentsDir } from "../paths.js";
5
+ /**
6
+ * Windsurf adapter - converts agents to rule format
7
+ */
8
+ export class WindsurfAdapter extends PlatformAdapter {
9
+ platform = "windsurf";
10
+ isSingleFile = false;
11
+ HEADER_MAPPINGS = {
12
+ "When Invoked": "When This Rule Applies",
13
+ "Core Responsibilities": "Rules",
14
+ Guidelines: "Rules",
15
+ "Delegation Guidelines": null, // Skip - Windsurf doesn't have delegation
16
+ "Output Format": "Expected Output",
17
+ };
18
+ getOutputPath() {
19
+ return getProjectAgentsDir("windsurf");
20
+ }
21
+ installAgent(agentName, agentInfo) {
22
+ const content = this.loadAgentContent(agentInfo);
23
+ const transformed = this.transformToRule(content, agentInfo);
24
+ const outputDir = this.getOutputPath();
25
+ const outputPath = path.join(outputDir, agentInfo.filename);
26
+ // Ensure directory exists
27
+ if (!fs.existsSync(outputDir)) {
28
+ fs.mkdirSync(outputDir, { recursive: true });
29
+ }
30
+ fs.writeFileSync(outputPath, transformed);
31
+ }
32
+ removeAgent(agentName, agentInfo) {
33
+ const outputPath = path.join(this.getOutputPath(), agentInfo.filename);
34
+ if (fs.existsSync(outputPath)) {
35
+ fs.unlinkSync(outputPath);
36
+ }
37
+ }
38
+ syncAgents(installedAgents) {
39
+ // Update each file individually
40
+ for (const agent of installedAgents) {
41
+ this.installAgent(agent.name, agent);
42
+ }
43
+ }
44
+ transformToRule(content, agentInfo) {
45
+ const parsed = this.parseAgentMarkdown(content);
46
+ // Windsurf uses simpler format - rules rather than agent behavior
47
+ let output = `# ${parsed.frontmatter.description || agentInfo.description}\n\n`;
48
+ output += this.removeAgentReferences(parsed.systemPrompt) + "\n\n";
49
+ // Transform and add sections
50
+ for (const section of parsed.sections) {
51
+ const newHeader = this.transformHeader(section.header, this.HEADER_MAPPINGS);
52
+ if (newHeader === null) {
53
+ continue; // Skip this section
54
+ }
55
+ output += `## ${newHeader}\n\n`;
56
+ // Reframe content as rules/guidance rather than agent instructions
57
+ const transformedContent = this.removeAgentReferences(section.content)
58
+ .replace(/delegate to/gi, "apply")
59
+ .replace(/you are/gi, "use")
60
+ .replace(/your/gi, "the");
61
+ output += transformedContent + "\n\n";
62
+ }
63
+ return output.trim();
64
+ }
65
+ }
66
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../../src/lib/adapters/windsurf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { Platform } from "./platform.js";
2
+ export interface AgentInfo {
3
+ name: string;
4
+ description: string;
5
+ filename: string;
6
+ /** Relative path from agents dir to source file (for subfolder support) */
7
+ sourcePath: string;
8
+ tags: string[];
9
+ category: string;
10
+ }
11
+ export interface CategoryInfo {
12
+ id: string;
13
+ name: string;
14
+ count: number;
15
+ }
16
+ /**
17
+ * Get list of all categories with agent counts
18
+ */
19
+ export declare function getCategories(): CategoryInfo[];
20
+ /**
21
+ * Get agents by category
22
+ */
23
+ export declare function getAgentsByCategory(category: string): AgentInfo[];
24
+ /**
25
+ * Get list of available agents from the bundled agents directory
26
+ */
27
+ export declare function getAvailableAgents(): AgentInfo[];
28
+ /**
29
+ * Get list of installed agents with their info
30
+ */
31
+ export declare function getInstalledAgents(): AgentInfo[];
32
+ /**
33
+ * Install an agent to the project
34
+ */
35
+ export declare function installAgent(agentName: string, platform?: Platform): boolean;
36
+ /**
37
+ * Remove an agent from the project
38
+ */
39
+ export declare function removeAgent(agentName: string): boolean;
40
+ /**
41
+ * Sync all installed agents to the latest version
42
+ */
43
+ export declare function syncAgents(): {
44
+ synced: string[];
45
+ failed: string[];
46
+ };
47
+ /**
48
+ * Find orphaned blue-* agent files that exist in project but aren't in manifest
49
+ */
50
+ export declare function findOrphanedAgents(): AgentInfo[];
51
+ /**
52
+ * Repair manifest by re-tracking orphaned agents
53
+ */
54
+ export declare function repairManifest(): {
55
+ repaired: string[];
56
+ removed: string[];
57
+ };
58
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAC;AA6BzD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAgC9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAGjE;AA6DD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,EAAE,CAoChD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,EAAE,CAKhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAqC5E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CA4BtD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA0DnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,EAAE,CAwBhD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAsC1E"}
@@ -0,0 +1,340 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import chalk from "chalk";
4
+ import { getBundledAgentsDir, getProjectAgentsDir, ensureProjectAgentsDir, } from "./paths.js";
5
+ import { readManifest, writeManifest, createManifest, addAgentToManifest, removeAgentFromManifest, getInstalledAgentNames, updatePlatform, } from "./manifest.js";
6
+ import { detectPlatform } from "./platform.js";
7
+ import { getAdapter } from "./adapters/index.js";
8
+ // Read version from package.json
9
+ import { createRequire } from "module";
10
+ const require = createRequire(import.meta.url);
11
+ const packageJson = require("../../package.json");
12
+ const PACKAGE_VERSION = packageJson.version;
13
+ /**
14
+ * Check if debug mode is enabled via environment variable
15
+ */
16
+ function isDebugEnabled() {
17
+ return (process.env.DEBUG === "blue-gardener" ||
18
+ process.env.BLUE_GARDENER_DEBUG === "1" ||
19
+ process.env.BLUE_GARDENER_DEBUG === "true");
20
+ }
21
+ /**
22
+ * Log debug message if debug mode is enabled
23
+ */
24
+ function debugLog(message) {
25
+ if (isDebugEnabled()) {
26
+ console.log(chalk.gray(`[debug] ${message}`));
27
+ }
28
+ }
29
+ /**
30
+ * Get list of all categories with agent counts
31
+ */
32
+ export function getCategories() {
33
+ const agents = getAvailableAgents();
34
+ const categoryCounts = new Map();
35
+ for (const agent of agents) {
36
+ const category = agent.category || "other";
37
+ categoryCounts.set(category, (categoryCounts.get(category) || 0) + 1);
38
+ }
39
+ const categoryOrder = [
40
+ "orchestrator",
41
+ "development",
42
+ "quality",
43
+ "infrastructure",
44
+ "configuration",
45
+ "blockchain",
46
+ "other",
47
+ ];
48
+ const categories = [];
49
+ for (const categoryId of categoryOrder) {
50
+ const count = categoryCounts.get(categoryId);
51
+ if (count) {
52
+ categories.push({
53
+ id: categoryId,
54
+ name: categoryId.charAt(0).toUpperCase() + categoryId.slice(1),
55
+ count,
56
+ });
57
+ }
58
+ }
59
+ return categories;
60
+ }
61
+ /**
62
+ * Get agents by category
63
+ */
64
+ export function getAgentsByCategory(category) {
65
+ const agents = getAvailableAgents();
66
+ return agents.filter((a) => a.category === category);
67
+ }
68
+ /**
69
+ * Parse agent metadata from frontmatter
70
+ */
71
+ function parseAgentFrontmatter(content) {
72
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
73
+ if (!frontmatterMatch) {
74
+ return { name: "", description: "", tags: [], category: "" };
75
+ }
76
+ const frontmatter = frontmatterMatch[1];
77
+ const nameMatch = frontmatter.match(/^name:\s*(.+)$/m);
78
+ const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
79
+ const categoryMatch = frontmatter.match(/^category:\s*(.+)$/m);
80
+ // Parse tags array: tags: [tag1, tag2, tag3]
81
+ const tagsMatch = frontmatter.match(/^tags:\s*\[([^\]]*)\]$/m);
82
+ const tags = tagsMatch
83
+ ? tagsMatch[1]
84
+ .split(",")
85
+ .map((t) => t.trim())
86
+ .filter(Boolean)
87
+ : [];
88
+ return {
89
+ name: nameMatch ? nameMatch[1].trim() : "",
90
+ description: descMatch ? descMatch[1].trim() : "",
91
+ tags,
92
+ category: categoryMatch ? categoryMatch[1].trim() : "",
93
+ };
94
+ }
95
+ /**
96
+ * Recursively find all .md files in a directory
97
+ */
98
+ function findMarkdownFiles(dir) {
99
+ const results = [];
100
+ if (!fs.existsSync(dir)) {
101
+ return results;
102
+ }
103
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
104
+ for (const entry of entries) {
105
+ const fullPath = path.join(dir, entry.name);
106
+ if (entry.isDirectory()) {
107
+ // Recursively search subdirectories
108
+ results.push(...findMarkdownFiles(fullPath));
109
+ }
110
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
111
+ results.push(fullPath);
112
+ }
113
+ }
114
+ return results;
115
+ }
116
+ /**
117
+ * Get list of available agents from the bundled agents directory
118
+ */
119
+ export function getAvailableAgents() {
120
+ const agentsDir = getBundledAgentsDir();
121
+ if (!fs.existsSync(agentsDir)) {
122
+ return [];
123
+ }
124
+ // Recursively find all .md files in agents directory and subdirectories
125
+ const files = findMarkdownFiles(agentsDir);
126
+ const agents = [];
127
+ for (const filePath of files) {
128
+ const content = fs.readFileSync(filePath, "utf-8");
129
+ const { name, description, tags, category } = parseAgentFrontmatter(content);
130
+ const relativePath = path.relative(agentsDir, filePath);
131
+ // Skip files without valid name frontmatter (e.g., CATALOG.md)
132
+ if (!name) {
133
+ debugLog(`Skipped ${relativePath} - no 'name' field in frontmatter`);
134
+ continue;
135
+ }
136
+ // Use just the filename (not the full path) for the output file
137
+ const filename = path.basename(filePath);
138
+ agents.push({
139
+ name,
140
+ description,
141
+ filename,
142
+ // Store the relative path from agents dir for source lookup
143
+ sourcePath: relativePath,
144
+ tags,
145
+ category,
146
+ });
147
+ }
148
+ return agents;
149
+ }
150
+ /**
151
+ * Get list of installed agents with their info
152
+ */
153
+ export function getInstalledAgents() {
154
+ const installedNames = getInstalledAgentNames();
155
+ const availableAgents = getAvailableAgents();
156
+ return availableAgents.filter((agent) => installedNames.includes(agent.name));
157
+ }
158
+ /**
159
+ * Install an agent to the project
160
+ */
161
+ export function installAgent(agentName, platform) {
162
+ const availableAgents = getAvailableAgents();
163
+ const agent = availableAgents.find((a) => a.name === agentName);
164
+ if (!agent) {
165
+ return false;
166
+ }
167
+ // Get platform from manifest or parameter
168
+ let manifest = readManifest();
169
+ const targetPlatform = platform || manifest?.platform || detectPlatform() || "cursor";
170
+ // Get adapter for platform
171
+ const adapter = getAdapter(targetPlatform);
172
+ // Ensure directory exists
173
+ ensureProjectAgentsDir(targetPlatform);
174
+ // Install agent using adapter
175
+ try {
176
+ adapter.installAgent(agentName, agent);
177
+ }
178
+ catch (error) {
179
+ debugLog(`Failed to install ${agentName}: ${error}`);
180
+ return false;
181
+ }
182
+ // Update manifest
183
+ if (!manifest) {
184
+ manifest = createManifest(PACKAGE_VERSION, targetPlatform);
185
+ }
186
+ else if (!manifest.platform) {
187
+ manifest = updatePlatform(manifest, targetPlatform);
188
+ }
189
+ manifest = addAgentToManifest(manifest, agentName, PACKAGE_VERSION);
190
+ writeManifest(manifest);
191
+ return true;
192
+ }
193
+ /**
194
+ * Remove an agent from the project
195
+ */
196
+ export function removeAgent(agentName) {
197
+ const manifest = readManifest();
198
+ if (!manifest || !manifest.agents[agentName]) {
199
+ return false;
200
+ }
201
+ // Get platform from manifest
202
+ const platform = manifest.platform || detectPlatform() || "cursor";
203
+ const adapter = getAdapter(platform);
204
+ // Find the agent info
205
+ const availableAgents = getAvailableAgents();
206
+ const agent = availableAgents.find((a) => a.name === agentName);
207
+ if (agent) {
208
+ try {
209
+ adapter.removeAgent(agentName, agent);
210
+ }
211
+ catch (error) {
212
+ debugLog(`Failed to remove ${agentName}: ${error}`);
213
+ return false;
214
+ }
215
+ }
216
+ // Update manifest
217
+ const updatedManifest = removeAgentFromManifest(manifest, agentName);
218
+ writeManifest(updatedManifest);
219
+ return true;
220
+ }
221
+ /**
222
+ * Sync all installed agents to the latest version
223
+ */
224
+ export function syncAgents() {
225
+ const manifest = readManifest();
226
+ if (!manifest) {
227
+ return { synced: [], failed: [] };
228
+ }
229
+ // Get platform from manifest
230
+ const platform = manifest.platform || detectPlatform() || "cursor";
231
+ const adapter = getAdapter(platform);
232
+ const synced = [];
233
+ const failed = [];
234
+ // Get installed agents info
235
+ const availableAgents = getAvailableAgents();
236
+ const installedAgents = [];
237
+ for (const agentName of Object.keys(manifest.agents)) {
238
+ const agent = availableAgents.find((a) => a.name === agentName);
239
+ if (agent) {
240
+ installedAgents.push(agent);
241
+ }
242
+ else {
243
+ failed.push(agentName);
244
+ }
245
+ }
246
+ if (adapter.isSingleFile) {
247
+ // Single-file platforms: regenerate entire file
248
+ try {
249
+ adapter.syncAgents(installedAgents);
250
+ synced.push(...installedAgents.map((a) => a.name));
251
+ }
252
+ catch (error) {
253
+ debugLog(`Failed to sync agents: ${error}`);
254
+ failed.push(...installedAgents.map((a) => a.name));
255
+ }
256
+ }
257
+ else {
258
+ // Multi-file platforms: update each file individually
259
+ for (const agent of installedAgents) {
260
+ try {
261
+ adapter.installAgent(agent.name, agent);
262
+ synced.push(agent.name);
263
+ }
264
+ catch (error) {
265
+ debugLog(`Failed to sync ${agent.name}: ${error}`);
266
+ failed.push(agent.name);
267
+ }
268
+ }
269
+ }
270
+ // Update manifest version
271
+ if (synced.length > 0) {
272
+ manifest.version = PACKAGE_VERSION;
273
+ for (const name of synced) {
274
+ manifest.agents[name].version = PACKAGE_VERSION;
275
+ }
276
+ writeManifest(manifest);
277
+ }
278
+ return { synced, failed };
279
+ }
280
+ /**
281
+ * Find orphaned blue-* agent files that exist in project but aren't in manifest
282
+ */
283
+ export function findOrphanedAgents() {
284
+ const projectAgentsDir = getProjectAgentsDir();
285
+ if (!fs.existsSync(projectAgentsDir)) {
286
+ return [];
287
+ }
288
+ const manifest = readManifest();
289
+ const trackedNames = manifest ? Object.keys(manifest.agents) : [];
290
+ const availableAgents = getAvailableAgents();
291
+ // Find blue-* files in project that match our available agents but aren't tracked
292
+ const files = fs
293
+ .readdirSync(projectAgentsDir)
294
+ .filter((f) => f.startsWith("blue-") && f.endsWith(".md"));
295
+ const orphaned = [];
296
+ for (const filename of files) {
297
+ const matchingAgent = availableAgents.find((a) => a.filename === filename);
298
+ if (matchingAgent && !trackedNames.includes(matchingAgent.name)) {
299
+ orphaned.push(matchingAgent);
300
+ }
301
+ }
302
+ return orphaned;
303
+ }
304
+ /**
305
+ * Repair manifest by re-tracking orphaned agents
306
+ */
307
+ export function repairManifest() {
308
+ const orphaned = findOrphanedAgents();
309
+ const repaired = [];
310
+ const removed = [];
311
+ if (orphaned.length === 0) {
312
+ return { repaired, removed };
313
+ }
314
+ // Get or create manifest
315
+ let manifest = readManifest();
316
+ if (!manifest) {
317
+ manifest = createManifest(PACKAGE_VERSION);
318
+ }
319
+ // Add orphaned agents to manifest
320
+ for (const agent of orphaned) {
321
+ manifest = addAgentToManifest(manifest, agent.name, PACKAGE_VERSION);
322
+ repaired.push(agent.name);
323
+ }
324
+ // Check for manifest entries that don't have files
325
+ const projectAgentsDir = getProjectAgentsDir();
326
+ const availableAgents = getAvailableAgents();
327
+ for (const agentName of Object.keys(manifest.agents)) {
328
+ const agent = availableAgents.find((a) => a.name === agentName);
329
+ if (agent) {
330
+ const filePath = path.join(projectAgentsDir, agent.filename);
331
+ if (!fs.existsSync(filePath)) {
332
+ manifest = removeAgentFromManifest(manifest, agentName);
333
+ removed.push(agentName);
334
+ }
335
+ }
336
+ }
337
+ writeManifest(manifest);
338
+ return { repaired, removed };
339
+ }
340
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Platform } from "./platform.js";
2
+ export interface EntrypointsInstallResult {
3
+ platform: Platform;
4
+ installed: string[];
5
+ skipped: string[];
6
+ message?: string;
7
+ }
8
+ export declare function installEntrypoints(platform: Platform): EntrypointsInstallResult;
9
+ //# sourceMappingURL=entrypoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrypoints.d.ts","sourceRoot":"","sources":["../../src/lib/entrypoints.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsCD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,wBAAwB,CA4C/E"}
@@ -0,0 +1,72 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { getPackageDir } from "./paths.js";
4
+ function ensureDir(dir) {
5
+ if (!fs.existsSync(dir)) {
6
+ fs.mkdirSync(dir, { recursive: true });
7
+ }
8
+ }
9
+ function listFiles(dir) {
10
+ if (!fs.existsSync(dir))
11
+ return [];
12
+ return fs
13
+ .readdirSync(dir, { withFileTypes: true })
14
+ .filter((e) => e.isFile())
15
+ .map((e) => e.name);
16
+ }
17
+ function copyFileIfChanged(src, dest) {
18
+ const srcContent = fs.readFileSync(src, "utf-8");
19
+ if (fs.existsSync(dest)) {
20
+ const destContent = fs.readFileSync(dest, "utf-8");
21
+ if (destContent === srcContent)
22
+ return false;
23
+ }
24
+ fs.writeFileSync(dest, srcContent);
25
+ return true;
26
+ }
27
+ function getBundledEntrypointsDir() {
28
+ return path.join(getPackageDir(), "entrypoints");
29
+ }
30
+ function getCursorCommandsDir(cwd) {
31
+ return path.join(cwd, ".cursor", "commands");
32
+ }
33
+ function getWindsurfWorkflowsDir(cwd) {
34
+ return path.join(cwd, ".windsurf", "workflows");
35
+ }
36
+ export function installEntrypoints(platform) {
37
+ const cwd = process.cwd();
38
+ const base = getBundledEntrypointsDir();
39
+ const installed = [];
40
+ const skipped = [];
41
+ if (platform === "cursor") {
42
+ const srcDir = path.join(base, "cursor", "commands");
43
+ const destDir = getCursorCommandsDir(cwd);
44
+ ensureDir(destDir);
45
+ for (const filename of listFiles(srcDir)) {
46
+ const src = path.join(srcDir, filename);
47
+ const dest = path.join(destDir, filename);
48
+ const didCopy = copyFileIfChanged(src, dest);
49
+ (didCopy ? installed : skipped).push(`.cursor/commands/${filename}`);
50
+ }
51
+ return { platform, installed, skipped };
52
+ }
53
+ if (platform === "windsurf") {
54
+ const srcDir = path.join(base, "windsurf", "workflows");
55
+ const destDir = getWindsurfWorkflowsDir(cwd);
56
+ ensureDir(destDir);
57
+ for (const filename of listFiles(srcDir)) {
58
+ const src = path.join(srcDir, filename);
59
+ const dest = path.join(destDir, filename);
60
+ const didCopy = copyFileIfChanged(src, dest);
61
+ (didCopy ? installed : skipped).push(`.windsurf/workflows/${filename}`);
62
+ }
63
+ return { platform, installed, skipped };
64
+ }
65
+ return {
66
+ platform,
67
+ installed,
68
+ skipped,
69
+ message: "No native entrypoints are installed for this platform. Use Cursor commands or Windsurf workflows when available, and rely on staged instructions in single-file platforms.",
70
+ };
71
+ }
72
+ //# sourceMappingURL=entrypoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entrypoints.js","sourceRoot":"","sources":["../../src/lib/entrypoints.ts"],"names":[],"mappings":"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"}