@electriccitizen/bolt 0.1.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 (92) hide show
  1. package/README.md +361 -0
  2. package/dist/adapters/ddev.d.ts +16 -0
  3. package/dist/adapters/ddev.js +75 -0
  4. package/dist/adapters/ddev.js.map +1 -0
  5. package/dist/adapters/index.d.ts +1 -0
  6. package/dist/adapters/index.js +2 -0
  7. package/dist/adapters/index.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +167 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +4 -0
  12. package/dist/commands/doctor.js +263 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/init.d.ts +12 -0
  15. package/dist/commands/init.js +319 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/pr.d.ts +20 -0
  18. package/dist/commands/pr.js +282 -0
  19. package/dist/commands/pr.js.map +1 -0
  20. package/dist/commands/refresh.d.ts +22 -0
  21. package/dist/commands/refresh.js +375 -0
  22. package/dist/commands/refresh.js.map +1 -0
  23. package/dist/commands/suppress.d.ts +10 -0
  24. package/dist/commands/suppress.js +86 -0
  25. package/dist/commands/suppress.js.map +1 -0
  26. package/dist/commands/test.d.ts +5 -0
  27. package/dist/commands/test.js +106 -0
  28. package/dist/commands/test.js.map +1 -0
  29. package/dist/commands/update.d.ts +26 -0
  30. package/dist/commands/update.js +573 -0
  31. package/dist/commands/update.js.map +1 -0
  32. package/dist/config.d.ts +47 -0
  33. package/dist/config.js +187 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/formatters/index.d.ts +2 -0
  36. package/dist/formatters/index.js +3 -0
  37. package/dist/formatters/index.js.map +1 -0
  38. package/dist/formatters/json.d.ts +5 -0
  39. package/dist/formatters/json.js +7 -0
  40. package/dist/formatters/json.js.map +1 -0
  41. package/dist/formatters/markdown.d.ts +5 -0
  42. package/dist/formatters/markdown.js +144 -0
  43. package/dist/formatters/markdown.js.map +1 -0
  44. package/dist/formatters/text.d.ts +5 -0
  45. package/dist/formatters/text.js +123 -0
  46. package/dist/formatters/text.js.map +1 -0
  47. package/dist/plugins/accessibility.d.ts +5 -0
  48. package/dist/plugins/accessibility.js +116 -0
  49. package/dist/plugins/accessibility.js.map +1 -0
  50. package/dist/plugins/browser-smoke.d.ts +6 -0
  51. package/dist/plugins/browser-smoke.js +331 -0
  52. package/dist/plugins/browser-smoke.js.map +1 -0
  53. package/dist/plugins/field-interaction.d.ts +6 -0
  54. package/dist/plugins/field-interaction.js +570 -0
  55. package/dist/plugins/field-interaction.js.map +1 -0
  56. package/dist/plugins/index.d.ts +6 -0
  57. package/dist/plugins/index.js +28 -0
  58. package/dist/plugins/index.js.map +1 -0
  59. package/dist/plugins/linkit.d.ts +8 -0
  60. package/dist/plugins/linkit.js +170 -0
  61. package/dist/plugins/linkit.js.map +1 -0
  62. package/dist/plugins/media-browser.d.ts +6 -0
  63. package/dist/plugins/media-browser.js +257 -0
  64. package/dist/plugins/media-browser.js.map +1 -0
  65. package/dist/plugins/structural-smoke.d.ts +6 -0
  66. package/dist/plugins/structural-smoke.js +90 -0
  67. package/dist/plugins/structural-smoke.js.map +1 -0
  68. package/dist/plugins/visual-regression.d.ts +8 -0
  69. package/dist/plugins/visual-regression.js +214 -0
  70. package/dist/plugins/visual-regression.js.map +1 -0
  71. package/dist/plugins/wysiwyg.d.ts +8 -0
  72. package/dist/plugins/wysiwyg.js +221 -0
  73. package/dist/plugins/wysiwyg.js.map +1 -0
  74. package/dist/runner.d.ts +21 -0
  75. package/dist/runner.js +293 -0
  76. package/dist/runner.js.map +1 -0
  77. package/dist/suppression.d.ts +55 -0
  78. package/dist/suppression.js +223 -0
  79. package/dist/suppression.js.map +1 -0
  80. package/dist/types.d.ts +178 -0
  81. package/dist/types.js +5 -0
  82. package/dist/types.js.map +1 -0
  83. package/modules/bolt_inspect/bolt_inspect.info.yml +6 -0
  84. package/modules/bolt_inspect/bolt_inspect.services.yml +22 -0
  85. package/modules/bolt_inspect/composer.json +16 -0
  86. package/modules/bolt_inspect/drush.services.yml +10 -0
  87. package/modules/bolt_inspect/src/Drush/Commands/BoltInspectCommands.php +203 -0
  88. package/modules/bolt_inspect/src/Service/ContentGenerator.php +586 -0
  89. package/modules/bolt_inspect/src/Service/SiteProfiler.php +362 -0
  90. package/modules/bolt_inspect/src/Service/TestEntityTracker.php +98 -0
  91. package/package.json +46 -0
  92. package/scripts/setup.sh +34 -0
