chati-dev 2.1.2 → 3.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.
Files changed (95) hide show
  1. package/README.md +95 -24
  2. package/bin/chati.js +1 -1
  3. package/framework/agents/build/dev.md +1 -0
  4. package/framework/agents/deploy/devops.md +1 -0
  5. package/framework/agents/discover/brief.md +1 -0
  6. package/framework/agents/discover/brownfield-wu.md +1 -0
  7. package/framework/agents/discover/greenfield-wu.md +1 -0
  8. package/framework/agents/plan/architect.md +1 -0
  9. package/framework/agents/plan/detail.md +1 -0
  10. package/framework/agents/plan/phases.md +3 -2
  11. package/framework/agents/plan/tasks.md +1 -0
  12. package/framework/agents/plan/ux.md +1 -0
  13. package/framework/agents/quality/qa-implementation.md +1 -0
  14. package/framework/agents/quality/qa-planning.md +1 -0
  15. package/framework/config.yaml +21 -2
  16. package/framework/constitution.md +67 -2
  17. package/framework/context/governance.md +16 -3
  18. package/framework/context/root.md +3 -3
  19. package/framework/data/entity-registry.yaml +1 -1
  20. package/framework/domains/agents/brownfield-wu.yaml +4 -0
  21. package/framework/domains/agents/detail.yaml +1 -1
  22. package/framework/domains/agents/dev.yaml +4 -0
  23. package/framework/domains/agents/orchestrator.yaml +8 -0
  24. package/framework/domains/agents/phases.yaml +2 -2
  25. package/framework/domains/agents/tasks.yaml +2 -2
  26. package/framework/domains/constitution.yaml +30 -2
  27. package/framework/domains/global.yaml +20 -0
  28. package/framework/hooks/model-governance.js +17 -15
  29. package/framework/hooks/read-protection.js +1 -0
  30. package/framework/i18n/en.yaml +11 -4
  31. package/framework/i18n/es.yaml +11 -4
  32. package/framework/i18n/fr.yaml +11 -4
  33. package/framework/i18n/pt.yaml +11 -4
  34. package/framework/intelligence/context-engine.md +31 -2
  35. package/framework/intelligence/decision-engine.md +1 -1
  36. package/framework/intelligence/memory-layer.md +17 -0
  37. package/framework/orchestrator/chati.md +94 -14
  38. package/framework/patterns/elicitation-library.yaml +2 -2
  39. package/framework/schemas/config.schema.json +44 -0
  40. package/framework/schemas/session.schema.json +27 -0
  41. package/framework/tasks/brownfield-wu-dependency-scan.md +1 -1
  42. package/framework/tasks/brownfield-wu-migration-plan.md +4 -4
  43. package/framework/tasks/brownfield-wu-risk-assess.md +2 -2
  44. package/framework/tasks/detail-expand-prd.md +2 -2
  45. package/framework/tasks/greenfield-wu-report.md +1 -1
  46. package/framework/tasks/orchestrator-handoff.md +2 -2
  47. package/framework/tasks/orchestrator-resume.md +1 -1
  48. package/framework/tasks/qa-impl-performance-test.md +2 -2
  49. package/framework/tasks/qa-impl-sast-scan.md +6 -6
  50. package/framework/tasks/qa-planning-consolidate.md +1 -1
  51. package/framework/tasks/qa-planning-coverage-plan.md +9 -9
  52. package/framework/tasks/qa-planning-gate-define.md +6 -6
  53. package/framework/tasks/qa-planning-risk-matrix.md +1 -1
  54. package/framework/tasks/tasks-consolidate.md +5 -5
  55. package/package.json +5 -1
  56. package/scripts/changelog-generator.js +2 -2
  57. package/scripts/ide-sync.js +9 -4
  58. package/scripts/pr-review.js +5 -5
  59. package/scripts/semantic-lint.js +3 -3
  60. package/src/autonomy/build-loop.js +194 -0
  61. package/src/autonomy/build-state.js +269 -0
  62. package/src/autonomy/execution-profile.js +151 -0
  63. package/src/config/context-file-generator.js +203 -0
  64. package/src/config/ide-configs.js +6 -6
  65. package/src/gates/g2-qa-planning.js +4 -2
  66. package/src/gates/g4-qa-implementation.js +5 -2
  67. package/src/gates/gate-base.js +33 -1
  68. package/src/health/engine.js +245 -0
  69. package/src/installer/core.js +54 -16
  70. package/src/installer/templates.js +131 -2
  71. package/src/installer/validator.js +5 -3
  72. package/src/intelligence/file-tracker.js +117 -0
  73. package/src/intelligence/registry-manager.js +2 -2
  74. package/src/intelligence/timeline.js +144 -0
  75. package/src/memory/gotchas-auto-capture.js +253 -0
  76. package/src/preview/detector.js +1 -1
  77. package/src/terminal/adapters/claude-adapter.js +33 -0
  78. package/src/terminal/adapters/codex-adapter.js +31 -0
  79. package/src/terminal/adapters/copilot-adapter.js +28 -0
  80. package/src/terminal/adapters/gemini-adapter.js +28 -0
  81. package/src/terminal/adapters/index.js +8 -0
  82. package/src/terminal/cli-registry.js +190 -0
  83. package/src/terminal/prompt-builder.js +9 -20
  84. package/src/terminal/run-agent.js +2 -1
  85. package/src/terminal/spawner.js +44 -14
  86. package/src/terminal/wave-analyzer.js +143 -0
  87. package/src/utils/config-parser.js +97 -0
  88. package/src/wizard/feedback.js +1 -1
  89. package/src/wizard/i18n.js +11 -4
  90. package/src/wizard/index.js +22 -10
  91. package/src/wizard/questions.js +50 -2
  92. package/framework/manifest.json +0 -5
  93. package/framework/manifest.sig +0 -1
  94. /package/assets/{logo - co/314/201pia.png" → logo - c/303/263pia.png"} +0 -0
  95. /package/assets/{logo - co/314/201pia.svg" → logo - c/303/263pia.svg"} +0 -0
