pipecraft 0.29.3 → 0.36.14

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 (142) hide show
  1. package/README.md +128 -54
  2. package/dist/cli/index.d.ts +3 -3
  3. package/dist/cli/index.js +68 -25
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/generators/init.tpl.d.ts +4 -4
  6. package/dist/generators/init.tpl.d.ts.map +1 -1
  7. package/dist/generators/init.tpl.js +214 -108
  8. package/dist/generators/init.tpl.js.map +1 -1
  9. package/dist/generators/workflows.tpl.d.ts +9 -9
  10. package/dist/generators/workflows.tpl.d.ts.map +1 -1
  11. package/dist/generators/workflows.tpl.js +33 -36
  12. package/dist/generators/workflows.tpl.js.map +1 -1
  13. package/dist/templates/actions/calculate-version.yml.tpl.d.ts +7 -4
  14. package/dist/templates/actions/calculate-version.yml.tpl.d.ts.map +1 -1
  15. package/dist/templates/actions/calculate-version.yml.tpl.js +49 -23
  16. package/dist/templates/actions/calculate-version.yml.tpl.js.map +1 -1
  17. package/dist/templates/actions/create-pr.yml.tpl.d.ts +5 -2
  18. package/dist/templates/actions/create-pr.yml.tpl.d.ts.map +1 -1
  19. package/dist/templates/actions/create-pr.yml.tpl.js +14 -8
  20. package/dist/templates/actions/create-pr.yml.tpl.js.map +1 -1
  21. package/dist/templates/actions/create-release.yml.tpl.d.ts +5 -2
  22. package/dist/templates/actions/create-release.yml.tpl.d.ts.map +1 -1
  23. package/dist/templates/actions/create-release.yml.tpl.js +16 -11
  24. package/dist/templates/actions/create-release.yml.tpl.js.map +1 -1
  25. package/dist/templates/actions/create-tag.yml.tpl.d.ts +5 -2
  26. package/dist/templates/actions/create-tag.yml.tpl.d.ts.map +1 -1
  27. package/dist/templates/actions/create-tag.yml.tpl.js +13 -9
  28. package/dist/templates/actions/create-tag.yml.tpl.js.map +1 -1
  29. package/dist/templates/actions/detect-changes.yml.tpl.d.ts +17 -51
  30. package/dist/templates/actions/detect-changes.yml.tpl.d.ts.map +1 -1
  31. package/dist/templates/actions/detect-changes.yml.tpl.js +130 -110
  32. package/dist/templates/actions/detect-changes.yml.tpl.js.map +1 -1
  33. package/dist/templates/actions/manage-branch.yml.tpl.d.ts +5 -2
  34. package/dist/templates/actions/manage-branch.yml.tpl.d.ts.map +1 -1
  35. package/dist/templates/actions/manage-branch.yml.tpl.js +13 -9
  36. package/dist/templates/actions/manage-branch.yml.tpl.js.map +1 -1
  37. package/dist/templates/actions/promote-branch.yml.tpl.d.ts +5 -2
  38. package/dist/templates/actions/promote-branch.yml.tpl.d.ts.map +1 -1
  39. package/dist/templates/actions/promote-branch.yml.tpl.js +39 -92
  40. package/dist/templates/actions/promote-branch.yml.tpl.js.map +1 -1
  41. package/dist/templates/release-it.cjs.tpl.d.ts +1 -1
  42. package/dist/templates/release-it.cjs.tpl.d.ts.map +1 -1
  43. package/dist/templates/release-it.cjs.tpl.js +38 -29
  44. package/dist/templates/release-it.cjs.tpl.js.map +1 -1
  45. package/dist/templates/workflows/enforce-pr-target.yml.tpl.d.ts +1 -1
  46. package/dist/templates/workflows/enforce-pr-target.yml.tpl.d.ts.map +1 -1
  47. package/dist/templates/workflows/enforce-pr-target.yml.tpl.js +2 -3
  48. package/dist/templates/workflows/enforce-pr-target.yml.tpl.js.map +1 -1
  49. package/dist/templates/workflows/pipeline.yml.tpl.d.ts +2 -2
  50. package/dist/templates/workflows/pipeline.yml.tpl.d.ts.map +1 -1
  51. package/dist/templates/workflows/pipeline.yml.tpl.js +337 -84
  52. package/dist/templates/workflows/pipeline.yml.tpl.js.map +1 -1
  53. package/dist/templates/workflows/pr-title-check.yml.tpl.d.ts +1 -1
  54. package/dist/templates/workflows/pr-title-check.yml.tpl.d.ts.map +1 -1
  55. package/dist/templates/workflows/pr-title-check.yml.tpl.js +101 -22
  56. package/dist/templates/workflows/pr-title-check.yml.tpl.js.map +1 -1
  57. package/dist/templates/workflows/shared/index.d.ts +4 -2
  58. package/dist/templates/workflows/shared/index.d.ts.map +1 -1
  59. package/dist/templates/workflows/shared/index.js +4 -2
  60. package/dist/templates/workflows/shared/index.js.map +1 -1
  61. package/dist/templates/workflows/shared/managed-workflow.d.ts +32 -0
  62. package/dist/templates/workflows/shared/managed-workflow.d.ts.map +1 -0
  63. package/dist/templates/workflows/shared/managed-workflow.js +51 -0
  64. package/dist/templates/workflows/shared/managed-workflow.js.map +1 -0
  65. package/dist/templates/workflows/shared/operations-changes.d.ts +13 -3
  66. package/dist/templates/workflows/shared/operations-changes.d.ts.map +1 -1
  67. package/dist/templates/workflows/shared/operations-changes.js +42 -16
  68. package/dist/templates/workflows/shared/operations-changes.js.map +1 -1
  69. package/dist/templates/workflows/shared/operations-domain-jobs.d.ts +18 -1
  70. package/dist/templates/workflows/shared/operations-domain-jobs.d.ts.map +1 -1
  71. package/dist/templates/workflows/shared/operations-domain-jobs.js +142 -17
  72. package/dist/templates/workflows/shared/operations-domain-jobs.js.map +1 -1
  73. package/dist/templates/workflows/shared/operations-gate.d.ts +6 -0
  74. package/dist/templates/workflows/shared/operations-gate.d.ts.map +1 -0
  75. package/dist/templates/workflows/shared/operations-gate.js +116 -0
  76. package/dist/templates/workflows/shared/operations-gate.js.map +1 -0
  77. package/dist/templates/workflows/shared/operations-header.d.ts +11 -1
  78. package/dist/templates/workflows/shared/operations-header.d.ts.map +1 -1
  79. package/dist/templates/workflows/shared/operations-header.js +66 -7
  80. package/dist/templates/workflows/shared/operations-header.js.map +1 -1
  81. package/dist/templates/workflows/shared/operations-tag-promote.d.ts +4 -3
  82. package/dist/templates/workflows/shared/operations-tag-promote.d.ts.map +1 -1
  83. package/dist/templates/workflows/shared/operations-tag-promote.js +144 -33
  84. package/dist/templates/workflows/shared/operations-tag-promote.js.map +1 -1
  85. package/dist/templates/workflows/shared/operations-version.d.ts +3 -2
  86. package/dist/templates/workflows/shared/operations-version.d.ts.map +1 -1
  87. package/dist/templates/workflows/shared/operations-version.js +17 -16
  88. package/dist/templates/workflows/shared/operations-version.js.map +1 -1
  89. package/dist/templates/yaml-format-utils.d.ts.map +1 -1
  90. package/dist/templates/yaml-format-utils.js +1 -5
  91. package/dist/templates/yaml-format-utils.js.map +1 -1
  92. package/dist/types/index.d.ts +65 -53
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/utils/action-reference.d.ts +73 -0
  95. package/dist/utils/action-reference.d.ts.map +1 -0
  96. package/dist/utils/action-reference.js +120 -0
  97. package/dist/utils/action-reference.js.map +1 -0
  98. package/dist/utils/ast-path-operations.d.ts +3 -3
  99. package/dist/utils/ast-path-operations.d.ts.map +1 -1
  100. package/dist/utils/ast-path-operations.js +58 -17
  101. package/dist/utils/ast-path-operations.js.map +1 -1
  102. package/dist/utils/config.d.ts +16 -5
  103. package/dist/utils/config.d.ts.map +1 -1
  104. package/dist/utils/config.js +69 -12
  105. package/dist/utils/config.js.map +1 -1
  106. package/dist/utils/github-setup.d.ts +7 -7
  107. package/dist/utils/github-setup.d.ts.map +1 -1
  108. package/dist/utils/github-setup.js +84 -63
  109. package/dist/utils/github-setup.js.map +1 -1
  110. package/dist/utils/logger.d.ts.map +1 -1
  111. package/dist/utils/logger.js.map +1 -1
  112. package/dist/utils/messaging.d.ts +2 -2
  113. package/dist/utils/messaging.d.ts.map +1 -1
  114. package/dist/utils/messaging.js +12 -8
  115. package/dist/utils/messaging.js.map +1 -1
  116. package/dist/utils/preflight.d.ts +2 -2
  117. package/dist/utils/preflight.d.ts.map +1 -1
  118. package/dist/utils/preflight.js +43 -41
  119. package/dist/utils/preflight.js.map +1 -1
  120. package/dist/utils/versioning.d.ts +1 -1
  121. package/dist/utils/versioning.d.ts.map +1 -1
  122. package/dist/utils/versioning.js +10 -10
  123. package/dist/utils/versioning.js.map +1 -1
  124. package/dist/utils/workflow-semantics.d.ts +61 -0
  125. package/dist/utils/workflow-semantics.d.ts.map +1 -0
  126. package/dist/utils/workflow-semantics.js +230 -0
  127. package/dist/utils/workflow-semantics.js.map +1 -0
  128. package/package.json +12 -4
  129. package/src/generators/init.tpl.ts +275 -128
  130. package/src/generators/workflows.tpl.ts +54 -57
  131. package/dist/templates/actions/detect-changes-nx.yml.tpl.d.ts +0 -32
  132. package/dist/templates/actions/detect-changes-nx.yml.tpl.d.ts.map +0 -1
  133. package/dist/templates/actions/detect-changes-nx.yml.tpl.js +0 -227
  134. package/dist/templates/actions/detect-changes-nx.yml.tpl.js.map +0 -1
  135. package/dist/templates/workflows/pipeline-nx.yml.tpl.d.ts +0 -22
  136. package/dist/templates/workflows/pipeline-nx.yml.tpl.d.ts.map +0 -1
  137. package/dist/templates/workflows/pipeline-nx.yml.tpl.js +0 -196
  138. package/dist/templates/workflows/pipeline-nx.yml.tpl.js.map +0 -1
  139. package/dist/utils/idempotency.d.ts +0 -187
  140. package/dist/utils/idempotency.d.ts.map +0 -1
  141. package/dist/utils/idempotency.js +0 -304
  142. package/dist/utils/idempotency.js.map +0 -1
