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.
- package/README.md +183 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +49 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/equip-refactored.d.ts +3 -0
- package/dist/commands/equip-refactored.d.ts.map +1 -0
- package/dist/commands/equip-refactored.js +83 -0
- package/dist/commands/equip-refactored.js.map +1 -0
- package/dist/commands/equip.d.ts +3 -0
- package/dist/commands/equip.d.ts.map +1 -0
- package/dist/commands/equip.js +232 -0
- package/dist/commands/equip.js.map +1 -0
- package/dist/commands/fieldguides/add.d.ts +11 -0
- package/dist/commands/fieldguides/add.d.ts.map +1 -0
- package/dist/commands/fieldguides/add.js +59 -0
- package/dist/commands/fieldguides/add.js.map +1 -0
- package/dist/commands/fieldguides/config.d.ts +21 -0
- package/dist/commands/fieldguides/config.d.ts.map +1 -0
- package/dist/commands/fieldguides/config.js +60 -0
- package/dist/commands/fieldguides/config.js.map +1 -0
- package/dist/commands/fieldguides/create.d.ts +20 -0
- package/dist/commands/fieldguides/create.d.ts.map +1 -0
- package/dist/commands/fieldguides/create.js +83 -0
- package/dist/commands/fieldguides/create.js.map +1 -0
- package/dist/commands/fieldguides/list.d.ts +11 -0
- package/dist/commands/fieldguides/list.d.ts.map +1 -0
- package/dist/commands/fieldguides/list.js +63 -0
- package/dist/commands/fieldguides/list.js.map +1 -0
- package/dist/commands/fieldguides/update.d.ts +14 -0
- package/dist/commands/fieldguides/update.d.ts.map +1 -0
- package/dist/commands/fieldguides/update.js +52 -0
- package/dist/commands/fieldguides/update.js.map +1 -0
- package/dist/commands/fieldguides.d.ts +3 -0
- package/dist/commands/fieldguides.d.ts.map +1 -0
- package/dist/commands/fieldguides.js +43 -0
- package/dist/commands/fieldguides.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +76 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +51 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/pack.d.ts +3 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +54 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +44 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config/fieldguide-mappings.d.ts +24 -0
- package/dist/config/fieldguide-mappings.d.ts.map +1 -0
- package/dist/config/fieldguide-mappings.js +173 -0
- package/dist/config/fieldguide-mappings.js.map +1 -0
- package/dist/constants/packages.d.ts +5 -0
- package/dist/constants/packages.d.ts.map +1 -0
- package/dist/constants/packages.js +67 -0
- package/dist/constants/packages.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/services/configuration-applier.d.ts +9 -0
- package/dist/services/configuration-applier.d.ts.map +1 -0
- package/dist/services/configuration-applier.js +45 -0
- package/dist/services/configuration-applier.js.map +1 -0
- package/dist/services/package-manager.d.ts +18 -0
- package/dist/services/package-manager.d.ts.map +1 -0
- package/dist/services/package-manager.js +48 -0
- package/dist/services/package-manager.js.map +1 -0
- package/dist/services/package-selector.d.ts +28 -0
- package/dist/services/package-selector.d.ts.map +1 -0
- package/dist/services/package-selector.js +49 -0
- package/dist/services/package-selector.js.map +1 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/console.d.ts +38 -0
- package/dist/ui/console.d.ts.map +1 -0
- package/dist/ui/console.js +60 -0
- package/dist/ui/console.js.map +1 -0
- package/dist/ui/prompts.d.ts +12 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +48 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/utils/detect-terrain.d.ts +39 -0
- package/dist/utils/detect-terrain.d.ts.map +1 -0
- package/dist/utils/detect-terrain.js +187 -0
- package/dist/utils/detect-terrain.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|