chati-dev 2.0.5 → 2.0.7
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 +51 -38
- package/framework/agents/{clarity → planning}/architect.md +1 -1
- package/framework/agents/{clarity → planning}/brief.md +1 -1
- package/framework/agents/{clarity → planning}/brownfield-wu.md +1 -1
- package/framework/agents/{clarity → planning}/detail.md +1 -1
- package/framework/agents/{clarity → planning}/greenfield-wu.md +1 -1
- package/framework/agents/{clarity → planning}/phases.md +1 -1
- package/framework/agents/{clarity → planning}/tasks.md +1 -1
- package/framework/agents/{clarity → planning}/ux.md +1 -1
- package/framework/agents/quality/qa-planning.md +5 -5
- package/framework/constitution.md +7 -7
- package/framework/context/governance.md +4 -4
- package/framework/context/quality.md +3 -2
- package/framework/context/root.md +1 -1
- package/framework/data/entity-registry.yaml +9 -9
- package/framework/domains/agents/qa-implementation.yaml +1 -1
- package/framework/domains/constitution.yaml +2 -2
- package/framework/domains/global.yaml +1 -1
- package/framework/hooks/mode-governance.js +5 -5
- package/framework/hooks/prism-engine.js +22 -2
- package/framework/hooks/read-protection.js +107 -0
- package/framework/hooks/session-digest.js +1 -1
- package/framework/hooks/settings.json +9 -0
- package/framework/i18n/en.yaml +1 -3
- package/framework/i18n/es.yaml +1 -3
- package/framework/i18n/fr.yaml +1 -3
- package/framework/i18n/pt.yaml +1 -3
- package/framework/intelligence/context-engine.md +3 -3
- package/framework/orchestrator/chati.md +24 -24
- package/framework/quality-gates/planning-gate.md +1 -1
- package/framework/schemas/context.schema.json +1 -1
- package/framework/schemas/session.schema.json +3 -3
- package/framework/tasks/architect-api-design.md +1 -1
- package/framework/tasks/architect-consolidate.md +1 -1
- package/framework/tasks/architect-db-design.md +1 -1
- package/framework/tasks/architect-design.md +1 -1
- package/framework/tasks/architect-security-review.md +1 -1
- package/framework/tasks/architect-stack-selection.md +1 -1
- package/framework/tasks/brief-consolidate.md +1 -1
- package/framework/tasks/brief-constraint-identify.md +1 -1
- package/framework/tasks/brief-extract-requirements.md +1 -1
- package/framework/tasks/brief-stakeholder-map.md +1 -1
- package/framework/tasks/brief-validate-completeness.md +1 -1
- package/framework/tasks/brownfield-wu-architecture-map.md +1 -1
- package/framework/tasks/brownfield-wu-deep-discovery.md +1 -1
- package/framework/tasks/brownfield-wu-dependency-scan.md +1 -1
- package/framework/tasks/brownfield-wu-migration-plan.md +1 -1
- package/framework/tasks/brownfield-wu-report.md +1 -1
- package/framework/tasks/brownfield-wu-risk-assess.md +1 -1
- package/framework/tasks/detail-acceptance-criteria.md +1 -1
- package/framework/tasks/detail-consolidate.md +1 -1
- package/framework/tasks/detail-edge-case-analysis.md +1 -1
- package/framework/tasks/detail-expand-prd.md +1 -1
- package/framework/tasks/detail-nfr-extraction.md +1 -1
- package/framework/tasks/greenfield-wu-analyze-empty.md +1 -1
- package/framework/tasks/greenfield-wu-report.md +1 -1
- package/framework/tasks/greenfield-wu-scaffold-detection.md +1 -1
- package/framework/tasks/greenfield-wu-tech-stack-assess.md +1 -1
- package/framework/tasks/orchestrator-deviation.md +3 -3
- package/framework/tasks/orchestrator-escalate.md +2 -2
- package/framework/tasks/orchestrator-handoff.md +6 -6
- package/framework/tasks/orchestrator-health.md +1 -1
- package/framework/tasks/orchestrator-mode-switch.md +20 -20
- package/framework/tasks/orchestrator-resume.md +6 -6
- package/framework/tasks/orchestrator-route.md +7 -7
- package/framework/tasks/orchestrator-status.md +8 -8
- package/framework/tasks/orchestrator-suggest-mode.md +13 -13
- package/framework/tasks/phases-breakdown.md +1 -1
- package/framework/tasks/phases-dependency-mapping.md +1 -1
- package/framework/tasks/phases-mvp-scoping.md +1 -1
- package/framework/tasks/qa-impl-regression-check.md +2 -2
- package/framework/tasks/qa-planning-consolidate.md +3 -3
- package/framework/tasks/qa-planning-coverage-plan.md +1 -1
- package/framework/tasks/qa-planning-gate-define.md +7 -7
- package/framework/tasks/qa-planning-risk-matrix.md +1 -1
- package/framework/tasks/qa-planning-test-strategy.md +1 -1
- package/framework/tasks/tasks-acceptance-write.md +1 -1
- package/framework/tasks/tasks-consolidate.md +1 -1
- package/framework/tasks/tasks-decompose.md +1 -1
- package/framework/tasks/tasks-estimate.md +1 -1
- package/framework/tasks/ux-a11y-check.md +1 -1
- package/framework/tasks/ux-component-map.md +1 -1
- package/framework/tasks/ux-consolidate.md +1 -1
- package/framework/tasks/ux-user-flow.md +1 -1
- package/framework/tasks/ux-wireframe.md +1 -1
- package/framework/workflows/brownfield-discovery.yaml +7 -7
- package/framework/workflows/brownfield-fullstack.yaml +9 -9
- package/framework/workflows/brownfield-service.yaml +5 -5
- package/framework/workflows/brownfield-ui.yaml +5 -5
- package/framework/workflows/greenfield-fullstack.yaml +9 -9
- package/package.json +3 -3
- package/scripts/bundle-framework.js +1 -1
- package/scripts/generate-signing-key.js +33 -0
- package/scripts/health-check.js +8 -8
- package/scripts/populate-entity-registry.js +1 -1
- package/scripts/semantic-lint.js +328 -0
- package/scripts/sign-manifest.js +53 -0
- package/scripts/validate-agents.js +1 -1
- package/scripts/validate-package.js +257 -0
- package/scripts/validate-tasks.js +1 -1
- package/src/autonomy/autonomous-gate.js +2 -2
- package/src/autonomy/progress-reporter.js +9 -9
- package/src/config/mcp-configs.js +16 -85
- package/src/context/engine.js +2 -2
- package/src/context/layers/l1-global.js +3 -3
- package/src/dashboard/layout.js +7 -7
- package/src/dashboard/renderer.js +2 -2
- package/src/gates/g1-planning-complete.js +9 -9
- package/src/gates/g4-qa-implementation.js +9 -9
- package/src/installer/core.js +27 -12
- package/src/installer/manifest.js +33 -1
- package/src/installer/signing-public-key.pem +3 -0
- package/src/installer/templates.js +1 -1
- package/src/installer/validator.js +41 -8
- package/src/intelligence/registry-manager.js +4 -4
- package/src/memory/agent-memory.js +20 -0
- package/src/memory/session-digest.js +1 -1
- package/src/orchestrator/agent-selector.js +10 -10
- package/src/orchestrator/intent-classifier.js +4 -4
- package/src/orchestrator/pipeline-manager.js +4 -4
- package/src/orchestrator/pipeline-state.js +1 -1
- package/src/orchestrator/session-manager.js +3 -3
- package/src/tasks/executor.js +1 -1
- package/src/tasks/loader.js +1 -1
- package/src/terminal/prompt-builder.js +10 -10
- package/src/wizard/i18n.js +1 -3
- package/src/wizard/index.js +10 -15
- package/src/wizard/questions.js +7 -70
|
@@ -9,15 +9,15 @@ import { INTENT_TYPES } from './intent-classifier.js';
|
|
|
9
9
|
* The complete agent pipeline in execution order.
|
|
10
10
|
*/
|
|
11
11
|
export const AGENT_PIPELINE = [
|
|
12
|
-
{ name: 'greenfield-wu', phase: '
|
|
13
|
-
{ name: 'brownfield-wu', phase: '
|
|
14
|
-
{ name: 'brief', phase: '
|
|
15
|
-
{ name: 'detail', phase: '
|
|
16
|
-
{ name: 'architect', phase: '
|
|
17
|
-
{ name: 'ux', phase: '
|
|
18
|
-
{ name: 'phases', phase: '
|
|
19
|
-
{ name: 'tasks', phase: '
|
|
20
|
-
{ name: 'qa-planning', phase: '
|
|
12
|
+
{ name: 'greenfield-wu', phase: 'planning', group: 'wu', parallel: false },
|
|
13
|
+
{ name: 'brownfield-wu', phase: 'planning', group: 'wu', parallel: false },
|
|
14
|
+
{ name: 'brief', phase: 'planning', group: 'planning', parallel: false },
|
|
15
|
+
{ name: 'detail', phase: 'planning', group: 'planning-parallel', parallel: true },
|
|
16
|
+
{ name: 'architect', phase: 'planning', group: 'planning-parallel', parallel: true },
|
|
17
|
+
{ name: 'ux', phase: 'planning', group: 'planning-parallel', parallel: true },
|
|
18
|
+
{ name: 'phases', phase: 'planning', group: 'planning', parallel: false },
|
|
19
|
+
{ name: 'tasks', phase: 'planning', group: 'planning', parallel: false },
|
|
20
|
+
{ name: 'qa-planning', phase: 'planning', group: 'quality', parallel: false },
|
|
21
21
|
{ name: 'dev', phase: 'build', group: 'build', parallel: false },
|
|
22
22
|
{ name: 'qa-implementation', phase: 'build', group: 'quality', parallel: false },
|
|
23
23
|
{ name: 'devops', phase: 'deploy', group: 'deploy', parallel: false },
|
|
@@ -58,7 +58,7 @@ function getAgentsByGroup(group) {
|
|
|
58
58
|
*
|
|
59
59
|
* @param {object} context
|
|
60
60
|
* @param {string} context.intent - Classified intent
|
|
61
|
-
* @param {string} context.mode - Current mode (
|
|
61
|
+
* @param {string} context.mode - Current mode (planning/build/deploy)
|
|
62
62
|
* @param {string} [context.currentAgent] - Currently active agent
|
|
63
63
|
* @param {string[]} [context.completedAgents] - Already completed agents
|
|
64
64
|
* @param {boolean} [context.isGreenfield] - true for new projects, false for existing
|
|
@@ -83,7 +83,7 @@ const WEIGHTS = {
|
|
|
83
83
|
* Context boost multipliers based on current mode.
|
|
84
84
|
*/
|
|
85
85
|
const MODE_CONTEXT_BOOST = {
|
|
86
|
-
|
|
86
|
+
planning: {
|
|
87
87
|
[INTENT_TYPES.PLANNING]: 1.5,
|
|
88
88
|
[INTENT_TYPES.IMPLEMENTATION]: 0.5,
|
|
89
89
|
},
|
|
@@ -198,11 +198,11 @@ function buildReasoning(intent, keywords, context) {
|
|
|
198
198
|
* Get intent-to-phase mapping.
|
|
199
199
|
*
|
|
200
200
|
* @param {string} intent
|
|
201
|
-
* @returns {string} Target phase (
|
|
201
|
+
* @returns {string} Target phase (planning, build, deploy)
|
|
202
202
|
*/
|
|
203
203
|
export function getIntentPhase(intent) {
|
|
204
204
|
const phaseMap = {
|
|
205
|
-
[INTENT_TYPES.PLANNING]: '
|
|
205
|
+
[INTENT_TYPES.PLANNING]: 'planning',
|
|
206
206
|
[INTENT_TYPES.IMPLEMENTATION]: 'build',
|
|
207
207
|
[INTENT_TYPES.REVIEW]: 'build',
|
|
208
208
|
[INTENT_TYPES.DEPLOY]: 'deploy',
|
|
@@ -243,7 +243,7 @@ export function checkModeAlignment(intent, currentMode) {
|
|
|
243
243
|
}
|
|
244
244
|
|
|
245
245
|
// Check if mode change is allowed
|
|
246
|
-
const modeOrder = ['
|
|
246
|
+
const modeOrder = ['planning', 'build', 'deploy'];
|
|
247
247
|
const currentIndex = modeOrder.indexOf(currentMode);
|
|
248
248
|
const targetIndex = modeOrder.indexOf(targetPhase);
|
|
249
249
|
|
|
@@ -8,7 +8,7 @@ import { AGENT_PIPELINE, getNextAgent } from './agent-selector.js';
|
|
|
8
8
|
/**
|
|
9
9
|
* Pipeline phases in order.
|
|
10
10
|
*/
|
|
11
|
-
export const PIPELINE_PHASES = ['
|
|
11
|
+
export const PIPELINE_PHASES = ['planning', 'build', 'deploy'];
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Agent status values.
|
|
@@ -26,7 +26,7 @@ export const AGENT_STATUS = {
|
|
|
26
26
|
* Required QA score for phase transitions.
|
|
27
27
|
*/
|
|
28
28
|
const QA_PLANNING_THRESHOLD = 95;
|
|
29
|
-
const QA_IMPLEMENTATION_THRESHOLD =
|
|
29
|
+
const QA_IMPLEMENTATION_THRESHOLD = 95;
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* Initialize a new pipeline for a project.
|
|
@@ -35,7 +35,7 @@ const QA_IMPLEMENTATION_THRESHOLD = 90;
|
|
|
35
35
|
* @returns {object} Pipeline state
|
|
36
36
|
*/
|
|
37
37
|
export function initPipeline(options = {}) {
|
|
38
|
-
const { isGreenfield = true, mode = '
|
|
38
|
+
const { isGreenfield = true, mode = 'planning' } = options;
|
|
39
39
|
|
|
40
40
|
const agents = {};
|
|
41
41
|
for (const agentDef of AGENT_PIPELINE) {
|
|
@@ -257,7 +257,7 @@ export function checkPhaseTransition(pipelineState) {
|
|
|
257
257
|
const { phase, agents } = pipelineState;
|
|
258
258
|
|
|
259
259
|
// Check based on current phase
|
|
260
|
-
if (phase === '
|
|
260
|
+
if (phase === 'planning') {
|
|
261
261
|
// Need QA-Planning to be completed with score >= 95
|
|
262
262
|
const qaPlanning = agents['qa-planning'];
|
|
263
263
|
if (!qaPlanning) {
|
|
@@ -44,7 +44,7 @@ export function loadPipelineState(projectDir) {
|
|
|
44
44
|
|
|
45
45
|
// Extract pipeline-relevant fields
|
|
46
46
|
const state = {
|
|
47
|
-
phase: session.mode || '
|
|
47
|
+
phase: session.mode || 'planning',
|
|
48
48
|
isGreenfield: session.project_type === 'greenfield',
|
|
49
49
|
startedAt: session.started_at || null,
|
|
50
50
|
completedAt: session.completed_at || null,
|
|
@@ -16,7 +16,7 @@ const SESSION_FILE = '.chati/session.yaml';
|
|
|
16
16
|
*/
|
|
17
17
|
const DEFAULT_SESSION = {
|
|
18
18
|
version: '1.0',
|
|
19
|
-
mode: '
|
|
19
|
+
mode: 'planning',
|
|
20
20
|
language: 'en',
|
|
21
21
|
project_type: 'greenfield',
|
|
22
22
|
started_at: null,
|
|
@@ -65,7 +65,7 @@ export function initSession(projectDir, options = {}) {
|
|
|
65
65
|
|
|
66
66
|
const session = {
|
|
67
67
|
...DEFAULT_SESSION,
|
|
68
|
-
mode: options.mode || '
|
|
68
|
+
mode: options.mode || 'planning',
|
|
69
69
|
language: options.language || 'en',
|
|
70
70
|
project_type: options.isGreenfield === false ? 'brownfield' : 'greenfield',
|
|
71
71
|
started_at: new Date().toISOString(),
|
|
@@ -383,7 +383,7 @@ export function validateSession(projectDir) {
|
|
|
383
383
|
}
|
|
384
384
|
|
|
385
385
|
// Validate mode
|
|
386
|
-
const validModes = ['
|
|
386
|
+
const validModes = ['planning', 'build', 'validate', 'deploy', 'completed'];
|
|
387
387
|
if (!validModes.includes(session.mode)) {
|
|
388
388
|
return {
|
|
389
389
|
exists: true,
|
package/src/tasks/executor.js
CHANGED
|
@@ -186,7 +186,7 @@ function sanitizeSessionState(state) {
|
|
|
186
186
|
if (!state) return null;
|
|
187
187
|
|
|
188
188
|
return {
|
|
189
|
-
mode: state.mode || '
|
|
189
|
+
mode: state.mode || 'planning',
|
|
190
190
|
current_agent: state.current_agent || null,
|
|
191
191
|
pipeline_position: state.pipeline_position || null,
|
|
192
192
|
completed_agents: state.completed_agents || [],
|
package/src/tasks/loader.js
CHANGED
|
@@ -59,7 +59,7 @@ export function parseTaskContent(content, source = 'unknown') {
|
|
|
59
59
|
id: meta.id,
|
|
60
60
|
agent: meta.agent,
|
|
61
61
|
trigger: meta.trigger || 'orchestrator',
|
|
62
|
-
phase: meta.phase || '
|
|
62
|
+
phase: meta.phase || 'planning',
|
|
63
63
|
requires_input: meta.requires_input === true || meta.requires_input === 'true',
|
|
64
64
|
parallelizable: meta.parallelizable === true || meta.parallelizable === 'true',
|
|
65
65
|
outputs: parseArray(meta.outputs),
|
|
@@ -37,14 +37,14 @@ const AGENT_MODELS = {
|
|
|
37
37
|
* Map of agent names to their definition file paths (relative to project root).
|
|
38
38
|
*/
|
|
39
39
|
export const AGENT_FILE_MAP = {
|
|
40
|
-
'greenfield-wu': 'chati.dev/agents/
|
|
41
|
-
'brownfield-wu': 'chati.dev/agents/
|
|
42
|
-
brief: 'chati.dev/agents/
|
|
43
|
-
detail: 'chati.dev/agents/
|
|
44
|
-
architect: 'chati.dev/agents/
|
|
45
|
-
ux: 'chati.dev/agents/
|
|
46
|
-
phases: 'chati.dev/agents/
|
|
47
|
-
tasks: 'chati.dev/agents/
|
|
40
|
+
'greenfield-wu': 'chati.dev/agents/planning/greenfield-wu.md',
|
|
41
|
+
'brownfield-wu': 'chati.dev/agents/planning/brownfield-wu.md',
|
|
42
|
+
brief: 'chati.dev/agents/planning/brief.md',
|
|
43
|
+
detail: 'chati.dev/agents/planning/detail.md',
|
|
44
|
+
architect: 'chati.dev/agents/planning/architect.md',
|
|
45
|
+
ux: 'chati.dev/agents/planning/ux.md',
|
|
46
|
+
phases: 'chati.dev/agents/planning/phases.md',
|
|
47
|
+
tasks: 'chati.dev/agents/planning/tasks.md',
|
|
48
48
|
'qa-planning': 'chati.dev/agents/quality/qa-planning.md',
|
|
49
49
|
dev: 'chati.dev/agents/build/dev.md',
|
|
50
50
|
'qa-implementation': 'chati.dev/agents/quality/qa-implementation.md',
|
|
@@ -158,7 +158,7 @@ function buildPrismSection(config) {
|
|
|
158
158
|
const result = runPrism({
|
|
159
159
|
domainsDir,
|
|
160
160
|
remainingPercent: 100, // Spawned terminals are always FRESH
|
|
161
|
-
mode: state.project?.state || '
|
|
161
|
+
mode: state.project?.state || 'planning',
|
|
162
162
|
agent: config.agent,
|
|
163
163
|
workflow: config.workflow || null,
|
|
164
164
|
pipelinePosition: config.agent,
|
|
@@ -261,7 +261,7 @@ function buildSessionSection(config) {
|
|
|
261
261
|
'',
|
|
262
262
|
`- **Project**: ${project.name || '(unnamed)'}`,
|
|
263
263
|
`- **Type**: ${project.type || 'greenfield'}`,
|
|
264
|
-
`- **Mode**: ${project.state || '
|
|
264
|
+
`- **Mode**: ${project.state || 'planning'}`,
|
|
265
265
|
`- **Language**: ${state.language || 'en'} (interaction) / English (artifacts)`,
|
|
266
266
|
`- **User Level**: ${state.user_level || 'auto'}`,
|
|
267
267
|
`- **Execution Mode**: ${state.execution_mode || 'autonomous'}`,
|
package/src/wizard/i18n.js
CHANGED
|
@@ -15,15 +15,13 @@ const FALLBACK_EN = {
|
|
|
15
15
|
brownfield: 'Brownfield (existing project integration)',
|
|
16
16
|
detected_brownfield: 'Detected package.json and src/ in current directory',
|
|
17
17
|
suggestion_brownfield: 'Suggestion: Brownfield',
|
|
18
|
-
select_ides: 'Select IDE(s) for Chati.dev configuration:',
|
|
19
|
-
select_mcps: 'Select MCPs to install (project-level):',
|
|
20
18
|
confirmation_title: 'Installation Summary',
|
|
21
19
|
project_label: 'Project',
|
|
22
20
|
language_label: 'Language',
|
|
23
21
|
ides_label: 'IDEs',
|
|
24
22
|
mcps_label: 'MCPs',
|
|
25
23
|
will_install: 'Will install:',
|
|
26
|
-
agents_count: '13 agent definitions (
|
|
24
|
+
agents_count: '13 agent definitions (PLANNING, BUILD, DEPLOY phases)',
|
|
27
25
|
workflows_count: '5 workflow blueprints',
|
|
28
26
|
templates_count: '5 templates (PRD, Brownfield PRD, Architecture, Task, QA Gate)',
|
|
29
27
|
constitution: 'Constitution (17 Articles + Preamble)',
|
package/src/wizard/index.js
CHANGED
|
@@ -3,17 +3,18 @@ import { readFileSync } from 'fs';
|
|
|
3
3
|
import { join, dirname, basename } from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { logBanner } from '../utils/logger.js';
|
|
6
|
-
import { stepLanguage, stepProjectType,
|
|
6
|
+
import { stepLanguage, stepProjectType, stepConfirmation } from './questions.js';
|
|
7
7
|
import { createSpinner, showStep, showValidation, showQuickStart } from './feedback.js';
|
|
8
8
|
import { installFramework } from '../installer/core.js';
|
|
9
9
|
import { validateInstallation } from '../installer/validator.js';
|
|
10
10
|
import { t } from './i18n.js';
|
|
11
|
+
import { DEFAULT_MCPS } from '../config/mcp-configs.js';
|
|
11
12
|
|
|
12
13
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
14
|
const VERSION = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8')).version;
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
|
-
* Run the
|
|
17
|
+
* Run the 4-step installer wizard
|
|
17
18
|
*/
|
|
18
19
|
export async function runWizard(targetDir, options = {}) {
|
|
19
20
|
// Load ASCII logo
|
|
@@ -34,13 +35,11 @@ export async function runWizard(targetDir, options = {}) {
|
|
|
34
35
|
// Step 2: Project Type
|
|
35
36
|
const projectType = options.projectType || await stepProjectType(targetDir);
|
|
36
37
|
|
|
37
|
-
//
|
|
38
|
-
const selectedIDEs = options.ides ||
|
|
38
|
+
// Auto-configured: Claude Code + default MCPs
|
|
39
|
+
const selectedIDEs = options.ides || ['claude-code'];
|
|
40
|
+
const selectedMCPs = options.mcps || DEFAULT_MCPS;
|
|
39
41
|
|
|
40
|
-
// Step
|
|
41
|
-
const selectedMCPs = options.mcps || await stepMCPs(projectType);
|
|
42
|
-
|
|
43
|
-
// Step 5: Confirmation
|
|
42
|
+
// Step 3: Confirmation
|
|
44
43
|
const projectName = basename(targetDir);
|
|
45
44
|
const config = {
|
|
46
45
|
projectName,
|
|
@@ -54,7 +53,7 @@ export async function runWizard(targetDir, options = {}) {
|
|
|
54
53
|
|
|
55
54
|
await stepConfirmation(config);
|
|
56
55
|
|
|
57
|
-
// Step
|
|
56
|
+
// Step 4: Installation + Validation
|
|
58
57
|
console.log();
|
|
59
58
|
const installSpinner = createSpinner(t('installer.installing'));
|
|
60
59
|
installSpinner.start();
|
|
@@ -71,10 +70,7 @@ export async function runWizard(targetDir, options = {}) {
|
|
|
71
70
|
showStep(t('installer.created_claude_md'));
|
|
72
71
|
showStep(t('installer.created_memories'));
|
|
73
72
|
showStep(t('installer.installed_intelligence'));
|
|
74
|
-
|
|
75
|
-
if (selectedMCPs.length > 0) {
|
|
76
|
-
showStep(`${t('installer.configured_mcps')} ${selectedMCPs.join(', ')}`);
|
|
77
|
-
}
|
|
73
|
+
showStep(`${t('installer.configured_mcps')} ${selectedMCPs.join(', ')}`);
|
|
78
74
|
|
|
79
75
|
// Validation
|
|
80
76
|
console.log();
|
|
@@ -96,9 +92,8 @@ export async function runWizard(targetDir, options = {}) {
|
|
|
96
92
|
console.log();
|
|
97
93
|
p.outro(t('installer.success'));
|
|
98
94
|
|
|
99
|
-
const primaryIDE = selectedIDEs[0] || 'your IDE';
|
|
100
95
|
showQuickStart(t('installer.quick_start_title'), [
|
|
101
|
-
`${t('installer.quick_start_1')} (
|
|
96
|
+
`${t('installer.quick_start_1')} (Claude Code)`,
|
|
102
97
|
t('installer.quick_start_2'),
|
|
103
98
|
t('installer.quick_start_3'),
|
|
104
99
|
]);
|
package/src/wizard/questions.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import { t, SUPPORTED_LANGUAGES, loadLanguage } from './i18n.js';
|
|
3
|
-
import { getIDEChoices } from '../config/ide-configs.js';
|
|
4
|
-
import { getMCPChoices, getMCPWarnings } from '../config/mcp-configs.js';
|
|
5
3
|
import { detectProjectType } from '../utils/detector.js';
|
|
6
4
|
import { showSummary, showChecklist } from './feedback.js';
|
|
7
|
-
import { brand, dim, success
|
|
5
|
+
import { brand, dim, success } from '../utils/colors.js';
|
|
8
6
|
|
|
9
7
|
/**
|
|
10
8
|
* Step 1: Language Selection (always in English)
|
|
@@ -60,77 +58,16 @@ export async function stepProjectType(targetDir) {
|
|
|
60
58
|
}
|
|
61
59
|
|
|
62
60
|
/**
|
|
63
|
-
* Step 3:
|
|
64
|
-
*/
|
|
65
|
-
export async function stepIDEs() {
|
|
66
|
-
const ideChoices = getIDEChoices();
|
|
67
|
-
|
|
68
|
-
const selectedIDEs = await p.multiselect({
|
|
69
|
-
message: t('installer.select_ides'),
|
|
70
|
-
options: ideChoices.map(ide => ({
|
|
71
|
-
value: ide.value,
|
|
72
|
-
label: `${ide.label} ${dim('--')} ${dim(ide.hint)}`,
|
|
73
|
-
})),
|
|
74
|
-
initialValues: ['claude-code'],
|
|
75
|
-
required: true,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
if (p.isCancel(selectedIDEs)) {
|
|
79
|
-
p.cancel('Installation cancelled.');
|
|
80
|
-
process.exit(0);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return selectedIDEs;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Step 4: MCP Selection (Multi-select)
|
|
88
|
-
*/
|
|
89
|
-
export async function stepMCPs(projectType) {
|
|
90
|
-
const mcpChoices = getMCPChoices();
|
|
91
|
-
|
|
92
|
-
const selectedMCPs = await p.multiselect({
|
|
93
|
-
message: t('installer.select_mcps'),
|
|
94
|
-
options: mcpChoices.map(mcp => ({
|
|
95
|
-
value: mcp.value,
|
|
96
|
-
label: `${mcp.label} ${dim('--')} ${dim(mcp.hint)}`,
|
|
97
|
-
})),
|
|
98
|
-
initialValues: mcpChoices.filter(m => m.initialValue).map(m => m.value),
|
|
99
|
-
required: false,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
if (p.isCancel(selectedMCPs)) {
|
|
103
|
-
p.cancel('Installation cancelled.');
|
|
104
|
-
process.exit(0);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Check for MCP warnings
|
|
108
|
-
const warnings = getMCPWarnings(projectType, selectedMCPs);
|
|
109
|
-
for (const warn of warnings) {
|
|
110
|
-
if (warn.level === 'critical') {
|
|
111
|
-
const continueAnyway = await p.confirm({
|
|
112
|
-
message: `${yellow('Warning:')} ${warn.message}\nContinue anyway?`,
|
|
113
|
-
initialValue: false,
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
if (p.isCancel(continueAnyway) || !continueAnyway) {
|
|
117
|
-
return stepMCPs(projectType); // Re-prompt
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return selectedMCPs;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Step 5: Confirmation
|
|
61
|
+
* Step 3: Confirmation
|
|
127
62
|
*/
|
|
128
63
|
export async function stepConfirmation(config) {
|
|
129
|
-
const { projectName, projectType, language,
|
|
64
|
+
const { projectName, projectType, language, selectedMCPs } = config;
|
|
130
65
|
|
|
131
66
|
const langName = SUPPORTED_LANGUAGES.find(l => l.value === language)?.label || language;
|
|
132
|
-
const ideNames =
|
|
133
|
-
const mcpNames = selectedMCPs.length > 0
|
|
67
|
+
const ideNames = 'Claude Code (auto-configured)';
|
|
68
|
+
const mcpNames = selectedMCPs.length > 0
|
|
69
|
+
? `${selectedMCPs.join(', ')} (auto-installed)`
|
|
70
|
+
: 'None';
|
|
134
71
|
|
|
135
72
|
console.log();
|
|
136
73
|
console.log(brand(t('installer.confirmation_title') + ':'));
|