@@ -7,128 +7,381 @@
7
7
  * Uses shared operations architecture for maintainability and consistency with Nx template.
8
8
  */
9
9
  import { renderTemplate, toFile } from '@featherscloud/pinion';
10
- import { parseDocument, stringify } from 'yaml';
11
10
  import fs from 'fs';
11
+ import { Document, parseDocument, Scalar, stringify, YAMLMap } from 'yaml';
12
12
  import { logger } from '../../utils/logger.js';
13
- import { applyPathOperations } from '../../utils/ast-path-operations.js';
14
13
  import { formatIfConditions } from '../yaml-format-utils.js';
15
- import { createHeaderOperations, createChangesJobOperation, createDomainTestJobOperations, createDomainDeployJobOperations, createDomainRemoteTestJobOperations, createVersionJobOperation, createTagPromoteReleaseOperations, getDomainJobNames } from './shared/index.js';
14
+ import { createChangesJobOperation, createHeaderOperations, createTagPromoteReleaseOperations, createVersionJobOperation, createManagedWorkflowDocument, stringifyManagedWorkflow, applyManagedWorkflowOperations } from './shared/index.js';
15
+ /**
16
+ * Extract user-customized section between markers from YAML content
17
+ * Returns content WITHOUT the markers themselves
18
+ * Uses unique delimiters as YAML comments (indentation-independent)
19
+ */
20
+ function extractUserSection(yamlContent) {
21
+ // Match markers as YAML comments: any leading whitespace + one or more # + optional whitespace + marker
22
+ // Example: " ### <--START CUSTOM JOBS-->"
23
+ const startMarkerRegex = /^.*#+\s*<--START CUSTOM JOBS-->\s*$/m;
24
+ const endMarkerRegex = /^.*#+\s*<--END CUSTOM JOBS-->\s*$/m;
25
+ const startMatch = yamlContent.match(startMarkerRegex);
26
+ const endMatch = yamlContent.match(endMarkerRegex);
27
+ if (!startMatch || !endMatch) {
28
+ return null;
29
+ }
30
+ const startIndex = startMatch.index + startMatch[0].length;
31
+ const endIndex = endMatch.index;
32
+ // Extract content between markers (NOT including the markers themselves)
33
+ let extracted = yamlContent.substring(startIndex, endIndex);
34
+ // Normalize whitespace: remove leading/trailing newlines
35
+ // These will be added back consistently during insertion
36
+ extracted = extracted.replace(/^\n+/, '');
37
+ extracted = extracted.replace(/\n+$/, '');
38
+ return extracted;
39
+ }
40
+ /**
41
+ * Generate placeholder jobs for domains with prefixes as YAML text
42
+ *
43
+ * @param domains - Domain configuration
44
+ * @returns YAML text for placeholder jobs, grouped by prefix
45
+ */
46
+ function generatePrefixedJobsText(domains) {
47
+ // Group jobs by prefix
48
+ const jobsByPrefix = {};
49
+ Object.keys(domains)
50
+ .sort()
51
+ .forEach(domain => {
52
+ const domainConfig = domains[domain];
53
+ logger.verbose(`📋 Domain ${domain}: prefixes = ${domainConfig.prefixes ? JSON.stringify(domainConfig.prefixes) : 'undefined'}`);
54
+ if (domainConfig.prefixes && Array.isArray(domainConfig.prefixes)) {
55
+ domainConfig.prefixes.forEach((prefix) => {
56
+ if (!jobsByPrefix[prefix]) {
57
+ jobsByPrefix[prefix] = [];
58
+ }
59
+ jobsByPrefix[prefix].push({
60
+ domain,
61
+ jobName: `${prefix}-${domain}`
62
+ });
63
+ });
64
+ }
65
+ });
66
+ // Generate YAML text for each prefix group
67
+ const jobTexts = [];
68
+ Object.keys(jobsByPrefix)
69
+ .sort()
70
+ .forEach(prefix => {
71
+ const jobs = jobsByPrefix[prefix];
72
+ jobs.forEach(job => {
73
+ const jobYaml = ` ${job.jobName}:
74
+ needs: changes
75
+ if: \${{ needs.changes.outputs.${job.domain} == 'true' }}
76
+ runs-on: ubuntu-latest
77
+ steps:
78
+ - uses: actions/checkout@v4
79
+ with:
80
+ ref: \${{ inputs.commitSha || github.sha }}
81
+ # TODO: Replace with your ${job.domain} ${prefix} logic
82
+ - name: Run ${prefix} for ${job.domain}
83
+ run: |
84
+ echo "Running ${prefix} for ${job.domain} domain"
85
+ echo "Replace this with your actual ${prefix} commands"
86
+ # Example: npm run ${prefix}:${job.domain}`;
87
+ jobTexts.push(jobYaml);
88
+ });
89
+ });
90
+ return jobTexts.join('\n\n');
91
+ }
92
+ /**
93
+ * Merge generated placeholder jobs with existing custom section content
94
+ *
95
+ * Only adds jobs that don't already exist in the custom section
96
+ *
97
+ * @param userSection - Existing custom section content (may be null)
98
+ * @param generatedJobs - Generated placeholder jobs text
99
+ * @returns Merged content
100
+ */
101
+ function mergeCustomJobsContent(userSection, generatedJobs) {
102
+ if (!generatedJobs) {
103
+ return userSection || '';
104
+ }
105
+ // Extract existing job names from userSection
106
+ const existingJobNames = new Set();
107
+ if (userSection) {
108
+ // Match job names: lines starting with spaces + jobname + :
109
+ const jobNameRegex = /^ {2}([a-zA-Z0-9_-]+):/gm;
110
+ let match;
111
+ while ((match = jobNameRegex.exec(userSection)) !== null) {
112
+ existingJobNames.add(match[1]);
113
+ }
114
+ }
115
+ logger.verbose(`📋 Existing custom job names: ${Array.from(existingJobNames).join(', ') || 'none'}`);
116
+ // Filter generated jobs to only include those that don't exist
117
+ const generatedJobLines = generatedJobs.split('\n\n');
118
+ const newJobs = [];
119
+ const skippedJobs = [];
120
+ generatedJobLines.forEach(jobText => {
121
+ // Extract job name from first line
122
+ const jobNameMatch = jobText.match(/^ {2}([a-zA-Z0-9_-]+):/);
123
+ if (jobNameMatch) {
124
+ const jobName = jobNameMatch[1];
125
+ if (!existingJobNames.has(jobName)) {
126
+ newJobs.push(jobText);
127
+ }
128
+ else {
129
+ skippedJobs.push(jobName);
130
+ }
131
+ }
132
+ });
133
+ logger.verbose(`📋 Generated ${newJobs.length} new placeholder job(s)`);
134
+ if (skippedJobs.length > 0) {
135
+ logger.verbose(`📋 Skipped ${skippedJobs.length} existing job(s): ${skippedJobs.join(', ')}`);
136
+ }
137
+ // Merge: existing jobs first, then new jobs
138
+ const parts = [];
139
+ if (userSection && userSection.trim()) {
140
+ parts.push(userSection);
141
+ }
142
+ if (newJobs.length > 0) {
143
+ parts.push(newJobs.join('\n\n'));
144
+ }
145
+ return parts.join('\n\n');
146
+ }
16
147
  /**
17
148
  * Main generator that handles merging with existing workflow
18
149
  */