@@ -0,0 +1,282 @@
1
+ /**
2
+ * bolt pr — create GitHub PRs from update branches.
3
+ *
4
+ * Works with individual branches or batch mode (--all) to create
5
+ * one PR per update branch produced by `bolt update`.
6
+ */
7
+ import { execFile } from 'child_process';
8
+ import { promisify } from 'util';
9
+ const execFileAsync = promisify(execFile);
10
+ /** Write progress messages to stderr. */
11
+ function log(msg) {
12
+ process.stderr.write(` ${msg}\n`);
13
+ }
14
+ function logOk(msg) {
15
+ process.stderr.write(` ✓ ${msg}\n`);
16
+ }
17
+ function logFail(msg) {
18
+ process.stderr.write(` ✗ ${msg}\n`);
19
+ }
20
+ function logWarn(msg) {
21
+ process.stderr.write(` ⚠ ${msg}\n`);
22
+ }
23
+ async function exec(command, args, timeoutMs = 60_000) {
24
+ try {
25
+ const { stdout, stderr } = await execFileAsync(command, args, {
26
+ maxBuffer: 10 * 1024 * 1024,
27
+ timeout: timeoutMs,
28
+ });
29
+ return { stdout, stderr, exitCode: 0 };
30
+ }
31
+ catch (err) {
32
+ if (err instanceof Error) {
33
+ const execErr = err;
34
+ return {
35
+ stdout: execErr.stdout ?? '',
36
+ stderr: execErr.stderr ?? err.message,
37
+ exitCode: typeof execErr.code === 'number' ? execErr.code : 1,
38
+ };
39
+ }
40
+ return { stdout: '', stderr: String(err), exitCode: 1 };
41
+ }
42
+ }
43
+ /**
44
+ * Get the current git branch name.
45
+ */
46
+ async function getCurrentBranch() {
47
+ const result = await exec('git', ['rev-parse', '--abbrev-ref', 'HEAD']);
48
+ return result.stdout.trim();
49
+ }
50
+ /**
51
+ * Find all local branches matching `update/*`.
52
+ */
53
+ async function findUpdateBranches() {
54
+ const result = await exec('git', ['branch', '--list', 'update/*']);
55
+ if (result.exitCode !== 0 || !result.stdout.trim())
56
+ return [];
57
+ return result.stdout
58
+ .trim()
59
+ .split('\n')
60
+ .map((line) => line.replace(/^\*?\s+/, '').trim())
61
+ .filter((name) => name.startsWith('update/'));
62
+ }
63
+ async function parseUpdateInfo(branch, baseBranch) {
64
+ // Get the commit message(s) on this branch relative to base.
65
+ const result = await exec('git', [
66
+ 'log', `${baseBranch}..${branch}`, '--format=%B', '--reverse',
67
+ ]);
68
+ if (result.exitCode !== 0 || !result.stdout.trim())
69
+ return null;
70
+ const fullMessage = result.stdout.trim();
71
+ const firstLine = fullMessage.split('\n')[0];
72
+ // Parse: "Update drupal/token from 1.14.0 to 1.15.0"
73
+ const match = firstLine.match(/^Update\s+(\S+)\s+from\s+(\S+)\s+to\s+(\S+)$/);
74
+ if (!match) {
75
+ // Fallback: try to extract from branch name (update/<package>-<version>).
76
+ const branchMatch = branch.match(/^update\/(.+)-([^-]+)$/);
77
+ if (branchMatch) {
78
+ return {
79
+ package: branchMatch[1].replace(/-/g, '/'),
80
+ oldVersion: '?',
81
+ newVersion: branchMatch[2],
82
+ commitBody: fullMessage,
83
+ };
84
+ }
85
+ return null;
86
+ }
87
+ return {
88
+ package: match[1],
89
+ oldVersion: match[2],
90
+ newVersion: match[3],
91
+ commitBody: fullMessage.split('\n').slice(1).join('\n').trim(),
92
+ };
93
+ }
94
+ /**
95
+ * Build the PR body from update info.
96
+ */
97
+ function buildPrBody(info) {
98
+ const lines = [];
99
+ lines.push(`## Module Update: ${info.package} ${info.oldVersion} → ${info.newVersion}`);
100
+ lines.push('');
101
+ // Parse structured info from commit body if available.
102
+ if (info.commitBody) {
103
+ lines.push('### Details');
104
+ // Extract each line from the commit body.
105
+ const bodyLines = info.commitBody.split('\n').filter((l) => l.trim());
106
+ for (const line of bodyLines) {
107
+ if (line.startsWith('Composer:') || line.startsWith('Database:') ||
108
+ line.startsWith('Config:') || line.startsWith('Bolt test:')) {
109
+ lines.push(`- ${line}`);
110
+ }
111
+ }
112
+ lines.push('');
113
+ }
114
+ lines.push('---');
115
+ lines.push('Generated by [Bolt](https://github.com/electriccitizen/bolt)');
116
+ return lines.join('\n');
117
+ }
118
+ /**
119
+ * Check if `gh` CLI is available.
120
+ */
121
+ async function hasGhCli() {
122
+ const result = await exec('gh', ['--version']);
123
+ return result.exitCode === 0;
124
+ }
125
+ /**
126
+ * Check if a PR already exists for a branch.
127
+ */
128
+ async function prExists(branch) {
129
+ const result = await exec('gh', [
130
+ 'pr', 'list', '--head', branch, '--json', 'url', '--limit', '1',
131
+ ]);
132
+ if (result.exitCode !== 0)
133
+ return null;
134
+ try {
135
+ const prs = JSON.parse(result.stdout);
136
+ if (Array.isArray(prs) && prs.length > 0) {
137
+ return prs[0].url;
138
+ }
139
+ }
140
+ catch {
141
+ // Ignore parse errors.
142
+ }
143
+ return null;
144
+ }
145
+ /**
146
+ * Create a PR for a single branch.
147
+ */
148
+ async function createPrForBranch(branch, prConfig, options) {
149
+ const baseBranch = options.base || prConfig.base_branch || 'main';
150
+ const remote = prConfig.remote || 'origin';
151
+ const isDraft = options.draft || prConfig.draft;
152
+ // Parse update info from commit.
153
+ const info = await parseUpdateInfo(branch, baseBranch);
154
+ // Build title and body.
155
+ let title;
156
+ let body;
157
+ if (info) {
158
+ title = `Update ${info.package} from ${info.oldVersion} to ${info.newVersion}`;
159
+ body = buildPrBody(info);
160
+ }
161
+ else {
162
+ // Fallback for non-update branches.
163
+ title = branch.replace('update/', 'Update: ').replace(/-/g, ' ');
164
+ body = `Branch: ${branch}\n\n---\nGenerated by [Bolt](https://github.com/electriccitizen/bolt)`;
165
+ }
166
+ // Check if PR already exists.
167
+ const existingUrl = await prExists(branch);
168
+ if (existingUrl) {
169
+ return { branch, status: 'exists', url: existingUrl };
170
+ }
171
+ // Push branch to remote.
172
+ log(`Pushing ${branch} to ${remote}...`);
173
+ const pushResult = await exec('git', ['push', '-u', remote, branch], 120_000);
174
+ if (pushResult.exitCode !== 0) {
175
+ return { branch, status: 'fail', error: `Push failed: ${pushResult.stderr.trim()}` };
176
+ }
177
+ // Build gh pr create args.
178
+ const ghArgs = ['pr', 'create',
179
+ '--base', baseBranch,
180
+ '--head', branch,
181
+ '--title', title,
182
+ '--body', body,
183
+ ];
184
+ if (isDraft) {
185
+ ghArgs.push('--draft');
186
+ }
187
+ // Merge reviewers from --reviewers flag and config.
188
+ const reviewers = new Set();
189
+ if (options.reviewers) {
190
+ for (const r of options.reviewers.split(',').map((s) => s.trim())) {
191
+ if (r)
192
+ reviewers.add(r);
193
+ }
194
+ }
195
+ for (const r of prConfig.default_reviewers) {
196
+ reviewers.add(r);
197
+ }
198
+ if (reviewers.size > 0) {
199
+ ghArgs.push('--reviewer', [...reviewers].join(','));
200
+ }
201
+ // Create PR.
202
+ const prResult = await exec('gh', ghArgs, 30_000);
203
+ if (prResult.exitCode !== 0) {
204
+ return { branch, status: 'fail', error: `gh pr create failed: ${prResult.stderr.trim()}` };
205
+ }
206
+ const url = prResult.stdout.trim();
207
+ return { branch, status: 'created', url };
208
+ }
209
+ export async function prCommand(options) {
210
+ const config = options.boltConfig;
211
+ const prConfig = config?.pr ?? {
212
+ base_branch: 'main',
213
+ default_reviewers: [],
214
+ draft: false,
215
+ remote: 'origin',
216
+ };
217
+ process.stderr.write('\nbolt pr\n');
218
+ process.stderr.write('━'.repeat(50) + '\n\n');
219
+ // Check for gh CLI.
220
+ if (!(await hasGhCli())) {
221
+ process.stderr.write('Error: GitHub CLI (gh) not found.\n' +
222
+ 'Install: https://cli.github.com\n' +
223
+ 'Then run: gh auth login\n');
224
+ process.exit(2);
225
+ }
226
+ // Determine which branches to create PRs for.
227
+ let branches;
228
+ if (options.all) {
229
+ branches = await findUpdateBranches();
230
+ if (branches.length === 0) {
231
+ log('No update/* branches found. Run `bolt update` first.');
232
+ process.exit(0);
233
+ }
234
+ log(`Found ${branches.length} update branch(es)`);
235
+ }
236
+ else {
237
+ const current = await getCurrentBranch();
238
+ if (!current.startsWith('update/')) {
239
+ logWarn(`Current branch "${current}" doesn't look like an update branch.`);
240
+ log('Use --all to create PRs for all update/* branches.');
241
+ }
242
+ branches = [current];
243
+ }
244
+ process.stderr.write('\n');
245
+ // Create PRs.
246
+ const results = [];
247
+ for (const branch of branches) {
248
+ log(`Creating PR for ${branch}...`);
249
+ const result = await createPrForBranch(branch, prConfig, options);
250
+ results.push(result);
251
+ switch (result.status) {
252
+ case 'created':
253
+ logOk(`${result.url}`);
254
+ break;
255
+ case 'exists':
256
+ logWarn(`PR already exists: ${result.url}`);
257
+ break;
258
+ case 'fail':
259
+ logFail(result.error ?? 'Unknown error');
260
+ break;
261
+ }
262
+ }
263
+ // Summary.
264
+ process.stderr.write('\n');
265
+ const created = results.filter((r) => r.status === 'created').length;
266
+ const existed = results.filter((r) => r.status === 'exists').length;
267
+ const failed = results.filter((r) => r.status === 'fail').length;
268
+ process.stderr.write(`PR summary: ${created} created, ${existed} already existed, ${failed} failed\n`);
269
+ // Print all PR URLs for easy access.
270
+ const urls = results.filter((r) => r.url).map((r) => r.url);
271
+ if (urls.length > 0) {
272
+ process.stderr.write('\nPR URLs:\n');
273
+ for (const url of urls) {
274
+ process.stderr.write(` ${url}\n`);
275
+ }
276
+ }
277
+ process.stderr.write('\n');
278
+ if (failed > 0 && created === 0) {
279
+ process.exit(1);
280
+ }
281
+ }
282
+ //# sourceMappingURL=pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * bolt refresh — sync local environment to match production.
3
+ *
4
+ * Ensures the local codebase and (optionally) database are current
5
+ * before running updates. Exits early on any step failure.
6
+ */
7
+ import type { BoltConfig } from '../config.js';
8
+ export interface RefreshOptions {
9
+ /** Pull a fresh database. */
10
+ db: boolean;
11
+ /** Skip database pull entirely (no prompt). */
12
+ skipDb: boolean;
13
+ /** Database source environment (default: live). */
14
+ source: string;
15
+ /** Skip all confirmation prompts. */
16
+ yes: boolean;
17
+ /** Base branch to checkout (default from config or 'main'). */
18
+ branch: string;
19
+ /** Resolved .bolt.yml config. */
20
+ boltConfig?: BoltConfig;
21
+ }
22
+ export declare function refreshCommand(options: RefreshOptions): Promise<void>;