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.
Files changed (112) hide show
  1. package/README.md +77 -7
  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/gtm-process-update.d.ts +10 -0
  13. package/dist/commands/gtm-process-update.d.ts.map +1 -0
  14. package/dist/commands/gtm-process-update.js +101 -0
  15. package/dist/commands/gtm-process-update.js.map +1 -0
  16. package/dist/commands/onboard.d.ts.map +1 -1
  17. package/dist/commands/onboard.js +203 -15
  18. package/dist/commands/onboard.js.map +1 -1
  19. package/dist/commands/openclaw.d.ts +56 -0
  20. package/dist/commands/openclaw.d.ts.map +1 -0
  21. package/dist/commands/openclaw.js +700 -0
  22. package/dist/commands/openclaw.js.map +1 -0
  23. package/dist/commands/service-validate.d.ts +12 -0
  24. package/dist/commands/service-validate.d.ts.map +1 -0
  25. package/dist/commands/service-validate.js +611 -0
  26. package/dist/commands/service-validate.js.map +1 -0
  27. package/dist/commands/services-create.d.ts +15 -0
  28. package/dist/commands/services-create.d.ts.map +1 -0
  29. package/dist/commands/services-create.js +1452 -0
  30. package/dist/commands/services-create.js.map +1 -0
  31. package/dist/commands/services-sync-agents.d.ts +23 -0
  32. package/dist/commands/services-sync-agents.d.ts.map +1 -0
  33. package/dist/commands/services-sync-agents.js +207 -0
  34. package/dist/commands/services-sync-agents.js.map +1 -0
  35. package/dist/commands/services.d.ts +7 -1
  36. package/dist/commands/services.d.ts.map +1 -1
  37. package/dist/commands/services.js +347 -22
  38. package/dist/commands/services.js.map +1 -1
  39. package/dist/commands/update.js +0 -0
  40. package/dist/commands/validate-settings.d.ts +37 -0
  41. package/dist/commands/validate-settings.d.ts.map +1 -0
  42. package/dist/commands/validate-settings.js +197 -0
  43. package/dist/commands/validate-settings.js.map +1 -0
  44. package/dist/index.js +155 -60
  45. package/dist/index.js.map +1 -1
  46. package/dist/lib/agent-generator.d.ts.map +1 -1
  47. package/dist/lib/agent-generator.js +94 -1
  48. package/dist/lib/agent-generator.js.map +1 -1
  49. package/dist/lib/openclaw-registry.d.ts +48 -0
  50. package/dist/lib/openclaw-registry.d.ts.map +1 -0
  51. package/dist/lib/openclaw-registry.js +181 -0
  52. package/dist/lib/openclaw-registry.js.map +1 -0
  53. package/dist/lib/openclaw-sdk.d.ts +107 -0
  54. package/dist/lib/openclaw-sdk.d.ts.map +1 -0
  55. package/dist/lib/openclaw-sdk.js +208 -0
  56. package/dist/lib/openclaw-sdk.js.map +1 -0
  57. package/dist/lib/peer-agent-generator.d.ts +44 -0
  58. package/dist/lib/peer-agent-generator.d.ts.map +1 -0
  59. package/dist/lib/peer-agent-generator.js +286 -0
  60. package/dist/lib/peer-agent-generator.js.map +1 -0
  61. package/dist/lib/service-detector.d.ts +1 -1
  62. package/dist/lib/service-detector.d.ts.map +1 -1
  63. package/dist/lib/service-detector.js +118 -5
  64. package/dist/lib/service-detector.js.map +1 -1
  65. package/dist/lib/service-gtm.d.ts +157 -0
  66. package/dist/lib/service-gtm.d.ts.map +1 -0
  67. package/dist/lib/service-gtm.js +786 -0
  68. package/dist/lib/service-gtm.js.map +1 -0
  69. package/dist/lib/service-mcp-base.d.ts +10 -1
  70. package/dist/lib/service-mcp-base.d.ts.map +1 -1
  71. package/dist/lib/service-mcp-base.js +20 -1
  72. package/dist/lib/service-mcp-base.js.map +1 -1
  73. package/dist/mcp/service-peer-mcp.d.ts +36 -0
  74. package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
  75. package/dist/mcp/service-peer-mcp.js +220 -0
  76. package/dist/mcp/service-peer-mcp.js.map +1 -0
  77. package/dist/mcp/service-registry-mcp.js +0 -0
  78. package/dist/utils/settings-validator.d.ts +4 -1
  79. package/dist/utils/settings-validator.d.ts.map +1 -1
  80. package/dist/utils/settings-validator.js +25 -1
  81. package/dist/utils/settings-validator.js.map +1 -1
  82. package/package.json +2 -1
  83. package/template/.claude/service-settings.json +32 -0
  84. package/template/.claude/settings.json +10 -0
  85. package/template/.claude/skills/end/SKILL.md +1780 -0
  86. package/template/.jfl/config.json +2 -1
  87. package/template/.mcp.json +1 -7
  88. package/template/CLAUDE.md +1042 -248
  89. package/template/CLAUDE.md.bak +1187 -0
  90. package/template/scripts/commit-gtm.sh +56 -0
  91. package/template/scripts/commit-product.sh +68 -0
  92. package/template/scripts/migrate-to-branch-sessions.sh +201 -0
  93. package/template/scripts/session/auto-commit.sh +4 -3
  94. package/template/scripts/session/jfl-doctor.sh +222 -83
  95. package/template/scripts/session/session-cleanup.sh +109 -21
  96. package/template/scripts/session/session-end.sh +26 -13
  97. package/template/scripts/session/session-init.sh +280 -98
  98. package/template/scripts/session/test-critical-infrastructure.sh +293 -0
  99. package/template/scripts/session/test-experience-level.sh +336 -0
  100. package/template/scripts/session/test-session-cleanup.sh +268 -0
  101. package/template/scripts/session/test-session-sync.sh +320 -0
  102. package/template/scripts/where-am-i.sh +78 -0
  103. package/template/templates/service-agent/.claude/settings.json +32 -0
  104. package/template/templates/service-agent/CLAUDE.md +334 -0
  105. package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
  106. package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
  107. package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
  108. package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
  109. package/dist/commands/session-mgmt.d.ts +0 -33
  110. package/dist/commands/session-mgmt.d.ts.map +0 -1
  111. package/dist/commands/session-mgmt.js +0 -404
  112. 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"}