jfl 0.1.0 → 0.2.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 (262) hide show
  1. package/README.md +443 -145
  2. package/clawdbot-plugin/clawdbot.plugin.json +20 -0
  3. package/clawdbot-plugin/index.js +555 -0
  4. package/clawdbot-plugin/index.ts +582 -0
  5. package/clawdbot-skill/SKILL.md +33 -336
  6. package/clawdbot-skill/index.ts +491 -321
  7. package/clawdbot-skill/skill.json +4 -13
  8. package/dist/commands/clawdbot.d.ts +11 -0
  9. package/dist/commands/clawdbot.d.ts.map +1 -0
  10. package/dist/commands/clawdbot.js +215 -0
  11. package/dist/commands/clawdbot.js.map +1 -0
  12. package/dist/commands/context-hub.d.ts +5 -0
  13. package/dist/commands/context-hub.d.ts.map +1 -1
  14. package/dist/commands/context-hub.js +394 -28
  15. package/dist/commands/context-hub.js.map +1 -1
  16. package/dist/commands/gtm-process-update.d.ts +10 -0
  17. package/dist/commands/gtm-process-update.d.ts.map +1 -0
  18. package/dist/commands/gtm-process-update.js +101 -0
  19. package/dist/commands/gtm-process-update.js.map +1 -0
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +278 -4
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +32 -33
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/memory.d.ts +38 -0
  27. package/dist/commands/memory.d.ts.map +1 -0
  28. package/dist/commands/memory.js +229 -0
  29. package/dist/commands/memory.js.map +1 -0
  30. package/dist/commands/migrate-services.d.ts +8 -0
  31. package/dist/commands/migrate-services.d.ts.map +1 -0
  32. package/dist/commands/migrate-services.js +182 -0
  33. package/dist/commands/migrate-services.js.map +1 -0
  34. package/dist/commands/onboard.d.ts +24 -0
  35. package/dist/commands/onboard.d.ts.map +1 -0
  36. package/dist/commands/onboard.js +663 -0
  37. package/dist/commands/onboard.js.map +1 -0
  38. package/dist/commands/openclaw.d.ts +56 -0
  39. package/dist/commands/openclaw.d.ts.map +1 -0
  40. package/dist/commands/openclaw.js +700 -0
  41. package/dist/commands/openclaw.js.map +1 -0
  42. package/dist/commands/orchestrate.d.ts +14 -0
  43. package/dist/commands/orchestrate.d.ts.map +1 -0
  44. package/dist/commands/orchestrate.js +270 -0
  45. package/dist/commands/orchestrate.js.map +1 -0
  46. package/dist/commands/profile.d.ts +46 -0
  47. package/dist/commands/profile.d.ts.map +1 -0
  48. package/dist/commands/profile.js +498 -0
  49. package/dist/commands/profile.js.map +1 -0
  50. package/dist/commands/repair.d.ts.map +1 -1
  51. package/dist/commands/repair.js +37 -0
  52. package/dist/commands/repair.js.map +1 -1
  53. package/dist/commands/service-agent.d.ts +16 -0
  54. package/dist/commands/service-agent.d.ts.map +1 -0
  55. package/dist/commands/service-agent.js +375 -0
  56. package/dist/commands/service-agent.js.map +1 -0
  57. package/dist/commands/service-manager.d.ts +12 -0
  58. package/dist/commands/service-manager.d.ts.map +1 -0
  59. package/dist/commands/service-manager.js +967 -0
  60. package/dist/commands/service-manager.js.map +1 -0
  61. package/dist/commands/service-validate.d.ts +12 -0
  62. package/dist/commands/service-validate.d.ts.map +1 -0
  63. package/dist/commands/service-validate.js +611 -0
  64. package/dist/commands/service-validate.js.map +1 -0
  65. package/dist/commands/services-create.d.ts +15 -0
  66. package/dist/commands/services-create.d.ts.map +1 -0
  67. package/dist/commands/services-create.js +1452 -0
  68. package/dist/commands/services-create.js.map +1 -0
  69. package/dist/commands/services-scan.d.ts +13 -0
  70. package/dist/commands/services-scan.d.ts.map +1 -0
  71. package/dist/commands/services-scan.js +251 -0
  72. package/dist/commands/services-scan.js.map +1 -0
  73. package/dist/commands/services-sync-agents.d.ts +23 -0
  74. package/dist/commands/services-sync-agents.d.ts.map +1 -0
  75. package/dist/commands/services-sync-agents.js +207 -0
  76. package/dist/commands/services-sync-agents.js.map +1 -0
  77. package/dist/commands/services.d.ts +19 -0
  78. package/dist/commands/services.d.ts.map +1 -0
  79. package/dist/commands/services.js +742 -0
  80. package/dist/commands/services.js.map +1 -0
  81. package/dist/commands/session.d.ts +5 -1
  82. package/dist/commands/session.d.ts.map +1 -1
  83. package/dist/commands/session.js +68 -586
  84. package/dist/commands/session.js.map +1 -1
  85. package/dist/commands/status.d.ts.map +1 -1
  86. package/dist/commands/status.js +17 -0
  87. package/dist/commands/status.js.map +1 -1
  88. package/dist/commands/update.d.ts.map +1 -1
  89. package/dist/commands/update.js +75 -21
  90. package/dist/commands/update.js.map +1 -1
  91. package/dist/commands/validate-settings.d.ts +37 -0
  92. package/dist/commands/validate-settings.d.ts.map +1 -0
  93. package/dist/commands/validate-settings.js +197 -0
  94. package/dist/commands/validate-settings.js.map +1 -0
  95. package/dist/commands/voice.d.ts +0 -1
  96. package/dist/commands/voice.d.ts.map +1 -1
  97. package/dist/commands/voice.js +16 -15
  98. package/dist/commands/voice.js.map +1 -1
  99. package/dist/index.js +395 -141
  100. package/dist/index.js.map +1 -1
  101. package/dist/lib/agent-generator.d.ts +26 -0
  102. package/dist/lib/agent-generator.d.ts.map +1 -0
  103. package/dist/lib/agent-generator.js +331 -0
  104. package/dist/lib/agent-generator.js.map +1 -0
  105. package/dist/lib/memory-db.d.ts +102 -0
  106. package/dist/lib/memory-db.d.ts.map +1 -0
  107. package/dist/lib/memory-db.js +313 -0
  108. package/dist/lib/memory-db.js.map +1 -0
  109. package/dist/lib/memory-indexer.d.ts +47 -0
  110. package/dist/lib/memory-indexer.d.ts.map +1 -0
  111. package/dist/lib/memory-indexer.js +215 -0
  112. package/dist/lib/memory-indexer.js.map +1 -0
  113. package/dist/lib/memory-search.d.ts +41 -0
  114. package/dist/lib/memory-search.d.ts.map +1 -0
  115. package/dist/lib/memory-search.js +246 -0
  116. package/dist/lib/memory-search.js.map +1 -0
  117. package/dist/lib/openclaw-registry.d.ts +48 -0
  118. package/dist/lib/openclaw-registry.d.ts.map +1 -0
  119. package/dist/lib/openclaw-registry.js +181 -0
  120. package/dist/lib/openclaw-registry.js.map +1 -0
  121. package/dist/lib/openclaw-sdk.d.ts +107 -0
  122. package/dist/lib/openclaw-sdk.d.ts.map +1 -0
  123. package/dist/lib/openclaw-sdk.js +208 -0
  124. package/dist/lib/openclaw-sdk.js.map +1 -0
  125. package/dist/lib/peer-agent-generator.d.ts +44 -0
  126. package/dist/lib/peer-agent-generator.d.ts.map +1 -0
  127. package/dist/lib/peer-agent-generator.js +286 -0
  128. package/dist/lib/peer-agent-generator.js.map +1 -0
  129. package/dist/lib/service-dependencies.d.ts +44 -0
  130. package/dist/lib/service-dependencies.d.ts.map +1 -0
  131. package/dist/lib/service-dependencies.js +314 -0
  132. package/dist/lib/service-dependencies.js.map +1 -0
  133. package/dist/lib/service-detector.d.ts +61 -0
  134. package/dist/lib/service-detector.d.ts.map +1 -0
  135. package/dist/lib/service-detector.js +521 -0
  136. package/dist/lib/service-detector.js.map +1 -0
  137. package/dist/lib/service-gtm.d.ts +157 -0
  138. package/dist/lib/service-gtm.d.ts.map +1 -0
  139. package/dist/lib/service-gtm.js +786 -0
  140. package/dist/lib/service-gtm.js.map +1 -0
  141. package/dist/lib/service-mcp-base.d.ts +103 -0
  142. package/dist/lib/service-mcp-base.d.ts.map +1 -0
  143. package/dist/lib/service-mcp-base.js +263 -0
  144. package/dist/lib/service-mcp-base.js.map +1 -0
  145. package/dist/lib/service-utils.d.ts +103 -0
  146. package/dist/lib/service-utils.d.ts.map +1 -0
  147. package/dist/lib/service-utils.js +368 -0
  148. package/dist/lib/service-utils.js.map +1 -0
  149. package/dist/lib/skill-generator.d.ts +21 -0
  150. package/dist/lib/skill-generator.d.ts.map +1 -0
  151. package/dist/lib/skill-generator.js +253 -0
  152. package/dist/lib/skill-generator.js.map +1 -0
  153. package/dist/lib/stratus-client.d.ts +100 -0
  154. package/dist/lib/stratus-client.d.ts.map +1 -0
  155. package/dist/lib/stratus-client.js +255 -0
  156. package/dist/lib/stratus-client.js.map +1 -0
  157. package/dist/mcp/context-hub-mcp.js +135 -53
  158. package/dist/mcp/context-hub-mcp.js.map +1 -1
  159. package/dist/mcp/service-mcp-server.d.ts +12 -0
  160. package/dist/mcp/service-mcp-server.d.ts.map +1 -0
  161. package/dist/mcp/service-mcp-server.js +434 -0
  162. package/dist/mcp/service-mcp-server.js.map +1 -0
  163. package/dist/mcp/service-peer-mcp.d.ts +36 -0
  164. package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
  165. package/dist/mcp/service-peer-mcp.js +220 -0
  166. package/dist/mcp/service-peer-mcp.js.map +1 -0
  167. package/dist/mcp/service-registry-mcp.d.ts +13 -0
  168. package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
  169. package/dist/mcp/service-registry-mcp.js +330 -0
  170. package/dist/mcp/service-registry-mcp.js.map +1 -0
  171. package/dist/ui/banner.js +1 -1
  172. package/dist/ui/banner.js.map +1 -1
  173. package/dist/ui/context-hub-logs.d.ts +10 -0
  174. package/dist/ui/context-hub-logs.d.ts.map +1 -0
  175. package/dist/ui/context-hub-logs.js +175 -0
  176. package/dist/ui/context-hub-logs.js.map +1 -0
  177. package/dist/ui/service-dashboard.d.ts +11 -0
  178. package/dist/ui/service-dashboard.d.ts.map +1 -0
  179. package/dist/ui/service-dashboard.js +357 -0
  180. package/dist/ui/service-dashboard.js.map +1 -0
  181. package/dist/ui/services-manager.d.ts +11 -0
  182. package/dist/ui/services-manager.d.ts.map +1 -0
  183. package/dist/ui/services-manager.js +507 -0
  184. package/dist/ui/services-manager.js.map +1 -0
  185. package/dist/utils/auth-guard.d.ts.map +1 -1
  186. package/dist/utils/auth-guard.js +8 -9
  187. package/dist/utils/auth-guard.js.map +1 -1
  188. package/dist/utils/claude-md-generator.d.ts +10 -0
  189. package/dist/utils/claude-md-generator.d.ts.map +1 -0
  190. package/dist/utils/claude-md-generator.js +215 -0
  191. package/dist/utils/claude-md-generator.js.map +1 -0
  192. package/dist/utils/ensure-context-hub.d.ts +20 -0
  193. package/dist/utils/ensure-context-hub.d.ts.map +1 -0
  194. package/dist/utils/ensure-context-hub.js +65 -0
  195. package/dist/utils/ensure-context-hub.js.map +1 -0
  196. package/dist/utils/ensure-project.d.ts.map +1 -1
  197. package/dist/utils/ensure-project.js +3 -4
  198. package/dist/utils/ensure-project.js.map +1 -1
  199. package/dist/utils/jfl-config.d.ts +19 -0
  200. package/dist/utils/jfl-config.d.ts.map +1 -0
  201. package/dist/utils/jfl-config.js +112 -0
  202. package/dist/utils/jfl-config.js.map +1 -0
  203. package/dist/utils/jfl-migration.d.ts +29 -0
  204. package/dist/utils/jfl-migration.d.ts.map +1 -0
  205. package/dist/utils/jfl-migration.js +142 -0
  206. package/dist/utils/jfl-migration.js.map +1 -0
  207. package/dist/utils/jfl-paths.d.ts +55 -0
  208. package/dist/utils/jfl-paths.d.ts.map +1 -0
  209. package/dist/utils/jfl-paths.js +120 -0
  210. package/dist/utils/jfl-paths.js.map +1 -0
  211. package/dist/utils/settings-validator.d.ts +73 -0
  212. package/dist/utils/settings-validator.d.ts.map +1 -0
  213. package/dist/utils/settings-validator.js +222 -0
  214. package/dist/utils/settings-validator.js.map +1 -0
  215. package/package.json +19 -3
  216. package/scripts/commit-gtm.sh +56 -0
  217. package/scripts/commit-product.sh +68 -0
  218. package/scripts/context-query.sh +45 -0
  219. package/scripts/session/auto-commit.sh +297 -0
  220. package/scripts/session/jfl-doctor.sh +707 -0
  221. package/scripts/session/session-cleanup.sh +268 -0
  222. package/scripts/session/session-end.sh +198 -0
  223. package/scripts/session/session-init.sh +350 -0
  224. package/scripts/session/session-init.sh.backup +292 -0
  225. package/scripts/session/session-sync.sh +167 -0
  226. package/scripts/session/test-context-preservation.sh +160 -0
  227. package/scripts/session/test-critical-infrastructure.sh +293 -0
  228. package/scripts/session/test-experience-level.sh +336 -0
  229. package/scripts/session/test-session-cleanup.sh +268 -0
  230. package/scripts/session/test-session-sync.sh +320 -0
  231. package/scripts/voice-start.sh +36 -8
  232. package/scripts/where-am-i.sh +78 -0
  233. package/template/.claude/service-settings.json +32 -0
  234. package/template/.claude/settings.json +14 -1
  235. package/template/.claude/skills/end/SKILL.md +1780 -0
  236. package/template/.jfl/config.json +2 -1
  237. package/template/CLAUDE.md +1039 -134
  238. package/template/CLAUDE.md.bak +1187 -0
  239. package/template/scripts/commit-gtm.sh +56 -0
  240. package/template/scripts/commit-product.sh +68 -0
  241. package/template/scripts/migrate-to-branch-sessions.sh +201 -0
  242. package/template/scripts/session/auto-commit.sh +58 -6
  243. package/template/scripts/session/jfl-doctor.sh +137 -17
  244. package/template/scripts/session/session-cleanup.sh +268 -0
  245. package/template/scripts/session/session-end.sh +4 -0
  246. package/template/scripts/session/session-init.sh +253 -66
  247. package/template/scripts/session/test-critical-infrastructure.sh +293 -0
  248. package/template/scripts/session/test-experience-level.sh +336 -0
  249. package/template/scripts/session/test-session-cleanup.sh +268 -0
  250. package/template/scripts/session/test-session-sync.sh +320 -0
  251. package/template/scripts/where-am-i.sh +78 -0
  252. package/template/templates/service-agent/.claude/settings.json +32 -0
  253. package/template/templates/service-agent/CLAUDE.md +334 -0
  254. package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
  255. package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
  256. package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
  257. package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
  258. package/dist/commands/session-mgmt.d.ts +0 -33
  259. package/dist/commands/session-mgmt.d.ts.map +0 -1
  260. package/dist/commands/session-mgmt.js +0 -404
  261. package/dist/commands/session-mgmt.js.map +0 -1
  262. package/template/scripts/session/auto-merge.sh +0 -325
