chati-dev 2.0.5 → 2.0.6
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 +48 -36
- 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 +6 -6
- package/framework/context/governance.md +3 -3
- package/framework/context/quality.md +1 -1
- 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 +1 -1
- package/framework/hooks/session-digest.js +1 -1
- 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 +2 -2
- package/scripts/bundle-framework.js +1 -1
- package/scripts/health-check.js +8 -8
- package/scripts/populate-entity-registry.js +1 -1
- package/scripts/validate-agents.js +1 -1
- package/scripts/validate-tasks.js +1 -1
- package/src/autonomy/autonomous-gate.js +1 -1
- 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/installer/core.js +11 -11
- package/src/installer/templates.js +1 -1
- package/src/installer/validator.js +8 -8
- package/src/intelligence/registry-manager.js +4 -4
- 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 +3 -3
- 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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview G1 — Planning Complete Gate
|
|
3
3
|
*
|
|
4
|
-
* Pre-BUILD gate that validates the
|
|
4
|
+
* Pre-BUILD gate that validates the PLANNING phase is fully completed.
|
|
5
5
|
* Checks that all required artifacts exist and QA-Planning has approved.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -31,7 +31,7 @@ export class PlanningCompleteGate extends GateBase {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* Collect evidence by checking filesystem for
|
|
34
|
+
* Collect evidence by checking filesystem for PLANNING artifacts.
|
|
35
35
|
*
|
|
36
36
|
* @param {string} projectDir
|
|
37
37
|
* @returns {object} Evidence about artifact presence, session state, and handoff
|
|
@@ -99,7 +99,7 @@ export class PlanningCompleteGate extends GateBase {
|
|
|
99
99
|
const allCriteria = [
|
|
100
100
|
...REQUIRED_ARTIFACTS.map(a => `${a.label} exists`),
|
|
101
101
|
'QA-Planning handoff with passing score',
|
|
102
|
-
'Session shows
|
|
102
|
+
'Session shows planning completed',
|
|
103
103
|
];
|
|
104
104
|
|
|
105
105
|
const criteriaResults = [];
|
|
@@ -130,16 +130,16 @@ export class PlanningCompleteGate extends GateBase {
|
|
|
130
130
|
|
|
131
131
|
// Check session state
|
|
132
132
|
if (evidence.sessionState) {
|
|
133
|
-
const
|
|
134
|
-
const completed =
|
|
133
|
+
const planningAgents = ['brief', 'detail', 'architect', 'ux', 'phases', 'tasks', 'qa-planning'];
|
|
134
|
+
const completed = planningAgents.filter(a =>
|
|
135
135
|
evidence.sessionState.completedAgents.includes(a)
|
|
136
136
|
);
|
|
137
137
|
|
|
138
|
-
if (completed.length ===
|
|
139
|
-
criteriaResults.push('Session shows
|
|
138
|
+
if (completed.length === planningAgents.length) {
|
|
139
|
+
criteriaResults.push('Session shows planning completed');
|
|
140
140
|
} else {
|
|
141
|
-
const missing =
|
|
142
|
-
warnings.push(`Incomplete
|
|
141
|
+
const missing = planningAgents.filter(a => !completed.includes(a));
|
|
142
|
+
warnings.push(`Incomplete planning agents: ${missing.join(', ')}`);
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
package/src/installer/core.js
CHANGED
|
@@ -34,7 +34,7 @@ export async function installFramework(config) {
|
|
|
34
34
|
// Copy framework structure
|
|
35
35
|
const frameworkDirs = [
|
|
36
36
|
'orchestrator',
|
|
37
|
-
'agents/
|
|
37
|
+
'agents/planning', 'agents/quality', 'agents/build', 'agents/deploy',
|
|
38
38
|
'templates', 'workflows', 'quality-gates',
|
|
39
39
|
'schemas', 'frameworks', 'intelligence', 'patterns',
|
|
40
40
|
'hooks', 'domains', 'domains/agents', 'domains/workflows',
|
|
@@ -120,15 +120,15 @@ function copyFrameworkFiles(destDir) {
|
|
|
120
120
|
const filesToCopy = [
|
|
121
121
|
'constitution.md',
|
|
122
122
|
'orchestrator/chati.md',
|
|
123
|
-
//
|
|
124
|
-
'agents/
|
|
125
|
-
'agents/
|
|
126
|
-
'agents/
|
|
127
|
-
'agents/
|
|
128
|
-
'agents/
|
|
129
|
-
'agents/
|
|
130
|
-
'agents/
|
|
131
|
-
'agents/
|
|
123
|
+
// PLANNING agents
|
|
124
|
+
'agents/planning/greenfield-wu.md',
|
|
125
|
+
'agents/planning/brownfield-wu.md',
|
|
126
|
+
'agents/planning/brief.md',
|
|
127
|
+
'agents/planning/detail.md',
|
|
128
|
+
'agents/planning/architect.md',
|
|
129
|
+
'agents/planning/ux.md',
|
|
130
|
+
'agents/planning/phases.md',
|
|
131
|
+
'agents/planning/tasks.md',
|
|
132
132
|
// Quality agents
|
|
133
133
|
'agents/quality/qa-planning.md',
|
|
134
134
|
'agents/quality/qa-implementation.md',
|
|
@@ -297,7 +297,7 @@ Read it to understand routing, session management, and agent activation.
|
|
|
297
297
|
Governance rules are in \`chati.dev/constitution.md\` (10 Articles).
|
|
298
298
|
|
|
299
299
|
## Agents
|
|
300
|
-
-
|
|
300
|
+
- PLANNING: chati.dev/agents/planning/ (8 agents)
|
|
301
301
|
- Quality: chati.dev/agents/quality/ (2 agents)
|
|
302
302
|
- BUILD: chati.dev/agents/build/ (1 agent)
|
|
303
303
|
- DEPLOY: chati.dev/agents/deploy/ (1 agent)
|
|
@@ -24,14 +24,14 @@ export async function validateInstallation(targetDir) {
|
|
|
24
24
|
// Check all 13 agents (orchestrator + 12 specialized)
|
|
25
25
|
const agentFiles = [
|
|
26
26
|
'orchestrator/chati.md',
|
|
27
|
-
'agents/
|
|
28
|
-
'agents/
|
|
29
|
-
'agents/
|
|
30
|
-
'agents/
|
|
31
|
-
'agents/
|
|
32
|
-
'agents/
|
|
33
|
-
'agents/
|
|
34
|
-
'agents/
|
|
27
|
+
'agents/planning/greenfield-wu.md',
|
|
28
|
+
'agents/planning/brownfield-wu.md',
|
|
29
|
+
'agents/planning/brief.md',
|
|
30
|
+
'agents/planning/detail.md',
|
|
31
|
+
'agents/planning/architect.md',
|
|
32
|
+
'agents/planning/ux.md',
|
|
33
|
+
'agents/planning/phases.md',
|
|
34
|
+
'agents/planning/tasks.md',
|
|
35
35
|
'agents/quality/qa-planning.md',
|
|
36
36
|
'agents/quality/qa-implementation.md',
|
|
37
37
|
'agents/build/dev.md',
|
|
@@ -140,10 +140,10 @@ export function runHealthCheck(targetDir) {
|
|
|
140
140
|
// 4. Agent check
|
|
141
141
|
const agentPaths = [
|
|
142
142
|
'orchestrator/chati.md',
|
|
143
|
-
'agents/
|
|
144
|
-
'agents/
|
|
145
|
-
'agents/
|
|
146
|
-
'agents/
|
|
143
|
+
'agents/planning/greenfield-wu.md', 'agents/planning/brownfield-wu.md',
|
|
144
|
+
'agents/planning/brief.md', 'agents/planning/detail.md',
|
|
145
|
+
'agents/planning/architect.md', 'agents/planning/ux.md',
|
|
146
|
+
'agents/planning/phases.md', 'agents/planning/tasks.md',
|
|
147
147
|
'agents/quality/qa-planning.md', 'agents/quality/qa-implementation.md',
|
|
148
148
|
'agents/build/dev.md', 'agents/deploy/devops.md',
|
|
149
149
|
];
|
|
@@ -19,7 +19,7 @@ export function buildSessionDigest(projectDir, sessionState) {
|
|
|
19
19
|
timestamp,
|
|
20
20
|
date: dateStr,
|
|
21
21
|
project: sessionState.project || {},
|
|
22
|
-
mode: sessionState.mode || '
|
|
22
|
+
mode: sessionState.mode || 'planning',
|
|
23
23
|
pipeline: sessionState.pipeline || {},
|
|
24
24
|
agents: {},
|
|
25
25
|
summary: {},
|
|
@@ -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.
|
|
@@ -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') + ':'));
|