@@ -3,7 +3,7 @@ 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, stepConfirmation } from './questions.js';
6
+ import { stepLanguage, stepProjectType, stepLlmProvider, 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';
@@ -35,16 +35,20 @@ export async function runWizard(targetDir, options = {}) {
35
35
  // Step 2: Project Type
36
36
  const projectType = options.projectType || await stepProjectType(targetDir);
37
37
 
38
+ // Step 3: LLM Provider
39
+ const llmProvider = options.llmProvider || await stepLlmProvider();
40
+
38
41
  // Auto-configured: Claude Code + default MCPs
39
42
  const selectedIDEs = options.ides || ['claude-code'];
40
43
  const selectedMCPs = options.mcps || DEFAULT_MCPS;
41
44
 
42
- // Step 3: Confirmation
45
+ // Step 4: Confirmation
43
46
  const projectName = basename(targetDir);
44
47
  const config = {
45
48
  projectName,
46
49
  projectType,
47
50
  language,
51
+ llmProvider,
48
52
  selectedIDEs,
49
53
  selectedMCPs,
50
54
  targetDir,
@@ -53,7 +57,7 @@ export async function runWizard(targetDir, options = {}) {
53
57
 
54
58
  await stepConfirmation(config);
55
59
 
56
- // Step 4: Installation + Validation
60
+ // Step 5: Installation + Validation
57
61
  console.log();
58
62
  const installSpinner = createSpinner(t('installer.installing'));
59
63
  installSpinner.start();
@@ -80,14 +84,21 @@ export async function runWizard(targetDir, options = {}) {
80
84
  const validation = await validateInstallation(targetDir);
81
85
  validateSpinner.stop();
82
86
 
83
- showValidation(t('installer.agents_valid'));
87
+ // Show validation results based on actual checks
88
+ if (validation.agents?.pass) showValidation(t('installer.agents_valid'));
89
+ if (validation.constitution?.pass) showValidation(t('installer.constitution_ok'));
90
+ if (validation.intelligence?.pass) showValidation(t('installer.intelligence_valid'));
91
+ if (validation.registry?.pass) showValidation(t('installer.registry_valid'));
92
+ if (validation.memories?.pass) showValidation(t('installer.memories_valid'));
93
+ if (validation.session?.pass) showValidation(t('installer.session_ok'));
84
94
  showValidation(t('installer.handoff_ok'));
85
95
  showValidation(t('installer.validation_ok'));
86
- showValidation(t('installer.constitution_ok'));
87
- showValidation(t('installer.intelligence_valid'));
88
- showValidation(t('installer.registry_valid'));
89
- showValidation(t('installer.memories_valid'));
90
- showValidation(t('installer.session_ok'));
96
+
97
+ // Warn if any checks failed
98
+ if (validation.passed < validation.total) {
99
+ const failed = validation.total - validation.passed;
100
+ p.log.warn(`${failed} validation check(s) did not pass. Run 'npx chati-dev health' for details.`);
101
+ }
91
102
 
92
103
  console.log();
93
104
  p.outro(t('installer.success'));
@@ -101,7 +112,8 @@ export async function runWizard(targetDir, options = {}) {
101
112
  return { success: true, config, validation };
102
113
  } catch (err) {
103
114
  installSpinner.stop();
104
- p.cancel(`Installation failed: ${err.message}`);
115
+ const phase = err.message?.includes('validat') ? 'Validation' : 'Installation';
116
+ p.cancel(`${phase} failed: ${err.message}`);
105
117
  return { success: false, error: err.message };
106
118
  }
107
119
  }
@@ -3,6 +3,7 @@ import { t, SUPPORTED_LANGUAGES, loadLanguage } from './i18n.js';
3
3
  import { detectProjectType } from '../utils/detector.js';
4
4
  import { showSummary, showChecklist } from './feedback.js';
5
5
  import { brand, dim, success } from '../utils/colors.js';
6
+ import { isProviderAvailable } from '../terminal/cli-registry.js';
6
7
 
7
8
  /**
8
9
  * Step 1: Language Selection (always in English)
@@ -58,12 +59,58 @@ export async function stepProjectType(targetDir) {
58
59
  }
59
60
 
60
61
  /**
61
- * Step 3: Confirmation
62
+ * Step 3: LLM Provider Selection
63
+ */
64
+ export async function stepLlmProvider() {
65
+ const providers = [
66
+ { name: 'claude', label: t('installer.llm_provider_claude') },
67
+ { name: 'gemini', label: t('installer.llm_provider_gemini') },
68
+ { name: 'codex', label: t('installer.llm_provider_codex') },
69
+ { name: 'copilot', label: t('installer.llm_provider_copilot') },
70
+ ];
71
+
72
+ // Check availability of each provider
73
+ const availability = {};
74
+ for (const prov of providers) {
75
+ try {
76
+ availability[prov.name] = await isProviderAvailable(prov.name);
77
+ } catch {
78
+ availability[prov.name] = prov.name === 'claude'; // claude always available
79
+ }
80
+ }
81
+
82
+ const options = providers.map(prov => {
83
+ const installed = availability[prov.name];
84
+ const suffix = installed ? '' : ` ${dim(t('installer.llm_provider_not_installed'))}`;
85
+ return {
86
+ value: prov.name,
87
+ label: `${prov.label}${suffix}`,
88
+ };
89
+ });
90
+
91
+ const provider = await p.select({
92
+ message: t('installer.llm_provider_title'),
93
+ options,
94
+ initialValue: 'claude',
95
+ });
96
+
97
+ if (p.isCancel(provider)) {
98
+ p.cancel('Installation cancelled.');
99
+ process.exit(0);
100
+ }
101
+
102
+ return provider;
103
+ }
104
+
105
+ /**
106
+ * Step 4: Confirmation
62
107
  */
63
108
  export async function stepConfirmation(config) {
64
- const { projectName, projectType, language, selectedMCPs } = config;
109
+ const { projectName, projectType, language, llmProvider, selectedMCPs } = config;
65
110
 
66
111
  const langName = SUPPORTED_LANGUAGES.find(l => l.value === language)?.label || language;
112
+ const providerNames = { claude: 'Claude (Anthropic)', gemini: 'Gemini (Google)', codex: 'Codex (OpenAI)', copilot: 'Copilot (GitHub)' };
113
+ const providerDisplay = providerNames[llmProvider] || llmProvider;
67
114
  const ideNames = 'Claude Code (auto-configured)';
68
115
  const mcpNames = selectedMCPs.length > 0
69
116
  ? `${selectedMCPs.join(', ')} (auto-installed)`
@@ -74,6 +121,7 @@ export async function stepConfirmation(config) {
74
121
  showSummary({
75
122
  [t('installer.project_label')]: `${projectName} (${projectType === 'greenfield' ? 'Greenfield' : 'Brownfield'})`,
76
123
  [t('installer.language_label')]: langName,
124
+ [t('installer.llm_provider_label')]: providerDisplay,
77
125
  [t('installer.ides_label')]: ideNames,
78
126
  [t('installer.mcps_label')]: mcpNames,
79
127
  });
@@ -1,5 +0,0 @@
1
- {
2
- "createdAt": "2026-02-17T14:15:05.931Z",
3
- "files": {},
4
- "version": "2.1.2"
5
- }
@@ -1 +0,0 @@
1
- Wjy+M0Wcyt+KTzRu0E4fc8sB97cTe7ye+qEtNGq/av7AzcB2GsSNlwrOhfMV64ukMBHSrBMQ995sDbTtzNKADA==