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.
- package/README.md +443 -145
- package/clawdbot-plugin/clawdbot.plugin.json +20 -0
- package/clawdbot-plugin/index.js +555 -0
- package/clawdbot-plugin/index.ts +582 -0
- package/clawdbot-skill/SKILL.md +33 -336
- package/clawdbot-skill/index.ts +491 -321
- package/clawdbot-skill/skill.json +4 -13
- package/dist/commands/clawdbot.d.ts +11 -0
- package/dist/commands/clawdbot.d.ts.map +1 -0
- package/dist/commands/clawdbot.js +215 -0
- package/dist/commands/clawdbot.js.map +1 -0
- package/dist/commands/context-hub.d.ts +5 -0
- package/dist/commands/context-hub.d.ts.map +1 -1
- package/dist/commands/context-hub.js +394 -28
- package/dist/commands/context-hub.js.map +1 -1
- package/dist/commands/gtm-process-update.d.ts +10 -0
- package/dist/commands/gtm-process-update.d.ts.map +1 -0
- package/dist/commands/gtm-process-update.js +101 -0
- package/dist/commands/gtm-process-update.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +278 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +32 -33
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/memory.d.ts +38 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +229 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/migrate-services.d.ts +8 -0
- package/dist/commands/migrate-services.d.ts.map +1 -0
- package/dist/commands/migrate-services.js +182 -0
- package/dist/commands/migrate-services.js.map +1 -0
- package/dist/commands/onboard.d.ts +24 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +663 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/openclaw.d.ts +56 -0
- package/dist/commands/openclaw.d.ts.map +1 -0
- package/dist/commands/openclaw.js +700 -0
- package/dist/commands/openclaw.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +14 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +270 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/profile.d.ts +46 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +498 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/repair.d.ts.map +1 -1
- package/dist/commands/repair.js +37 -0
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/service-agent.d.ts +16 -0
- package/dist/commands/service-agent.d.ts.map +1 -0
- package/dist/commands/service-agent.js +375 -0
- package/dist/commands/service-agent.js.map +1 -0
- package/dist/commands/service-manager.d.ts +12 -0
- package/dist/commands/service-manager.d.ts.map +1 -0
- package/dist/commands/service-manager.js +967 -0
- package/dist/commands/service-manager.js.map +1 -0
- package/dist/commands/service-validate.d.ts +12 -0
- package/dist/commands/service-validate.d.ts.map +1 -0
- package/dist/commands/service-validate.js +611 -0
- package/dist/commands/service-validate.js.map +1 -0
- package/dist/commands/services-create.d.ts +15 -0
- package/dist/commands/services-create.d.ts.map +1 -0
- package/dist/commands/services-create.js +1452 -0
- package/dist/commands/services-create.js.map +1 -0
- package/dist/commands/services-scan.d.ts +13 -0
- package/dist/commands/services-scan.d.ts.map +1 -0
- package/dist/commands/services-scan.js +251 -0
- package/dist/commands/services-scan.js.map +1 -0
- package/dist/commands/services-sync-agents.d.ts +23 -0
- package/dist/commands/services-sync-agents.d.ts.map +1 -0
- package/dist/commands/services-sync-agents.js +207 -0
- package/dist/commands/services-sync-agents.js.map +1 -0
- package/dist/commands/services.d.ts +19 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +742 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/session.d.ts +5 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +68 -586
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +17 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +75 -21
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate-settings.d.ts +37 -0
- package/dist/commands/validate-settings.d.ts.map +1 -0
- package/dist/commands/validate-settings.js +197 -0
- package/dist/commands/validate-settings.js.map +1 -0
- package/dist/commands/voice.d.ts +0 -1
- package/dist/commands/voice.d.ts.map +1 -1
- package/dist/commands/voice.js +16 -15
- package/dist/commands/voice.js.map +1 -1
- package/dist/index.js +395 -141
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-generator.d.ts +26 -0
- package/dist/lib/agent-generator.d.ts.map +1 -0
- package/dist/lib/agent-generator.js +331 -0
- package/dist/lib/agent-generator.js.map +1 -0
- package/dist/lib/memory-db.d.ts +102 -0
- package/dist/lib/memory-db.d.ts.map +1 -0
- package/dist/lib/memory-db.js +313 -0
- package/dist/lib/memory-db.js.map +1 -0
- package/dist/lib/memory-indexer.d.ts +47 -0
- package/dist/lib/memory-indexer.d.ts.map +1 -0
- package/dist/lib/memory-indexer.js +215 -0
- package/dist/lib/memory-indexer.js.map +1 -0
- package/dist/lib/memory-search.d.ts +41 -0
- package/dist/lib/memory-search.d.ts.map +1 -0
- package/dist/lib/memory-search.js +246 -0
- package/dist/lib/memory-search.js.map +1 -0
- package/dist/lib/openclaw-registry.d.ts +48 -0
- package/dist/lib/openclaw-registry.d.ts.map +1 -0
- package/dist/lib/openclaw-registry.js +181 -0
- package/dist/lib/openclaw-registry.js.map +1 -0
- package/dist/lib/openclaw-sdk.d.ts +107 -0
- package/dist/lib/openclaw-sdk.d.ts.map +1 -0
- package/dist/lib/openclaw-sdk.js +208 -0
- package/dist/lib/openclaw-sdk.js.map +1 -0
- package/dist/lib/peer-agent-generator.d.ts +44 -0
- package/dist/lib/peer-agent-generator.d.ts.map +1 -0
- package/dist/lib/peer-agent-generator.js +286 -0
- package/dist/lib/peer-agent-generator.js.map +1 -0
- package/dist/lib/service-dependencies.d.ts +44 -0
- package/dist/lib/service-dependencies.d.ts.map +1 -0
- package/dist/lib/service-dependencies.js +314 -0
- package/dist/lib/service-dependencies.js.map +1 -0
- package/dist/lib/service-detector.d.ts +61 -0
- package/dist/lib/service-detector.d.ts.map +1 -0
- package/dist/lib/service-detector.js +521 -0
- package/dist/lib/service-detector.js.map +1 -0
- package/dist/lib/service-gtm.d.ts +157 -0
- package/dist/lib/service-gtm.d.ts.map +1 -0
- package/dist/lib/service-gtm.js +786 -0
- package/dist/lib/service-gtm.js.map +1 -0
- package/dist/lib/service-mcp-base.d.ts +103 -0
- package/dist/lib/service-mcp-base.d.ts.map +1 -0
- package/dist/lib/service-mcp-base.js +263 -0
- package/dist/lib/service-mcp-base.js.map +1 -0
- package/dist/lib/service-utils.d.ts +103 -0
- package/dist/lib/service-utils.d.ts.map +1 -0
- package/dist/lib/service-utils.js +368 -0
- package/dist/lib/service-utils.js.map +1 -0
- package/dist/lib/skill-generator.d.ts +21 -0
- package/dist/lib/skill-generator.d.ts.map +1 -0
- package/dist/lib/skill-generator.js +253 -0
- package/dist/lib/skill-generator.js.map +1 -0
- package/dist/lib/stratus-client.d.ts +100 -0
- package/dist/lib/stratus-client.d.ts.map +1 -0
- package/dist/lib/stratus-client.js +255 -0
- package/dist/lib/stratus-client.js.map +1 -0
- package/dist/mcp/context-hub-mcp.js +135 -53
- package/dist/mcp/context-hub-mcp.js.map +1 -1
- package/dist/mcp/service-mcp-server.d.ts +12 -0
- package/dist/mcp/service-mcp-server.d.ts.map +1 -0
- package/dist/mcp/service-mcp-server.js +434 -0
- package/dist/mcp/service-mcp-server.js.map +1 -0
- package/dist/mcp/service-peer-mcp.d.ts +36 -0
- package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
- package/dist/mcp/service-peer-mcp.js +220 -0
- package/dist/mcp/service-peer-mcp.js.map +1 -0
- package/dist/mcp/service-registry-mcp.d.ts +13 -0
- package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
- package/dist/mcp/service-registry-mcp.js +330 -0
- package/dist/mcp/service-registry-mcp.js.map +1 -0
- package/dist/ui/banner.js +1 -1
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/context-hub-logs.d.ts +10 -0
- package/dist/ui/context-hub-logs.d.ts.map +1 -0
- package/dist/ui/context-hub-logs.js +175 -0
- package/dist/ui/context-hub-logs.js.map +1 -0
- package/dist/ui/service-dashboard.d.ts +11 -0
- package/dist/ui/service-dashboard.d.ts.map +1 -0
- package/dist/ui/service-dashboard.js +357 -0
- package/dist/ui/service-dashboard.js.map +1 -0
- package/dist/ui/services-manager.d.ts +11 -0
- package/dist/ui/services-manager.d.ts.map +1 -0
- package/dist/ui/services-manager.js +507 -0
- package/dist/ui/services-manager.js.map +1 -0
- package/dist/utils/auth-guard.d.ts.map +1 -1
- package/dist/utils/auth-guard.js +8 -9
- package/dist/utils/auth-guard.js.map +1 -1
- package/dist/utils/claude-md-generator.d.ts +10 -0
- package/dist/utils/claude-md-generator.d.ts.map +1 -0
- package/dist/utils/claude-md-generator.js +215 -0
- package/dist/utils/claude-md-generator.js.map +1 -0
- package/dist/utils/ensure-context-hub.d.ts +20 -0
- package/dist/utils/ensure-context-hub.d.ts.map +1 -0
- package/dist/utils/ensure-context-hub.js +65 -0
- package/dist/utils/ensure-context-hub.js.map +1 -0
- package/dist/utils/ensure-project.d.ts.map +1 -1
- package/dist/utils/ensure-project.js +3 -4
- package/dist/utils/ensure-project.js.map +1 -1
- package/dist/utils/jfl-config.d.ts +19 -0
- package/dist/utils/jfl-config.d.ts.map +1 -0
- package/dist/utils/jfl-config.js +112 -0
- package/dist/utils/jfl-config.js.map +1 -0
- package/dist/utils/jfl-migration.d.ts +29 -0
- package/dist/utils/jfl-migration.d.ts.map +1 -0
- package/dist/utils/jfl-migration.js +142 -0
- package/dist/utils/jfl-migration.js.map +1 -0
- package/dist/utils/jfl-paths.d.ts +55 -0
- package/dist/utils/jfl-paths.d.ts.map +1 -0
- package/dist/utils/jfl-paths.js +120 -0
- package/dist/utils/jfl-paths.js.map +1 -0
- package/dist/utils/settings-validator.d.ts +73 -0
- package/dist/utils/settings-validator.d.ts.map +1 -0
- package/dist/utils/settings-validator.js +222 -0
- package/dist/utils/settings-validator.js.map +1 -0
- package/package.json +19 -3
- package/scripts/commit-gtm.sh +56 -0
- package/scripts/commit-product.sh +68 -0
- package/scripts/context-query.sh +45 -0
- package/scripts/session/auto-commit.sh +297 -0
- package/scripts/session/jfl-doctor.sh +707 -0
- package/scripts/session/session-cleanup.sh +268 -0
- package/scripts/session/session-end.sh +198 -0
- package/scripts/session/session-init.sh +350 -0
- package/scripts/session/session-init.sh.backup +292 -0
- package/scripts/session/session-sync.sh +167 -0
- package/scripts/session/test-context-preservation.sh +160 -0
- package/scripts/session/test-critical-infrastructure.sh +293 -0
- package/scripts/session/test-experience-level.sh +336 -0
- package/scripts/session/test-session-cleanup.sh +268 -0
- package/scripts/session/test-session-sync.sh +320 -0
- package/scripts/voice-start.sh +36 -8
- package/scripts/where-am-i.sh +78 -0
- package/template/.claude/service-settings.json +32 -0
- package/template/.claude/settings.json +14 -1
- package/template/.claude/skills/end/SKILL.md +1780 -0
- package/template/.jfl/config.json +2 -1
- package/template/CLAUDE.md +1039 -134
- package/template/CLAUDE.md.bak +1187 -0
- package/template/scripts/commit-gtm.sh +56 -0
- package/template/scripts/commit-product.sh +68 -0
- package/template/scripts/migrate-to-branch-sessions.sh +201 -0
- package/template/scripts/session/auto-commit.sh +58 -6
- package/template/scripts/session/jfl-doctor.sh +137 -17
- package/template/scripts/session/session-cleanup.sh +268 -0
- package/template/scripts/session/session-end.sh +4 -0
- package/template/scripts/session/session-init.sh +253 -66
- package/template/scripts/session/test-critical-infrastructure.sh +293 -0
- package/template/scripts/session/test-experience-level.sh +336 -0
- package/template/scripts/session/test-session-cleanup.sh +268 -0
- package/template/scripts/session/test-session-sync.sh +320 -0
- package/template/scripts/where-am-i.sh +78 -0
- package/template/templates/service-agent/.claude/settings.json +32 -0
- package/template/templates/service-agent/CLAUDE.md +334 -0
- package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
- package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
- package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
- package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
- package/dist/commands/session-mgmt.d.ts +0 -33
- package/dist/commands/session-mgmt.d.ts.map +0 -1
- package/dist/commands/session-mgmt.js +0 -404
- package/dist/commands/session-mgmt.js.map +0 -1
- package/template/scripts/session/auto-merge.sh +0 -325
|
@@ -0,0 +1,314 @@
|
|
|
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
|
+
import chalk from "chalk";
|
|
10
|
+
import * as fs from "fs";
|
|
11
|
+
import * as path from "path";
|
|
12
|
+
import { JFL_PATHS } from "../utils/jfl-paths.js";
|
|
13
|
+
const GLOBAL_SERVICES_FILE = path.join(JFL_PATHS.data, "services.json");
|
|
14
|
+
const SERVICE_MANAGER_URL = "http://localhost:3402";
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Config Loading
|
|
17
|
+
// ============================================================================
|
|
18
|
+
function loadServicesConfig() {
|
|
19
|
+
if (!fs.existsSync(GLOBAL_SERVICES_FILE)) {
|
|
20
|
+
throw new Error(`Services file not found: ${GLOBAL_SERVICES_FILE}`);
|
|
21
|
+
}
|
|
22
|
+
const content = fs.readFileSync(GLOBAL_SERVICES_FILE, "utf-8");
|
|
23
|
+
return JSON.parse(content);
|
|
24
|
+
}
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Dependency Graph Building
|
|
27
|
+
// ============================================================================
|
|
28
|
+
export function buildDependencyGraph(services) {
|
|
29
|
+
const graph = {
|
|
30
|
+
nodes: Object.keys(services),
|
|
31
|
+
edges: new Map(),
|
|
32
|
+
dependents: new Map(),
|
|
33
|
+
};
|
|
34
|
+
// Build edges (service -> dependencies)
|
|
35
|
+
for (const [name, service] of Object.entries(services)) {
|
|
36
|
+
const deps = service.depends_on || [];
|
|
37
|
+
graph.edges.set(name, deps);
|
|
38
|
+
// Build reverse edges (service -> dependents)
|
|
39
|
+
for (const dep of deps) {
|
|
40
|
+
if (!graph.dependents.has(dep)) {
|
|
41
|
+
graph.dependents.set(dep, []);
|
|
42
|
+
}
|
|
43
|
+
graph.dependents.get(dep).push(name);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return graph;
|
|
47
|
+
}
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Dependency Resolution
|
|
50
|
+
// ============================================================================
|
|
51
|
+
export function getStartOrder(serviceName, services) {
|
|
52
|
+
const graph = buildDependencyGraph(services);
|
|
53
|
+
const visited = new Set();
|
|
54
|
+
const order = [];
|
|
55
|
+
function visit(name) {
|
|
56
|
+
if (visited.has(name))
|
|
57
|
+
return;
|
|
58
|
+
visited.add(name);
|
|
59
|
+
// Visit dependencies first
|
|
60
|
+
const deps = graph.edges.get(name) || [];
|
|
61
|
+
for (const dep of deps) {
|
|
62
|
+
if (!services[dep]) {
|
|
63
|
+
throw new Error(`Service "${name}" depends on unknown service "${dep}"`);
|
|
64
|
+
}
|
|
65
|
+
visit(dep);
|
|
66
|
+
}
|
|
67
|
+
order.push(name);
|
|
68
|
+
}
|
|
69
|
+
visit(serviceName);
|
|
70
|
+
return order;
|
|
71
|
+
}
|
|
72
|
+
export function getStopOrder(serviceName, services) {
|
|
73
|
+
const graph = buildDependencyGraph(services);
|
|
74
|
+
const visited = new Set();
|
|
75
|
+
const order = [];
|
|
76
|
+
function visit(name) {
|
|
77
|
+
if (visited.has(name))
|
|
78
|
+
return;
|
|
79
|
+
visited.add(name);
|
|
80
|
+
// Visit dependents first (reverse order for stop)
|
|
81
|
+
const dependents = graph.dependents.get(name) || [];
|
|
82
|
+
for (const dependent of dependents) {
|
|
83
|
+
visit(dependent);
|
|
84
|
+
}
|
|
85
|
+
order.push(name);
|
|
86
|
+
}
|
|
87
|
+
visit(serviceName);
|
|
88
|
+
return order;
|
|
89
|
+
}
|
|
90
|
+
export function detectCycles(services) {
|
|
91
|
+
const graph = buildDependencyGraph(services);
|
|
92
|
+
const visited = new Set();
|
|
93
|
+
const recursionStack = new Set();
|
|
94
|
+
const cycle = [];
|
|
95
|
+
function visit(name, path) {
|
|
96
|
+
if (recursionStack.has(name)) {
|
|
97
|
+
// Found cycle
|
|
98
|
+
const cycleStart = path.indexOf(name);
|
|
99
|
+
cycle.push(...path.slice(cycleStart), name);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
if (visited.has(name))
|
|
103
|
+
return false;
|
|
104
|
+
visited.add(name);
|
|
105
|
+
recursionStack.add(name);
|
|
106
|
+
const deps = graph.edges.get(name) || [];
|
|
107
|
+
for (const dep of deps) {
|
|
108
|
+
if (visit(dep, [...path, name])) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
recursionStack.delete(name);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
for (const node of graph.nodes) {
|
|
116
|
+
if (visit(node, [])) {
|
|
117
|
+
return cycle;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Dependency Validation
|
|
124
|
+
// ============================================================================
|
|
125
|
+
export function validateDependencies(services) {
|
|
126
|
+
const errors = [];
|
|
127
|
+
// Check for unknown dependencies
|
|
128
|
+
for (const [name, service] of Object.entries(services)) {
|
|
129
|
+
const deps = service.depends_on || [];
|
|
130
|
+
for (const dep of deps) {
|
|
131
|
+
if (!services[dep]) {
|
|
132
|
+
errors.push(`Service "${name}" depends on unknown service "${dep}"`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Check for cycles
|
|
137
|
+
const cycle = detectCycles(services);
|
|
138
|
+
if (cycle) {
|
|
139
|
+
errors.push(`Dependency cycle detected: ${cycle.join(" -> ")}`);
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
valid: errors.length === 0,
|
|
143
|
+
errors,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// ============================================================================
|
|
147
|
+
// Service Status
|
|
148
|
+
// ============================================================================
|
|
149
|
+
export async function getServiceStatus(serviceName) {
|
|
150
|
+
try {
|
|
151
|
+
const response = await fetch(`${SERVICE_MANAGER_URL}/registry/${serviceName}`);
|
|
152
|
+
if (!response.ok)
|
|
153
|
+
return null;
|
|
154
|
+
const result = await response.json();
|
|
155
|
+
return result.service;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export async function isServiceRunning(serviceName) {
|
|
162
|
+
const status = await getServiceStatus(serviceName);
|
|
163
|
+
return status?.status === "running";
|
|
164
|
+
}
|
|
165
|
+
// ============================================================================
|
|
166
|
+
// Dependency-Aware Start/Stop
|
|
167
|
+
// ============================================================================
|
|
168
|
+
export async function startWithDependencies(serviceName, options = {}) {
|
|
169
|
+
const config = loadServicesConfig();
|
|
170
|
+
const services = config.services;
|
|
171
|
+
if (!services[serviceName]) {
|
|
172
|
+
throw new Error(`Service not found: ${serviceName}`);
|
|
173
|
+
}
|
|
174
|
+
// Validate dependencies
|
|
175
|
+
const validation = validateDependencies(services);
|
|
176
|
+
if (!validation.valid) {
|
|
177
|
+
throw new Error(`Dependency validation failed:\n${validation.errors.join("\n")}`);
|
|
178
|
+
}
|
|
179
|
+
// Get start order
|
|
180
|
+
const order = getStartOrder(serviceName, services);
|
|
181
|
+
if (options.dryRun) {
|
|
182
|
+
return order;
|
|
183
|
+
}
|
|
184
|
+
// Start services in order
|
|
185
|
+
const started = [];
|
|
186
|
+
for (const name of order) {
|
|
187
|
+
if (options.onProgress) {
|
|
188
|
+
options.onProgress(name, "checking");
|
|
189
|
+
}
|
|
190
|
+
const running = await isServiceRunning(name);
|
|
191
|
+
if (running) {
|
|
192
|
+
if (options.verbose) {
|
|
193
|
+
console.log(chalk.dim(` ${name} already running`));
|
|
194
|
+
}
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (options.onProgress) {
|
|
198
|
+
options.onProgress(name, "starting");
|
|
199
|
+
}
|
|
200
|
+
// Start service via Service Manager
|
|
201
|
+
try {
|
|
202
|
+
const response = await fetch(`${SERVICE_MANAGER_URL}/registry/${name}/call`, {
|
|
203
|
+
method: "POST",
|
|
204
|
+
headers: { "Content-Type": "application/json" },
|
|
205
|
+
body: JSON.stringify({ tool: "start", args: {} }),
|
|
206
|
+
});
|
|
207
|
+
if (response.ok) {
|
|
208
|
+
started.push(name);
|
|
209
|
+
if (options.verbose) {
|
|
210
|
+
console.log(chalk.green(` ✓ Started ${name}`));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
throw new Error(`Failed to start ${name}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
throw new Error(`Failed to start ${name}: ${error}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return started;
|
|
222
|
+
}
|
|
223
|
+
export async function stopWithDependents(serviceName, options = {}) {
|
|
224
|
+
const config = loadServicesConfig();
|
|
225
|
+
const services = config.services;
|
|
226
|
+
if (!services[serviceName]) {
|
|
227
|
+
throw new Error(`Service not found: ${serviceName}`);
|
|
228
|
+
}
|
|
229
|
+
// Get stop order
|
|
230
|
+
const order = getStopOrder(serviceName, services);
|
|
231
|
+
// Check if any dependents are running (unless force)
|
|
232
|
+
if (!options.force && order.length > 1) {
|
|
233
|
+
const dependents = order.slice(0, -1); // All except the service itself
|
|
234
|
+
const runningDependents = [];
|
|
235
|
+
for (const dep of dependents) {
|
|
236
|
+
if (await isServiceRunning(dep)) {
|
|
237
|
+
runningDependents.push(dep);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (runningDependents.length > 0) {
|
|
241
|
+
throw new Error(`Cannot stop ${serviceName} - the following services depend on it and are running:\n` +
|
|
242
|
+
runningDependents.map((d) => ` - ${d}`).join("\n") +
|
|
243
|
+
`\n\nUse --force to stop all dependents`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (options.dryRun) {
|
|
247
|
+
return order;
|
|
248
|
+
}
|
|
249
|
+
// Stop services in order
|
|
250
|
+
const stopped = [];
|
|
251
|
+
for (const name of order) {
|
|
252
|
+
if (options.onProgress) {
|
|
253
|
+
options.onProgress(name, "checking");
|
|
254
|
+
}
|
|
255
|
+
const running = await isServiceRunning(name);
|
|
256
|
+
if (!running) {
|
|
257
|
+
if (options.verbose) {
|
|
258
|
+
console.log(chalk.dim(` ${name} already stopped`));
|
|
259
|
+
}
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (options.onProgress) {
|
|
263
|
+
options.onProgress(name, "stopping");
|
|
264
|
+
}
|
|
265
|
+
// Stop service via Service Manager
|
|
266
|
+
try {
|
|
267
|
+
const response = await fetch(`${SERVICE_MANAGER_URL}/registry/${name}/call`, {
|
|
268
|
+
method: "POST",
|
|
269
|
+
headers: { "Content-Type": "application/json" },
|
|
270
|
+
body: JSON.stringify({ tool: "stop", args: {} }),
|
|
271
|
+
});
|
|
272
|
+
if (response.ok) {
|
|
273
|
+
stopped.push(name);
|
|
274
|
+
if (options.verbose) {
|
|
275
|
+
console.log(chalk.green(` ✓ Stopped ${name}`));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
throw new Error(`Failed to stop ${name}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
throw new Error(`Failed to stop ${name}: ${error}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return stopped;
|
|
287
|
+
}
|
|
288
|
+
// ============================================================================
|
|
289
|
+
// Visualization
|
|
290
|
+
// ============================================================================
|
|
291
|
+
export function visualizeDependencies(services) {
|
|
292
|
+
const graph = buildDependencyGraph(services);
|
|
293
|
+
const lines = [];
|
|
294
|
+
lines.push(chalk.bold("\nService Dependencies:\n"));
|
|
295
|
+
for (const [name, deps] of graph.edges.entries()) {
|
|
296
|
+
if (deps.length === 0)
|
|
297
|
+
continue;
|
|
298
|
+
lines.push(chalk.cyan(`${name}`));
|
|
299
|
+
for (const dep of deps) {
|
|
300
|
+
lines.push(chalk.dim(` └─ depends on → ${dep}`));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
lines.push(chalk.bold("\nService Dependents:\n"));
|
|
304
|
+
for (const [name, dependents] of graph.dependents.entries()) {
|
|
305
|
+
if (dependents.length === 0)
|
|
306
|
+
continue;
|
|
307
|
+
lines.push(chalk.cyan(`${name}`));
|
|
308
|
+
for (const dependent of dependents) {
|
|
309
|
+
lines.push(chalk.dim(` └─ required by → ${dependent}`));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return lines.join("\n");
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=service-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-dependencies.js","sourceRoot":"","sources":["../../src/lib/service-dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
export interface ServiceMetadata {
|
|
13
|
+
name: string;
|
|
14
|
+
type: "web" | "api" | "container" | "worker" | "cli" | "infrastructure" | "library";
|
|
15
|
+
description: string;
|
|
16
|
+
port: number | null;
|
|
17
|
+
version: string;
|
|
18
|
+
commands: {
|
|
19
|
+
start?: string;
|
|
20
|
+
stop?: string;
|
|
21
|
+
logs?: string;
|
|
22
|
+
build?: string;
|
|
23
|
+
test?: string;
|
|
24
|
+
};
|
|
25
|
+
dependencies: string[];
|
|
26
|
+
healthcheck?: string;
|
|
27
|
+
url?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Detect service type from codebase structure
|
|
31
|
+
*/
|
|
32
|
+
export declare function detectServiceType(path: string): ServiceMetadata["type"];
|
|
33
|
+
/**
|
|
34
|
+
* Extract port from package.json scripts or common config files
|
|
35
|
+
*/
|
|
36
|
+
export declare function detectPort(path: string): number | null;
|
|
37
|
+
/**
|
|
38
|
+
* Get service name from package.json, git remote, or directory name
|
|
39
|
+
*/
|
|
40
|
+
export declare function detectServiceName(path: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Get version from git, package.json, or pyproject.toml
|
|
43
|
+
*/
|
|
44
|
+
export declare function detectVersion(path: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Generate commands for service management
|
|
47
|
+
*/
|
|
48
|
+
export declare function detectCommands(path: string, type: ServiceMetadata["type"], port: number | null): ServiceMetadata["commands"];
|
|
49
|
+
/**
|
|
50
|
+
* Detect dependencies (languages, frameworks, tools)
|
|
51
|
+
*/
|
|
52
|
+
export declare function detectDependencies(path: string): string[];
|
|
53
|
+
/**
|
|
54
|
+
* Generate healthcheck command
|
|
55
|
+
*/
|
|
56
|
+
export declare function detectHealthcheck(path: string, type: ServiceMetadata["type"], port: number | null): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Extract full service metadata from codebase
|
|
59
|
+
*/
|
|
60
|
+
export declare function extractServiceMetadata(path: string): ServiceMetadata;
|
|
61
|
+
//# sourceMappingURL=service-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-detector.d.ts","sourceRoot":"","sources":["../../src/lib/service-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,gBAAgB,GAAG,SAAS,CAAA;IACnF,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAiHvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8DtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsCtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+BlD;AA0DD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,eAAe,CAAC,UAAU,CAAC,CA+E7B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgDzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,MAAM,GAAG,SAAS,CAuCpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CA6CpE"}
|