pipecraft 0.37.4 → 0.39.2

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 (32) hide show
  1. package/README.md +50 -0
  2. package/dist/cli/index.js +152 -53
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/templates/actions/calculate-version.yml.tpl.d.ts.map +1 -1
  5. package/dist/templates/actions/calculate-version.yml.tpl.js +24 -2
  6. package/dist/templates/actions/calculate-version.yml.tpl.js.map +1 -1
  7. package/dist/templates/actions/create-pr.yml.tpl.js +1 -1
  8. package/dist/templates/actions/create-release.yml.tpl.js +1 -1
  9. package/dist/templates/actions/manage-branch.yml.tpl.js +1 -1
  10. package/dist/templates/actions/promote-branch.yml.tpl.js +1 -1
  11. package/dist/templates/workflows/pipeline.yml.tpl.d.ts.map +1 -1
  12. package/dist/templates/workflows/pipeline.yml.tpl.js +55 -25
  13. package/dist/templates/workflows/pipeline.yml.tpl.js.map +1 -1
  14. package/dist/templates/workflows/shared/operations-changes.js +1 -1
  15. package/dist/templates/workflows/shared/operations-domain-jobs.js +4 -4
  16. package/dist/templates/workflows/shared/operations-tag-promote.js +3 -3
  17. package/dist/templates/workflows/shared/operations-version.d.ts.map +1 -1
  18. package/dist/templates/workflows/shared/operations-version.js +7 -1
  19. package/dist/templates/workflows/shared/operations-version.js.map +1 -1
  20. package/dist/utils/doctor.d.ts +61 -0
  21. package/dist/utils/doctor.d.ts.map +1 -0
  22. package/dist/utils/doctor.js +647 -0
  23. package/dist/utils/doctor.js.map +1 -0
  24. package/dist/utils/github-setup.d.ts +38 -0
  25. package/dist/utils/github-setup.d.ts.map +1 -1
  26. package/dist/utils/github-setup.js +66 -11
  27. package/dist/utils/github-setup.js.map +1 -1
  28. package/dist/utils/skill-installer.d.ts +54 -0
  29. package/dist/utils/skill-installer.d.ts.map +1 -0
  30. package/dist/utils/skill-installer.js +251 -0
  31. package/dist/utils/skill-installer.js.map +1 -0
  32. package/package.json +15 -9
