outfitter 1.0.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 (94) hide show
  1. package/README.md +183 -0
  2. package/dist/commands/add.d.ts +3 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +49 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/equip-refactored.d.ts +3 -0
  7. package/dist/commands/equip-refactored.d.ts.map +1 -0
  8. package/dist/commands/equip-refactored.js +83 -0
  9. package/dist/commands/equip-refactored.js.map +1 -0
  10. package/dist/commands/equip.d.ts +3 -0
  11. package/dist/commands/equip.d.ts.map +1 -0
  12. package/dist/commands/equip.js +232 -0
  13. package/dist/commands/equip.js.map +1 -0
  14. package/dist/commands/fieldguides/add.d.ts +11 -0
  15. package/dist/commands/fieldguides/add.d.ts.map +1 -0
  16. package/dist/commands/fieldguides/add.js +59 -0
  17. package/dist/commands/fieldguides/add.js.map +1 -0
  18. package/dist/commands/fieldguides/config.d.ts +21 -0
  19. package/dist/commands/fieldguides/config.d.ts.map +1 -0
  20. package/dist/commands/fieldguides/config.js +60 -0
  21. package/dist/commands/fieldguides/config.js.map +1 -0
  22. package/dist/commands/fieldguides/create.d.ts +20 -0
  23. package/dist/commands/fieldguides/create.d.ts.map +1 -0
  24. package/dist/commands/fieldguides/create.js +83 -0
  25. package/dist/commands/fieldguides/create.js.map +1 -0
  26. package/dist/commands/fieldguides/list.d.ts +11 -0
  27. package/dist/commands/fieldguides/list.d.ts.map +1 -0
  28. package/dist/commands/fieldguides/list.js +63 -0
  29. package/dist/commands/fieldguides/list.js.map +1 -0
  30. package/dist/commands/fieldguides/update.d.ts +14 -0
  31. package/dist/commands/fieldguides/update.d.ts.map +1 -0
  32. package/dist/commands/fieldguides/update.js +52 -0
  33. package/dist/commands/fieldguides/update.js.map +1 -0
  34. package/dist/commands/fieldguides.d.ts +3 -0
  35. package/dist/commands/fieldguides.d.ts.map +1 -0
  36. package/dist/commands/fieldguides.js +43 -0
  37. package/dist/commands/fieldguides.js.map +1 -0
  38. package/dist/commands/init.d.ts +3 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +76 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/list.d.ts +3 -0
  43. package/dist/commands/list.d.ts.map +1 -0
  44. package/dist/commands/list.js +51 -0
  45. package/dist/commands/list.js.map +1 -0
  46. package/dist/commands/pack.d.ts +3 -0
  47. package/dist/commands/pack.d.ts.map +1 -0
  48. package/dist/commands/pack.js +54 -0
  49. package/dist/commands/pack.js.map +1 -0
  50. package/dist/commands/update.d.ts +3 -0
  51. package/dist/commands/update.d.ts.map +1 -0
  52. package/dist/commands/update.js +44 -0
  53. package/dist/commands/update.js.map +1 -0
  54. package/dist/config/fieldguide-mappings.d.ts +24 -0
  55. package/dist/config/fieldguide-mappings.d.ts.map +1 -0
  56. package/dist/config/fieldguide-mappings.js +173 -0
  57. package/dist/config/fieldguide-mappings.js.map +1 -0
  58. package/dist/constants/packages.d.ts +5 -0
  59. package/dist/constants/packages.d.ts.map +1 -0
  60. package/dist/constants/packages.js +67 -0
  61. package/dist/constants/packages.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +26 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/services/configuration-applier.d.ts +9 -0
  67. package/dist/services/configuration-applier.d.ts.map +1 -0
  68. package/dist/services/configuration-applier.js +45 -0
  69. package/dist/services/configuration-applier.js.map +1 -0
  70. package/dist/services/package-manager.d.ts +18 -0
  71. package/dist/services/package-manager.d.ts.map +1 -0
  72. package/dist/services/package-manager.js +48 -0
  73. package/dist/services/package-manager.js.map +1 -0
  74. package/dist/services/package-selector.d.ts +28 -0
  75. package/dist/services/package-selector.d.ts.map +1 -0
  76. package/dist/services/package-selector.js +49 -0
  77. package/dist/services/package-selector.js.map +1 -0
  78. package/dist/types/index.d.ts +22 -0
  79. package/dist/types/index.d.ts.map +1 -0
  80. package/dist/types/index.js +2 -0
  81. package/dist/types/index.js.map +1 -0
  82. package/dist/ui/console.d.ts +38 -0
  83. package/dist/ui/console.d.ts.map +1 -0
  84. package/dist/ui/console.js +60 -0
  85. package/dist/ui/console.js.map +1 -0
  86. package/dist/ui/prompts.d.ts +12 -0
  87. package/dist/ui/prompts.d.ts.map +1 -0
  88. package/dist/ui/prompts.js +48 -0
  89. package/dist/ui/prompts.js.map +1 -0
  90. package/dist/utils/detect-terrain.d.ts +39 -0
  91. package/dist/utils/detect-terrain.d.ts.map +1 -0
  92. package/dist/utils/detect-terrain.js +187 -0
  93. package/dist/utils/detect-terrain.js.map +1 -0
  94. package/package.json +62 -0
