jfl 0.1.1 → 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 +77 -7
- 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/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/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +203 -15
- package/dist/commands/onboard.js.map +1 -1
- 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/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-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 +7 -1
- package/dist/commands/services.d.ts.map +1 -1
- package/dist/commands/services.js +347 -22
- package/dist/commands/services.js.map +1 -1
- package/dist/commands/update.js +0 -0
- 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/index.js +155 -60
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-generator.d.ts.map +1 -1
- package/dist/lib/agent-generator.js +94 -1
- package/dist/lib/agent-generator.js.map +1 -1
- 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-detector.d.ts +1 -1
- package/dist/lib/service-detector.d.ts.map +1 -1
- package/dist/lib/service-detector.js +118 -5
- package/dist/lib/service-detector.js.map +1 -1
- 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 +10 -1
- package/dist/lib/service-mcp-base.d.ts.map +1 -1
- package/dist/lib/service-mcp-base.js +20 -1
- package/dist/lib/service-mcp-base.js.map +1 -1
- 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.js +0 -0
- package/dist/utils/settings-validator.d.ts +4 -1
- package/dist/utils/settings-validator.d.ts.map +1 -1
- package/dist/utils/settings-validator.js +25 -1
- package/dist/utils/settings-validator.js.map +1 -1
- package/package.json +2 -1
- package/template/.claude/service-settings.json +32 -0
- package/template/.claude/settings.json +10 -0
- package/template/.claude/skills/end/SKILL.md +1780 -0
- package/template/.jfl/config.json +2 -1
- package/template/.mcp.json +1 -7
- package/template/CLAUDE.md +1042 -248
- 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 +4 -3
- package/template/scripts/session/jfl-doctor.sh +222 -83
- package/template/scripts/session/session-cleanup.sh +109 -21
- package/template/scripts/session/session-end.sh +26 -13
- package/template/scripts/session/session-init.sh +280 -98
- 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
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Validation Command
|
|
3
|
+
*
|
|
4
|
+
* Validates that a JFL service is properly configured and compliant with GTM standards.
|
|
5
|
+
*
|
|
6
|
+
* @purpose Ensure GTM services are properly configured and can integrate with parent GTM
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { execSync } from 'child_process';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
const CONFIG_PATH = '.jfl/config.json';
|
|
13
|
+
const SETTINGS_PATH = '.claude/settings.json';
|
|
14
|
+
const JOURNAL_DIR = '.jfl/journal';
|
|
15
|
+
const MCP_CONFIG_PATH = '.mcp.json';
|
|
16
|
+
const SKILLS_DIR = '.claude/skills';
|
|
17
|
+
export async function serviceValidate(options = {}) {
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
// Check if we're in a JFL project
|
|
20
|
+
if (!fs.existsSync(CONFIG_PATH)) {
|
|
21
|
+
console.error(chalk.red('Error: Not a JFL project (no .jfl/config.json found)'));
|
|
22
|
+
console.error(chalk.gray('Run this command from a JFL service directory.'));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const config = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
|
|
26
|
+
// Check if this is a service
|
|
27
|
+
if (!config.service) {
|
|
28
|
+
console.error(chalk.red('Error: Not a JFL service (service: true not set in config)'));
|
|
29
|
+
console.error(chalk.gray('This command is for validating GTM services.'));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
if (!options.json) {
|
|
33
|
+
console.log(chalk.cyan.bold(`\n🔍 SERVICE VALIDATION: ${config.name}`));
|
|
34
|
+
console.log(chalk.cyan('━'.repeat(60)) + '\n');
|
|
35
|
+
}
|
|
36
|
+
// Run all validation checks
|
|
37
|
+
const result = await runValidationChecks(cwd, config);
|
|
38
|
+
// Apply fixes if requested
|
|
39
|
+
if (options.fix && result.summary.fixable > 0) {
|
|
40
|
+
await applyFixes(result.checks);
|
|
41
|
+
// Re-run validation to show updated status
|
|
42
|
+
console.log(chalk.cyan('\n━'.repeat(60)));
|
|
43
|
+
console.log(chalk.cyan.bold('VALIDATION AFTER AUTO-FIX:'));
|
|
44
|
+
console.log(chalk.cyan('━'.repeat(60)) + '\n');
|
|
45
|
+
const updatedResult = await runValidationChecks(cwd, config);
|
|
46
|
+
displayResults(updatedResult, options.json);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
displayResults(result, options.json);
|
|
50
|
+
}
|
|
51
|
+
// Exit with error code if there are failures
|
|
52
|
+
if (result.summary.errors > 0) {
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function runValidationChecks(cwd, config) {
|
|
57
|
+
const checks = [];
|
|
58
|
+
// 1. Service Identity
|
|
59
|
+
checks.push(await checkServiceIdentity(cwd, config));
|
|
60
|
+
// 2. GTM Integration
|
|
61
|
+
checks.push(...await checkGtmIntegration(cwd, config));
|
|
62
|
+
// 3. Hooks & Session Management
|
|
63
|
+
checks.push(...await checkHooksAndSession(cwd));
|
|
64
|
+
// 4. Context & Journal
|
|
65
|
+
checks.push(...await checkContextAndJournal(cwd, config));
|
|
66
|
+
// 5. Skills
|
|
67
|
+
checks.push(...await checkSkills(cwd));
|
|
68
|
+
// 6. Health
|
|
69
|
+
checks.push(...await checkHealth(cwd));
|
|
70
|
+
// Calculate summary
|
|
71
|
+
const summary = {
|
|
72
|
+
passed: checks.filter(c => c.status === 'pass').length,
|
|
73
|
+
warnings: checks.filter(c => c.status === 'warn').length,
|
|
74
|
+
errors: checks.filter(c => c.status === 'fail').length,
|
|
75
|
+
fixable: checks.filter(c => c.fixable && c.status !== 'pass').length
|
|
76
|
+
};
|
|
77
|
+
return { checks, summary };
|
|
78
|
+
}
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// VALIDATION CHECK IMPLEMENTATIONS
|
|
81
|
+
// ============================================================================
|
|
82
|
+
async function checkServiceIdentity(cwd, config) {
|
|
83
|
+
const issues = [];
|
|
84
|
+
if (!config.name)
|
|
85
|
+
issues.push('Missing "name" field');
|
|
86
|
+
if (!config.type)
|
|
87
|
+
issues.push('Missing "type" field');
|
|
88
|
+
if (!config.description)
|
|
89
|
+
issues.push('Missing "description" field');
|
|
90
|
+
if (!config.gtm_parent)
|
|
91
|
+
issues.push('Missing "gtm_parent" field');
|
|
92
|
+
if (issues.length > 0) {
|
|
93
|
+
return {
|
|
94
|
+
category: 'Service Configuration',
|
|
95
|
+
status: 'fail',
|
|
96
|
+
message: 'Service configuration incomplete',
|
|
97
|
+
details: issues,
|
|
98
|
+
fixable: false
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
category: 'Service Configuration',
|
|
103
|
+
status: 'pass',
|
|
104
|
+
message: `Type: ${config.type}${config.gtm_parent ? `\n GTM Parent: ${config.gtm_parent}` : ''}`,
|
|
105
|
+
fixable: false
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async function checkGtmIntegration(cwd, config) {
|
|
109
|
+
const checks = [];
|
|
110
|
+
if (!config.gtm_parent) {
|
|
111
|
+
checks.push({
|
|
112
|
+
category: 'GTM Integration',
|
|
113
|
+
status: 'fail',
|
|
114
|
+
message: 'No GTM parent configured',
|
|
115
|
+
details: ['Set "gtm_parent" in .jfl/config.json'],
|
|
116
|
+
fixable: false
|
|
117
|
+
});
|
|
118
|
+
return checks;
|
|
119
|
+
}
|
|
120
|
+
// Check if GTM parent exists
|
|
121
|
+
const gtmParentPath = config.gtm_parent.startsWith('/')
|
|
122
|
+
? config.gtm_parent
|
|
123
|
+
: path.resolve(cwd, config.gtm_parent);
|
|
124
|
+
if (!fs.existsSync(gtmParentPath)) {
|
|
125
|
+
checks.push({
|
|
126
|
+
category: 'GTM Integration',
|
|
127
|
+
status: 'fail',
|
|
128
|
+
message: 'GTM parent directory not found',
|
|
129
|
+
details: [`Path: ${gtmParentPath}`],
|
|
130
|
+
fixable: false
|
|
131
|
+
});
|
|
132
|
+
return checks;
|
|
133
|
+
}
|
|
134
|
+
const gtmConfigPath = path.join(gtmParentPath, '.jfl/config.json');
|
|
135
|
+
if (!fs.existsSync(gtmConfigPath)) {
|
|
136
|
+
checks.push({
|
|
137
|
+
category: 'GTM Integration',
|
|
138
|
+
status: 'fail',
|
|
139
|
+
message: 'GTM parent is not a valid JFL workspace',
|
|
140
|
+
details: [`No .jfl/config.json at ${gtmParentPath}`],
|
|
141
|
+
fixable: false
|
|
142
|
+
});
|
|
143
|
+
return checks;
|
|
144
|
+
}
|
|
145
|
+
// Check if registered in GTM's registered_services
|
|
146
|
+
const gtmConfig = JSON.parse(fs.readFileSync(gtmConfigPath, 'utf-8'));
|
|
147
|
+
const registeredServices = gtmConfig.registered_services || [];
|
|
148
|
+
const isRegistered = registeredServices.some((s) => s.name === config.name || s.path === cwd);
|
|
149
|
+
if (!isRegistered) {
|
|
150
|
+
checks.push({
|
|
151
|
+
category: 'GTM Integration',
|
|
152
|
+
status: 'warn',
|
|
153
|
+
message: 'Not registered in parent GTM',
|
|
154
|
+
details: ['Service should be in registered_services array'],
|
|
155
|
+
fixable: true,
|
|
156
|
+
fix: async () => {
|
|
157
|
+
const services = gtmConfig.registered_services || [];
|
|
158
|
+
services.push({
|
|
159
|
+
name: config.name,
|
|
160
|
+
path: cwd,
|
|
161
|
+
type: config.type,
|
|
162
|
+
registered_at: new Date().toISOString()
|
|
163
|
+
});
|
|
164
|
+
gtmConfig.registered_services = services;
|
|
165
|
+
fs.writeFileSync(gtmConfigPath, JSON.stringify(gtmConfig, null, 2));
|
|
166
|
+
console.log(chalk.green(` ✓ Registered service in ${gtmParentPath}/.jfl/config.json`));
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
checks.push({
|
|
172
|
+
category: 'GTM Integration',
|
|
173
|
+
status: 'pass',
|
|
174
|
+
message: 'Registered in parent GTM\n Bidirectional link verified',
|
|
175
|
+
fixable: false
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return checks;
|
|
179
|
+
}
|
|
180
|
+
async function checkHooksAndSession(cwd) {
|
|
181
|
+
const checks = [];
|
|
182
|
+
if (!fs.existsSync(SETTINGS_PATH)) {
|
|
183
|
+
checks.push({
|
|
184
|
+
category: 'Hooks Configuration',
|
|
185
|
+
status: 'warn',
|
|
186
|
+
message: 'No .claude/settings.json found',
|
|
187
|
+
details: ['Session hooks not configured'],
|
|
188
|
+
fixable: true,
|
|
189
|
+
fix: async () => {
|
|
190
|
+
const defaultSettings = {
|
|
191
|
+
hooks: {
|
|
192
|
+
SessionStart: [
|
|
193
|
+
{
|
|
194
|
+
matcher: "",
|
|
195
|
+
hooks: [
|
|
196
|
+
{
|
|
197
|
+
type: "command",
|
|
198
|
+
command: "./scripts/session/session-init.sh"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
type: "command",
|
|
202
|
+
command: "jfl context-hub ensure >> .jfl/logs/context-hub.log 2>&1 &",
|
|
203
|
+
async: true
|
|
204
|
+
}
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
],
|
|
208
|
+
Stop: [
|
|
209
|
+
{
|
|
210
|
+
matcher: "",
|
|
211
|
+
hooks: [
|
|
212
|
+
{
|
|
213
|
+
type: "command",
|
|
214
|
+
command: "BRANCH=$(cat .jfl/current-session-branch.txt 2>/dev/null || git branch --show-current); JOURNAL=\".jfl/journal/${BRANCH}.jsonl\"; if [ ! -s \"$JOURNAL\" ] 2>/dev/null; then echo '⚠️ No journal entry for session'; else echo '✓ Journal exists'; fi; exit 0"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
type: "command",
|
|
218
|
+
command: "./scripts/session/session-cleanup.sh >> .jfl/logs/session-cleanup.log 2>&1 || echo 'Cleanup skipped'; exit 0"
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
PreCompact: [
|
|
224
|
+
{
|
|
225
|
+
matcher: "",
|
|
226
|
+
hooks: [
|
|
227
|
+
{
|
|
228
|
+
type: "command",
|
|
229
|
+
command: "BRANCH=$(cat .jfl/current-session-branch.txt 2>/dev/null || git branch --show-current); JOURNAL=\".jfl/journal/${BRANCH}.jsonl\"; if [ ! -s \"$JOURNAL\" ] 2>/dev/null; then echo ''; echo '🚨 CONTEXT COMPACTING - WRITE JOURNAL NOW'; echo \"File: .jfl/journal/${BRANCH}.jsonl\"; fi"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
type: "command",
|
|
233
|
+
command: "nohup sh -c 'git add -A && git diff --cached --quiet || git commit -m \"auto: pre-compact save\"' > /dev/null 2>&1 & disown; exit 0"
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
fs.mkdirSync(path.dirname(SETTINGS_PATH), { recursive: true });
|
|
241
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(defaultSettings, null, 2));
|
|
242
|
+
console.log(chalk.green(' ✓ Created .claude/settings.json with default hooks'));
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
return checks;
|
|
246
|
+
}
|
|
247
|
+
const settings = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf-8'));
|
|
248
|
+
if (!settings.hooks) {
|
|
249
|
+
checks.push({
|
|
250
|
+
category: 'Hooks Configuration',
|
|
251
|
+
status: 'warn',
|
|
252
|
+
message: 'No hooks configured',
|
|
253
|
+
fixable: false
|
|
254
|
+
});
|
|
255
|
+
return checks;
|
|
256
|
+
}
|
|
257
|
+
// Check for invalid hook names (like SessionStart:service)
|
|
258
|
+
const invalidHooks = [];
|
|
259
|
+
const validHookNames = ['SessionStart', 'Stop', 'PreCompact', 'UserPromptSubmit'];
|
|
260
|
+
for (const hookName of Object.keys(settings.hooks)) {
|
|
261
|
+
if (!validHookNames.includes(hookName)) {
|
|
262
|
+
invalidHooks.push(hookName);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (invalidHooks.length > 0) {
|
|
266
|
+
checks.push({
|
|
267
|
+
category: 'Hooks Configuration',
|
|
268
|
+
status: 'fail',
|
|
269
|
+
message: 'Invalid hook names found',
|
|
270
|
+
details: invalidHooks.map(h => {
|
|
271
|
+
const suggested = h.split(':')[0];
|
|
272
|
+
return `${h} → should be: ${suggested}`;
|
|
273
|
+
}),
|
|
274
|
+
fixable: true,
|
|
275
|
+
fix: async () => {
|
|
276
|
+
const fixed = { ...settings };
|
|
277
|
+
for (const invalidHook of invalidHooks) {
|
|
278
|
+
const validName = invalidHook.split(':')[0];
|
|
279
|
+
if (validHookNames.includes(validName)) {
|
|
280
|
+
// Move the hook config to the valid name
|
|
281
|
+
fixed.hooks[validName] = fixed.hooks[invalidHook];
|
|
282
|
+
delete fixed.hooks[invalidHook];
|
|
283
|
+
console.log(chalk.green(` ✓ Renamed hook: ${invalidHook} → ${validName}`));
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
console.log(chalk.yellow(` ⚠ Removed invalid hook: ${invalidHook}`));
|
|
287
|
+
delete fixed.hooks[invalidHook];
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(fixed, null, 2));
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
checks.push({
|
|
296
|
+
category: 'Hooks Configuration',
|
|
297
|
+
status: 'pass',
|
|
298
|
+
message: 'Valid hook names',
|
|
299
|
+
fixable: false
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
return checks;
|
|
303
|
+
}
|
|
304
|
+
async function checkContextAndJournal(cwd, config) {
|
|
305
|
+
const checks = [];
|
|
306
|
+
// Check journal directory
|
|
307
|
+
if (!fs.existsSync(JOURNAL_DIR)) {
|
|
308
|
+
checks.push({
|
|
309
|
+
category: 'Journal',
|
|
310
|
+
status: 'warn',
|
|
311
|
+
message: 'Journal directory missing',
|
|
312
|
+
details: ['No .jfl/journal/ directory'],
|
|
313
|
+
fixable: true,
|
|
314
|
+
fix: async () => {
|
|
315
|
+
fs.mkdirSync(JOURNAL_DIR, { recursive: true });
|
|
316
|
+
console.log(chalk.green(' ✓ Created .jfl/journal/ directory'));
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
// Check if there's a journal entry for current session
|
|
322
|
+
const journalFiles = fs.readdirSync(JOURNAL_DIR).filter(f => f.endsWith('.jsonl'));
|
|
323
|
+
if (journalFiles.length === 0) {
|
|
324
|
+
checks.push({
|
|
325
|
+
category: 'Journal',
|
|
326
|
+
status: 'warn',
|
|
327
|
+
message: 'No journal entry for current session',
|
|
328
|
+
details: ['Run /end to document your work before ending session'],
|
|
329
|
+
fixable: false
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
checks.push({
|
|
334
|
+
category: 'Journal',
|
|
335
|
+
status: 'pass',
|
|
336
|
+
message: `${journalFiles.length} journal file(s) found`,
|
|
337
|
+
fixable: false
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Check Context Hub connectivity
|
|
342
|
+
try {
|
|
343
|
+
const response = await fetch('http://localhost:4242/health');
|
|
344
|
+
if (response.ok) {
|
|
345
|
+
checks.push({
|
|
346
|
+
category: 'Context Hub',
|
|
347
|
+
status: 'pass',
|
|
348
|
+
message: 'Reachable at http://localhost:4242',
|
|
349
|
+
fixable: false
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
checks.push({
|
|
354
|
+
category: 'Context Hub',
|
|
355
|
+
status: 'warn',
|
|
356
|
+
message: 'Context Hub responding with errors',
|
|
357
|
+
details: [`Status: ${response.status}`],
|
|
358
|
+
fixable: false
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
checks.push({
|
|
364
|
+
category: 'Context Hub',
|
|
365
|
+
status: 'warn',
|
|
366
|
+
message: 'Context Hub not reachable',
|
|
367
|
+
details: ['Run: jfl context-hub ensure'],
|
|
368
|
+
fixable: false
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
// Check MCP config
|
|
372
|
+
if (!fs.existsSync(MCP_CONFIG_PATH)) {
|
|
373
|
+
checks.push({
|
|
374
|
+
category: 'MCP Configuration',
|
|
375
|
+
status: 'warn',
|
|
376
|
+
message: 'No .mcp.json found',
|
|
377
|
+
details: ['jfl-context MCP server will not be available'],
|
|
378
|
+
fixable: true,
|
|
379
|
+
fix: async () => {
|
|
380
|
+
const defaultMcpConfig = {
|
|
381
|
+
mcpServers: {
|
|
382
|
+
'jfl-context': {
|
|
383
|
+
command: 'jfl-context-hub-mcp',
|
|
384
|
+
args: [],
|
|
385
|
+
env: {
|
|
386
|
+
CONTEXT_HUB_URL: 'http://localhost:4242'
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
fs.writeFileSync(MCP_CONFIG_PATH, JSON.stringify(defaultMcpConfig, null, 2));
|
|
392
|
+
console.log(chalk.green(' ✓ Created .mcp.json with jfl-context server'));
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
checks.push({
|
|
398
|
+
category: 'MCP Configuration',
|
|
399
|
+
status: 'pass',
|
|
400
|
+
message: 'MCP config present',
|
|
401
|
+
fixable: false
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
return checks;
|
|
405
|
+
}
|
|
406
|
+
async function checkSkills(cwd) {
|
|
407
|
+
const checks = [];
|
|
408
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
409
|
+
checks.push({
|
|
410
|
+
category: 'Skills',
|
|
411
|
+
status: 'warn',
|
|
412
|
+
message: 'Skills directory missing',
|
|
413
|
+
details: ['No .claude/skills/ directory'],
|
|
414
|
+
fixable: true,
|
|
415
|
+
fix: async () => {
|
|
416
|
+
fs.mkdirSync(SKILLS_DIR, { recursive: true });
|
|
417
|
+
console.log(chalk.green(' ✓ Created .claude/skills/ directory'));
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
return checks;
|
|
421
|
+
}
|
|
422
|
+
// Check for required skills
|
|
423
|
+
const requiredSkills = ['end'];
|
|
424
|
+
const missingSkills = [];
|
|
425
|
+
for (const skill of requiredSkills) {
|
|
426
|
+
const skillPath = path.join(SKILLS_DIR, skill);
|
|
427
|
+
if (!fs.existsSync(skillPath)) {
|
|
428
|
+
missingSkills.push(skill);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
if (missingSkills.length > 0) {
|
|
432
|
+
checks.push({
|
|
433
|
+
category: 'Skills',
|
|
434
|
+
status: 'warn',
|
|
435
|
+
message: 'Missing required skills',
|
|
436
|
+
details: missingSkills.map(s => `/${s} skill not deployed`),
|
|
437
|
+
fixable: false // jfl services deploy-skill handles this
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
// Check YAML frontmatter
|
|
442
|
+
const endSkillMd = path.join(SKILLS_DIR, 'end/SKILL.md');
|
|
443
|
+
if (fs.existsSync(endSkillMd)) {
|
|
444
|
+
const content = fs.readFileSync(endSkillMd, 'utf-8');
|
|
445
|
+
const hasYaml = content.startsWith('---\n');
|
|
446
|
+
if (!hasYaml) {
|
|
447
|
+
checks.push({
|
|
448
|
+
category: 'Skills',
|
|
449
|
+
status: 'warn',
|
|
450
|
+
message: '/end skill missing YAML frontmatter',
|
|
451
|
+
details: ['Skill may not be recognized by Claude Code'],
|
|
452
|
+
fixable: false
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
checks.push({
|
|
457
|
+
category: 'Skills',
|
|
458
|
+
status: 'pass',
|
|
459
|
+
message: '/end skill deployed\n YAML frontmatter valid',
|
|
460
|
+
fixable: false
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return checks;
|
|
466
|
+
}
|
|
467
|
+
async function checkHealth(cwd) {
|
|
468
|
+
const checks = [];
|
|
469
|
+
// Check for stale worktrees
|
|
470
|
+
try {
|
|
471
|
+
const worktreeList = execSync('git worktree list --porcelain', { cwd, encoding: 'utf-8' });
|
|
472
|
+
const worktrees = worktreeList.split('\n\n').filter(Boolean);
|
|
473
|
+
if (worktrees.length > 1) {
|
|
474
|
+
checks.push({
|
|
475
|
+
category: 'Health',
|
|
476
|
+
status: 'warn',
|
|
477
|
+
message: `${worktrees.length - 1} worktree(s) active`,
|
|
478
|
+
details: ['May indicate multiple concurrent sessions'],
|
|
479
|
+
fixable: false
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
checks.push({
|
|
484
|
+
category: 'Health',
|
|
485
|
+
status: 'pass',
|
|
486
|
+
message: 'No stale worktrees',
|
|
487
|
+
fixable: false
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
// Not a git repo or no worktrees - that's fine
|
|
493
|
+
}
|
|
494
|
+
// Check git state
|
|
495
|
+
try {
|
|
496
|
+
const status = execSync('git status --porcelain', { cwd, encoding: 'utf-8' });
|
|
497
|
+
if (status.trim()) {
|
|
498
|
+
checks.push({
|
|
499
|
+
category: 'Health',
|
|
500
|
+
status: 'warn',
|
|
501
|
+
message: 'Uncommitted changes detected',
|
|
502
|
+
details: ['Consider committing or documenting in journal'],
|
|
503
|
+
fixable: false
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
checks.push({
|
|
508
|
+
category: 'Health',
|
|
509
|
+
status: 'pass',
|
|
510
|
+
message: 'Git state clean',
|
|
511
|
+
fixable: false
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
// Not a git repo - skip this check
|
|
517
|
+
}
|
|
518
|
+
// Check journal write permissions
|
|
519
|
+
try {
|
|
520
|
+
const testFile = path.join(JOURNAL_DIR, '.write-test');
|
|
521
|
+
fs.writeFileSync(testFile, 'test');
|
|
522
|
+
fs.unlinkSync(testFile);
|
|
523
|
+
checks.push({
|
|
524
|
+
category: 'Health',
|
|
525
|
+
status: 'pass',
|
|
526
|
+
message: 'Journal directory writable',
|
|
527
|
+
fixable: false
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
checks.push({
|
|
532
|
+
category: 'Health',
|
|
533
|
+
status: 'fail',
|
|
534
|
+
message: 'Cannot write to journal directory',
|
|
535
|
+
details: ['Check permissions on .jfl/journal/'],
|
|
536
|
+
fixable: false
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
return checks;
|
|
540
|
+
}
|
|
541
|
+
// ============================================================================
|
|
542
|
+
// FIX APPLICATION
|
|
543
|
+
// ============================================================================
|
|
544
|
+
async function applyFixes(checks) {
|
|
545
|
+
console.log(chalk.cyan('\n━'.repeat(60)));
|
|
546
|
+
console.log(chalk.cyan.bold('APPLYING AUTO-FIXES:'));
|
|
547
|
+
console.log(chalk.cyan('━'.repeat(60)) + '\n');
|
|
548
|
+
const fixableChecks = checks.filter(c => c.fixable && c.fix && c.status !== 'pass');
|
|
549
|
+
if (fixableChecks.length === 0) {
|
|
550
|
+
console.log(chalk.gray('No auto-fixable issues found.\n'));
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
for (const check of fixableChecks) {
|
|
554
|
+
console.log(chalk.yellow(`Fixing: ${check.category} - ${check.message}`));
|
|
555
|
+
try {
|
|
556
|
+
await check.fix();
|
|
557
|
+
}
|
|
558
|
+
catch (error) {
|
|
559
|
+
console.log(chalk.red(` ✗ Fix failed: ${error}`));
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
console.log();
|
|
563
|
+
}
|
|
564
|
+
// ============================================================================
|
|
565
|
+
// DISPLAY
|
|
566
|
+
// ============================================================================
|
|
567
|
+
function displayResults(result, json = false) {
|
|
568
|
+
if (json) {
|
|
569
|
+
console.log(JSON.stringify(result, null, 2));
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
// Group checks by category
|
|
573
|
+
const categories = new Map();
|
|
574
|
+
for (const check of result.checks) {
|
|
575
|
+
if (!categories.has(check.category)) {
|
|
576
|
+
categories.set(check.category, []);
|
|
577
|
+
}
|
|
578
|
+
categories.get(check.category).push(check);
|
|
579
|
+
}
|
|
580
|
+
// Display each category
|
|
581
|
+
for (const [category, checks] of categories) {
|
|
582
|
+
const firstCheck = checks[0];
|
|
583
|
+
const icon = firstCheck.status === 'pass' ? '✓' : firstCheck.status === 'warn' ? '⚠' : '✗';
|
|
584
|
+
const color = firstCheck.status === 'pass' ? chalk.green : firstCheck.status === 'warn' ? chalk.yellow : chalk.red;
|
|
585
|
+
console.log(color(`[${icon}] ${category}`));
|
|
586
|
+
for (const check of checks) {
|
|
587
|
+
console.log(chalk.gray(` ${check.message}`));
|
|
588
|
+
if (check.details) {
|
|
589
|
+
for (const detail of check.details) {
|
|
590
|
+
console.log(chalk.gray(` → ${detail}`));
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
console.log();
|
|
595
|
+
}
|
|
596
|
+
// Summary
|
|
597
|
+
console.log(chalk.cyan('━'.repeat(60)));
|
|
598
|
+
console.log(chalk.cyan.bold('\nSummary:'));
|
|
599
|
+
console.log(chalk.green(` ${result.summary.passed} passed`));
|
|
600
|
+
if (result.summary.warnings > 0) {
|
|
601
|
+
console.log(chalk.yellow(` ${result.summary.warnings} warning(s)`));
|
|
602
|
+
}
|
|
603
|
+
if (result.summary.errors > 0) {
|
|
604
|
+
console.log(chalk.red(` ${result.summary.errors} error(s)`));
|
|
605
|
+
}
|
|
606
|
+
if (result.summary.fixable > 0) {
|
|
607
|
+
console.log(chalk.cyan(`\nRun ${chalk.bold('jfl services validate --fix')} to auto-repair ${result.summary.fixable} issue(s).`));
|
|
608
|
+
}
|
|
609
|
+
console.log();
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=service-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-validate.js","sourceRoot":"","sources":["../../src/commands/service-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Services Create Command
|
|
3
|
+
*
|
|
4
|
+
* Create new service with AI assistance and automatic GTM integration
|
|
5
|
+
*
|
|
6
|
+
* @purpose Create new services with wizard, templates, and AI assistance
|
|
7
|
+
*/
|
|
8
|
+
export interface CreateOptions {
|
|
9
|
+
name?: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
skipAI?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function servicesCreateCommand(options?: CreateOptions): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=services-create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services-create.d.ts","sourceRoot":"","sources":["../../src/commands/services-create.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAgBD,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FtF"}
|