@@ -0,0 +1,647 @@
1
+ /**
2
+ * Pipecraft Doctor - Diagnostic Health Check
3
+ *
4
+ * Performs comprehensive health checks on a Pipecraft setup:
5
+ * - Configuration validation
6
+ * - GitHub workflow permissions
7
+ * - Branch existence on remote
8
+ * - Generated file verification
9
+ * - Workflow semantic validation
10
+ * - Domain path validation
11
+ *
12
+ * @module utils/doctor
13
+ */
14
+ import { execSync } from 'node:child_process';
15
+ import { existsSync, readFileSync } from 'node:fs';
16
+ import { join } from 'node:path';
17
+ import { glob } from 'glob';
18
+ import { loadConfig, validateConfig } from './config.js';
19
+ import { formatOrgActionsLockMessage, getGitHubToken, getOrgWorkflowPermissions, getRepositoryInfo, getRequiredPermissionChanges, getWorkflowPermissions } from './github-setup.js';
20
+ import { validateWorkflowSemantics } from './workflow-semantics.js';
21
+ // ============================================================================
22
+ // ANSI Color Utilities
23
+ // ============================================================================
24
+ const COLORS = {
25
+ reset: '\x1b[0m',
26
+ bold: '\x1b[1m',
27
+ dim: '\x1b[2m',
28
+ // Pipecraft brand - magenta/pink
29
+ magenta: '\x1b[35m',
30
+ brightMagenta: '\x1b[95m',
31
+ // Status colors
32
+ green: '\x1b[32m',
33
+ red: '\x1b[31m',
34
+ yellow: '\x1b[33m',
35
+ cyan: '\x1b[36m',
36
+ white: '\x1b[37m',
37
+ gray: '\x1b[90m'
38
+ };
39
+ function color(text, ...codes) {
40
+ return `${codes.join('')}${text}${COLORS.reset}`;
41
+ }
42
+ // ============================================================================
43
+ // Output Formatting
44
+ // ============================================================================
45
+ function formatStatus(status) {
46
+ switch (status) {
47
+ case 'success':
48
+ return color(' ✓ ', COLORS.green);
49
+ case 'error':
50
+ return color(' ✗ ', COLORS.red);
51
+ case 'warning':
52
+ return color(' ! ', COLORS.yellow);
53
+ }
54
+ }
55
+ function formatCheckLine(result) {
56
+ const status = formatStatus(result.status);
57
+ switch (result.status) {
58
+ case 'success':
59
+ return `${status} ${color(result.message, COLORS.green)}`;
60
+ case 'error':
61
+ return `${status} ${color(result.message, COLORS.red)}`;
62
+ case 'warning':
63
+ return `${status} ${color(result.message, COLORS.yellow)}`;
64
+ }
65
+ }
66
+ function formatCategoryHeader(name) {
67
+ return color(name, COLORS.brightMagenta, COLORS.bold);
68
+ }
69
+ function formatFixCommand(command) {
70
+ return color(command, COLORS.cyan);
71
+ }
72
+ export function formatDoctorOutput(result) {
73
+ const lines = [];
74
+ // Header
75
+ lines.push('');
76
+ lines.push(color('Pipecraft Doctor', COLORS.brightMagenta, COLORS.bold));
77
+ lines.push('');
78
+ // Categories
79
+ for (const category of result.categories) {
80
+ lines.push(formatCategoryHeader(category.name));
81
+ for (const check of category.results) {
82
+ lines.push(formatCheckLine(check));
83
+ }
84
+ lines.push('');
85
+ }
86
+ // Summary line
87
+ lines.push(color('─'.repeat(50), COLORS.gray));
88
+ if (result.errorCount === 0 && result.warningCount === 0) {
89
+ lines.push(color('All checks passed!', COLORS.green, COLORS.bold));
90
+ }
91
+ else {
92
+ const parts = [];
93
+ if (result.errorCount > 0) {
94
+ parts.push(color(`${result.errorCount} error${result.errorCount > 1 ? 's' : ''}`, COLORS.red));
95
+ }
96
+ if (result.warningCount > 0) {
97
+ parts.push(color(`${result.warningCount} warning${result.warningCount > 1 ? 's' : ''}`, COLORS.yellow));
98
+ }
99
+ lines.push(parts.join(', '));
100
+ }
101
+ // Fix suggestions
102
+ const fixes = result.categories
103
+ .flatMap(cat => cat.results)
104
+ .filter(r => r.status !== 'success' && r.fix);
105
+ if (fixes.length > 0) {
106
+ lines.push('');
107
+ lines.push(color('To fix:', COLORS.white, COLORS.bold));
108
+ lines.push('');
109
+ let fixNumber = 1;
110
+ for (const fix of fixes) {
111
+ if (fix.fix) {
112
+ lines.push(` ${color(`${fixNumber}.`, COLORS.white)} ${fix.fix.description}`);
113
+ if (fix.fix.command) {
114
+ lines.push(` ${formatFixCommand(fix.fix.command)}`);
115
+ }
116
+ lines.push('');
117
+ fixNumber++;
118
+ }
119
+ }
120
+ }
121
+ return lines.join('\n');
122
+ }
123
+ // ============================================================================
124
+ // Individual Checks
125
+ // ============================================================================
126
+ /**
127
+ * Check 1: Configuration validation
128
+ */
129
+ export function checkConfiguration() {
130
+ const results = [];
131
+ // Check if config file exists and is valid
132
+ try {
133
+ const config = loadConfig();
134
+ results.push({
135
+ status: 'success',
136
+ message: 'Config file found'
137
+ });
138
+ // Validate schema
139
+ try {
140
+ validateConfig(config);
141
+ results.push({
142
+ status: 'success',
143
+ message: 'Config schema valid'
144
+ });
145
+ }
146
+ catch (error) {
147
+ const message = error instanceof Error ? error.message : String(error);
148
+ results.push({
149
+ status: 'error',
150
+ message: `Config validation failed: ${message}`,
151
+ fix: {
152
+ description: 'Fix the configuration errors in .pipecraftrc',
153
+ command: 'pipecraft validate'
154
+ }
155
+ });
156
+ }
157
+ }
158
+ catch {
159
+ results.push({
160
+ status: 'error',
161
+ message: 'No config file found',
162
+ fix: {
163
+ description: 'Initialize Pipecraft configuration',
164
+ command: 'pipecraft init'
165
+ }
166
+ });
167
+ }
168
+ return { name: 'Configuration', results };
169
+ }
170
+ /**
171
+ * Check 2: GitHub workflow permissions
172
+ */
173
+ export async function checkGitHubPermissions() {
174
+ const results = [];
175
+ try {
176
+ // Get repository info
177
+ const repoInfo = getRepositoryInfo();
178
+ results.push({
179
+ status: 'success',
180
+ message: `Repository: ${repoInfo.owner}/${repoInfo.repo}`
181
+ });
182
+ // Get GitHub token
183
+ let token;
184
+ try {
185
+ token = getGitHubToken();
186
+ }
187
+ catch {
188
+ results.push({
189
+ status: 'error',
190
+ message: 'GitHub token not found',
191
+ fix: {
192
+ description: 'Authenticate with GitHub CLI',
193
+ command: 'gh auth login'
194
+ }
195
+ });
196
+ return { name: 'GitHub Setup', results };
197
+ }
198
+ // Check workflow permissions
199
+ try {
200
+ const permissions = await getWorkflowPermissions(repoInfo.owner, repoInfo.repo, token);
201
+ const changes = getRequiredPermissionChanges(permissions);
202
+ if (changes === null) {
203
+ results.push({
204
+ status: 'success',
205
+ message: 'Workflow permissions configured correctly'
206
+ });
207
+ }
208
+ else {
209
+ if (permissions.default_workflow_permissions !== 'write') {
210
+ results.push({
211
+ status: 'error',
212
+ message: 'Workflow permissions are read-only (should be read-write)',
213
+ fix: {
214
+ description: 'Configure GitHub workflow permissions',
215
+ command: 'pipecraft setup-github'
216
+ }
217
+ });
218
+ }
219
+ if (!permissions.can_approve_pull_request_reviews) {
220
+ // Proactively detect an organization-level lock. If the org itself
221
+ // disallows Actions creating/approving PRs, `pipecraft setup-github`
222
+ // cannot fix it (the write would 409) — only an org admin can. Surface
223
+ // that directly instead of recommending a command that will fail.
224
+ let orgLocked = false;
225
+ try {
226
+ const orgPermissions = await getOrgWorkflowPermissions(repoInfo.owner, token);
227
+ if (orgPermissions && orgPermissions.can_approve_pull_request_reviews === false) {
228
+ orgLocked = true;
229
+ }
230
+ }
231
+ catch {
232
+ // Indeterminate (no org-admin scope, not an org, network) — fall back.
233
+ }
234
+ if (orgLocked) {
235
+ results.push({
236
+ status: 'error',
237
+ message: 'Cannot create/approve PRs — blocked by organization policy (org admin action required)',
238
+ fix: {
239
+ description: formatOrgActionsLockMessage(repoInfo.owner),
240
+ command: `https://github.com/organizations/${repoInfo.owner}/settings/actions`
241
+ }
242
+ });
243
+ }
244
+ else {
245
+ results.push({
246
+ status: 'error',
247
+ message: 'Cannot create/approve PRs (should be enabled)',
248
+ fix: {
249
+ description: 'Enable PR creation permission',
250
+ command: 'pipecraft setup-github'
251
+ }
252
+ });
253
+ }
254
+ }
255
+ }
256
+ }
257
+ catch (error) {
258
+ const message = error instanceof Error ? error.message : String(error);
259
+ results.push({
260
+ status: 'warning',
261
+ message: `Could not check permissions: ${message}`
262
+ });
263
+ }
264
+ }
265
+ catch (error) {
266
+ const message = error instanceof Error ? error.message : String(error);
267
+ results.push({
268
+ status: 'error',
269
+ message: `Git remote not configured: ${message}`,
270
+ fix: {
271
+ description: 'Set up git remote origin',
272
+ command: 'git remote add origin <your-repo-url>'
273
+ }
274
+ });
275
+ }
276
+ return { name: 'GitHub Setup', results };
277
+ }
278
+ /**
279
+ * Check 3: Branches exist on remote
280
+ */
281
+ export function checkBranches() {
282
+ const results = [];
283
+ try {
284
+ const config = loadConfig();
285
+ if (!config.branchFlow || config.branchFlow.length === 0) {
286
+ results.push({
287
+ status: 'warning',
288
+ message: 'No branches configured in branchFlow'
289
+ });
290
+ return { name: 'Branches', results };
291
+ }
292
+ // Get remote branches
293
+ let remoteBranches;
294
+ try {
295
+ const output = execSync('git ls-remote --heads origin', {
296
+ encoding: 'utf8',
297
+ stdio: ['pipe', 'pipe', 'ignore']
298
+ });
299
+ remoteBranches = output
300
+ .split('\n')
301
+ .filter(line => line.trim())
302
+ .map(line => {
303
+ const match = line.match(/refs\/heads\/(.+)$/);
304
+ return match ? match[1] : '';
305
+ })
306
+ .filter(Boolean);
307
+ }
308
+ catch {
309
+ results.push({
310
+ status: 'warning',
311
+ message: 'Could not check remote branches (offline or no remote)',
312
+ fix: {
313
+ description: 'Ensure git remote is configured and accessible',
314
+ command: 'git remote -v'
315
+ }
316
+ });
317
+ return { name: 'Branches', results };
318
+ }
319
+ // Check each branch in branchFlow
320
+ for (const branch of config.branchFlow) {
321
+ if (remoteBranches.includes(branch)) {
322
+ results.push({
323
+ status: 'success',
324
+ message: `${branch} exists on origin`
325
+ });
326
+ }
327
+ else {
328
+ results.push({
329
+ status: 'warning',
330
+ message: `${branch} not found on origin`,
331
+ fix: {
332
+ description: `Push branch "${branch}" to remote`,
333
+ command: `git push -u origin ${branch}`
334
+ }
335
+ });
336
+ }
337
+ }
338
+ }
339
+ catch {
340
+ results.push({
341
+ status: 'warning',
342
+ message: 'Could not load config to check branches'
343
+ });
344
+ }
345
+ return { name: 'Branches', results };
346
+ }
347
+ /**
348
+ * Check 4: Required actions exist
349
+ */
350
+ export function checkGeneratedFiles() {
351
+ const results = [];
352
+ try {
353
+ const config = loadConfig();
354
+ const actionMode = config.actionSourceMode || 'local';
355
+ // Check pipeline.yml exists
356
+ const pipelinePath = join(process.cwd(), '.github/workflows/pipeline.yml');
357
+ if (existsSync(pipelinePath)) {
358
+ results.push({
359
+ status: 'success',
360
+ message: '.github/workflows/pipeline.yml'
361
+ });
362
+ }
363
+ else {
364
+ results.push({
365
+ status: 'error',
366
+ message: '.github/workflows/pipeline.yml not found',
367
+ fix: {
368
+ description: 'Generate workflow files',
369
+ command: 'pipecraft generate'
370
+ }
371
+ });
372
+ }
373
+ // Check actions only in local mode
374
+ if (actionMode === 'local') {
375
+ const actionsDir = join(process.cwd(), '.github/actions');
376
+ const expectedActions = [
377
+ 'calculate-version',
378
+ 'create-pr',
379
+ 'create-release',
380
+ 'create-tag',
381
+ 'detect-changes',
382
+ 'manage-branch',
383
+ 'promote-branch'
384
+ ];
385
+ for (const action of expectedActions) {
386
+ const actionPath = join(actionsDir, action);
387
+ if (existsSync(actionPath)) {
388
+ results.push({
389
+ status: 'success',
390
+ message: `.github/actions/${action}`
391
+ });
392
+ }
393
+ else {
394
+ results.push({
395
+ status: 'error',
396
+ message: `.github/actions/${action} not found`,
397
+ fix: {
398
+ description: 'Generate missing action',
399
+ command: 'pipecraft generate'
400
+ }
401
+ });
402
+ }
403
+ }
404
+ }
405
+ else if (actionMode === 'remote') {
406
+ // In remote mode, verify the workflow references remote actions correctly
407
+ const pipelinePath = join(process.cwd(), '.github/workflows/pipeline.yml');
408
+ if (existsSync(pipelinePath)) {
409
+ const pipelineContent = readFileSync(pipelinePath, 'utf8');
410
+ const actionVersion = config.actionVersion || 'main';
411
+ const expectedRemotePattern = `the-craftlab/pipecraft/actions/`;
412
+ if (pipelineContent.includes(expectedRemotePattern)) {
413
+ results.push({
414
+ status: 'success',
415
+ message: `Using remote actions (the-craftlab/pipecraft/actions/*@${actionVersion})`
416
+ });
417
+ }
418
+ else {
419
+ results.push({
420
+ status: 'warning',
421
+ message: `Workflow may not reference remote actions correctly`,
422
+ fix: {
423
+ description: 'Regenerate workflows with remote action mode',
424
+ command: 'pipecraft generate --force'
425
+ }
426
+ });
427
+ }
428
+ }
429
+ }
430
+ else if (actionMode === 'source') {
431
+ // In source mode (dogfooding), verify actions exist at ./actions/
432
+ const actionsDir = join(process.cwd(), 'actions');
433
+ const expectedActions = [
434
+ 'calculate-version',
435
+ 'create-pr',
436
+ 'create-release',
437
+ 'create-tag',
438
+ 'detect-changes',
439
+ 'manage-branch',
440
+ 'promote-branch'
441
+ ];
442
+ for (const action of expectedActions) {
443
+ const actionPath = join(actionsDir, action);
444
+ if (existsSync(actionPath)) {
445
+ results.push({
446
+ status: 'success',
447
+ message: `actions/${action}`
448
+ });
449
+ }
450
+ else {
451
+ results.push({
452
+ status: 'error',
453
+ message: `actions/${action} not found`,
454
+ fix: {
455
+ description: 'Ensure source actions exist',
456
+ command: undefined
457
+ }
458
+ });
459
+ }
460
+ }
461
+ }
462
+ }
463
+ catch {
464
+ // Config not found - just check pipeline.yml
465
+ const pipelinePath = join(process.cwd(), '.github/workflows/pipeline.yml');
466
+ if (existsSync(pipelinePath)) {
467
+ results.push({
468
+ status: 'success',
469
+ message: '.github/workflows/pipeline.yml'
470
+ });
471
+ }
472
+ else {
473
+ results.push({
474
+ status: 'error',
475
+ message: '.github/workflows/pipeline.yml not found',
476
+ fix: {
477
+ description: 'Generate workflow files',
478
+ command: 'pipecraft generate'
479
+ }
480
+ });
481
+ }
482
+ }
483
+ return { name: 'Generated Files', results };
484
+ }
485
+ /**
486
+ * Check 5: Workflow semantic validation
487
+ */
488
+ export function checkWorkflowSemantics() {
489
+ const results = [];
490
+ const pipelinePath = join(process.cwd(), '.github/workflows/pipeline.yml');
491
+ if (!existsSync(pipelinePath)) {
492
+ results.push({
493
+ status: 'warning',
494
+ message: 'Cannot validate workflow (pipeline.yml not found)'
495
+ });
496
+ return { name: 'Workflow Validation', results };
497
+ }
498
+ try {
499
+ const yamlContent = readFileSync(pipelinePath, 'utf8');
500
+ const validation = validateWorkflowSemantics(yamlContent);
501
+ if (validation.valid && validation.warnings.length === 0) {
502
+ results.push({
503
+ status: 'success',
504
+ message: 'No circular dependencies'
505
+ });
506
+ results.push({
507
+ status: 'success',
508
+ message: 'All job references valid'
509
+ });
510
+ }
511
+ else {
512
+ // Report errors
513
+ for (const error of validation.errors) {
514
+ results.push({
515
+ status: 'error',
516
+ message: error.message,
517
+ fix: {
518
+ description: 'Regenerate workflows to fix semantic errors',
519
+ command: 'pipecraft generate --force'
520
+ }
521
+ });
522
+ }
523
+ // Report warnings
524
+ for (const warning of validation.warnings) {
525
+ results.push({
526
+ status: 'warning',
527
+ message: warning.message
528
+ });
529
+ }
530
+ if (validation.errors.length === 0) {
531
+ results.push({
532
+ status: 'success',
533
+ message: 'No circular dependencies'
534
+ });
535
+ results.push({
536
+ status: 'success',
537
+ message: 'All job references valid'
538
+ });
539
+ }
540
+ }
541
+ }
542
+ catch (error) {
543
+ const message = error instanceof Error ? error.message : String(error);
544
+ results.push({
545
+ status: 'error',
546
+ message: `Failed to parse workflow: ${message}`
547
+ });
548
+ }
549
+ return { name: 'Workflow Validation', results };
550
+ }
551
+ /**
552
+ * Check 6: Domain paths match files
553
+ */
554
+ export async function checkDomainPaths() {
555
+ const results = [];
556
+ try {
557
+ const config = loadConfig();
558
+ if (!config.domains || Object.keys(config.domains).length === 0) {
559
+ results.push({
560
+ status: 'warning',
561
+ message: 'No domains configured'
562
+ });
563
+ return { name: 'Domain Paths', results };
564
+ }
565
+ for (const [domainName, domainConfig] of Object.entries(config.domains)) {
566
+ if (!domainConfig.paths || domainConfig.paths.length === 0) {
567
+ results.push({
568
+ status: 'warning',
569
+ message: `"${domainName}" has no paths configured`
570
+ });
571
+ continue;
572
+ }
573
+ // Check each path pattern
574
+ let totalMatches = 0;
575
+ for (const pattern of domainConfig.paths) {
576
+ try {
577
+ const matches = await glob(pattern, {
578
+ cwd: process.cwd(),
579
+ nodir: false,
580
+ ignore: ['node_modules/**', '.git/**']
581
+ });
582
+ totalMatches += matches.length;
583
+ }
584
+ catch {
585
+ // Glob error - continue with other patterns
586
+ }
587
+ }
588
+ if (totalMatches > 0) {
589
+ results.push({
590
+ status: 'success',
591
+ message: `"${domainName}" paths match ${totalMatches} file${totalMatches > 1 ? 's' : ''}`
592
+ });
593
+ }
594
+ else {
595
+ const pathsStr = domainConfig.paths.join(', ');
596
+ results.push({
597
+ status: 'warning',
598
+ message: `"${domainName}" matches 0 files (${pathsStr})`,
599
+ fix: {
600
+ description: `Check path patterns for "${domainName}" in .pipecraftrc`,
601
+ command: undefined
602
+ }
603
+ });
604
+ }
605
+ }
606
+ }
607
+ catch {
608
+ results.push({
609
+ status: 'warning',
610
+ message: 'Could not load config to check domain paths'
611
+ });
612
+ }
613
+ return { name: 'Domain Paths', results };
614
+ }
615
+ // ============================================================================
616
+ // Main Doctor Function
617
+ // ============================================================================
618
+ /**
619
+ * Run all diagnostic checks and return the results.
620
+ */
621
+ export async function runDoctor() {
622
+ const categories = [];
623
+ // Run all checks
624
+ categories.push(checkConfiguration());
625
+ categories.push(await checkGitHubPermissions());
626
+ categories.push(checkBranches());
627
+ categories.push(checkGeneratedFiles());
628
+ categories.push(checkWorkflowSemantics());
629
+ categories.push(await checkDomainPaths());
630
+ // Count errors and warnings
631
+ let errorCount = 0;
632
+ let warningCount = 0;
633
+ for (const category of categories) {
634
+ for (const result of category.results) {
635
+ if (result.status === 'error')
636
+ errorCount++;
637
+ if (result.status === 'warning')
638
+ warningCount++;
639
+ }
640
+ }
641
+ return {
642
+ categories,
643
+ errorCount,
644
+ warningCount
645
+ };
646
+ }
647
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/utils/doctor.ts"],"names":[],"mappings":"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"}