package/README.md ADDED
@@ -0,0 +1,183 @@
1
+ # outfitter
2
+
3
+ > Command-line tool for equipping your development journey with configurations
4
+ > and fieldguides
5
+
6
+ ## Installation
7
+
8
+ ```bash
9
+ npm install -g outfitter
10
+ # or
11
+ pnpm add -g outfitter
12
+ # or
13
+ yarn global add outfitter
14
+ ```
15
+
16
+ ## Quick Start
17
+
18
+ ```bash
19
+ # Initialize a new project with Outfitter configurations
20
+ outfitter equip
21
+
22
+ # Manage fieldguides (documentation & patterns)
23
+ outfitter fieldguides list
24
+ outfitter fieldguides add react-patterns typescript-standards
25
+
26
+ # View help
27
+ outfitter --help
28
+ ```
29
+
30
+ ## Commands
31
+
32
+ ### `outfitter equip` (alias: `init`)
33
+
34
+ Interactively install Outfitter configurations and utilities to your project.
35
+
36
+ ```bash
37
+ outfitter equip # Interactive setup
38
+ outfitter equip --preset nextjs # Use Next.js preset
39
+ ```
40
+
41
+ **Available presets:**
42
+
43
+ - `nextjs` - Next.js full-stack applications
44
+ - `react` - React single-page applications
45
+ - `node` - Node.js backend services
46
+ - `minimal` - Just TypeScript standards
47
+
48
+ ### `outfitter fieldguides` (alias: `fg`)
49
+
50
+ Manage project fieldguides - living documentation and patterns for your team.
51
+
52
+ ```bash
53
+ # List available fieldguides
54
+ outfitter fieldguides list
55
+
56
+ # Add fieldguides to your project
57
+ outfitter fieldguides add react-patterns typescript-standards
58
+
59
+ # Update existing fieldguides
60
+ outfitter fieldguides update
61
+
62
+ # Create a new fieldguide
63
+ outfitter fieldguides create
64
+
65
+ # Configure fieldguide settings
66
+ outfitter fieldguides config
67
+ ```
68
+
69
+ ## Configuration
70
+
71
+ Projects initialized with Outfitter have a `.outfitter/` directory containing:
72
+
73
+ ```
74
+ .outfitter/
75
+ ā”œā”€ā”€ config.json # Project configuration and installed supplies
76
+ ā”œā”€ā”€ supplies/ # Local copies of installed supplies
77
+ └── cache/ # Version and update cache
78
+ ```
79
+
80
+ ### config.json
81
+
82
+ ```json
83
+ {
84
+ "version": "1.0.0",
85
+ "preset": "nextjs",
86
+ "supplies": [
87
+ "typescript-standards",
88
+ "react-patterns",
89
+ "nextjs-patterns",
90
+ "testing-standards"
91
+ ],
92
+ "installed": "2024-01-20T10:30:00Z"
93
+ }
94
+ ```
95
+
96
+ ## Packlists
97
+
98
+ Packlists allow you to share and standardize supply configurations across teams.
99
+
100
+ ### Creating a Packlist
101
+
102
+ ```bash
103
+ # Export your current setup
104
+ outfitter pack export --output frontend-standard.json
105
+ ```
106
+
107
+ ### Using a Packlist
108
+
109
+ ```bash
110
+ # In a new project
111
+ outfitter init
112
+ outfitter pack import frontend-standard.json
113
+ ```
114
+
115
+ ### Packlist Format
116
+
117
+ ```json
118
+ {
119
+ "name": "Frontend Standard",
120
+ "version": "1.0.0",
121
+ "supplies": ["typescript-standards", "react-patterns", "testing-standards"],
122
+ "created": "2024-01-20T10:30:00Z"
123
+ }
124
+ ```
125
+
126
+ ## Available Supplies
127
+
128
+ ### Standards
129
+
130
+ - `typescript-standards` - Core TypeScript patterns and conventions
131
+ - `testing-standards` - Comprehensive testing methodology
132
+ - `security-standards` - Security baseline and best practices
133
+ - `documentation-standards` - Clear documentation guidelines
134
+
135
+ ### Patterns
136
+
137
+ - `react-patterns` - React component and hook patterns
138
+ - `nextjs-patterns` - Next.js specific patterns
139
+ - `typescript-error-handling` - Error handling patterns
140
+ - `performance-patterns` - Performance optimization patterns
141
+
142
+ ### Guides
143
+
144
+ - `react-hook-form` - Form handling with React Hook Form
145
+ - `react-query` - Data fetching with React Query
146
+ - `zustand-guide` - State management with Zustand
147
+ - `vitest-guide` - Testing with Vitest
148
+ - `playwright-guide` - E2E testing with Playwright
149
+
150
+ ## Integration with AI Assistants
151
+
152
+ Use the `--with-claude` flag during initialization to create a `CLAUDE.md` file
153
+ that references your installed supplies:
154
+
155
+ ```bash
156
+ outfitter init --preset react --with-claude
157
+ ```
158
+
159
+ This creates a CLAUDE.md that helps AI assistants understand your project's
160
+ standards and patterns.
161
+
162
+ ## Development
163
+
164
+ This package is part of the
165
+ [Outfitter monorepo](https://github.com/outfitter-dev/monorepo).
166
+
167
+ See the [Development Guide](../../docs/contributing/development.md) for
168
+ instructions on building, testing, and contributing to this package.
169
+
170
+ ## Roadmap
171
+
172
+ - [ ] GitHub integration for fetching supplies
173
+ - [ ] Version management and updates
174
+ - [ ] Custom supply sources
175
+ - [ ] Team/organization presets
176
+ - [ ] Supply dependency resolution
177
+ - [ ] Offline mode with cached supplies
178
+ - [ ] `outfitter doctor` - Check project compliance
179
+ - [ ] `outfitter migrate` - Migrate between standards versions
180
+
181
+ ## License
182
+
183
+ MIT
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const addCommand: Command;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,UAAU,SA6DnB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { readJSON, writeJSON, pathExists } from 'fs-extra';
5
+ import { join } from 'path';
6
+ export const addCommand = new Command('add')
7
+ .description('Add specific fieldguides to your project')
8
+ .argument('<fieldguides...>', 'Fieldguides to add (e.g., react-patterns typescript-standards)')
9
+ .action(async (fieldguides) => {
10
+ const cwd = process.cwd();
11
+ const configPath = join(cwd, '.outfitter', 'config.json');
12
+ // Check if initialized
13
+ if (!(await pathExists(configPath))) {
14
+ console.error(chalk.red('Project not initialized. Run "outfitter init" first.'));
15
+ process.exit(1);
16
+ }
17
+ const spinner = ora('Adding fieldguides...').start();
18
+ try {
19
+ // Read current config
20
+ const config = await readJSON(configPath);
21
+ // Get existing fieldguides (support old 'supplies' key)
22
+ const existingFieldguides = config.fieldguides || config.supplies || [];
23
+ // Add new fieldguides (avoiding duplicates)
24
+ const newFieldguides = fieldguides.filter(f => !existingFieldguides.includes(f));
25
+ config.fieldguides = [...existingFieldguides, ...newFieldguides];
26
+ // Remove old supplies key if it exists
27
+ if (config.supplies) {
28
+ delete config.supplies;
29
+ }
30
+ // TODO: In real implementation, fetch actual files from fieldguides package
31
+ // For now, just update config
32
+ await writeJSON(configPath, config, { spaces: 2 });
33
+ spinner.succeed(`Added ${newFieldguides.length} new fieldguides`);
34
+ if (newFieldguides.length > 0) {
35
+ console.log('\n' + chalk.green('Added:'));
36
+ newFieldguides.forEach(f => console.log(' • ' + f));
37
+ }
38
+ const skipped = fieldguides.length - newFieldguides.length;
39
+ if (skipped > 0) {
40
+ console.log('\n' +
41
+ chalk.yellow(`Skipped ${skipped} already installed fieldguides`));
42
+ }
43
+ }
44
+ catch (error) {
45
+ spinner.fail('Failed to add fieldguides');
46
+ throw error;
47
+ }
48
+ });
49
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,0CAA0C,CAAC;KACvD,QAAQ,CACP,kBAAkB,EAClB,gEAAgE,CACjE;KACA,MAAM,CAAC,KAAK,EAAE,WAA0B,EAAE,EAAE;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAE1D,uBAAuB;IACvB,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE1C,wDAAwD;QACxD,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QAExE,4CAA4C;QAC5C,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CACtC,CAAC;QACF,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,mBAAmB,EAAE,GAAG,cAAc,CAAC,CAAC;QAEjE,uCAAuC;QACvC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC;QAED,4EAA4E;QAC5E,8BAA8B;QAE9B,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAEnD,OAAO,CAAC,OAAO,CAAC,SAAS,cAAc,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAElE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1C,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;QAC3D,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,IAAI;gBACF,KAAK,CAAC,MAAM,CAAC,WAAW,OAAO,gCAAgC,CAAC,CACnE,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const equipCommand: Command;
3
+ //# sourceMappingURL=equip-refactored.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equip-refactored.d.ts","sourceRoot":"","sources":["../../src/commands/equip-refactored.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,YAAY,SAoFrB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { Command } from 'commander';
2
+ import * as packageManager from '../services/package-manager.js';
3
+ import * as configApplier from '../services/configuration-applier.js';
4
+ import * as packageSelector from '../services/package-selector.js';
5
+ import * as ui from '../ui/console.js';
6
+ import * as prompts from '../ui/prompts.js';
7
+ import { detectTerrain } from '../utils/detect-terrain.js';
8
+ import { getRecommendedFieldguides } from '../config/fieldguide-mappings.js';
9
+ export const equipCommand = new Command('equip')
10
+ .alias('init')
11
+ .description('Interactively install Outfitter configurations and utilities')
12
+ .option('--preset <type>', 'Use a preset configuration (minimal, standard, full)')
13
+ .option('-y, --yes', 'Skip prompts and use defaults')
14
+ .action(async (options) => {
15
+ ui.showWelcome();
16
+ // Detect project terrain
17
+ const terrainSpinner = ui.createSpinner('Analyzing project terrain...');
18
+ terrainSpinner.start();
19
+ const terrain = await detectTerrain();
20
+ terrainSpinner.succeed('Project terrain analyzed');
21
+ ui.showTerrainSummary(terrain);
22
+ // Get & show recommended fieldguides
23
+ const recommendedFieldguides = getRecommendedFieldguides(terrain);
24
+ prompts.showRecommendedFieldguides(recommendedFieldguides);
25
+ // Determine package selection
26
+ let selection;
27
+ if (options.preset) {
28
+ selection = packageSelector.getPresetSelection(options.preset);
29
+ }
30
+ else if (options.yes) {
31
+ selection = packageSelector.getDefaultSelection(terrain);
32
+ }
33
+ else {
34
+ selection = await packageSelector.getInteractiveSelection(terrain, recommendedFieldguides);
35
+ }
36
+ // Detect and show package manager
37
+ const pm = await packageManager.detectPackageManager();
38
+ ui.showPackageManager(pm);
39
+ // Install packages
40
+ const allPackages = [...selection.configs, ...selection.utils];
41
+ if (allPackages.length > 0) {
42
+ const installSpinner = ui.createSpinner('Installing packages...');
43
+ installSpinner.start();
44
+ try {
45
+ await packageManager.installPackages(allPackages, pm);
46
+ installSpinner.succeed('Packages installed');
47
+ }
48
+ catch (error) {
49
+ installSpinner.fail('Failed to install packages');
50
+ throw error;
51
+ }
52
+ }
53
+ // Apply configurations
54
+ if (selection.configs.length > 0) {
55
+ const configSpinner = ui.createSpinner('Applying configurations...');
56
+ configSpinner.start();
57
+ try {
58
+ await configApplier.applyConfigurations(selection.configs);
59
+ configSpinner.succeed('Configurations applied');
60
+ }
61
+ catch (error) {
62
+ configSpinner.fail('Failed to apply configurations');
63
+ throw error;
64
+ }
65
+ }
66
+ // Initialize git hooks if husky was selected
67
+ if (selection.configs.includes('@outfitter/husky-config')) {
68
+ const gitHooks = options.yes || (await prompts.confirmGitHooks());
69
+ if (gitHooks) {
70
+ const hooksSpinner = ui.createSpinner('Setting up git hooks...');
71
+ hooksSpinner.start();
72
+ try {
73
+ await configApplier.initializeHusky();
74
+ hooksSpinner.succeed('Git hooks initialized');
75
+ }
76
+ catch {
77
+ hooksSpinner.fail('Failed to initialize git hooks');
78
+ }
79
+ }
80
+ }
81
+ ui.showNextSteps(pm, selection);
82
+ });
83
+ //# sourceMappingURL=equip-refactored.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equip-refactored.js","sourceRoot":"","sources":["../../src/commands/equip-refactored.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const equipCommand: Command;
3
+ //# sourceMappingURL=equip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equip.d.ts","sourceRoot":"","sources":["../../src/commands/equip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyHpC,eAAO,MAAM,YAAY,SAoLrB,CAAC"}
@@ -0,0 +1,232 @@
1
+ import { Command } from 'commander';
2
+ import { checkbox, confirm } from '@inquirer/prompts';
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { execa } from 'execa';
6
+ import fsExtra from 'fs-extra';
7
+ const { pathExistsSync } = fsExtra;
8
+ import { join, dirname } from 'path';
9
+ import { detectTerrain, getTerrainSummary } from '../utils/detect-terrain.js';
10
+ import { getRecommendedFieldguides, getRecommendedFieldguideIds, } from '../config/fieldguide-mappings.js';
11
+ import { CONFIG_PACKAGES, UTILITY_PACKAGES } from '../constants/packages.js';
12
+ import { getPresetSelection } from '../services/package-selector.js';
13
+ /**
14
+ * Finds the project root by walking up from the given directory until a package.json is found.
15
+ *
16
+ * @param startDir - The directory to start searching from. Defaults to process.cwd().
17
+ * @returns The directory containing package.json, or null if not found.
18
+ */
19
+ function findProjectRoot(startDir = process.cwd()) {
20
+ let currentDir = startDir;
21
+ while (currentDir !== dirname(currentDir)) {
22
+ if (pathExistsSync(join(currentDir, 'package.json'))) {
23
+ return currentDir;
24
+ }
25
+ currentDir = dirname(currentDir);
26
+ }
27
+ return null;
28
+ }
29
+ /**
30
+ * Detects the package manager used in the current project by checking for known lock files.
31
+ *
32
+ * @returns The detected package manager: 'pnpm', 'yarn', 'bun', or 'npm'. Defaults to 'npm' if no lock file is found.
33
+ */
34
+ function detectPackageManager() {
35
+ const projectRoot = findProjectRoot();
36
+ if (!projectRoot) {
37
+ return 'npm';
38
+ }
39
+ // Check for lock files in the project root
40
+ if (pathExistsSync(join(projectRoot, 'pnpm-lock.yaml')))
41
+ return 'pnpm';
42
+ if (pathExistsSync(join(projectRoot, 'yarn.lock')))
43
+ return 'yarn';
44
+ if (pathExistsSync(join(projectRoot, 'bun.lockb')))
45
+ return 'bun';
46
+ if (pathExistsSync(join(projectRoot, 'package-lock.json')))
47
+ return 'npm';
48
+ return 'npm';
49
+ }
50
+ const DEV_FLAGS = {
51
+ npm: '--save-dev',
52
+ pnpm: '-D',
53
+ yarn: '-D',
54
+ bun: '--dev',
55
+ };
56
+ async function installPackages(packages, packageManager, isDev = true) {
57
+ const installCmd = packageManager === 'npm' ? 'install' : 'add';
58
+ const args = isDev
59
+ ? [installCmd, DEV_FLAGS[packageManager], ...packages]
60
+ : [installCmd, ...packages];
61
+ await execa(packageManager, args, {
62
+ stdio: 'inherit',
63
+ });
64
+ }
65
+ async function applyConfigurations(selectedConfigs) {
66
+ // TODO: Apply configuration files based on selected packages
67
+ console.log(chalk.yellow('\nāš ļø Configuration file generation coming soon'));
68
+ console.log(chalk.gray(' For now, please configure packages manually:'));
69
+ if (selectedConfigs.includes('@outfitter/eslint-config')) {
70
+ console.log(chalk.gray(' • ESLint: Create .eslintrc.js extending @outfitter/eslint-config'));
71
+ }
72
+ if (selectedConfigs.includes('@outfitter/typescript-config')) {
73
+ console.log(chalk.gray(' • TypeScript: Update tsconfig.json to extend from @outfitter/typescript-config'));
74
+ }
75
+ if (selectedConfigs.includes('@outfitter/prettier-config')) {
76
+ console.log(chalk.gray(' • Prettier: Add "prettier": "@outfitter/prettier-config" to package.json'));
77
+ }
78
+ }
79
+ export const equipCommand = new Command('equip')
80
+ .alias('init')
81
+ .description('Interactively install Outfitter configurations and utilities')
82
+ .option('--preset <type>', 'Use a preset configuration (minimal, standard, full)')
83
+ .option('-y, --yes', 'Skip prompts and use defaults')
84
+ .action(async (options) => {
85
+ console.log(chalk.cyan("šŸŽ’ Welcome to Outfitter! Let's equip your project.\n"));
86
+ // Detect project terrain
87
+ const terrainSpinner = ora('Analyzing project terrain...').start();
88
+ let terrain;
89
+ let terrainSummary = [];
90
+ try {
91
+ terrain = await detectTerrain();
92
+ terrainSummary = getTerrainSummary(terrain);
93
+ terrainSpinner.succeed('Project terrain analyzed');
94
+ }
95
+ catch (err) {
96
+ terrainSpinner.fail('Failed to analyze project terrain');
97
+ throw err;
98
+ }
99
+ if (terrainSummary.length > 0) {
100
+ console.log(chalk.cyan('\nšŸ—» Detected terrain:'));
101
+ terrainSummary.forEach(feature => {
102
+ console.log(` • ${feature}`);
103
+ });
104
+ }
105
+ // Get recommended fieldguides based on terrain
106
+ const recommendedFieldguides = getRecommendedFieldguides(terrain);
107
+ let selection;
108
+ if (options.preset) {
109
+ // Use preset configuration
110
+ selection = getPresetSelection(options.preset);
111
+ }
112
+ else if (options.yes) {
113
+ // Use defaults
114
+ selection = {
115
+ configs: CONFIG_PACKAGES.filter(p => p.selected).map(p => p.value),
116
+ utils: UTILITY_PACKAGES.filter(p => p.selected).map(p => p.value),
117
+ fieldguides: getRecommendedFieldguideIds(terrain),
118
+ };
119
+ }
120
+ else {
121
+ // Interactive selection
122
+ console.log('');
123
+ const selectedConfigs = await checkbox({
124
+ message: 'Select configurations to install:',
125
+ choices: CONFIG_PACKAGES.map(pkg => ({
126
+ name: pkg.name,
127
+ value: pkg.value,
128
+ checked: pkg.selected,
129
+ })),
130
+ });
131
+ const selectedUtils = await checkbox({
132
+ message: 'Select utility packages:',
133
+ choices: UTILITY_PACKAGES.map(pkg => ({
134
+ name: pkg.name,
135
+ value: pkg.value,
136
+ checked: pkg.selected,
137
+ })),
138
+ });
139
+ // Show recommended fieldguides
140
+ let selectedFieldguides = [];
141
+ if (recommendedFieldguides.length > 0) {
142
+ console.log(chalk.cyan('\nšŸ“š Recommended fieldguides for your terrain:'));
143
+ recommendedFieldguides.forEach(fg => {
144
+ const icon = fg.priority === 'essential'
145
+ ? '⭐'
146
+ : fg.priority === 'recommended'
147
+ ? 'šŸ‘'
148
+ : 'šŸ“–';
149
+ console.log(` ${icon} ${fg.name} - ${fg.description}`);
150
+ });
151
+ const includeFieldguides = await confirm({
152
+ message: 'Would you like to include these recommended fieldguides?',
153
+ default: true,
154
+ });
155
+ if (includeFieldguides) {
156
+ selectedFieldguides = getRecommendedFieldguideIds(terrain);
157
+ }
158
+ }
159
+ selection = {
160
+ configs: selectedConfigs,
161
+ utils: selectedUtils,
162
+ fieldguides: selectedFieldguides,
163
+ };
164
+ }
165
+ // Detect package manager
166
+ const packageManager = detectPackageManager();
167
+ console.log(chalk.gray(`\nšŸ“¦ Using ${packageManager}`));
168
+ // Install packages
169
+ const configPackages = selection.configs;
170
+ const utilityPackages = selection.utils;
171
+ if (configPackages.length > 0 || utilityPackages.length > 0) {
172
+ const installSpinner = ora('Installing packages...').start();
173
+ try {
174
+ // Combine installations to reduce lockfile churn
175
+ const installations = [];
176
+ if (configPackages.length > 0) {
177
+ installations.push([configPackages, true]);
178
+ }
179
+ if (utilityPackages.length > 0) {
180
+ installations.push([utilityPackages, false]);
181
+ }
182
+ for (const [packages, isDev] of installations) {
183
+ await installPackages(packages, packageManager, isDev);
184
+ }
185
+ installSpinner.succeed('Packages installed');
186
+ }
187
+ catch (error) {
188
+ installSpinner.fail('Failed to install packages');
189
+ throw error;
190
+ }
191
+ }
192
+ // Apply configurations
193
+ if (selection.configs.length > 0) {
194
+ const configSpinner = ora('Applying configurations...').start();
195
+ try {
196
+ await applyConfigurations(selection.configs);
197
+ configSpinner.succeed('Configurations applied');
198
+ }
199
+ catch (error) {
200
+ configSpinner.fail('Failed to apply configurations');
201
+ throw error;
202
+ }
203
+ }
204
+ // Initialize git hooks if husky was selected
205
+ if (selection.configs.includes('@outfitter/husky-config')) {
206
+ const gitHooks = await confirm({
207
+ message: 'Initialize git hooks?',
208
+ default: true,
209
+ });
210
+ if (gitHooks) {
211
+ const hooksSpinner = ora('Setting up git hooks...').start();
212
+ try {
213
+ await execa('npx', ['husky-init', '--yes'], { stdio: 'inherit' });
214
+ await execa(packageManager, ['install'], { stdio: 'inherit' });
215
+ hooksSpinner.succeed('Git hooks initialized');
216
+ }
217
+ catch (error) {
218
+ hooksSpinner.fail('Failed to initialize git hooks');
219
+ throw error;
220
+ }
221
+ }
222
+ }
223
+ console.log(chalk.green('\nšŸŽ‰ Your project is now equipped with Outfitter!\n'));
224
+ // Show next steps
225
+ console.log(chalk.cyan('Next steps:'));
226
+ console.log(` • Run '${packageManager} run lint' to check your code`);
227
+ console.log(` • Check README.md for usage instructions`);
228
+ if (selection.fieldguides.length > 0) {
229
+ console.log(` • Explore fieldguides with 'outfitter fieldguides list'`);
230
+ }
231
+ });
232
+ //# sourceMappingURL=equip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equip.js","sourceRoot":"","sources":["../../src/commands/equip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Adds the specified fieldguides to the local configuration file, avoiding duplicates.
3
+ *
4
+ * Updates `.outfitter/config.json` in the current working directory by appending new fieldguides to the `fieldguides` array, removing the legacy `supplies` key if present. Only fieldguides not already listed are added.
5
+ *
6
+ * @param fieldguides - Names of fieldguides to add to the configuration.
7
+ *
8
+ * @remark Exits the process with code 1 if the configuration file does not exist.
9
+ */
10
+ export declare function addFieldguides(fieldguides: Array<string>): Promise<void>;
11
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/fieldguides/add.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Df"}