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,521 @@
1
+ /**
2
+ * Service Detector
3
+ *
4
+ * Analyzes a codebase to auto-detect service metadata:
5
+ * - Service type (web, api, container, worker, infrastructure)
6
+ * - Name, port, version
7
+ * - Start/stop/logs commands
8
+ * - Dependencies
9
+ *
10
+ * @purpose Auto-detect service metadata from codebase
11
+ */
12
+ import { existsSync, readFileSync } from "fs";
13
+ import { join } from "path";
14
+ import { execSync } from "child_process";
15
+ /**
16
+ * Detect service type from codebase structure
17
+ */
18
+ export function detectServiceType(path) {
19
+ // Check for OpenClaw plugin - parse manifest for enriched type detection
20
+ if (existsSync(join(path, "openclaw.plugin.json"))) {
21
+ try {
22
+ const manifest = JSON.parse(readFileSync(join(path, "openclaw.plugin.json"), "utf-8"));
23
+ const runtimeType = manifest.runtime?.type;
24
+ // Map runtime types to service types
25
+ if (runtimeType === "clawdbot")
26
+ return "worker";
27
+ if (runtimeType === "claude-code" || runtimeType === "cursor")
28
+ return "cli";
29
+ // Default: infer from capabilities
30
+ const caps = manifest.agent?.capabilities || [];
31
+ if (caps.includes("session_create"))
32
+ return "worker";
33
+ }
34
+ catch {
35
+ // Malformed manifest, fall through
36
+ }
37
+ return "library";
38
+ }
39
+ // Check for Docker
40
+ if (existsSync(join(path, "Dockerfile")) || existsSync(join(path, "docker-compose.yml"))) {
41
+ return "container";
42
+ }
43
+ // Check for Mintlify docs project
44
+ const docsJson = join(path, "docs.json");
45
+ const mintJson = join(path, "mint.json");
46
+ if (existsSync(docsJson)) {
47
+ const content = readFileSync(docsJson, "utf-8");
48
+ if (content.includes("mintlify")) {
49
+ return "infrastructure"; // docs aren't operational services
50
+ }
51
+ }
52
+ else if (existsSync(mintJson)) {
53
+ return "infrastructure";
54
+ }
55
+ // Check for package.json (Node.js)
56
+ if (existsSync(join(path, "package.json"))) {
57
+ const pkg = JSON.parse(readFileSync(join(path, "package.json"), "utf-8"));
58
+ // Next.js = web
59
+ if (pkg.dependencies?.["next"] || pkg.devDependencies?.["next"]) {
60
+ return "web";
61
+ }
62
+ // Express/Fastify/Koa = api
63
+ if (pkg.dependencies?.["express"] ||
64
+ pkg.dependencies?.["fastify"] ||
65
+ pkg.dependencies?.["koa"]) {
66
+ return "api";
67
+ }
68
+ // Detect npm library (has exports/main but no start script)
69
+ if ((pkg.exports || pkg.main) && !pkg.scripts?.start && !pkg.scripts?.dev) {
70
+ return "library";
71
+ }
72
+ // Generic Node.js app
73
+ return "cli";
74
+ }
75
+ // Check for Python API frameworks
76
+ if (existsSync(join(path, "requirements.txt")) ||
77
+ existsSync(join(path, "pyproject.toml")) ||
78
+ existsSync(join(path, "setup.py"))) {
79
+ const reqFiles = [
80
+ join(path, "requirements.txt"),
81
+ join(path, "pyproject.toml"),
82
+ join(path, "Pipfile"),
83
+ ];
84
+ for (const file of reqFiles) {
85
+ if (existsSync(file)) {
86
+ const content = readFileSync(file, "utf-8").toLowerCase();
87
+ // FastAPI/Flask/Django = api
88
+ if (content.includes("fastapi") || content.includes("flask") || content.includes("django")) {
89
+ return "api";
90
+ }
91
+ }
92
+ }
93
+ return "cli";
94
+ }
95
+ // Check for Go
96
+ if (existsSync(join(path, "go.mod"))) {
97
+ const goMod = readFileSync(join(path, "go.mod"), "utf-8").toLowerCase();
98
+ if (goMod.includes("gin-gonic") || goMod.includes("echo") || goMod.includes("fiber")) {
99
+ return "api";
100
+ }
101
+ return "cli";
102
+ }
103
+ // Check for Rust
104
+ if (existsSync(join(path, "Cargo.toml"))) {
105
+ const cargo = readFileSync(join(path, "Cargo.toml"), "utf-8").toLowerCase();
106
+ if (cargo.includes("actix") || cargo.includes("rocket") || cargo.includes("axum")) {
107
+ return "api";
108
+ }
109
+ return "cli";
110
+ }
111
+ // Default to infrastructure
112
+ return "infrastructure";
113
+ }
114
+ /**
115
+ * Extract port from package.json scripts or common config files
116
+ */
117
+ export function detectPort(path) {
118
+ // Check package.json scripts
119
+ if (existsSync(join(path, "package.json"))) {
120
+ const pkg = JSON.parse(readFileSync(join(path, "package.json"), "utf-8"));
121
+ // Look for port in dev/start scripts
122
+ const scripts = [pkg.scripts?.dev, pkg.scripts?.start, pkg.scripts?.serve];
123
+ for (const script of scripts) {
124
+ if (!script)
125
+ continue;
126
+ // Match PORT=3000, --port 3000, -p 3000, :3000
127
+ const portMatch = script.match(/(?:PORT=|--port|:|\-p\s+)(\d{4,5})/);
128
+ if (portMatch) {
129
+ return parseInt(portMatch[1], 10);
130
+ }
131
+ }
132
+ // Check for Next.js default (3000)
133
+ if (pkg.dependencies?.["next"]) {
134
+ return 3000;
135
+ }
136
+ }
137
+ // Check for .env files
138
+ const envFiles = [".env", ".env.local", ".env.development"];
139
+ for (const envFile of envFiles) {
140
+ const envPath = join(path, envFile);
141
+ if (existsSync(envPath)) {
142
+ const content = readFileSync(envPath, "utf-8");
143
+ const portMatch = content.match(/PORT=(\d{4,5})/);
144
+ if (portMatch) {
145
+ return parseInt(portMatch[1], 10);
146
+ }
147
+ }
148
+ }
149
+ // Check Python files for common patterns
150
+ const pythonFiles = ["server.py", "main.py", "app.py", "api.py"];
151
+ for (const pyFile of pythonFiles) {
152
+ const pyPath = join(path, pyFile);
153
+ if (existsSync(pyPath)) {
154
+ const content = readFileSync(pyPath, "utf-8");
155
+ // Match uvicorn.run(app, port=8000) or similar
156
+ const portMatch = content.match(/port\s*[=:]\s*(\d{4,5})/);
157
+ if (portMatch) {
158
+ return parseInt(portMatch[1], 10);
159
+ }
160
+ }
161
+ }
162
+ // Check docker-compose.yml
163
+ if (existsSync(join(path, "docker-compose.yml"))) {
164
+ const compose = readFileSync(join(path, "docker-compose.yml"), "utf-8");
165
+ const portMatch = compose.match(/- ["']?(\d{4,5}):\d{4,5}["']?/);
166
+ if (portMatch) {
167
+ return parseInt(portMatch[1], 10);
168
+ }
169
+ }
170
+ return null;
171
+ }
172
+ /**
173
+ * Get service name from package.json, git remote, or directory name
174
+ */
175
+ export function detectServiceName(path) {
176
+ // Try package.json name
177
+ if (existsSync(join(path, "package.json"))) {
178
+ const pkg = JSON.parse(readFileSync(join(path, "package.json"), "utf-8"));
179
+ if (pkg.name) {
180
+ return slugify(pkg.name);
181
+ }
182
+ }
183
+ // Try Python project name
184
+ if (existsSync(join(path, "pyproject.toml"))) {
185
+ const content = readFileSync(join(path, "pyproject.toml"), "utf-8");
186
+ const nameMatch = content.match(/name\s*=\s*["']([^"']+)["']/);
187
+ if (nameMatch) {
188
+ return slugify(nameMatch[1]);
189
+ }
190
+ }
191
+ // Try git remote
192
+ try {
193
+ const remote = execSync("git config --get remote.origin.url", {
194
+ cwd: path,
195
+ encoding: "utf-8",
196
+ stdio: "pipe",
197
+ }).trim();
198
+ // Extract repo name from URL
199
+ const match = remote.match(/\/([^\/]+?)(\.git)?$/);
200
+ if (match) {
201
+ return slugify(match[1]);
202
+ }
203
+ }
204
+ catch {
205
+ // No git remote
206
+ }
207
+ // Fall back to directory name
208
+ const dirName = path.split("/").pop() || "service";
209
+ return slugify(dirName);
210
+ }
211
+ /**
212
+ * Get version from git, package.json, or pyproject.toml
213
+ */
214
+ export function detectVersion(path) {
215
+ // Try git describe
216
+ try {
217
+ const version = execSync("git describe --tags --always", {
218
+ cwd: path,
219
+ encoding: "utf-8",
220
+ stdio: "pipe",
221
+ }).trim();
222
+ return version;
223
+ }
224
+ catch {
225
+ // No git tags
226
+ }
227
+ // Try package.json
228
+ if (existsSync(join(path, "package.json"))) {
229
+ const pkg = JSON.parse(readFileSync(join(path, "package.json"), "utf-8"));
230
+ if (pkg.version) {
231
+ return pkg.version;
232
+ }
233
+ }
234
+ // Try pyproject.toml
235
+ if (existsSync(join(path, "pyproject.toml"))) {
236
+ const content = readFileSync(join(path, "pyproject.toml"), "utf-8");
237
+ const versionMatch = content.match(/version\s*=\s*["']([^"']+)["']/);
238
+ if (versionMatch) {
239
+ return versionMatch[1];
240
+ }
241
+ }
242
+ return "unknown";
243
+ }
244
+ /**
245
+ * Detect package manager from lockfiles
246
+ */
247
+ function detectPackageManager(path) {
248
+ if (existsSync(join(path, "bun.lockb")))
249
+ return "bun";
250
+ if (existsSync(join(path, "pnpm-lock.yaml")))
251
+ return "pnpm";
252
+ if (existsSync(join(path, "yarn.lock")))
253
+ return "yarn";
254
+ if (existsSync(join(path, "package-lock.json")))
255
+ return "npm";
256
+ return null;
257
+ }
258
+ /**
259
+ * Scan README for start commands
260
+ * Returns detected command or null
261
+ */
262
+ function scanReadmeForCommand(path) {
263
+ // Find README file (case-insensitive)
264
+ const readmeFiles = ["README.md", "README.MD", "readme.md", "README", "readme"];
265
+ let readme = null;
266
+ for (const file of readmeFiles) {
267
+ const readmePath = join(path, file);
268
+ if (existsSync(readmePath)) {
269
+ readme = readFileSync(readmePath, "utf-8");
270
+ break;
271
+ }
272
+ }
273
+ if (!readme)
274
+ return null;
275
+ // Pattern 1: Code blocks with commands
276
+ // Match: ```bash\nnpm run dev\n```
277
+ const codeBlockPattern = /```(?:bash|sh|shell)?\s*\n\s*((?:npm|yarn|pnpm|bun|make|docker|mint|python|go)\s+[^\n]+)/gi;
278
+ const codeBlockMatch = codeBlockPattern.exec(readme);
279
+ if (codeBlockMatch) {
280
+ return codeBlockMatch[1].trim();
281
+ }
282
+ // Pattern 2: Command after $ or >
283
+ // Match: $ npm run dev
284
+ const dollarPattern = /[\$>]\s*((?:npm|yarn|pnpm|bun|make|docker|mint|python|go)\s+[^\n]+)/i;
285
+ const dollarMatch = dollarPattern.exec(readme);
286
+ if (dollarMatch) {
287
+ return dollarMatch[1].trim();
288
+ }
289
+ // Pattern 3: "Run: <command>" or "Start: <command>"
290
+ const runPattern = /(?:run|start|development):\s*((?:npm|yarn|pnpm|bun|make|docker|mint|python|go)\s+[^\n]+)/i;
291
+ const runMatch = runPattern.exec(readme);
292
+ if (runMatch) {
293
+ return runMatch[1].trim();
294
+ }
295
+ return null;
296
+ }
297
+ /**
298
+ * Generate commands for service management
299
+ */
300
+ export function detectCommands(path, type, port) {
301
+ const commands = {};
302
+ // Node.js projects
303
+ if (existsSync(join(path, "package.json"))) {
304
+ const pkg = JSON.parse(readFileSync(join(path, "package.json"), "utf-8"));
305
+ const pkgManager = detectPackageManager(path) || "npm";
306
+ if (pkg.scripts?.dev) {
307
+ commands.start = `cd ${path} && ${pkgManager} run dev`;
308
+ }
309
+ else if (pkg.scripts?.start) {
310
+ commands.start = `cd ${path} && ${pkgManager} start`;
311
+ }
312
+ if (pkg.scripts?.build) {
313
+ commands.build = `cd ${path} && ${pkgManager} run build`;
314
+ }
315
+ if (pkg.scripts?.test) {
316
+ commands.test = `cd ${path} && ${pkgManager} test`;
317
+ }
318
+ if (port) {
319
+ commands.stop = `lsof -ti :${port} | xargs kill -9 2>/dev/null || true`;
320
+ commands.logs = `echo 'Check terminal where ${pkgManager} run dev is running'`;
321
+ }
322
+ }
323
+ // Python projects
324
+ if (existsSync(join(path, "requirements.txt")) || existsSync(join(path, "pyproject.toml"))) {
325
+ // Check for common entry points
326
+ const entryPoints = ["server.py", "main.py", "app.py", "api/server.py"];
327
+ for (const entry of entryPoints) {
328
+ if (existsSync(join(path, entry))) {
329
+ const dir = entry.includes("/") ? entry.split("/")[0] : ".";
330
+ const file = entry.includes("/") ? entry.split("/")[1] : entry;
331
+ if (dir === ".") {
332
+ commands.start = `cd ${path} && python ${file}`;
333
+ }
334
+ else {
335
+ commands.start = `cd ${path}/${dir} && python ${file}`;
336
+ }
337
+ break;
338
+ }
339
+ }
340
+ if (port) {
341
+ commands.stop = `lsof -ti :${port} | xargs kill -9 2>/dev/null || true`;
342
+ commands.logs = `tail -f ${path}/*.log`;
343
+ }
344
+ // Check for pytest
345
+ if (existsSync(join(path, "tests")) || existsSync(join(path, "test"))) {
346
+ commands.test = `cd ${path} && pytest`;
347
+ }
348
+ }
349
+ // Docker projects
350
+ if (existsSync(join(path, "docker-compose.yml"))) {
351
+ commands.start = `cd ${path} && docker compose up -d`;
352
+ commands.stop = `cd ${path} && docker compose down`;
353
+ commands.logs = `cd ${path} && docker compose logs -f`;
354
+ }
355
+ else if (existsSync(join(path, "Dockerfile"))) {
356
+ const serviceName = detectServiceName(path);
357
+ commands.start = `cd ${path} && docker build -t ${serviceName} . && docker run -d --name ${serviceName} ${serviceName}`;
358
+ commands.stop = `docker stop ${serviceName} && docker rm ${serviceName}`;
359
+ commands.logs = `docker logs -f ${serviceName}`;
360
+ }
361
+ // Fallback: Try README scanning if no start command detected
362
+ if (!commands.start) {
363
+ const readmeCommand = scanReadmeForCommand(path);
364
+ if (readmeCommand) {
365
+ commands.start = `cd ${path} && ${readmeCommand}`;
366
+ }
367
+ }
368
+ return commands;
369
+ }
370
+ /**
371
+ * Detect dependencies (languages, frameworks, tools)
372
+ */
373
+ export function detectDependencies(path) {
374
+ const deps = [];
375
+ // Node.js
376
+ if (existsSync(join(path, "package.json"))) {
377
+ const pkg = JSON.parse(readFileSync(join(path, "package.json"), "utf-8"));
378
+ deps.push("node");
379
+ if (pkg.dependencies?.["next"])
380
+ deps.push("next.js");
381
+ if (pkg.dependencies?.["react"])
382
+ deps.push("react");
383
+ if (pkg.dependencies?.["express"])
384
+ deps.push("express");
385
+ if (pkg.dependencies?.["fastify"])
386
+ deps.push("fastify");
387
+ if (pkg.devDependencies?.["typescript"] || pkg.dependencies?.["typescript"]) {
388
+ deps.push("typescript");
389
+ }
390
+ }
391
+ // Python
392
+ if (existsSync(join(path, "requirements.txt")) || existsSync(join(path, "pyproject.toml"))) {
393
+ deps.push("python");
394
+ const files = [
395
+ join(path, "requirements.txt"),
396
+ join(path, "pyproject.toml"),
397
+ ];
398
+ for (const file of files) {
399
+ if (existsSync(file)) {
400
+ const content = readFileSync(file, "utf-8").toLowerCase();
401
+ if (content.includes("fastapi"))
402
+ deps.push("fastapi");
403
+ if (content.includes("flask"))
404
+ deps.push("flask");
405
+ if (content.includes("django"))
406
+ deps.push("django");
407
+ if (content.includes("uvicorn"))
408
+ deps.push("uvicorn");
409
+ }
410
+ }
411
+ }
412
+ // Docker
413
+ if (existsSync(join(path, "Dockerfile")))
414
+ deps.push("docker");
415
+ if (existsSync(join(path, "docker-compose.yml")))
416
+ deps.push("docker-compose");
417
+ // Go
418
+ if (existsSync(join(path, "go.mod")))
419
+ deps.push("go");
420
+ // Rust
421
+ if (existsSync(join(path, "Cargo.toml")))
422
+ deps.push("rust");
423
+ return deps;
424
+ }
425
+ /**
426
+ * Generate healthcheck command
427
+ */
428
+ export function detectHealthcheck(path, type, port) {
429
+ if (!port)
430
+ return undefined;
431
+ // Check for explicit health endpoint in code
432
+ if (type === "web" || type === "api") {
433
+ // Node.js
434
+ if (existsSync(join(path, "package.json"))) {
435
+ // Check for Next.js API route
436
+ const healthPaths = [
437
+ "pages/api/health.ts",
438
+ "pages/api/health.js",
439
+ "app/api/health/route.ts",
440
+ "app/api/health/route.js",
441
+ ];
442
+ for (const healthPath of healthPaths) {
443
+ if (existsSync(join(path, healthPath))) {
444
+ return `curl -sf http://localhost:${port}/api/health > /dev/null`;
445
+ }
446
+ }
447
+ }
448
+ // Python
449
+ const pythonFiles = ["server.py", "main.py", "app.py", "api.py"];
450
+ for (const pyFile of pythonFiles) {
451
+ const pyPath = join(path, pyFile);
452
+ if (existsSync(pyPath)) {
453
+ const content = readFileSync(pyPath, "utf-8");
454
+ if (content.includes("/health") || content.includes("health_check")) {
455
+ return `curl -sf http://localhost:${port}/health > /dev/null`;
456
+ }
457
+ }
458
+ }
459
+ // Generic check - just see if port responds
460
+ return `curl -sf http://localhost:${port}/ > /dev/null`;
461
+ }
462
+ return undefined;
463
+ }
464
+ /**
465
+ * Extract full service metadata from codebase
466
+ */
467
+ export function extractServiceMetadata(path) {
468
+ const name = detectServiceName(path);
469
+ const type = detectServiceType(path);
470
+ const port = detectPort(path);
471
+ const version = detectVersion(path);
472
+ const commands = detectCommands(path, type, port);
473
+ const dependencies = detectDependencies(path);
474
+ const healthcheck = detectHealthcheck(path, type, port);
475
+ // Generate description
476
+ let description = `${type.charAt(0).toUpperCase() + type.slice(1)} service`;
477
+ // Enrich from OpenClaw manifest if present
478
+ const openclawManifest = join(path, "openclaw.plugin.json");
479
+ if (existsSync(openclawManifest)) {
480
+ try {
481
+ const manifest = JSON.parse(readFileSync(openclawManifest, "utf-8"));
482
+ if (manifest.agent?.description) {
483
+ description = manifest.agent.description;
484
+ }
485
+ if (manifest.agent?.name && !name) {
486
+ // Use agent name as fallback service name
487
+ }
488
+ }
489
+ catch {
490
+ // Malformed manifest
491
+ }
492
+ }
493
+ if (existsSync(join(path, "package.json"))) {
494
+ const pkg = JSON.parse(readFileSync(join(path, "package.json"), "utf-8"));
495
+ if (pkg.description) {
496
+ description = pkg.description;
497
+ }
498
+ }
499
+ return {
500
+ name,
501
+ type,
502
+ description,
503
+ port,
504
+ version,
505
+ commands,
506
+ dependencies,
507
+ healthcheck,
508
+ };
509
+ }
510
+ /**
511
+ * Slugify a string for use as service ID
512
+ */
513
+ function slugify(str) {
514
+ return str
515
+ .toLowerCase()
516
+ .replace(/[@\/]/g, "-") // Replace @ and / with -
517
+ .replace(/[^a-z0-9-]/g, "") // Remove non-alphanumeric except -
518
+ .replace(/^-+|-+$/g, "") // Trim leading/trailing -
519
+ .replace(/-+/g, "-"); // Collapse multiple -
520
+ }
521
+ //# sourceMappingURL=service-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-detector.js","sourceRoot":"","sources":["../../src/lib/service-detector.ts"],"names":[],"mappings":"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"}