19
150
  export const generate = (ctx) => Promise.resolve(ctx)
20
151
  .then(ctx => {
21
- const filePath = `${ctx.cwd || process.cwd()}/.github/workflows/pipeline.yml`;
152
+ const filePath = ctx.pipelinePath || `${ctx.cwd || process.cwd()}/.github/workflows/pipeline.yml`;
22
153
  const { config, branchFlow } = ctx;
23
154
  const domains = config?.domains || {};
24
- // Get domain job names for dependency management
25
- const { testJobs, deployJobs, remoteTestJobs } = getDomainJobNames(domains);
26
- // Build operations array
155
+ const fileExists = fs.existsSync(filePath);
156
+ let existingContent = '';
157
+ let existingEnv = null;
158
+ if (fileExists) {
159
+ existingContent = fs.readFileSync(filePath, 'utf8');
160
+ try {
161
+ const envDoc = parseDocument(existingContent);
162
+ const envNode = envDoc && typeof envDoc.get === 'function' ? envDoc.get('env') : null;
163
+ if (envNode && typeof envNode.toJSON === 'function') {
164
+ existingEnv = envNode.toJSON();
165
+ }
166
+ }
167
+ catch (error) {
168
+ logger.warn(`⚠️ Failed to parse existing pipeline for runtime defaults: ${error}`);
169
+ }
170
+ }
171
+ // Get job names from domains (supports both prefixes and legacy boolean flags)
172
+ // Build operations array - only managed jobs
27
173
  const operations = [
28
174
  // Header (name, run-name, on triggers)
29
- ...createHeaderOperations({ branchFlow }),
175
+ ...createHeaderOperations({
176
+ branchFlow,
177
+ nodeVersion: existingEnv?.NODE_VERSION ?? undefined,
178
+ pnpmVersion: existingEnv?.PNPM_VERSION ?? undefined
179
+ }),
30
180
  // Changes detection (path-based)
31
181
  createChangesJobOperation({
32
182
  domains,
33
- useNx: false,
34
- baseRef: config.finalBranch
183
+ baseRef: config.finalBranch,
184
+ config
35
185
  }),
36
- // NO nx-ci job for path-based (that's the key difference!)
37
- // Domain test jobs (preserved for user customization)
38
- ...createDomainTestJobOperations({ domains }),
39
- // Version calculation
186
+ // Version calculation (simplified - only depends on changes)
40
187
  createVersionJobOperation({
41
- testJobNames: testJobs,
42
- nxEnabled: false,
43
- baseRef: config.finalBranch
188
+ testJobNames: [], // No test job dependencies in new model
189
+ baseRef: config.finalBranch,
190
+ config
44
191
  }),
45
- // Domain deploy jobs (preserved for user customization)
46
- ...createDomainDeployJobOperations({ domains }),
47
- // Domain remote test jobs (preserved for user customization)
48
- ...createDomainRemoteTestJobOperations({ domains }),
192
+ // NOTE: Prefixed domain jobs are NOT generated via operations
193
+ // They are generated as text and merged into the custom section below
49
194
  // Tag, promote, release
50
195
  ...createTagPromoteReleaseOperations({
51
196
  branchFlow,
52
- deployJobNames: deployJobs,
53
- remoteTestJobNames: remoteTestJobs
197
+ autoPromote: typeof config.autoPromote === 'object' ? config.autoPromote : {},
198
+ config
54
199
  })
55
200
  ];
56
- // Check if file exists
57
- if (!fs.existsSync(filePath)) {
58
- logger.verbose('📝 Creating new path-based pipeline');
59
- // Create new document with empty YAML map
60
- const doc = parseDocument('{}');
61
- if (doc.contents) {
62
- applyPathOperations(doc.contents, operations, doc);
201
+ // Extract user-customized section and custom jobs from existing file if it exists
202
+ let userSection = null;
203
+ const customJobsFromExisting = [];
204
+ if (fileExists) {
205
+ userSection = extractUserSection(existingContent);
206
+ if (userSection) {
207
+ logger.verbose('📋 Found user-customized section between markers');
63
208
  }
64
- const yamlContent = stringify(doc, { lineWidth: 0, minContentWidth: 0 });
65
- const formattedContent = formatIfConditions(yamlContent);
66
- return { ...ctx, yamlContent: formattedContent, mergeStatus: 'created' };
67
- }
68
- // Parse existing file
69
- const existingContent = fs.readFileSync(filePath, 'utf8');
70
- const doc = parseDocument(existingContent);
71
- // Get managed jobs (always overwritten)
72
- const managedJobs = new Set(['changes', 'version', 'tag', 'promote', 'release']);
73
- // Get deprecated jobs (should be removed)
74
- const deprecatedJobs = new Set(['createpr', 'branch']);
75
- // Extract user jobs from existing (preserves comments!)
76
- const userJobs = new Map();
77
- const existingJobs = doc.contents && doc.contents.get ? doc.contents.get('jobs') : null;
78
- if (existingJobs && existingJobs.items) {
79
- for (const item of existingJobs.items) {
80
- const jobName = item.key?.toString();
81
- if (jobName &&
82
- !managedJobs.has(jobName) &&
83
- !deprecatedJobs.has(jobName) &&
84
- !testJobs.includes(jobName) &&
85
- !deployJobs.includes(jobName) &&
86
- !remoteTestJobs.includes(jobName)) {
87
- // This is a custom user job - preserve it completely
88
- userJobs.set(jobName, item);
209
+ // Also extract custom jobs (for force mode preservation)
210
+ const existingDoc = parseDocument(existingContent);
211
+ const existingJobs = existingDoc.contents && existingDoc.contents.get
212
+ ? existingDoc.contents.get('jobs')
213
+ : null;
214
+ const managedJobs = new Set(['changes', 'version', 'gate', 'tag', 'promote', 'release']);
215
+ if (existingJobs && existingJobs.items) {
216
+ for (const pair of existingJobs.items) {
217
+ const keyStr = pair.key instanceof Scalar ? pair.key.value : pair.key;
218
+ if (!managedJobs.has(keyStr)) {
219
+ customJobsFromExisting.push(pair);
220
+ }
89
221
  }
90
222
  }
91
- }
92
- // Clear all jobs before applying operations to prevent duplicates
93
- if (existingJobs && existingJobs.items) {
94
- ;
95
- existingJobs.items = [];
96
- }
97
- // Apply operations to update managed jobs
98
- if (doc.contents) {
99
- applyPathOperations(doc.contents, operations, doc);
100
- }
101
- // Add back user jobs (preserves their comments!)
102
- if (userJobs.size > 0) {
103
- logger.verbose(`📋 Preserving ${userJobs.size} user jobs: ${Array.from(userJobs.keys()).join(', ')}`);
104
- const jobsNode = doc.contents.get('jobs');
105
- if (jobsNode && jobsNode.items) {
106
- for (const [_, item] of userJobs) {
107
- jobsNode.items.push(item);
223
+ if (customJobsFromExisting.length > 0) {
224
+ logger.verbose(`📋 Found ${customJobsFromExisting.length} custom job(s) to preserve`);
225
+ // If no userSection but custom jobs exist, convert custom jobs to YAML text
226
+ if (!userSection && customJobsFromExisting.length > 0) {
227
+ // Stringify each job pair individually to get proper formatting
228
+ const jobTexts = [];
229
+ for (const pair of customJobsFromExisting) {
230
+ // Create a temp doc for this one job to get proper YAML formatting
231
+ const tempDoc = new Document(new YAMLMap());
232
+ tempDoc.contents.items = [pair];
233
+ let jobYaml = tempDoc.toString({
234
+ lineWidth: 0,
235
+ indent: 2,
236
+ defaultStringType: 'PLAIN',
237
+ defaultKeyType: 'PLAIN',
238
+ minContentWidth: 0
239
+ });
240
+ // Remove trailing newlines and add proper indentation (2 spaces for YAML jobs section)
241
+ jobYaml = jobYaml
242
+ .trim()
243
+ .split('\n')
244
+ .map(line => ' ' + line)
245
+ .join('\n');
246
+ jobTexts.push(jobYaml);
247
+ }
248
+ // Join all jobs with double newlines
249
+ userSection = jobTexts.join('\n\n');
250
+ logger.verbose('📋 Converted custom jobs to user section');
108
251
  }
109
252
  }
110
253
  }
111
- // Check for deprecated jobs
112
- const deprecatedFound = [];
113
- if (existingJobs && existingJobs.items) {
114
- for (const item of existingJobs.items) {
115
- const jobName = item.key?.toString();
116
- if (jobName && deprecatedJobs.has(jobName)) {
117
- deprecatedFound.push(jobName);
254
+ // In force mode or new file, create fresh document to ensure correct structure
255
+ if (!fileExists || ctx.pinion?.force) {
256
+ const logMessage = !fileExists
257
+ ? '📝 Creating new path-based pipeline'
258
+ : '🔄 Force mode: Rebuilding path-based pipeline from scratch';
259
+ logger.verbose(logMessage);
260
+ const headerComment = `=============================================================================
261
+ PIPECRAFT MANAGED WORKFLOW
262
+ =============================================================================
263
+
264
+ ✅ YOU CAN CUSTOMIZE:
265
+ - Custom jobs between the '# <--START CUSTOM JOBS-->' and '# <--END CUSTOM JOBS-->' comment markers
266
+ - Workflow name
267
+
268
+ ⚠️ PIPECRAFT MANAGES (do not modify):
269
+ - Workflow triggers, job dependencies, and conditionals
270
+ - Changes detection, version calculation, and tag creation
271
+ - Tag, promote, and release jobs
272
+
273
+ 📌 VERSION PROMOTION BEHAVIOR:
274
+ - Only commits that trigger a version bump will promote to staging/main
275
+ - Non-versioned commits (test, build, etc.) remain on develop
276
+ - This keeps staging/main aligned with tagged releases
277
+
278
+ Running 'pipecraft generate' updates managed sections while preserving
279
+ your customizations in test/deploy/remote-test jobs.
280
+
281
+ 📖 Learn more: https://pipecraft.thecraftlab.dev
282
+ =============================================================================`;
283
+ const doc = createManagedWorkflowDocument(headerComment, operations, ctx);
284
+ // Stringify to YAML
285
+ let yamlContent = stringifyManagedWorkflow(doc);
286
+ // Generate placeholder jobs from prefixes and merge with existing custom section
287
+ const generatedPlaceholders = generatePrefixedJobsText(domains);
288
+ // Debug: log generated job names
289
+ const generatedJobNames = generatedPlaceholders
290
+ .split('\n\n')
291
+ .map(j => j.match(/^ {2}([a-zA-Z0-9_-]+):/))
292
+ .filter(m => m)
293
+ .map(m => m[1]);
294
+ logger.verbose(`📋 Generated ${generatedJobNames.length} placeholder jobs: ${generatedJobNames.join(', ')}`);
295
+ const mergedCustomContent = mergeCustomJobsContent(userSection, generatedPlaceholders);
296
+ // Insert merged custom section (user jobs + generated placeholders)
297
+ if (mergedCustomContent && mergedCustomContent.trim().length > 0) {
298
+ // Find the version job's outputs section
299
+ const versionOutputsPattern = /^ {2}version:\s*\n(?:.*\n)*? {4}outputs:\s*\n\s*version:.*$/m;
300
+ const match = yamlContent.match(versionOutputsPattern);
301
+ if (match) {
302
+ const insertionIndex = match.index + match[0].length;
303
+ const userSectionWithMarkers = `# <--START CUSTOM JOBS-->\n\n${mergedCustomContent}\n\n # <--END CUSTOM JOBS-->`;
304
+ yamlContent =
305
+ yamlContent.slice(0, insertionIndex) +
306
+ '\n\n ' +
307
+ userSectionWithMarkers +
308
+ '\n' +
309
+ yamlContent.slice(insertionIndex);
310
+ logger.verbose('📋 Inserted custom jobs section (user + generated placeholders) after version job');
118
311
  }
119
312
  }
313
+ else if (!fileExists) {
314
+ // For new files, add placeholder markers
315
+ const versionOutputsPattern = /^( {2}version:\s*\n(?:.*\n)*? {4}outputs:\s*\n\s*version:.*)$/m;
316
+ yamlContent = yamlContent.replace(versionOutputsPattern, '$1\n\n # <--START CUSTOM JOBS-->\n\n # <--END CUSTOM JOBS-->\n');
317
+ logger.verbose('📝 Added placeholder user section markers');
318
+ }
319
+ const formattedContent = formatIfConditions(yamlContent);
320
+ const status = mergedCustomContent ? 'merged' : fileExists ? 'rebuilt' : 'created';
321
+ return { ...ctx, yamlContent: formattedContent, mergeStatus: status };
120
322
  }
121
- if (deprecatedFound.length > 0) {
122
- logger.verbose(`🗑️ Removed deprecated jobs: ${deprecatedFound.join(', ')}`);
323
+ // Parse existing file for merge mode (no force flag)
324
+ const freshContent = fs.readFileSync(filePath, 'utf8');
325
+ const doc = parseDocument(freshContent);
326
+ applyManagedWorkflowOperations(doc, operations, ctx);
327
+ // Stringify to YAML
328
+ let yamlContent = stringify(doc, {
329
+ lineWidth: 0,
330
+ indent: 2,
331
+ defaultStringType: 'PLAIN',
332
+ defaultKeyType: 'PLAIN',
333
+ minContentWidth: 0
334
+ });
335
+ // Insert user section after version job if it exists
336
+ // Find the version job's outputs section
337
+ const versionOutputsPattern = /^ {2}version:\s*\n(?:.*\n)*? {4}outputs:\s*\n\s*version:.*$/m;
338
+ const match = yamlContent.match(versionOutputsPattern);
339
+ if (match) {
340
+ const insertionIndex = match.index + match[0].length;
341
+ // If no user section exists, create default with test-gate example
342
+ const defaultCustomSection = `#=============================================================================
343
+ # CUSTOM JOBS SECTION (✅ Add your test, deploy, and remote-test jobs here)
344
+ #=============================================================================
345
+ # This section is preserved across regenerations. Add your custom jobs between
346
+ # the START and END markers below.
347
+ #
348
+ # Example: test-gate pattern (recommended for production workflows)
349
+ # Uncomment and customize the example below to prevent deployments when tests fail.
350
+
351
+ # test-gate:
352
+ # needs: [ ] # TODO: Add all test job names (e.g., test-api, test-frontend)
353
+ # if: always() # TODO: Add failure checks and success conditions
354
+ # runs-on: ubuntu-latest
355
+ # steps:
356
+ # - run: echo "✅ All tests passed"`;
357
+ const contentToInsert = userSection || defaultCustomSection;
358
+ const userSectionWithMarkers = `# <--START CUSTOM JOBS-->\n\n${contentToInsert}\n\n # <--END CUSTOM JOBS-->`;
359
+ if (userSection) {
360
+ logger.verbose('📋 Inserting preserved user section between markers');
361
+ }
362
+ else {
363
+ logger.verbose('📝 Creating default custom section with test-gate example');
364
+ }
365
+ yamlContent =
366
+ yamlContent.slice(0, insertionIndex) +
367
+ '\n\n ' +
368
+ userSectionWithMarkers +
369
+ '\n' +
370
+ yamlContent.slice(insertionIndex);
123
371
  }
124
- const status = userJobs.size > 0 ? 'merged' : 'updated';
125
- const yamlContent = stringify(doc, { lineWidth: 0, minContentWidth: 0 });
126
372
  const formattedContent = formatIfConditions(yamlContent);
373
+ const status = userSection ? 'merged' : 'updated';
127
374
  return { ...ctx, yamlContent: formattedContent, mergeStatus: status };
128
375
  })
129
376
  .then(ctx => {
130
377
  const outputPath = ctx.outputPipelinePath || '.github/workflows/pipeline.yml';
131
- const status = ctx.mergeStatus === 'merged' ? '🔄 Merged with existing' : ctx.mergeStatus === 'updated' ? '🔄 Updated existing' : '📝 Created new';
378
+ const status = ctx.mergeStatus === 'merged'
379
+ ? '🔄 Merged with existing'
380
+ : ctx.mergeStatus === 'updated'
381
+ ? '🔄 Updated existing'
382
+ : ctx.mergeStatus === 'rebuilt'
383
+ ? '🔄 Rebuilt from scratch'
384
+ : '📝 Created new';
132
385
  logger.verbose(`${status} ${outputPath}`);
133
386
  return ctx;
134
387
  })
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.yml.tpl.js","sourceRoot":"","sources":["../../../src/templates/workflows/pipeline.yml.tpl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.yml.tpl.js","sourceRoot":"","sources":["../../../src/templates/workflows/pipeline.yml.tpl.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@
25
25
  * })
26
26
  * ```
27
27
  */
28
- import { PinionContext } from '@featherscloud/pinion';
28
+ import { type PinionContext } from '@featherscloud/pinion';
29
29
  /**
30
30
  * Generates the pr-title-check.yml workflow file.
31
31
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pr-title-check.yml.tpl.d.ts","sourceRoot":"","sources":["../../../src/templates/workflows/pr-title-check.yml.tpl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,aAAa,EAA0B,MAAM,uBAAuB,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,aAAa,iBA6ErC,CAAA"}
1
+ {"version":3,"file":"pr-title-check.yml.tpl.d.ts","sourceRoot":"","sources":["../../../src/templates/workflows/pr-title-check.yml.tpl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,KAAK,aAAa,EAA0B,MAAM,uBAAuB,CAAA;AAElF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,aAAa,iBAgKvC,CAAA"}