@nepopsx/cli 0.0.1
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/bin/opsx.mjs +2 -0
- package/dist/commands/activate.d.ts +6 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +50 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/decode.d.ts +2 -0
- package/dist/commands/decode.d.ts.map +1 -0
- package/dist/commands/decode.js +57 -0
- package/dist/commands/decode.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +133 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +385 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +6 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +29 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/server.d.ts +4 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +35 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +352 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/config/api-config.d.ts +12 -0
- package/dist/config/api-config.d.ts.map +1 -0
- package/dist/config/api-config.js +67 -0
- package/dist/config/api-config.js.map +1 -0
- package/dist/generator/builtin-templates.d.ts +12 -0
- package/dist/generator/builtin-templates.d.ts.map +1 -0
- package/dist/generator/builtin-templates.js +251 -0
- package/dist/generator/builtin-templates.js.map +1 -0
- package/dist/generator/philosophy.d.ts +12 -0
- package/dist/generator/philosophy.d.ts.map +1 -0
- package/dist/generator/philosophy.js +106 -0
- package/dist/generator/philosophy.js.map +1 -0
- package/dist/generator/render.d.ts +74 -0
- package/dist/generator/render.d.ts.map +1 -0
- package/dist/generator/render.js +229 -0
- package/dist/generator/render.js.map +1 -0
- package/dist/generator/writer.d.ts +19 -0
- package/dist/generator/writer.d.ts.map +1 -0
- package/dist/generator/writer.js +59 -0
- package/dist/generator/writer.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/licensing/fingerprint.d.ts +48 -0
- package/dist/licensing/fingerprint.d.ts.map +1 -0
- package/dist/licensing/fingerprint.js +163 -0
- package/dist/licensing/fingerprint.js.map +1 -0
- package/dist/licensing/index.d.ts +7 -0
- package/dist/licensing/index.d.ts.map +1 -0
- package/dist/licensing/index.js +7 -0
- package/dist/licensing/index.js.map +1 -0
- package/dist/licensing/license-manager.d.ts +44 -0
- package/dist/licensing/license-manager.d.ts.map +1 -0
- package/dist/licensing/license-manager.js +311 -0
- package/dist/licensing/license-manager.js.map +1 -0
- package/dist/licensing/template-fetch.d.ts +31 -0
- package/dist/licensing/template-fetch.d.ts.map +1 -0
- package/dist/licensing/template-fetch.js +92 -0
- package/dist/licensing/template-fetch.js.map +1 -0
- package/dist/security/agent-validator.d.ts +20 -0
- package/dist/security/agent-validator.d.ts.map +1 -0
- package/dist/security/agent-validator.js +67 -0
- package/dist/security/agent-validator.js.map +1 -0
- package/dist/security/index.d.ts +7 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +7 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/integrity.d.ts +28 -0
- package/dist/security/integrity.d.ts.map +1 -0
- package/dist/security/integrity.js +87 -0
- package/dist/security/integrity.js.map +1 -0
- package/dist/security/scanner.d.ts +43 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +172 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/utils/detect.d.ts +7 -0
- package/dist/utils/detect.d.ts.map +1 -0
- package/dist/utils/detect.js +227 -0
- package/dist/utils/detect.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { input, select, confirm, checkbox } from '@inquirer/prompts';
|
|
2
|
+
import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { stringify } from 'yaml';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { detectServices } from '../utils/detect.js';
|
|
7
|
+
export async function initCommand(options) {
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
const configDir = join(cwd, '.opsx');
|
|
10
|
+
const configPath = join(configDir, 'workspace.yaml');
|
|
11
|
+
if (existsSync(configPath)) {
|
|
12
|
+
const overwrite = await confirm({
|
|
13
|
+
message: `.opsx/workspace.yaml already exists. Overwrite?`,
|
|
14
|
+
default: false,
|
|
15
|
+
});
|
|
16
|
+
if (!overwrite) {
|
|
17
|
+
console.log(chalk.yellow('Aborted.'));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.bold.cyan('\n🔧 OPSX Workspace Setup\n'));
|
|
22
|
+
// ── Step 1: Organization ──────────────────────────────────
|
|
23
|
+
console.log(chalk.bold('Step 1/5: Organization'));
|
|
24
|
+
const orgName = await input({
|
|
25
|
+
message: 'Organization name:',
|
|
26
|
+
validate: (v) => v.trim().length > 0 || 'Required',
|
|
27
|
+
});
|
|
28
|
+
const githubOrg = await input({
|
|
29
|
+
message: 'GitHub org/user (optional):',
|
|
30
|
+
});
|
|
31
|
+
// ── Step 2: Workspace ─────────────────────────────────────
|
|
32
|
+
console.log(chalk.bold('\nStep 2/5: Workspace'));
|
|
33
|
+
const dirName = cwd.split('/').pop() ?? 'my-project';
|
|
34
|
+
const workspaceName = await input({
|
|
35
|
+
message: 'Project name:',
|
|
36
|
+
default: dirName,
|
|
37
|
+
});
|
|
38
|
+
const workspaceDesc = await input({
|
|
39
|
+
message: 'Brief project description:',
|
|
40
|
+
});
|
|
41
|
+
const repo = await input({
|
|
42
|
+
message: 'GitHub repo (owner/name, optional):',
|
|
43
|
+
default: githubOrg ? `${githubOrg.trim()}/${dirName}` : '',
|
|
44
|
+
});
|
|
45
|
+
// ── Step 3: Auto-detect services ─────────────────────────
|
|
46
|
+
console.log(chalk.bold('\nStep 3/5: Services'));
|
|
47
|
+
console.log(chalk.dim('Scanning workspace for services...\n'));
|
|
48
|
+
const detected = detectServices(cwd);
|
|
49
|
+
let services = [];
|
|
50
|
+
if (detected.length > 0) {
|
|
51
|
+
console.log(chalk.green(`Found ${detected.length} service(s):`));
|
|
52
|
+
for (const s of detected) {
|
|
53
|
+
console.log(` ${chalk.bold(s.name)} — ${s.language}/${s.framework ?? 'unknown'} at ${s.path}`);
|
|
54
|
+
}
|
|
55
|
+
const useDetected = await confirm({
|
|
56
|
+
message: 'Use detected services?',
|
|
57
|
+
default: true,
|
|
58
|
+
});
|
|
59
|
+
if (useDetected) {
|
|
60
|
+
services = detected;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(chalk.yellow('No services auto-detected.'));
|
|
65
|
+
}
|
|
66
|
+
const addMore = await confirm({
|
|
67
|
+
message: services.length > 0 ? 'Add more services manually?' : 'Add services manually?',
|
|
68
|
+
default: services.length === 0,
|
|
69
|
+
});
|
|
70
|
+
if (addMore) {
|
|
71
|
+
let adding = true;
|
|
72
|
+
while (adding) {
|
|
73
|
+
const svc = await promptService();
|
|
74
|
+
services.push(svc);
|
|
75
|
+
adding = await confirm({ message: 'Add another service?', default: false });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (services.length === 0) {
|
|
79
|
+
console.log(chalk.red('At least one service is required.'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// ── Step 4: Execution order ───────────────────────────────
|
|
83
|
+
console.log(chalk.bold('\nStep 4/7: Execution Order'));
|
|
84
|
+
console.log(chalk.dim('For multi-service changes, which order should agents modify services?\n'));
|
|
85
|
+
let executionOrder;
|
|
86
|
+
if (services.length > 1) {
|
|
87
|
+
const ordered = await checkbox({
|
|
88
|
+
message: 'Select services in order (upstream → downstream):',
|
|
89
|
+
choices: services.map((s) => ({ name: `${s.name} (${s.language})`, value: s.name })),
|
|
90
|
+
});
|
|
91
|
+
if (ordered.length > 0) {
|
|
92
|
+
executionOrder = ordered;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// ── Step 5: Coding Philosophy ─────────────────────────────
|
|
96
|
+
console.log(chalk.bold('\nStep 5/7: Coding Philosophy'));
|
|
97
|
+
console.log(chalk.dim('Set your team\'s coding preferences. Agents will follow these as directives.\n'));
|
|
98
|
+
const wantPhilosophy = await confirm({
|
|
99
|
+
message: 'Configure coding philosophy? (can be added later in workspace.yaml)',
|
|
100
|
+
default: true,
|
|
101
|
+
});
|
|
102
|
+
let philosophy;
|
|
103
|
+
if (wantPhilosophy) {
|
|
104
|
+
philosophy = await promptPhilosophy();
|
|
105
|
+
}
|
|
106
|
+
// ── Step 6: Agents ────────────────────────────────────────
|
|
107
|
+
console.log(chalk.bold('\nStep 6/7: Agents'));
|
|
108
|
+
const agentChoices = [
|
|
109
|
+
{ name: 'feature-factory — End-to-end feature development (discovery → deploy)', value: 'feature-factory' },
|
|
110
|
+
{ name: 'sdlc-orchestrator — Spec-driven planning & implementation', value: 'sdlc-orchestrator' },
|
|
111
|
+
{ name: 'qa-commander — Automated QA & testing', value: 'qa-commander' },
|
|
112
|
+
{ name: 'code-review-guardian — Deep PR reviews', value: 'code-review-guardian' },
|
|
113
|
+
];
|
|
114
|
+
const selectedAgents = await checkbox({
|
|
115
|
+
message: 'Which agents do you want to install?',
|
|
116
|
+
choices: agentChoices,
|
|
117
|
+
});
|
|
118
|
+
const agents = {};
|
|
119
|
+
for (const a of selectedAgents) {
|
|
120
|
+
agents[a] = { enabled: true };
|
|
121
|
+
}
|
|
122
|
+
// ── Build config ──────────────────────────────────────────
|
|
123
|
+
const config = {
|
|
124
|
+
version: 1,
|
|
125
|
+
org: {
|
|
126
|
+
name: orgName.trim(),
|
|
127
|
+
...(githubOrg.trim() ? { github_org: githubOrg.trim() } : {}),
|
|
128
|
+
},
|
|
129
|
+
workspace: {
|
|
130
|
+
name: workspaceName.trim(),
|
|
131
|
+
...(workspaceDesc.trim() ? { description: workspaceDesc.trim() } : {}),
|
|
132
|
+
...(repo.trim() ? { repo: repo.trim() } : {}),
|
|
133
|
+
},
|
|
134
|
+
services,
|
|
135
|
+
...(executionOrder ? { execution_order: executionOrder } : {}),
|
|
136
|
+
conventions: {
|
|
137
|
+
branching: 'feat/*,fix/*,chore/*',
|
|
138
|
+
commits: 'conventional',
|
|
139
|
+
pr_required: true,
|
|
140
|
+
default_branch: 'main',
|
|
141
|
+
test_required: true,
|
|
142
|
+
},
|
|
143
|
+
...(Object.keys(agents).length > 0 ? { agents } : {}),
|
|
144
|
+
safety: {
|
|
145
|
+
branch_isolation: true,
|
|
146
|
+
checkpoint_before_destructive: true,
|
|
147
|
+
confirm_destructive: true,
|
|
148
|
+
scope_restriction: true,
|
|
149
|
+
},
|
|
150
|
+
...(philosophy ? { philosophy } : {}),
|
|
151
|
+
customs_dir: 'customs/',
|
|
152
|
+
};
|
|
153
|
+
// ── Step 7: Custom Instructions ───────────────────────────
|
|
154
|
+
console.log(chalk.bold('\nStep 7/7: Custom Instructions'));
|
|
155
|
+
const customsDir = join(cwd, 'customs');
|
|
156
|
+
const customsAutoDir = join(customsDir, 'auto');
|
|
157
|
+
if (!existsSync(customsDir)) {
|
|
158
|
+
const createCustoms = await confirm({
|
|
159
|
+
message: 'Create customs/ directory for freeform team instructions?',
|
|
160
|
+
default: true,
|
|
161
|
+
});
|
|
162
|
+
if (createCustoms) {
|
|
163
|
+
mkdirSync(customsAutoDir, { recursive: true });
|
|
164
|
+
// Seed with a README explaining the customs directory
|
|
165
|
+
writeFileSync(join(customsDir, 'README.md'), `# Custom Instructions
|
|
166
|
+
|
|
167
|
+
Place \`.md\` files here to inject freeform instructions into Feature Factory agents.
|
|
168
|
+
|
|
169
|
+
## How It Works
|
|
170
|
+
|
|
171
|
+
- Each \`.md\` file in this directory is injected into relevant agent contexts during \`opsx sync\`
|
|
172
|
+
- Use YAML frontmatter to control scoping:
|
|
173
|
+
|
|
174
|
+
\`\`\`markdown
|
|
175
|
+
---
|
|
176
|
+
applies_to: [ff-developer, ff-developer-reviewer] # optional: limit to specific agents
|
|
177
|
+
scope: typescript # optional: only for services using this language
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
Your instructions here...
|
|
181
|
+
\`\`\`
|
|
182
|
+
|
|
183
|
+
## Directory Structure
|
|
184
|
+
|
|
185
|
+
\`\`\`
|
|
186
|
+
customs/
|
|
187
|
+
├── README.md # This file
|
|
188
|
+
├── coding-standards.md # Your team's coding rules
|
|
189
|
+
├── api-conventions.md # API design patterns
|
|
190
|
+
├── forbidden-patterns.md # Things to avoid
|
|
191
|
+
├── service-quirks.md # Known gotchas
|
|
192
|
+
└── auto/ # Machine-generated (by ff-reflector)
|
|
193
|
+
└── ... # Don't edit — auto-managed
|
|
194
|
+
\`\`\`
|
|
195
|
+
|
|
196
|
+
## Tips
|
|
197
|
+
|
|
198
|
+
- Keep files focused — one topic per file
|
|
199
|
+
- Be specific — "Never use default exports" is better than "Follow best practices"
|
|
200
|
+
- The \`auto/\` subdirectory is managed by the Reflector agent — don't edit manually
|
|
201
|
+
`, 'utf-8');
|
|
202
|
+
console.log(chalk.green(' Created customs/ directory with README'));
|
|
203
|
+
console.log(chalk.dim(' Add .md files with your team rules. They\'ll be injected into agent context.'));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// ── Write ─────────────────────────────────────────────────
|
|
207
|
+
mkdirSync(configDir, { recursive: true });
|
|
208
|
+
writeFileSync(configPath, stringify(config, { lineWidth: 120 }), 'utf-8');
|
|
209
|
+
console.log(chalk.bold.green(`\n✅ Created .opsx/workspace.yaml`));
|
|
210
|
+
console.log(chalk.dim(`\nNext steps:`));
|
|
211
|
+
console.log(` 1. Review the config: ${chalk.cyan('cat .opsx/workspace.yaml')}`);
|
|
212
|
+
console.log(` 2. Generate workspace files: ${chalk.cyan('npx @nepopsx/cli sync')}`);
|
|
213
|
+
console.log(` 3. Commit: ${chalk.cyan('git add .opsx/ .github/ && git commit -m "chore: init opsx workspace"')}`);
|
|
214
|
+
}
|
|
215
|
+
async function promptService() {
|
|
216
|
+
const name = await input({
|
|
217
|
+
message: 'Service name (kebab-case):',
|
|
218
|
+
validate: (v) => /^[a-z][a-z0-9-]*$/.test(v) || 'Must be kebab-case (e.g., web-app)',
|
|
219
|
+
});
|
|
220
|
+
const path = await input({
|
|
221
|
+
message: 'Path (relative to repo root):',
|
|
222
|
+
validate: (v) => v.trim().length > 0 || 'Required',
|
|
223
|
+
});
|
|
224
|
+
const language = await select({
|
|
225
|
+
message: 'Language:',
|
|
226
|
+
choices: [
|
|
227
|
+
{ name: 'TypeScript', value: 'typescript' },
|
|
228
|
+
{ name: 'JavaScript', value: 'javascript' },
|
|
229
|
+
{ name: 'Python', value: 'python' },
|
|
230
|
+
{ name: 'Go', value: 'go' },
|
|
231
|
+
{ name: 'Rust', value: 'rust' },
|
|
232
|
+
{ name: 'Java', value: 'java' },
|
|
233
|
+
{ name: 'Kotlin', value: 'kotlin' },
|
|
234
|
+
{ name: 'Ruby', value: 'ruby' },
|
|
235
|
+
{ name: 'PHP', value: 'php' },
|
|
236
|
+
{ name: 'C#', value: 'csharp' },
|
|
237
|
+
],
|
|
238
|
+
});
|
|
239
|
+
const framework = await input({
|
|
240
|
+
message: 'Framework (e.g., nextjs, nestjs, fastapi, gin):',
|
|
241
|
+
});
|
|
242
|
+
const maturity = await select({
|
|
243
|
+
message: 'Maturity:',
|
|
244
|
+
choices: [
|
|
245
|
+
{ name: 'Prototype — early stage, breaking changes expected', value: 'prototype' },
|
|
246
|
+
{ name: 'Evolving — active development, mostly stable', value: 'evolving' },
|
|
247
|
+
{ name: 'Production — stable, careful changes only', value: 'production' },
|
|
248
|
+
{ name: 'Legacy — maintenance mode', value: 'legacy' },
|
|
249
|
+
],
|
|
250
|
+
default: 'evolving',
|
|
251
|
+
});
|
|
252
|
+
const svc = {
|
|
253
|
+
name,
|
|
254
|
+
path: path.trim(),
|
|
255
|
+
language,
|
|
256
|
+
maturity,
|
|
257
|
+
...(framework.trim() ? { framework: framework.trim() } : {}),
|
|
258
|
+
};
|
|
259
|
+
return svc;
|
|
260
|
+
}
|
|
261
|
+
async function promptPhilosophy() {
|
|
262
|
+
const philosophy = {};
|
|
263
|
+
philosophy.error_handling = await select({
|
|
264
|
+
message: 'Error handling approach:',
|
|
265
|
+
choices: [
|
|
266
|
+
{ name: 'Result types — errors as values (Result/Either)', value: 'result-types' },
|
|
267
|
+
{ name: 'Try-catch — standard exception handling', value: 'try-catch' },
|
|
268
|
+
{ name: 'Error boundaries — boundary-level catching', value: 'error-boundaries' },
|
|
269
|
+
{ name: 'Mixed — context-dependent', value: 'mixed' },
|
|
270
|
+
],
|
|
271
|
+
default: 'try-catch',
|
|
272
|
+
});
|
|
273
|
+
philosophy.testing_philosophy = await select({
|
|
274
|
+
message: 'Testing approach:',
|
|
275
|
+
choices: [
|
|
276
|
+
{ name: 'TDD — write tests first', value: 'tdd' },
|
|
277
|
+
{ name: 'Test after — write tests after implementation', value: 'test-after' },
|
|
278
|
+
{ name: 'Integration-first — prioritize integration tests', value: 'integration-first' },
|
|
279
|
+
{ name: 'Minimal — only critical paths', value: 'minimal' },
|
|
280
|
+
],
|
|
281
|
+
default: 'test-after',
|
|
282
|
+
});
|
|
283
|
+
philosophy.abstraction_level = await select({
|
|
284
|
+
message: 'Code style preference:',
|
|
285
|
+
choices: [
|
|
286
|
+
{ name: 'Explicit — verbose, readable, avoid abstractions', value: 'explicit' },
|
|
287
|
+
{ name: 'DRY — extract shared logic aggressively', value: 'dry' },
|
|
288
|
+
{ name: 'Pragmatic — Rule of Three', value: 'pragmatic' },
|
|
289
|
+
],
|
|
290
|
+
default: 'pragmatic',
|
|
291
|
+
});
|
|
292
|
+
philosophy.documentation = await select({
|
|
293
|
+
message: 'Documentation level:',
|
|
294
|
+
choices: [
|
|
295
|
+
{ name: 'All exports — document everything public', value: 'jsdoc-all' },
|
|
296
|
+
{ name: 'Public API only — interfaces and exported functions', value: 'jsdoc-on-public' },
|
|
297
|
+
{ name: 'Minimal — only non-obvious behavior', value: 'minimal' },
|
|
298
|
+
{ name: 'None — code is the documentation', value: 'none' },
|
|
299
|
+
],
|
|
300
|
+
default: 'jsdoc-on-public',
|
|
301
|
+
});
|
|
302
|
+
philosophy.pr_size = await select({
|
|
303
|
+
message: 'Preferred PR size:',
|
|
304
|
+
choices: [
|
|
305
|
+
{ name: 'Small — <300 lines, many small PRs', value: 'small' },
|
|
306
|
+
{ name: 'Medium — <800 lines, one task per PR', value: 'medium' },
|
|
307
|
+
{ name: 'Large — no limit, full feature per PR', value: 'large' },
|
|
308
|
+
],
|
|
309
|
+
default: 'small',
|
|
310
|
+
});
|
|
311
|
+
const wantAdvanced = await confirm({
|
|
312
|
+
message: 'Configure advanced preferences? (API style, ORM, DI, state management, components)',
|
|
313
|
+
default: false,
|
|
314
|
+
});
|
|
315
|
+
if (wantAdvanced) {
|
|
316
|
+
philosophy.api_style = await select({
|
|
317
|
+
message: 'API design style:',
|
|
318
|
+
choices: [
|
|
319
|
+
{ name: 'REST (resource-based) — /users, /orders, standard verbs', value: 'rest-resource' },
|
|
320
|
+
{ name: 'REST (RPC-style) — /calculatePrice, /sendNotification', value: 'rest-rpc' },
|
|
321
|
+
{ name: 'GraphQL — schema-first with types and resolvers', value: 'graphql' },
|
|
322
|
+
],
|
|
323
|
+
default: 'rest-resource',
|
|
324
|
+
});
|
|
325
|
+
philosophy.orm_usage = await select({
|
|
326
|
+
message: 'Database access pattern:',
|
|
327
|
+
choices: [
|
|
328
|
+
{ name: 'Repository — separate data access layer', value: 'repository' },
|
|
329
|
+
{ name: 'Active Record — models contain queries', value: 'active-record' },
|
|
330
|
+
{ name: 'Raw SQL — manual parameterized queries', value: 'raw-sql' },
|
|
331
|
+
{ name: 'Query Builder — type-safe query construction', value: 'query-builder' },
|
|
332
|
+
],
|
|
333
|
+
default: 'repository',
|
|
334
|
+
});
|
|
335
|
+
philosophy.dependency_injection = await select({
|
|
336
|
+
message: 'Dependency injection:',
|
|
337
|
+
choices: [
|
|
338
|
+
{ name: 'Constructor injection — explicit parameters', value: 'constructor' },
|
|
339
|
+
{ name: 'IoC Container — decorators/central registration', value: 'container' },
|
|
340
|
+
{ name: 'None — direct imports, mock in tests', value: 'none' },
|
|
341
|
+
],
|
|
342
|
+
default: 'constructor',
|
|
343
|
+
});
|
|
344
|
+
philosophy.state_management = await select({
|
|
345
|
+
message: 'State management preference:',
|
|
346
|
+
choices: [
|
|
347
|
+
{ name: 'Immutable — never mutate, use spreads/copies', value: 'immutable' },
|
|
348
|
+
{ name: 'Mutable — direct mutation is acceptable', value: 'mutable' },
|
|
349
|
+
{ name: 'Mixed — context-dependent', value: 'mixed' },
|
|
350
|
+
],
|
|
351
|
+
default: 'immutable',
|
|
352
|
+
});
|
|
353
|
+
philosophy.component_pattern = await select({
|
|
354
|
+
message: 'Frontend component pattern:',
|
|
355
|
+
choices: [
|
|
356
|
+
{ name: 'Functional — hooks, composition', value: 'functional' },
|
|
357
|
+
{ name: 'Class — lifecycle methods, inheritance', value: 'class' },
|
|
358
|
+
{ name: 'Mixed — whichever fits better', value: 'mixed' },
|
|
359
|
+
],
|
|
360
|
+
default: 'functional',
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
// Custom freeform rules
|
|
364
|
+
const wantCustom = await confirm({
|
|
365
|
+
message: 'Add custom freeform rules? (e.g., "Never use default exports")',
|
|
366
|
+
default: false,
|
|
367
|
+
});
|
|
368
|
+
if (wantCustom) {
|
|
369
|
+
const customRules = [];
|
|
370
|
+
let adding = true;
|
|
371
|
+
while (adding) {
|
|
372
|
+
const rule = await input({
|
|
373
|
+
message: 'Custom rule:',
|
|
374
|
+
validate: (v) => v.trim().length > 0 || 'Required',
|
|
375
|
+
});
|
|
376
|
+
customRules.push(rule.trim());
|
|
377
|
+
adding = await confirm({ message: 'Add another rule?', default: false });
|
|
378
|
+
}
|
|
379
|
+
if (customRules.length > 0) {
|
|
380
|
+
philosophy.custom = customRules;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return philosophy;
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAU,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAyB,MAAM,SAAS,CAAC;AACtF,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAErD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;YAC9B,OAAO,EAAE,iDAAiD;YAC1D,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAE5D,6DAA6D;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;QAC1B,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU;KAC3D,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC;QAC5B,OAAO,EAAE,6BAA6B;KACvC,CAAC,CAAC;IAEH,6DAA6D;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,YAAY,CAAC;IACrD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC;QAChC,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC;QAChC,OAAO,EAAE,4BAA4B;KACtC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACvB,OAAO,EAAE,qCAAqC;QAC9C,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;KAC3D,CAAC,CAAC;IAEH,4DAA4D;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,QAAQ,GAAc,EAAE,CAAC;IAE7B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,SAAS,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;YAChC,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;QAC5B,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,wBAAwB;QACvF,OAAO,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;KAC/B,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,OAAO,MAAM,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,6DAA6D;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;IAElG,IAAI,cAAoC,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;YAC7B,OAAO,EAAE,mDAAmD;YAC5D,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SACrF,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,cAAc,GAAG,OAAO,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC,CAAC;IAEzG,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;QACnC,OAAO,EAAE,qEAAqE;QAC9E,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,IAAI,UAAkC,CAAC;IACvC,IAAI,cAAc,EAAE,CAAC;QACnB,UAAU,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,CAAC;IAED,6DAA6D;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE9C,MAAM,YAAY,GAAG;QACnB,EAAE,IAAI,EAAE,uEAAuE,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAC3G,EAAE,IAAI,EAAE,2DAA2D,EAAE,KAAK,EAAE,mBAAmB,EAAE;QACjG,EAAE,IAAI,EAAE,uCAAuC,EAAE,KAAK,EAAE,cAAc,EAAE;QACxE,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,sBAAsB,EAAE;KAClF,CAAC;IAEF,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC;QACpC,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,YAAY;KACtB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAyC,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,6DAA6D;IAC7D,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,CAAC;QACV,GAAG,EAAE;YACH,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;YACpB,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D;QACD,SAAS,EAAE;YACT,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE;YAC1B,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C;QACD,QAAQ;QACR,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,WAAW,EAAE;YACX,SAAS,EAAE,sBAAsB;YACjC,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,IAAI;YACjB,cAAc,EAAE,MAAM;YACtB,aAAa,EAAE,IAAI;SACpB;QACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,EAAE;YACN,gBAAgB,EAAE,IAAI;YACtB,6BAA6B,EAAE,IAAI;YACnC,mBAAmB,EAAE,IAAI;YACzB,iBAAiB,EAAE,IAAI;SACxB;QACD,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,WAAW,EAAE,UAAU;KACxB,CAAC;IAEF,6DAA6D;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;YAClC,OAAO,EAAE,2DAA2D;YACpE,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,aAAa,EAAE,CAAC;YAClB,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE/C,sDAAsD;YACtD,aAAa,CACX,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCP,EACO,OAAO,CACR,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,EAAE,CAAC,CAAC;AACrH,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACvB,OAAO,EAAE,4BAA4B;QACrC,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,oCAAoC;KAC7F,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;QACvB,OAAO,EAAE,+BAA+B;QACxC,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU;KAC3D,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAW;QACtC,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;YAC3C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;YAC3C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACnC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YAC3B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACnC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAC/B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;SAChC;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC;QAC5B,OAAO,EAAE,iDAAiD;KAC3D,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,oDAAoD,EAAE,KAAK,EAAE,WAAoB,EAAE;YAC3F,EAAE,IAAI,EAAE,8CAA8C,EAAE,KAAK,EAAE,UAAmB,EAAE;YACpF,EAAE,IAAI,EAAE,2CAA2C,EAAE,KAAK,EAAE,YAAqB,EAAE;YACnF,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,QAAiB,EAAE;SAChE;QACD,OAAO,EAAE,UAAmB;KAC7B,CAAC,CAAC;IAEH,MAAM,GAAG,GAAY;QACnB,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QACjB,QAAQ;QACR,QAAQ;QACR,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,UAAU,GAAe,EAAE,CAAC;IAElC,UAAU,CAAC,cAAc,GAAG,MAAM,MAAM,CAAC;QACvC,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,iDAAiD,EAAE,KAAK,EAAE,cAAuB,EAAE;YAC3F,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,WAAoB,EAAE;YAChF,EAAE,IAAI,EAAE,4CAA4C,EAAE,KAAK,EAAE,kBAA2B,EAAE;YAC1F,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,OAAgB,EAAE;SAC/D;QACD,OAAO,EAAE,WAAoB;KAC9B,CAAC,CAAC;IAEH,UAAU,CAAC,kBAAkB,GAAG,MAAM,MAAM,CAAC;QAC3C,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,KAAc,EAAE;YAC1D,EAAE,IAAI,EAAE,+CAA+C,EAAE,KAAK,EAAE,YAAqB,EAAE;YACvF,EAAE,IAAI,EAAE,kDAAkD,EAAE,KAAK,EAAE,mBAA4B,EAAE;YACjG,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,SAAkB,EAAE;SACrE;QACD,OAAO,EAAE,YAAqB;KAC/B,CAAC,CAAC;IAEH,UAAU,CAAC,iBAAiB,GAAG,MAAM,MAAM,CAAC;QAC1C,OAAO,EAAE,wBAAwB;QACjC,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,kDAAkD,EAAE,KAAK,EAAE,UAAmB,EAAE;YACxF,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,KAAc,EAAE;YAC1E,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,WAAoB,EAAE;SACnE;QACD,OAAO,EAAE,WAAoB;KAC9B,CAAC,CAAC;IAEH,UAAU,CAAC,aAAa,GAAG,MAAM,MAAM,CAAC;QACtC,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,0CAA0C,EAAE,KAAK,EAAE,WAAoB,EAAE;YACjF,EAAE,IAAI,EAAE,qDAAqD,EAAE,KAAK,EAAE,iBAA0B,EAAE;YAClG,EAAE,IAAI,EAAE,qCAAqC,EAAE,KAAK,EAAE,SAAkB,EAAE;YAC1E,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,MAAe,EAAE;SACrE;QACD,OAAO,EAAE,iBAA0B;KACpC,CAAC,CAAC;IAEH,UAAU,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC;QAChC,OAAO,EAAE,oBAAoB;QAC7B,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,OAAgB,EAAE;YACvE,EAAE,IAAI,EAAE,sCAAsC,EAAE,KAAK,EAAE,QAAiB,EAAE;YAC1E,EAAE,IAAI,EAAE,uCAAuC,EAAE,KAAK,EAAE,OAAgB,EAAE;SAC3E;QACD,OAAO,EAAE,OAAgB;KAC1B,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;QACjC,OAAO,EAAE,oFAAoF;QAC7F,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,IAAI,YAAY,EAAE,CAAC;QACjB,UAAU,CAAC,SAAS,GAAG,MAAM,MAAM,CAAC;YAClC,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,yDAAyD,EAAE,KAAK,EAAE,eAAwB,EAAE;gBACpG,EAAE,IAAI,EAAE,uDAAuD,EAAE,KAAK,EAAE,UAAmB,EAAE;gBAC7F,EAAE,IAAI,EAAE,iDAAiD,EAAE,KAAK,EAAE,SAAkB,EAAE;aACvF;YACD,OAAO,EAAE,eAAwB;SAClC,CAAC,CAAC;QAEH,UAAU,CAAC,SAAS,GAAG,MAAM,MAAM,CAAC;YAClC,OAAO,EAAE,0BAA0B;YACnC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,YAAqB,EAAE;gBACjF,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,eAAwB,EAAE;gBACnF,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,SAAkB,EAAE;gBAC7E,EAAE,IAAI,EAAE,8CAA8C,EAAE,KAAK,EAAE,eAAwB,EAAE;aAC1F;YACD,OAAO,EAAE,YAAqB;SAC/B,CAAC,CAAC;QAEH,UAAU,CAAC,oBAAoB,GAAG,MAAM,MAAM,CAAC;YAC7C,OAAO,EAAE,uBAAuB;YAChC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,6CAA6C,EAAE,KAAK,EAAE,aAAsB,EAAE;gBACtF,EAAE,IAAI,EAAE,iDAAiD,EAAE,KAAK,EAAE,WAAoB,EAAE;gBACxF,EAAE,IAAI,EAAE,sCAAsC,EAAE,KAAK,EAAE,MAAe,EAAE;aACzE;YACD,OAAO,EAAE,aAAsB;SAChC,CAAC,CAAC;QAEH,UAAU,CAAC,gBAAgB,GAAG,MAAM,MAAM,CAAC;YACzC,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,8CAA8C,EAAE,KAAK,EAAE,WAAoB,EAAE;gBACrF,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,SAAkB,EAAE;gBAC9E,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,OAAgB,EAAE;aAC/D;YACD,OAAO,EAAE,WAAoB;SAC9B,CAAC,CAAC;QAEH,UAAU,CAAC,iBAAiB,GAAG,MAAM,MAAM,CAAC;YAC1C,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,YAAqB,EAAE;gBACzE,EAAE,IAAI,EAAE,wCAAwC,EAAE,KAAK,EAAE,OAAgB,EAAE;gBAC3E,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,OAAgB,EAAE;aACnE;YACD,OAAO,EAAE,YAAqB;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;QAC/B,OAAO,EAAE,gEAAgE;QACzE,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,OAAO,MAAM,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;gBACvB,OAAO,EAAE,cAAc;gBACvB,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU;aAC3D,CAAC,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9B,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAEA,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export async function installCommand(agent, options) {
|
|
3
|
+
const knownAgents = {
|
|
4
|
+
'feature-factory': '@nepopsx/agent-feature-factory',
|
|
5
|
+
'sdlc-orchestrator': '@nepopsx/agent-sdlc-orchestrator',
|
|
6
|
+
'qa-commander': '@nepopsx/agent-qa-commander',
|
|
7
|
+
'code-review-guardian': '@nepopsx/agent-code-review-guardian',
|
|
8
|
+
};
|
|
9
|
+
const pkg = knownAgents[agent];
|
|
10
|
+
if (!pkg) {
|
|
11
|
+
console.log(chalk.red(`Unknown agent: "${agent}"`));
|
|
12
|
+
console.log(chalk.dim(`Available agents: ${Object.keys(knownAgents).join(', ')}`));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const version = options.version ?? 'latest';
|
|
16
|
+
console.log(chalk.cyan(`\nInstalling ${pkg}@${version}...`));
|
|
17
|
+
// TODO: In full implementation, this will:
|
|
18
|
+
// 1. npm install / download the agent package
|
|
19
|
+
// 2. Add the agent to .opsx/workspace.yaml
|
|
20
|
+
// 3. Run opsx sync to generate files
|
|
21
|
+
console.log(chalk.yellow('\n⚠ Agent registry not yet connected. For now, add the agent manually to .opsx/workspace.yaml:'));
|
|
22
|
+
console.log(chalk.dim(`
|
|
23
|
+
agents:
|
|
24
|
+
${agent}:
|
|
25
|
+
enabled: true
|
|
26
|
+
`));
|
|
27
|
+
console.log(chalk.dim(`Then run: ${chalk.cyan('opsx sync')}\n`));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,OAAuB;IACzE,MAAM,WAAW,GAA2B;QAC1C,iBAAiB,EAAE,gCAAgC;QACnD,mBAAmB,EAAE,kCAAkC;QACvD,cAAc,EAAE,6BAA6B;QAC7C,sBAAsB,EAAE,qCAAqC;KAC9D,CAAC;IAEF,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC;IAE7D,2CAA2C;IAC3C,8CAA8C;IAC9C,2CAA2C;IAC3C,qCAAqC;IAErC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gGAAgG,CAAC,CAAC,CAAC;IAC5H,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;;MAElB,KAAK;;CAEV,CAAC,CAAC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AASA,wBAAgB,iBAAiB,IAAI,IAAI,CAiBxC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQrD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAOzC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { clearApiBase, getLocalConfigPath, readLocalConfig, resolveApiBase, setApiBase, } from '../config/api-config.js';
|
|
3
|
+
export function serverShowCommand() {
|
|
4
|
+
const cwd = process.cwd();
|
|
5
|
+
const localConfig = readLocalConfig(cwd);
|
|
6
|
+
const effectiveApiBase = resolveApiBase(cwd);
|
|
7
|
+
console.log(chalk.bold.cyan('\n🌐 OPSX Server Configuration\n'));
|
|
8
|
+
console.log(` Effective API base: ${chalk.bold(effectiveApiBase)}`);
|
|
9
|
+
if (process.env.OPSX_API_URL) {
|
|
10
|
+
console.log(` Source: ${chalk.bold('OPSX_API_URL environment override')}`);
|
|
11
|
+
}
|
|
12
|
+
else if (localConfig.api_url) {
|
|
13
|
+
console.log(` Source: ${chalk.bold(getLocalConfigPath(cwd))}`);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log(` Source: ${chalk.bold('built-in default')}`);
|
|
17
|
+
}
|
|
18
|
+
console.log('');
|
|
19
|
+
}
|
|
20
|
+
export function serverSetCommand(rawUrl) {
|
|
21
|
+
const cwd = process.cwd();
|
|
22
|
+
const normalizedApiBase = setApiBase(cwd, rawUrl);
|
|
23
|
+
console.log(chalk.green('\n✅ OPSX server saved\n'));
|
|
24
|
+
console.log(` API base: ${chalk.bold(normalizedApiBase)}`);
|
|
25
|
+
console.log(` Config: ${chalk.dim(getLocalConfigPath(cwd))}`);
|
|
26
|
+
console.log('');
|
|
27
|
+
}
|
|
28
|
+
export function serverClearCommand() {
|
|
29
|
+
const cwd = process.cwd();
|
|
30
|
+
clearApiBase(cwd);
|
|
31
|
+
console.log(chalk.green('\n✅ OPSX server override cleared\n'));
|
|
32
|
+
console.log(` Effective API base: ${chalk.bold(resolveApiBase(cwd))}`);
|
|
33
|
+
console.log('');
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAErE,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,YAAY,CAAC,GAAG,CAAC,CAAC;IAElB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAYA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiLrE"}
|