@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,263 @@
1
+ /**
2
+ * bolt doctor — validate the developer environment.
3
+ */
4
+ import { existsSync, readFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { execFile } from 'child_process';
7
+ import { promisify } from 'util';
8
+ import { fileURLToPath } from 'url';
9
+ import { dirname, resolve } from 'path';
10
+ import { loadConfig, validateConfig } from '../config.js';
11
+ const execFileAsync = promisify(execFile);
12
+ /**
13
+ * Run a command and return stdout, or null on failure.
14
+ */
15
+ async function tryExec(command, args) {
16
+ try {
17
+ const { stdout } = await execFileAsync(command, args, {
18
+ maxBuffer: 5 * 1024 * 1024,
19
+ timeout: 30_000,
20
+ });
21
+ return stdout.trim();
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /**
28
+ * Get bolt's own version from package.json.
29
+ */
30
+ function getBoltVersion() {
31
+ const thisFile = fileURLToPath(import.meta.url);
32
+ const pkgPath = resolve(dirname(thisFile), '..', '..', 'package.json');
33
+ try {
34
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
35
+ return pkg.version ?? 'unknown';
36
+ }
37
+ catch {
38
+ return 'unknown';
39
+ }
40
+ }
41
+ export async function doctorCommand() {
42
+ const cwd = process.cwd();
43
+ const checks = [];
44
+ let issueCount = 0;
45
+ process.stderr.write('\nbolt doctor\n');
46
+ process.stderr.write('━'.repeat(50) + '\n\n');
47
+ // --- CLI section ---
48
+ const cliChecks = [];
49
+ // Bolt version.
50
+ const boltVersion = getBoltVersion();
51
+ cliChecks.push({ label: `bolt ${boltVersion}`, status: 'pass' });
52
+ // Node.js version.
53
+ const nodeVersion = process.version;
54
+ const nodeMajor = parseInt(nodeVersion.replace('v', ''), 10);
55
+ if (nodeMajor >= 20) {
56
+ cliChecks.push({ label: `node ${nodeVersion}`, status: 'pass' });
57
+ }
58
+ else {
59
+ cliChecks.push({
60
+ label: `node ${nodeVersion}`,
61
+ status: 'fail',
62
+ detail: 'Node.js 20+ required',
63
+ });
64
+ issueCount++;
65
+ }
66
+ // Playwright browsers.
67
+ const thisFile = fileURLToPath(import.meta.url);
68
+ const boltRoot = resolve(dirname(thisFile), '..', '..');
69
+ const playwrightBrowsers = join(boltRoot, 'node_modules', 'playwright-core', '.local-browsers');
70
+ // Playwright stores browsers in a user-level cache, check via npx
71
+ const pwCheck = await tryExec('npx', ['playwright', 'install', '--dry-run']);
72
+ if (pwCheck !== null) {
73
+ cliChecks.push({ label: 'playwright browsers installed', status: 'pass' });
74
+ }
75
+ else {
76
+ // Fallback: just check if playwright can be imported (it was installed as dep)
77
+ try {
78
+ await import('playwright');
79
+ cliChecks.push({ label: 'playwright browsers installed', status: 'pass' });
80
+ }
81
+ catch {
82
+ cliChecks.push({
83
+ label: 'playwright browsers',
84
+ status: 'fail',
85
+ detail: 'Run: npx playwright install chromium',
86
+ });
87
+ issueCount++;
88
+ }
89
+ }
90
+ checks.push({ section: 'CLI', results: cliChecks });
91
+ // --- Local tools section ---
92
+ const toolChecks = [];
93
+ // DDEV.
94
+ const ddevVersion = await tryExec('ddev', ['version', '--json-output']);
95
+ if (ddevVersion) {
96
+ try {
97
+ const ddevData = JSON.parse(ddevVersion);
98
+ const ver = ddevData.raw?.['DDEV version'] ?? ddevData['DDEV version'] ?? 'installed';
99
+ toolChecks.push({ label: `ddev ${ver}`, status: 'pass' });
100
+ }
101
+ catch {
102
+ toolChecks.push({ label: 'ddev installed', status: 'pass' });
103
+ }
104
+ }
105
+ else {
106
+ toolChecks.push({
107
+ label: 'ddev',
108
+ status: 'fail',
109
+ detail: 'DDEV not found. Install: https://ddev.readthedocs.io',
110
+ });
111
+ issueCount++;
112
+ }
113
+ checks.push({ section: 'Local tools', results: toolChecks });
114
+ // --- Site section (only if in a DDEV project) ---
115
+ const ddevConfigPath = join(cwd, '.ddev', 'config.yaml');
116
+ const inProject = existsSync(ddevConfigPath);
117
+ if (inProject) {
118
+ const siteChecks = [];
119
+ // DDEV running?
120
+ const ddevDescribe = await tryExec('ddev', ['describe', '-j']);
121
+ if (ddevDescribe) {
122
+ siteChecks.push({ label: 'DDEV running', status: 'pass' });
123
+ // Volume mount?
124
+ const dockerComposePath = join(cwd, '.ddev', 'docker-compose.bolt.yaml');
125
+ if (existsSync(dockerComposePath)) {
126
+ siteChecks.push({ label: 'bolt volume mount configured', status: 'pass' });
127
+ }
128
+ else {
129
+ siteChecks.push({
130
+ label: 'bolt volume mount',
131
+ status: 'fail',
132
+ detail: 'Run: bolt init',
133
+ });
134
+ issueCount++;
135
+ }
136
+ // bolt_inspect module enabled?
137
+ const profileResult = await tryExec('ddev', ['drush', 'bolt-inspect:profile']);
138
+ if (profileResult) {
139
+ try {
140
+ const profile = JSON.parse(profileResult);
141
+ const ctCount = profile.contentTypes?.length ?? 0;
142
+ siteChecks.push({
143
+ label: `bolt_inspect module enabled (${ctCount} content types)`,
144
+ status: 'pass',
145
+ });
146
+ // Version compatibility check.
147
+ const moduleVersion = profile.boltInspectVersion ?? 'unknown';
148
+ if (moduleVersion === 'unknown') {
149
+ siteChecks.push({
150
+ label: 'bolt_inspect version',
151
+ status: 'warn',
152
+ detail: `Module version unknown. Run: bolt init --upgrade`,
153
+ });
154
+ }
155
+ else if (moduleVersion !== boltVersion) {
156
+ siteChecks.push({
157
+ label: `bolt_inspect version mismatch`,
158
+ status: 'warn',
159
+ detail: `CLI is ${boltVersion}, module is ${moduleVersion}. Run: bolt init --upgrade`,
160
+ });
161
+ }
162
+ else {
163
+ siteChecks.push({
164
+ label: `bolt_inspect version ${moduleVersion}`,
165
+ status: 'pass',
166
+ });
167
+ }
168
+ }
169
+ catch {
170
+ siteChecks.push({
171
+ label: 'bolt_inspect module',
172
+ status: 'warn',
173
+ detail: 'Profile returned invalid JSON',
174
+ });
175
+ issueCount++;
176
+ }
177
+ }
178
+ else {
179
+ siteChecks.push({
180
+ label: 'bolt_inspect module',
181
+ status: 'fail',
182
+ detail: 'Not installed. Run: bolt init',
183
+ });
184
+ issueCount++;
185
+ }
186
+ }
187
+ else {
188
+ siteChecks.push({
189
+ label: 'DDEV',
190
+ status: 'fail',
191
+ detail: 'DDEV project found but not running. Run: ddev start',
192
+ });
193
+ issueCount++;
194
+ }
195
+ // Get project name from ddev describe.
196
+ let projectName = 'this project';
197
+ if (ddevDescribe) {
198
+ try {
199
+ const data = JSON.parse(ddevDescribe);
200
+ projectName = data.raw?.name ?? data.name ?? 'this project';
201
+ }
202
+ catch {
203
+ // fine
204
+ }
205
+ }
206
+ checks.push({ section: `Site (${projectName})`, results: siteChecks });
207
+ }
208
+ // --- Config section ---
209
+ const configChecks = [];
210
+ const boltYmlPath = join(cwd, '.bolt.yml');
211
+ if (existsSync(boltYmlPath)) {
212
+ const config = loadConfig(cwd);
213
+ const issues = validateConfig(config);
214
+ if (issues.length === 0) {
215
+ configChecks.push({ label: '.bolt.yml valid', status: 'pass' });
216
+ }
217
+ else {
218
+ for (const issue of issues) {
219
+ configChecks.push({ label: '.bolt.yml', status: 'fail', detail: issue });
220
+ issueCount++;
221
+ }
222
+ }
223
+ }
224
+ else if (inProject) {
225
+ configChecks.push({
226
+ label: '.bolt.yml',
227
+ status: 'warn',
228
+ detail: 'Not found. Run: bolt init',
229
+ });
230
+ }
231
+ else {
232
+ configChecks.push({
233
+ label: '.bolt.yml',
234
+ status: 'skip',
235
+ detail: 'Not in a project directory',
236
+ });
237
+ }
238
+ checks.push({ section: 'Config', results: configChecks });
239
+ // --- Output ---
240
+ for (const section of checks) {
241
+ process.stderr.write(`${section.section}:\n`);
242
+ for (const check of section.results) {
243
+ const icon = check.status === 'pass' ? '✓'
244
+ : check.status === 'fail' ? '✗'
245
+ : check.status === 'warn' ? '!'
246
+ : '⊘';
247
+ process.stderr.write(` ${icon} ${check.label}\n`);
248
+ if (check.detail) {
249
+ process.stderr.write(` → ${check.detail}\n`);
250
+ }
251
+ }
252
+ process.stderr.write('\n');
253
+ }
254
+ // Summary.
255
+ if (issueCount === 0) {
256
+ process.stderr.write('Status: All checks passed.\n\n');
257
+ }
258
+ else {
259
+ process.stderr.write(`Status: ${issueCount} issue(s) found. Fix and re-run.\n\n`);
260
+ process.exit(1);
261
+ }
262
+ }
263
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * bolt init — connect bolt to a client site.
3
+ *
4
+ * Full init: volume mount, Composer repo, module install, config template.
5
+ * Upgrade mode (--upgrade): updates volume mount path + module only.
6
+ */
7
+ export interface InitOptions {
8
+ skipComposer: boolean;
9
+ skipModule: boolean;
10
+ upgrade: boolean;
11
+ }
12
+ export declare function initCommand(options: InitOptions): Promise<void>;
@@ -0,0 +1,319 @@
1
+ /**
2
+ * bolt init — connect bolt to a client site.
3
+ *
4
+ * Full init: volume mount, Composer repo, module install, config template.
5
+ * Upgrade mode (--upgrade): updates volume mount path + module only.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
8
+ import { join, resolve } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ import { dirname } from 'path';
11
+ import { execFile } from 'child_process';
12
+ import { promisify } from 'util';
13
+ import { generateConfigTemplate } from '../config.js';
14
+ const execFileAsync = promisify(execFile);
15
+ /** Write progress messages to stderr. */
16
+ function log(msg) {
17
+ process.stderr.write(` ${msg}\n`);
18
+ }
19
+ function logOk(msg) {
20
+ process.stderr.write(` ✓ ${msg}\n`);
21
+ }
22
+ function logSkip(msg) {
23
+ process.stderr.write(` ⊘ ${msg}\n`);
24
+ }
25
+ /**
26
+ * Resolve the path to bolt's install directory (where modules/bolt_inspect lives).
27
+ * Works from both git clone (dev) and npm global install.
28
+ */
29
+ function getBoltRoot() {
30
+ const thisFile = fileURLToPath(import.meta.url);
31
+ // dist/commands/init.js → bolt root
32
+ return resolve(dirname(thisFile), '..', '..');
33
+ }
34
+ /**
35
+ * Get bolt CLI version from package.json.
36
+ */
37
+ function getBoltVersion() {
38
+ const boltRoot = getBoltRoot();
39
+ try {
40
+ const pkg = JSON.parse(readFileSync(join(boltRoot, 'package.json'), 'utf-8'));
41
+ return pkg.version ?? 'unknown';
42
+ }
43
+ catch {
44
+ return 'unknown';
45
+ }
46
+ }
47
+ /**
48
+ * Run a shell command and return the result.
49
+ */
50
+ async function exec(command, args) {
51
+ try {
52
+ const { stdout, stderr } = await execFileAsync(command, args, {
53
+ maxBuffer: 10 * 1024 * 1024,
54
+ timeout: 120_000,
55
+ });
56
+ return { stdout, stderr, exitCode: 0 };
57
+ }
58
+ catch (err) {
59
+ if (err instanceof Error) {
60
+ const execErr = err;
61
+ return {
62
+ stdout: execErr.stdout ?? '',
63
+ stderr: execErr.stderr ?? err.message,
64
+ exitCode: typeof execErr.code === 'number' ? execErr.code : 1,
65
+ };
66
+ }
67
+ return { stdout: '', stderr: String(err), exitCode: 1 };
68
+ }
69
+ }
70
+ /**
71
+ * Upgrade mode: updates the volume mount path and restarts DDEV
72
+ * so the site picks up the latest bolt_inspect module code.
73
+ */
74
+ async function upgradeCommand(cwd) {
75
+ const boltRoot = getBoltRoot();
76
+ const boltInspectPath = join(boltRoot, 'modules', 'bolt_inspect');
77
+ const boltVersion = getBoltVersion();
78
+ process.stderr.write('\nbolt init --upgrade\n');
79
+ process.stderr.write('━'.repeat(50) + '\n\n');
80
+ // Verify bolt_inspect module exists in the package.
81
+ if (!existsSync(boltInspectPath)) {
82
+ process.stderr.write(`Error: bolt_inspect module not found at ${boltInspectPath}\n` +
83
+ 'Is bolt installed correctly?\n');
84
+ process.exit(2);
85
+ }
86
+ // Verify we're in a DDEV project.
87
+ const ddevConfigPath = join(cwd, '.ddev', 'config.yaml');
88
+ if (!existsSync(ddevConfigPath)) {
89
+ process.stderr.write('Error: No .ddev/config.yaml found.\n' +
90
+ 'Run this from a DDEV-configured Drupal project directory.\n');
91
+ process.exit(2);
92
+ }
93
+ // Update volume mount to point to current bolt install path.
94
+ const dockerComposePath = join(cwd, '.ddev', 'docker-compose.bolt.yaml');
95
+ const volumeConfig = `services:
96
+ web:
97
+ volumes:
98
+ - ${boltRoot}/modules/bolt_inspect:/mnt/bolt_inspect:cached
99
+ `;
100
+ if (existsSync(dockerComposePath)) {
101
+ const existing = readFileSync(dockerComposePath, 'utf-8');
102
+ if (existing === volumeConfig) {
103
+ logOk('Volume mount already points to current bolt install');
104
+ }
105
+ else {
106
+ writeFileSync(dockerComposePath, volumeConfig, 'utf-8');
107
+ logOk('Updated volume mount path');
108
+ }
109
+ }
110
+ else {
111
+ writeFileSync(dockerComposePath, volumeConfig, 'utf-8');
112
+ logOk('Created volume mount');
113
+ }
114
+ // Restart DDEV to pick up the updated mount.
115
+ log('Restarting DDEV...');
116
+ const restartResult = await exec('ddev', ['restart']);
117
+ if (restartResult.exitCode !== 0) {
118
+ process.stderr.write(`Error: DDEV restart failed.\n${restartResult.stderr}\n` +
119
+ 'Start DDEV manually.\n');
120
+ process.exit(2);
121
+ }
122
+ logOk('DDEV restarted');
123
+ // Clear Drupal cache so it picks up any module code changes.
124
+ log('Clearing caches...');
125
+ const crResult = await exec('ddev', ['drush', 'cr']);
126
+ if (crResult.exitCode !== 0) {
127
+ process.stderr.write(`Warning: drush cr failed.\n${crResult.stderr}\n`);
128
+ }
129
+ else {
130
+ logOk('Caches cleared');
131
+ }
132
+ // Run database updates in case the module added any.
133
+ log('Running database updates...');
134
+ const updbResult = await exec('ddev', ['drush', 'updb', '-y']);
135
+ if (updbResult.exitCode !== 0) {
136
+ process.stderr.write(`Warning: drush updb failed.\n${updbResult.stderr}\n`);
137
+ }
138
+ else {
139
+ if (updbResult.stdout.includes('No pending updates')) {
140
+ logOk('No pending database updates');
141
+ }
142
+ else {
143
+ logOk('Database updates applied');
144
+ }
145
+ }
146
+ process.stderr.write('\n');
147
+ process.stderr.write(`bolt_inspect upgraded to ${boltVersion}\n`);
148
+ process.stderr.write('Run: bolt doctor (verify environment)\n\n');
149
+ }
150
+ export async function initCommand(options) {
151
+ const cwd = process.cwd();
152
+ // Upgrade mode: just update the module, don't re-init.
153
+ if (options.upgrade) {
154
+ await upgradeCommand(cwd);
155
+ return;
156
+ }
157
+ const boltRoot = getBoltRoot();
158
+ const boltInspectPath = join(boltRoot, 'modules', 'bolt_inspect');
159
+ process.stderr.write('\nbolt init\n');
160
+ process.stderr.write('━'.repeat(50) + '\n\n');
161
+ // 0. Warn if on main/master branch — bolt changes should go on a dedicated branch.
162
+ try {
163
+ const branchResult = await exec('git', ['rev-parse', '--abbrev-ref', 'HEAD']);
164
+ const branch = branchResult.stdout.trim();
165
+ if (branch === 'main' || branch === 'master') {
166
+ process.stderr.write(` ⚠ You are on the "${branch}" branch.\n` +
167
+ ` bolt init modifies composer.json — this should typically go on a dedicated branch.\n` +
168
+ ` Consider: git checkout -b bolt\n\n`);
169
+ }
170
+ }
171
+ catch {
172
+ // Not a git repo or git not available — skip the check.
173
+ }
174
+ // 1. Verify we're in a DDEV project.
175
+ const ddevConfigPath = join(cwd, '.ddev', 'config.yaml');
176
+ if (!existsSync(ddevConfigPath)) {
177
+ process.stderr.write('Error: No .ddev/config.yaml found.\n' +
178
+ 'Run this command from a DDEV-configured Drupal project directory.\n');
179
+ process.exit(2);
180
+ }
181
+ logOk('DDEV project detected');
182
+ // 2. Verify bolt_inspect module exists.
183
+ if (!existsSync(boltInspectPath)) {
184
+ process.stderr.write(`Error: bolt_inspect module not found at ${boltInspectPath}\n` +
185
+ 'Is bolt installed correctly?\n');
186
+ process.exit(2);
187
+ }
188
+ // 3. Create DDEV volume mount.
189
+ const dockerComposePath = join(cwd, '.ddev', 'docker-compose.bolt.yaml');
190
+ if (existsSync(dockerComposePath)) {
191
+ logOk('DDEV volume mount already configured');
192
+ }
193
+ else {
194
+ const volumeConfig = `services:
195
+ web:
196
+ volumes:
197
+ - ${boltRoot}/modules/bolt_inspect:/mnt/bolt_inspect:cached
198
+ `;
199
+ writeFileSync(dockerComposePath, volumeConfig, 'utf-8');
200
+ logOk('Created .ddev/docker-compose.bolt.yaml');
201
+ }
202
+ if (!options.skipComposer) {
203
+ // 4. Check if DDEV is running, restart to pick up volume mount.
204
+ log('Restarting DDEV to pick up volume mount...');
205
+ const restartResult = await exec('ddev', ['restart']);
206
+ if (restartResult.exitCode !== 0) {
207
+ process.stderr.write(`Error: DDEV restart failed.\n${restartResult.stderr}\n` +
208
+ 'Start DDEV manually and re-run bolt init.\n');
209
+ process.exit(2);
210
+ }
211
+ logOk('DDEV restarted');
212
+ // 5. Add Composer path repository if not already present.
213
+ const composerPath = join(cwd, 'composer.json');
214
+ if (!existsSync(composerPath)) {
215
+ process.stderr.write('Error: No composer.json found in project root.\n');
216
+ process.exit(2);
217
+ }
218
+ const composerJson = JSON.parse(readFileSync(composerPath, 'utf-8'));
219
+ const repos = composerJson.repositories ?? [];
220
+ const hasBoltRepo = (Array.isArray(repos) ? repos : Object.values(repos)).some((r) => r.url === '/mnt/bolt_inspect');
221
+ if (hasBoltRepo) {
222
+ logOk('Composer path repository already configured');
223
+ }
224
+ else {
225
+ log('Adding Composer path repository...');
226
+ const configResult = await exec('ddev', [
227
+ 'composer', 'config', 'repositories.bolt_inspect',
228
+ '{"type": "path", "url": "/mnt/bolt_inspect", "options": {"symlink": true}}',
229
+ ]);
230
+ if (configResult.exitCode !== 0) {
231
+ process.stderr.write(`Warning: Could not add Composer repository.\n${configResult.stderr}\n`);
232
+ }
233
+ else {
234
+ logOk('Added Composer path repository');
235
+ }
236
+ }
237
+ // 6. Require bolt_inspect.
238
+ log('Installing bolt_inspect module...');
239
+ const requireResult = await exec('ddev', [
240
+ 'composer', 'require', 'bolt/bolt_inspect:@dev',
241
+ ]);
242
+ if (requireResult.exitCode !== 0) {
243
+ // May already be installed.
244
+ if (requireResult.stderr.includes('already present')) {
245
+ logOk('bolt_inspect already in composer.json');
246
+ }
247
+ else {
248
+ process.stderr.write(`Warning: composer require failed.\n${requireResult.stderr}\n`);
249
+ }
250
+ }
251
+ else {
252
+ logOk('Installed bolt_inspect via Composer');
253
+ }
254
+ }
255
+ else {
256
+ logSkip('Skipping Composer setup (--skip-composer)');
257
+ }
258
+ if (!options.skipModule) {
259
+ // 7. Enable the module.
260
+ if (!options.skipComposer) {
261
+ log('Enabling bolt_inspect module...');
262
+ const enResult = await exec('ddev', ['drush', 'en', 'bolt_inspect', '-y']);
263
+ if (enResult.exitCode !== 0) {
264
+ if (enResult.stderr.includes('already installed')) {
265
+ logOk('bolt_inspect already enabled');
266
+ }
267
+ else {
268
+ process.stderr.write(`Warning: Could not enable module.\n${enResult.stderr}\n`);
269
+ }
270
+ }
271
+ else {
272
+ logOk('Enabled bolt_inspect module');
273
+ }
274
+ }
275
+ }
276
+ else {
277
+ logSkip('Skipping module enable (--skip-module)');
278
+ }
279
+ // 8. Drop .bolt.yml config template.
280
+ const boltYmlPath = join(cwd, '.bolt.yml');
281
+ if (existsSync(boltYmlPath)) {
282
+ logOk('.bolt.yml already exists');
283
+ }
284
+ else {
285
+ writeFileSync(boltYmlPath, generateConfigTemplate(), 'utf-8');
286
+ logOk('Created .bolt.yml config template');
287
+ }
288
+ // 9. Add bolt artifacts to .gitignore.
289
+ const gitignorePath = join(cwd, '.gitignore');
290
+ const boltIgnores = [
291
+ '# Bolt (local testing artifacts)',
292
+ '.bolt/logs/',
293
+ 'vr-screenshots/',
294
+ '.ddev/docker-compose.bolt.yaml',
295
+ ];
296
+ if (existsSync(gitignorePath)) {
297
+ const existing = readFileSync(gitignorePath, 'utf-8');
298
+ const missing = boltIgnores.filter((line) => !existing.includes(line));
299
+ if (missing.length > 0) {
300
+ writeFileSync(gitignorePath, existing.trimEnd() + '\n\n' + missing.join('\n') + '\n', 'utf-8');
301
+ logOk('Added bolt entries to .gitignore');
302
+ }
303
+ else {
304
+ logOk('.gitignore already has bolt entries');
305
+ }
306
+ }
307
+ else {
308
+ writeFileSync(gitignorePath, boltIgnores.join('\n') + '\n', 'utf-8');
309
+ logOk('Created .gitignore with bolt entries');
310
+ }
311
+ // Done.
312
+ process.stderr.write('\n');
313
+ process.stderr.write('bolt init complete. Next steps:\n');
314
+ process.stderr.write(' 1. Edit .bolt.yml to customize test configuration\n');
315
+ process.stderr.write(' 2. Run: bolt doctor (verify environment)\n');
316
+ process.stderr.write(' 3. Run: bolt test (run tests)\n');
317
+ process.stderr.write('\n');
318
+ }
319
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
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 type { BoltConfig } from '../config.js';
8
+ export interface PrOptions {
9
+ /** Base branch for PR (default from config). */
10
+ base?: string;
11
+ /** Comma-separated GitHub usernames. */
12
+ reviewers?: string;
13
+ /** Create as draft PR. */
14
+ draft: boolean;
15
+ /** Create PRs for all update/* branches. */
16
+ all: boolean;
17
+ /** Resolved .bolt.yml config. */
18
+ boltConfig?: BoltConfig;
19
+ }
20
+ export declare function prCommand(options: PrOptions): Promise<void>;