@@ -0,0 +1,208 @@
1
+ /**
2
+ * OpenClaw TypeScript SDK
3
+ *
4
+ * Thin wrapper around Context Hub HTTP API and direct file I/O.
5
+ * For Node.js agent runtimes (Clawdbot, custom) that prefer imports over shell-outs.
6
+ *
7
+ * Primary path: HTTP to Context Hub (fast, no process spawn).
8
+ * Fallback: Shell out to `jfl openclaw` commands.
9
+ *
10
+ * @purpose Runtime-agnostic SDK for OpenClaw agent protocol
11
+ * @spec specs/OPENCLAW_SPEC.md
12
+ */
13
+ import { execSync } from "child_process";
14
+ import { existsSync, readFileSync, appendFileSync, mkdirSync } from "fs";
15
+ import { join } from "path";
16
+ import axios from "axios";
17
+ // ============================================================================
18
+ // Client
19
+ // ============================================================================
20
+ export class OpenClawClient {
21
+ agentId;
22
+ hubUrl;
23
+ gtmPath;
24
+ http;
25
+ sessionId = null;
26
+ constructor(config) {
27
+ this.agentId = config.agentId;
28
+ this.hubUrl = config.hubUrl || "http://localhost:4242";
29
+ this.gtmPath = config.gtmPath || null;
30
+ this.http = axios.create({
31
+ baseURL: this.hubUrl,
32
+ timeout: 10000,
33
+ headers: this.getAuthHeaders(),
34
+ });
35
+ }
36
+ // ==========================================================================
37
+ // Session Lifecycle
38
+ // ==========================================================================
39
+ async sessionStart(gtmPath) {
40
+ const result = this.cli(`session-start --agent ${this.agentId}${gtmPath ? ` --gtm "${gtmPath}"` : ""} --json`);
41
+ const info = JSON.parse(result);
42
+ this.sessionId = info.session_id;
43
+ this.gtmPath = info.gtm_path;
44
+ return info;
45
+ }
46
+ async sessionEnd(sync = false) {
47
+ this.cli(`session-end${sync ? " --sync" : ""} --json`);
48
+ this.sessionId = null;
49
+ }
50
+ async heartbeat() {
51
+ const result = this.cli("heartbeat --json");
52
+ return JSON.parse(result);
53
+ }
54
+ // ==========================================================================
55
+ // Context (via HTTP API)
56
+ // ==========================================================================
57
+ async getContext(query, taskType) {
58
+ try {
59
+ const resp = await this.http.post("/api/context", {
60
+ query,
61
+ taskType,
62
+ maxItems: 30,
63
+ });
64
+ return resp.data.items || resp.data || [];
65
+ }
66
+ catch {
67
+ // Fallback to CLI
68
+ const args = [
69
+ query ? `--query "${query}"` : "",
70
+ taskType ? `--task-type ${taskType}` : "",
71
+ ]
72
+ .filter(Boolean)
73
+ .join(" ");
74
+ const result = this.cli(`context ${args} --json`);
75
+ return JSON.parse(result);
76
+ }
77
+ }
78
+ async searchMemory(query, type) {
79
+ try {
80
+ const resp = await this.http.post("/api/memory/search", {
81
+ query,
82
+ type,
83
+ maxItems: 10,
84
+ });
85
+ return resp.data.results || resp.data || [];
86
+ }
87
+ catch {
88
+ // Fallback not available for memory search via CLI
89
+ return [];
90
+ }
91
+ }
92
+ // ==========================================================================
93
+ // Journal (direct JSONL append)
94
+ // ==========================================================================
95
+ async writeJournal(entry) {
96
+ const session = this.sessionId || this.getCurrentSessionBranch();
97
+ if (!session) {
98
+ throw new Error("No active session. Call sessionStart() first.");
99
+ }
100
+ const gtmPath = this.resolveGtmPath();
101
+ if (!gtmPath) {
102
+ throw new Error("No GTM path resolved. Register with a GTM first.");
103
+ }
104
+ const journalDir = join(gtmPath, ".jfl", "journal");
105
+ if (!existsSync(journalDir)) {
106
+ mkdirSync(journalDir, { recursive: true });
107
+ }
108
+ const fullEntry = {
109
+ v: 1,
110
+ ts: new Date().toISOString(),
111
+ session,
112
+ type: entry.type || "feature",
113
+ title: entry.title || "Untitled",
114
+ summary: entry.summary || "",
115
+ ...entry,
116
+ };
117
+ const journalFile = join(journalDir, `${session}.jsonl`);
118
+ appendFileSync(journalFile, JSON.stringify(fullEntry) + "\n");
119
+ }
120
+ // ==========================================================================
121
+ // GTM Management
122
+ // ==========================================================================
123
+ async listGtms() {
124
+ const result = this.cli("gtm-list --json");
125
+ return JSON.parse(result);
126
+ }
127
+ async switchGtm(gtmId) {
128
+ this.cli(`gtm-switch "${gtmId}" --json`);
129
+ }
130
+ async createGtm(name, path) {
131
+ const args = path ? `"${name}" --path "${path}"` : `"${name}"`;
132
+ const result = this.cli(`gtm-create ${args} --json`);
133
+ const parsed = JSON.parse(result);
134
+ return parsed.path || parsed.gtm_path;
135
+ }
136
+ // ==========================================================================
137
+ // Service Coordination
138
+ // ==========================================================================
139
+ async tagService(name, message) {
140
+ this.cli(`tag "${name}" "${message}"`);
141
+ }
142
+ async listServices() {
143
+ const gtmPath = this.resolveGtmPath();
144
+ if (!gtmPath)
145
+ return [];
146
+ const configPath = join(gtmPath, ".jfl", "config.json");
147
+ if (!existsSync(configPath))
148
+ return [];
149
+ try {
150
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
151
+ return config.registered_services || [];
152
+ }
153
+ catch {
154
+ return [];
155
+ }
156
+ }
157
+ // ==========================================================================
158
+ // Private Helpers
159
+ // ==========================================================================
160
+ cli(subcommand) {
161
+ try {
162
+ return execSync(`jfl openclaw ${subcommand}`, {
163
+ encoding: "utf-8",
164
+ timeout: 30000,
165
+ stdio: ["pipe", "pipe", "pipe"],
166
+ }).trim();
167
+ }
168
+ catch (err) {
169
+ throw new Error(`jfl openclaw ${subcommand} failed: ${err.stderr || err.message}`);
170
+ }
171
+ }
172
+ getAuthHeaders() {
173
+ const gtmPath = this.resolveGtmPath();
174
+ if (!gtmPath)
175
+ return {};
176
+ const tokenPath = join(gtmPath, ".jfl", "context-hub.token");
177
+ if (!existsSync(tokenPath))
178
+ return {};
179
+ const token = readFileSync(tokenPath, "utf-8").trim();
180
+ return { Authorization: `Bearer ${token}` };
181
+ }
182
+ resolveGtmPath() {
183
+ if (this.gtmPath)
184
+ return this.gtmPath;
185
+ // Try to get from registry via CLI
186
+ try {
187
+ const result = this.cli("status --json");
188
+ const status = JSON.parse(result);
189
+ return status.gtm_path || null;
190
+ }
191
+ catch {
192
+ return null;
193
+ }
194
+ }
195
+ getCurrentSessionBranch() {
196
+ try {
197
+ return execSync("git branch --show-current", {
198
+ encoding: "utf-8",
199
+ timeout: 5000,
200
+ stdio: ["pipe", "pipe", "pipe"],
201
+ }).trim();
202
+ }
203
+ catch {
204
+ return null;
205
+ }
206
+ }
207
+ }
208
+ //# sourceMappingURL=openclaw-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-sdk.js","sourceRoot":"","sources":["../../src/lib/openclaw-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAA6B,MAAM,OAAO,CAAA;AA+EjD,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,MAAM,OAAO,cAAc;IACjB,OAAO,CAAQ;IACf,MAAM,CAAQ;IACd,OAAO,CAAe;IACtB,IAAI,CAAe;IACnB,SAAS,GAAkB,IAAI,CAAA;IAEvC,YAAY,MAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,uBAAuB,CAAA;QACtD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAA;QAErC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;SAC/B,CAAC,CAAA;IACJ,CAAC;IAED,6EAA6E;IAC7E,oBAAoB;IACpB,6EAA6E;IAE7E,KAAK,CAAC,YAAY,CAAC,OAAgB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,yBAAyB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CACtF,CAAA;QACD,MAAM,IAAI,GAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAgB,KAAK;QACpC,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,6EAA6E;IAC7E,yBAAyB;IACzB,6EAA6E;IAE7E,KAAK,CAAC,UAAU,CACd,KAAc,EACd,QAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBAChD,KAAK;gBACL,QAAQ;gBACR,QAAQ,EAAE,EAAE;aACb,CAAC,CAAA;YACF,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;YAClB,MAAM,IAAI,GAAG;gBACX,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;gBACjC,QAAQ,CAAC,CAAC,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;aAC1C;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,CAAC,CAAA;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,CAAA;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,IAAa;QAEb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;gBACtD,KAAK;gBACL,IAAI;gBACJ,QAAQ,EAAE,EAAE;aACb,CAAC,CAAA;YACF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;YACnD,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,gCAAgC;IAChC,6EAA6E;IAE7E,KAAK,CAAC,YAAY,CAAC,KAA4B;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAA;QAEhE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QAClE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACrE,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;QACnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,CAAC;QAED,MAAM,SAAS,GAAiB;YAC9B,CAAC,EAAE,CAAC;YACJ,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,OAAO;YACP,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,UAAU;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;YAC5B,GAAG,KAAK;SACO,CAAA;QAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,QAAQ,CAAC,CAAA;QACxD,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,6EAA6E;IAC7E,iBAAiB;IACjB,6EAA6E;IAE7E,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,IAAI,CAAC,GAAG,CAAC,eAAe,KAAK,UAAU,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAAa;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAA;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,SAAS,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACjC,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAA;IACvC,CAAC;IAED,6EAA6E;IAC7E,uBAAuB;IACvB,6EAA6E;IAE7E,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAAe;QAC5C,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,OAAO,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;QACvD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAA;QAEtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;YAC5D,OAAO,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAErE,GAAG,CAAC,UAAkB;QAC5B,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,gBAAgB,UAAU,EAAE,EAAE;gBAC5C,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAA;QACX,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,gBAAgB,UAAU,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAClE,CAAA;QACH,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QAEvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAA;QAC5D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAA;QAErC,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QACrD,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAA;IAC7C,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QAErC,mCAAmC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACjC,OAAO,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAA;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAEO,uBAAuB;QAC7B,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,2BAA2B,EAAE;gBAC3C,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAA;QACX,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Peer Agent Generator
3
+ *
4
+ * Generates peer service agent references in service .claude/agents/ directory.
5
+ * Enables service-to-service @-mentions while maintaining security boundaries.
6
+ *
7
+ * @purpose Generate peer service agent references for cross-service collaboration
8
+ */
9
+ export interface PeerAgentDefinition {
10
+ name: string;
11
+ serviceName: string;
12
+ serviceType: string;
13
+ servicePath: string;
14
+ capabilities: string[];
15
+ description: string;
16
+ }
17
+ export interface ServiceRegistration {
18
+ name: string;
19
+ path: string;
20
+ type: string;
21
+ registered_at: string;
22
+ status: string;
23
+ }
24
+ /**
25
+ * Get registered services from GTM config
26
+ */
27
+ export declare function getRegisteredServices(gtmPath: string): ServiceRegistration[];
28
+ /**
29
+ * Generate peer agent definition from service metadata
30
+ */
31
+ export declare function generatePeerAgentDefinition(peerService: ServiceRegistration, currentServicePath: string, gtmPath: string): PeerAgentDefinition;
32
+ /**
33
+ * Write peer agent definition to service's .claude/agents/ directory
34
+ */
35
+ export declare function writePeerAgentDefinition(agentDef: PeerAgentDefinition, servicePath: string): string;
36
+ /**
37
+ * Sync peer agents for a service - add/update/remove peer agent files
38
+ */
39
+ export declare function syncPeerAgents(servicePath: string, gtmPath: string): {
40
+ added: number;
41
+ updated: number;
42
+ removed: number;
43
+ };
44
+ //# sourceMappingURL=peer-agent-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-agent-generator.d.ts","sourceRoot":"","sources":["../../src/lib/peer-agent-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAa5E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,mBAAmB,EAChC,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,MAAM,GACd,mBAAmB,CAcrB;AAsDD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,MAAM,GAClB,MAAM,CAsFR;AAyED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2DrD"}
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Peer Agent Generator
3
+ *
4
+ * Generates peer service agent references in service .claude/agents/ directory.
5
+ * Enables service-to-service @-mentions while maintaining security boundaries.
6
+ *
7
+ * @purpose Generate peer service agent references for cross-service collaboration
8
+ */
9
+ import { writeFileSync, mkdirSync, existsSync, readdirSync, unlinkSync } from "fs";
10
+ import { join } from "path";
11
+ import { readFileSync } from "fs";
12
+ /**
13
+ * Get registered services from GTM config
14
+ */
15
+ export function getRegisteredServices(gtmPath) {
16
+ const configPath = join(gtmPath, ".jfl/config.json");
17
+ if (!existsSync(configPath)) {
18
+ return [];
19
+ }
20
+ try {
21
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
22
+ return config.registered_services || [];
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ }
28
+ /**
29
+ * Generate peer agent definition from service metadata
30
+ */
31
+ export function generatePeerAgentDefinition(peerService, currentServicePath, gtmPath) {
32
+ const name = `peer-service-${peerService.name}`;
33
+ // Generate capability-based triggers
34
+ const capabilities = generatePeerCapabilities(peerService.type);
35
+ return {
36
+ name,
37
+ serviceName: peerService.name,
38
+ serviceType: peerService.type,
39
+ servicePath: peerService.path,
40
+ capabilities,
41
+ description: `Peer service for ${peerService.name} (${peerService.type})`,
42
+ };
43
+ }
44
+ /**
45
+ * Generate capabilities based on service type
46
+ */
47
+ function generatePeerCapabilities(serviceType) {
48
+ const caps = [];
49
+ switch (serviceType) {
50
+ case "web":
51
+ case "api":
52
+ caps.push("Handle API requests and serve data");
53
+ caps.push("Manage database operations");
54
+ caps.push("Process user input and validation");
55
+ break;
56
+ case "worker":
57
+ caps.push("Process background jobs and queues");
58
+ caps.push("Handle scheduled tasks");
59
+ caps.push("Perform async operations");
60
+ break;
61
+ case "cli":
62
+ caps.push("Execute command-line operations");
63
+ caps.push("Automate workflows");
64
+ caps.push("Provide interactive tools");
65
+ break;
66
+ case "library":
67
+ caps.push("Provide reusable functionality");
68
+ caps.push("Support code development and testing");
69
+ caps.push("Maintain documentation and examples");
70
+ caps.push("Build and publish artifacts");
71
+ break;
72
+ case "infrastructure":
73
+ caps.push("Monitor system health");
74
+ caps.push("Aggregate metrics and logs");
75
+ caps.push("Coordinate service operations");
76
+ break;
77
+ case "container":
78
+ caps.push("Manage containerized services");
79
+ caps.push("Handle Docker operations");
80
+ caps.push("Control service lifecycle");
81
+ break;
82
+ default:
83
+ caps.push("Provide service-specific functionality");
84
+ }
85
+ return caps;
86
+ }
87
+ /**
88
+ * Write peer agent definition to service's .claude/agents/ directory
89
+ */
90
+ export function writePeerAgentDefinition(agentDef, servicePath) {
91
+ const agentsDir = join(servicePath, ".claude/agents");
92
+ // Ensure directory exists
93
+ if (!existsSync(agentsDir)) {
94
+ mkdirSync(agentsDir, { recursive: true });
95
+ }
96
+ const agentFile = join(agentsDir, `${agentDef.name}.md`);
97
+ const whenToUse = generateWhenToUse(agentDef.serviceType, agentDef.serviceName);
98
+ const content = `---
99
+ name: ${agentDef.name}
100
+ version: 1.0.0
101
+ color: blue
102
+ description: ${agentDef.description}
103
+ type: peer-service
104
+ ---
105
+
106
+ # Peer Service: ${agentDef.serviceName}
107
+
108
+ **Service Type:** ${agentDef.serviceType}
109
+ **Service Path:** \`${agentDef.servicePath}\`
110
+
111
+ ## When to Collaborate
112
+
113
+ ${whenToUse}
114
+
115
+ ## Capabilities
116
+
117
+ ${agentDef.capabilities.map((cap) => `- ${cap}`).join("\n")}
118
+
119
+ ## How to Invoke
120
+
121
+ Use @-mention to collaborate with this peer service:
122
+
123
+ \`\`\`
124
+ @${agentDef.name} what's your current status?
125
+ @${agentDef.name} can you help with [specific task]?
126
+ @${agentDef.name} what changed recently?
127
+ \`\`\`
128
+
129
+ ## Security
130
+
131
+ - This is a **peer service** - you can see its status but cannot modify its files
132
+ - All operations route through Service Manager with security checks
133
+ - You cannot call yourself as a peer (self-calls are blocked)
134
+ - Destructive operations require explicit approval
135
+
136
+ ## Communication Pattern
137
+
138
+ When you @-mention this peer:
139
+ 1. Service Manager validates the request
140
+ 2. Peer agent spawns in its own working directory
141
+ 3. Peer agent processes the request with its own context
142
+ 4. Result returns to you
143
+ 5. You can continue collaborating or work independently
144
+
145
+ ## Examples
146
+
147
+ **Status check:**
148
+ \`\`\`
149
+ @${agentDef.name} what's your current status?
150
+ \`\`\`
151
+
152
+ **Request collaboration:**
153
+ \`\`\`
154
+ @${agentDef.name} I need help with [specific task]. Can you handle [specific part]?
155
+ \`\`\`
156
+
157
+ **Context sharing:**
158
+ \`\`\`
159
+ @${agentDef.name} what changed in your service in the last 24 hours?
160
+ \`\`\`
161
+
162
+ ## Remember
163
+
164
+ - **Collaborate when:** Task outside your service's core responsibility, need data from another service, coordinating multi-service operation
165
+ - **Handle alone when:** Task within your service's domain, operation is service-local
166
+ - **Always provide context:** When asking for help, explain what you need and why
167
+ `;
168
+ writeFileSync(agentFile, content);
169
+ return agentFile;
170
+ }
171
+ /**
172
+ * Generate "When to Use" guidance based on service type
173
+ */
174
+ function generateWhenToUse(serviceType, serviceName) {
175
+ switch (serviceType) {
176
+ case "api":
177
+ return `Use \`@peer-service-${serviceName}\` when you need to:
178
+ - Check API endpoint status or health
179
+ - Understand API routes and handlers
180
+ - Coordinate API changes that affect your service
181
+ - Get data from API endpoints
182
+ - Verify API schema or contracts`;
183
+ case "web":
184
+ return `Use \`@peer-service-${serviceName}\` when you need to:
185
+ - Check frontend deployment status
186
+ - Understand UI components or flows
187
+ - Coordinate UI changes with backend
188
+ - Get user-facing content or copy
189
+ - Verify frontend build status`;
190
+ case "worker":
191
+ return `Use \`@peer-service-${serviceName}\` when you need to:
192
+ - Check background job status
193
+ - Understand job queue state
194
+ - Coordinate async operations
195
+ - Trigger or schedule jobs
196
+ - Verify job processing results`;
197
+ case "library":
198
+ return `Use \`@peer-service-${serviceName}\` when you need to:
199
+ - Understand library APIs and interfaces
200
+ - Work on plugin or package features
201
+ - Run library tests and builds
202
+ - Update documentation
203
+ - Debug integration issues`;
204
+ case "infrastructure":
205
+ return `Use \`@peer-service-${serviceName}\` when you need to:
206
+ - Check system health across services
207
+ - Get aggregated metrics or logs
208
+ - Coordinate service deployments
209
+ - Understand infrastructure state
210
+ - Verify connectivity or resources`;
211
+ case "container":
212
+ return `Use \`@peer-service-${serviceName}\` when you need to:
213
+ - Check container status
214
+ - Understand Docker configuration
215
+ - Coordinate container operations
216
+ - Verify container health
217
+ - Get container logs or metrics`;
218
+ case "cli":
219
+ return `Use \`@peer-service-${serviceName}\` when you need to:
220
+ - Execute CLI commands
221
+ - Automate workflows
222
+ - Run scripts or tools
223
+ - Get CLI output or results
224
+ - Verify CLI functionality`;
225
+ default:
226
+ return `Use \`@peer-service-${serviceName}\` when you need to:
227
+ - Check service status
228
+ - Understand service capabilities
229
+ - Coordinate with this service
230
+ - Get service-specific data
231
+ - Verify service operations`;
232
+ }
233
+ }
234
+ /**
235
+ * Sync peer agents for a service - add/update/remove peer agent files
236
+ */
237
+ export function syncPeerAgents(servicePath, gtmPath) {
238
+ const stats = { added: 0, updated: 0, removed: 0 };
239
+ // Get service name from its config
240
+ const serviceConfigPath = join(servicePath, ".jfl/config.json");
241
+ if (!existsSync(serviceConfigPath)) {
242
+ throw new Error(`Service config not found: ${serviceConfigPath}`);
243
+ }
244
+ const serviceConfig = JSON.parse(readFileSync(serviceConfigPath, "utf-8"));
245
+ const currentServiceName = serviceConfig.name;
246
+ // Get registered services from GTM
247
+ const registeredServices = getRegisteredServices(gtmPath);
248
+ // Filter out current service (can't be peer with self)
249
+ const peerServices = registeredServices.filter((s) => s.name !== currentServiceName);
250
+ // Ensure .claude/agents directory exists
251
+ const agentsDir = join(servicePath, ".claude/agents");
252
+ if (!existsSync(agentsDir)) {
253
+ mkdirSync(agentsDir, { recursive: true });
254
+ }
255
+ // Get existing peer agent files
256
+ const existingPeerFiles = existsSync(agentsDir)
257
+ ? readdirSync(agentsDir).filter((f) => f.startsWith("peer-service-") && f.endsWith(".md"))
258
+ : [];
259
+ // Generate/update peer agent files for all registered services
260
+ const currentPeerFiles = new Set();
261
+ for (const peerService of peerServices) {
262
+ const agentDef = generatePeerAgentDefinition(peerService, servicePath, gtmPath);
263
+ const fileName = `${agentDef.name}.md`;
264
+ currentPeerFiles.add(fileName);
265
+ const filePath = join(agentsDir, fileName);
266
+ if (existsSync(filePath)) {
267
+ // Update existing
268
+ writePeerAgentDefinition(agentDef, servicePath);
269
+ stats.updated++;
270
+ }
271
+ else {
272
+ // Add new
273
+ writePeerAgentDefinition(agentDef, servicePath);
274
+ stats.added++;
275
+ }
276
+ }
277
+ // Remove stale peer agent files (services that were unregistered)
278
+ for (const existingFile of existingPeerFiles) {
279
+ if (!currentPeerFiles.has(existingFile)) {
280
+ unlinkSync(join(agentsDir, existingFile));
281
+ stats.removed++;
282
+ }
283
+ }
284
+ return stats;
285
+ }
286
+ //# sourceMappingURL=peer-agent-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-agent-generator.js","sourceRoot":"","sources":["../../src/lib/peer-agent-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Service Dependency Management
3
+ *
4
+ * Handles service dependencies - ensures services start in correct order,
5
+ * auto-starts required dependencies, prevents stopping services with dependents.
6
+ *
7
+ * @purpose Dependency resolution and validation for service mesh
8
+ */
9
+ interface Service {
10
+ name: string;
11
+ type: string;
12
+ description: string;
13
+ depends_on?: string[];
14
+ [key: string]: any;
15
+ }
16
+ interface DependencyGraph {
17
+ nodes: string[];
18
+ edges: Map<string, string[]>;
19
+ dependents: Map<string, string[]>;
20
+ }
21
+ export declare function buildDependencyGraph(services: Record<string, Service>): DependencyGraph;
22
+ export declare function getStartOrder(serviceName: string, services: Record<string, Service>): string[];
23
+ export declare function getStopOrder(serviceName: string, services: Record<string, Service>): string[];
24
+ export declare function detectCycles(services: Record<string, Service>): string[] | null;
25
+ export declare function validateDependencies(services: Record<string, Service>): {
26
+ valid: boolean;
27
+ errors: string[];
28
+ };
29
+ export declare function getServiceStatus(serviceName: string): Promise<any>;
30
+ export declare function isServiceRunning(serviceName: string): Promise<boolean>;
31
+ export declare function startWithDependencies(serviceName: string, options?: {
32
+ dryRun?: boolean;
33
+ verbose?: boolean;
34
+ onProgress?: (service: string, action: string) => void;
35
+ }): Promise<string[]>;
36
+ export declare function stopWithDependents(serviceName: string, options?: {
37
+ dryRun?: boolean;
38
+ verbose?: boolean;
39
+ force?: boolean;
40
+ onProgress?: (service: string, action: string) => void;
41
+ }): Promise<string[]>;
42
+ export declare function visualizeDependencies(services: Record<string, Service>): string;
43
+ export {};
44
+ //# sourceMappingURL=service-dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-dependencies.d.ts","sourceRoot":"","sources":["../../src/lib/service-dependencies.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAOD,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAClC;AAmBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAsBvF;AAMD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAwB9F;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAqB7F;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAqC/E;AAMD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACvE,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB,CAuBA;AAMD,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAUxE;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG5E;AAMD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,GACL,OAAO,CAAC,MAAM,EAAE,CAAC,CAgEnB;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,GACL,OAAO,CAAC,MAAM,EAAE,CAAC,CA8EnB;AAMD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA2B/E"}