chati-dev 4.5.4 → 4.5.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 +3 -4
- package/bin/chati.js +35 -1
- package/framework/agents/plan/tasks.md +1 -1
- package/framework/config.yaml +9 -18
- package/framework/constitution.md +30 -20
- package/framework/context/governance.md +3 -1
- package/framework/context/root.md +1 -1
- package/framework/data/entity-registry.yaml +2 -2
- package/framework/domains/agents/orchestrator.yaml +1 -1
- package/framework/domains/constitution.yaml +1 -1
- package/framework/domains/global.yaml +2 -2
- package/framework/hooks/model-governance.js +9 -0
- package/framework/manifest.json +38 -38
- package/framework/manifest.sig +1 -1
- package/framework/orchestrator/chati.md +27 -3
- package/framework/schemas/session.schema.json +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/greenfield-wu-report.md +1 -1
- package/node_modules/@chati/provider-registry/src/index.js +3 -2
- package/node_modules/@chati/tracking-clickup/src/index.js +22 -0
- package/package.json +1 -1
- package/src/config/gemini-hooks-generator.js +10 -4
- package/src/dashboard/layout.js +6 -4
- package/src/installer/core.js +16 -0
- package/src/installer/templates.js +21 -1
- package/src/installer-v2/clickup-preflight.js +32 -0
- package/src/installer-v2/model-catalog-envelope.json +19 -80
- package/src/installer-v2/model-catalog.json +9 -45
- package/src/installer-v2/model-catalog.sig +1 -1
- package/src/installer-v2/wizard-installation.js +2 -2
- package/src/intelligence/registry-manager.js +9 -3
- package/src/orchestrator/cli.js +36 -21
- package/src/orchestrator/clickup-projection.js +25 -8
- package/src/orchestrator/clickup-runtime.js +89 -1
- package/src/orchestrator/planning-runtime.js +1 -2
- package/src/orchestrator/rail-runtime.js +1 -2
- package/src/orchestrator/runtime-installation-v2.js +10 -1
- package/src/wizard/index.js +16 -20
- package/src/wizard/questions.js +7 -8
|
@@ -200,6 +200,28 @@ export class TrackingClickUp {
|
|
|
200
200
|
return Object.freeze(canonicalize(projection));
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
+
/** Records a receipt produced by an independently authorized MCP boundary. */
|
|
204
|
+
confirmExternalDelivery({ projection_id, receipt_ref } = {}) {
|
|
205
|
+
const projection = this.#find(projection_id);
|
|
206
|
+
string(receipt_ref, 'INVALID_TRANSPORT_RECEIPT', 'receipt_ref');
|
|
207
|
+
if (this.#verifyReference(receipt_ref, 'receipt') !== true) {
|
|
208
|
+
fail('UNVERIFIED_RECEIPT', 'external delivery receipt must be an immutable verified reference');
|
|
209
|
+
}
|
|
210
|
+
if (projection.delivery_state === 'permanent_failure') fail('PERMANENT_FAILURE', 'permanently failed projection cannot be confirmed');
|
|
211
|
+
if (projection.delivery_state === 'confirmed') {
|
|
212
|
+
if (projection.receipt_ref !== receipt_ref) fail('RECEIPT_CONFLICT', 'projection is already confirmed by a different receipt');
|
|
213
|
+
return Object.freeze(canonicalize(projection));
|
|
214
|
+
}
|
|
215
|
+
projection.delivery_state = 'confirmed';
|
|
216
|
+
projection.receipt_ref = receipt_ref;
|
|
217
|
+
projection.reconciliation_state = 'pending';
|
|
218
|
+
projection.last_attempt_at = timestamp(this.#clock);
|
|
219
|
+
projection.attempts += 1;
|
|
220
|
+
this.#setEvolution(projection);
|
|
221
|
+
this.#persist();
|
|
222
|
+
return Object.freeze(canonicalize(projection));
|
|
223
|
+
}
|
|
224
|
+
|
|
203
225
|
reconcile({ projection_id } = {}) {
|
|
204
226
|
const projection = this.#find(projection_id);
|
|
205
227
|
if (!this.#transport || typeof this.#transport.reconcile !== 'function') fail('RECONCILIATION_NOT_CONFIGURED', 'no authorized reconciliation transport is configured');
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Constitution Article XIX — hooks are generated at install time, zero runtime overhead.
|
|
10
10
|
*
|
|
11
11
|
* Gemini CLI Hook Events (used by chati.dev):
|
|
12
|
-
* - BeforeModel: runs before model inference (PRISM injection, model advisory)
|
|
12
|
+
* - BeforeModel: runs before model inference (PRISM injection, legacy model advisory)
|
|
13
13
|
* - BeforeTool: runs before tool execution (mode governance, constitution guard, read protection)
|
|
14
14
|
* - PreCompress: runs before context compression (session digest)
|
|
15
15
|
*/
|
|
@@ -27,7 +27,7 @@ export const HOOK_MAP = {
|
|
|
27
27
|
// indefinitely from a long-running session.
|
|
28
28
|
'license-guard': { event: 'BeforeModel', description: 'Validate license on every turn (chati.dev governance)' },
|
|
29
29
|
'prism-engine': { event: 'BeforeModel', description: 'Inject PRISM context into model prompt' },
|
|
30
|
-
'model-governance': { event: 'BeforeModel', description: '
|
|
30
|
+
'model-governance': { event: 'BeforeModel', description: 'Legacy advisory for pre-v2 installations' },
|
|
31
31
|
'mode-governance': { event: 'BeforeTool', description: 'Block writes outside current mode scope' },
|
|
32
32
|
'constitution-guard': { event: 'BeforeTool', description: 'Block destructive commands and secret writes' },
|
|
33
33
|
'read-protection': { event: 'BeforeTool', description: 'Block reads of sensitive files' },
|
|
@@ -121,13 +121,14 @@ main();
|
|
|
121
121
|
|
|
122
122
|
/**
|
|
123
123
|
* Generate the model governance hook for Gemini CLI.
|
|
124
|
-
* BeforeModel event — advisory
|
|
124
|
+
* BeforeModel event — legacy advisory for pre-v2 installations.
|
|
125
125
|
*/
|
|
126
126
|
function generateModelGovernance() {
|
|
127
127
|
return `${HOOK_HEADER}
|
|
128
128
|
/**
|
|
129
129
|
* Model Governance — BeforeModel
|
|
130
|
-
*
|
|
130
|
+
* V2 routing is automatic and invisible. This wrapper only supports legacy
|
|
131
|
+
* installations that do not have a v2 installation contract.
|
|
131
132
|
*/
|
|
132
133
|
async function main() {
|
|
133
134
|
let input = '';
|
|
@@ -139,6 +140,11 @@ async function main() {
|
|
|
139
140
|
const event = JSON.parse(input);
|
|
140
141
|
const cwd = event.cwd || process.cwd();
|
|
141
142
|
|
|
143
|
+
if (existsSync(join(cwd, '.chati', 'v2', 'installation.json'))) {
|
|
144
|
+
console.log(JSON.stringify({}));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
142
148
|
const sessionPath = join(cwd, '.chati', 'session.yaml');
|
|
143
149
|
if (!existsSync(sessionPath)) {
|
|
144
150
|
console.log(JSON.stringify({}));
|
package/src/dashboard/layout.js
CHANGED
|
@@ -65,14 +65,16 @@ export function buildProjectInfo(data) {
|
|
|
65
65
|
const rawMode = session.execution_mode;
|
|
66
66
|
const mode = formatMode(rawMode && typeof rawMode === 'object' ? rawMode.mode : rawMode);
|
|
67
67
|
const lang = session.language || 'en';
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
const providers = Array.isArray(session.providers_enabled) && session.providers_enabled.length > 0
|
|
69
|
+
? session.providers_enabled.join('/')
|
|
70
|
+
: 'unknown';
|
|
71
|
+
const languageVisibleWidth = 12 + lang.length;
|
|
72
|
+
const providersVisibleWidth = 11 + providers.length;
|
|
71
73
|
|
|
72
74
|
return [
|
|
73
75
|
brand('│') + ` ${dim('Project:')} ${name}` + ' '.repeat(Math.max(1, 30 - name.length)) + `${dim('Type:')} ${type}` + ' '.repeat(Math.max(1, 18 - type.length)) + brand('│'),
|
|
74
76
|
brand('│') + ` ${dim('Phase:')} ${state}` + ' '.repeat(Math.max(1, 28)) + `${dim('Mode:')} ${mode}` + ' '.repeat(Math.max(1, 10)) + brand('│'),
|
|
75
|
-
brand('│') + ` ${dim('Language:')} ${lang}` + ' '.repeat(Math.max(1,
|
|
77
|
+
brand('│') + ` ${dim('Language:')} ${lang}` + ' '.repeat(Math.max(1, 28 - languageVisibleWidth)) + `${dim('Providers:')} ${providers}` + ' '.repeat(Math.max(1, 31 - providersVisibleWidth)) + brand('│'),
|
|
76
78
|
];
|
|
77
79
|
}
|
|
78
80
|
|
package/src/installer/core.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync, copyFileSync, existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
2
|
+
import { execFileSync } from 'child_process';
|
|
2
3
|
import { join, dirname, basename } from 'path';
|
|
3
4
|
import { fileURLToPath } from 'url';
|
|
4
5
|
import { createRequire } from 'module';
|
|
@@ -215,6 +216,21 @@ export async function installFramework(config) {
|
|
|
215
216
|
|
|
216
217
|
// 7. Update .gitignore with runtime session lock files
|
|
217
218
|
updateGitignore(targetDir, selectedIDEs);
|
|
219
|
+
|
|
220
|
+
// RAIL evidence and release lanes require a Git worktree. For a genuinely
|
|
221
|
+
// new project, initialize it automatically. Nested projects already covered
|
|
222
|
+
// by a parent worktree are left untouched.
|
|
223
|
+
ensureGitRepository(targetDir);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function ensureGitRepository(targetDir) {
|
|
227
|
+
try {
|
|
228
|
+
execFileSync('git', ['-C', targetDir, 'rev-parse', '--show-toplevel'], { stdio: 'ignore' });
|
|
229
|
+
return { initialized: false };
|
|
230
|
+
} catch {
|
|
231
|
+
execFileSync('git', ['-C', targetDir, 'init', '-q'], { stdio: 'ignore' });
|
|
232
|
+
return { initialized: true };
|
|
233
|
+
}
|
|
218
234
|
}
|
|
219
235
|
|
|
220
236
|
/**
|
|
@@ -9,7 +9,7 @@ export function generateSessionYaml(config) {
|
|
|
9
9
|
// Schema MUST match session-manager.js DEFAULT_SESSION fields,
|
|
10
10
|
// otherwise validateSession() rejects installer-generated sessions.
|
|
11
11
|
const session = {
|
|
12
|
-
schema_version: '1.
|
|
12
|
+
schema_version: '1.2',
|
|
13
13
|
version: '1.0',
|
|
14
14
|
mode: 'discover',
|
|
15
15
|
project: {
|
|
@@ -35,6 +35,26 @@ export function generateSessionYaml(config) {
|
|
|
35
35
|
agents: {},
|
|
36
36
|
backlog: [],
|
|
37
37
|
last_handoff: '',
|
|
38
|
+
scaffold_candidates: [],
|
|
39
|
+
scaffold_signals: {},
|
|
40
|
+
scaffold_applied: [],
|
|
41
|
+
active_model: null,
|
|
42
|
+
active_provider: null,
|
|
43
|
+
context_tokens_used: 0,
|
|
44
|
+
context_window_tokens: null,
|
|
45
|
+
context_last_bracket: null,
|
|
46
|
+
decision_trail: [],
|
|
47
|
+
teams: [],
|
|
48
|
+
team_events: [],
|
|
49
|
+
preview: {
|
|
50
|
+
status: 'inactive',
|
|
51
|
+
url: null,
|
|
52
|
+
port: null,
|
|
53
|
+
framework: null,
|
|
54
|
+
logs_captured: 0,
|
|
55
|
+
adjustment_count: 0,
|
|
56
|
+
},
|
|
57
|
+
model_selections: [],
|
|
38
58
|
// Article XXIII — Reasoning Tier Governance.
|
|
39
59
|
// Tier starts at 'standard' and is promoted by reasoning-escalator.js
|
|
40
60
|
// in response to friction signals. See chati.dev/hooks/reasoning-escalator.js.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
|
|
3
|
+
const COMMANDS = Object.freeze({ claude: 'claude', codex: 'codex', grok: 'grok' });
|
|
4
|
+
|
|
5
|
+
export function outputHasConnectedClickUp(output) {
|
|
6
|
+
if (typeof output !== 'string') return false;
|
|
7
|
+
return output.split(/\r?\n/).some((line) => {
|
|
8
|
+
if (!/\bclickup\b/i.test(line)) return false;
|
|
9
|
+
return !/\b(disabled|failed|error|not configured|unhealthy|unauthorized|disconnected)\b|authentication required/i.test(line);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Read-only preflight. It never writes provider config or reads credentials. */
|
|
14
|
+
export function checkClickUpMcp(selectedProviders, { exec = execFileSync } = {}) {
|
|
15
|
+
const providers = [...new Set(selectedProviders || [])].filter((provider) => COMMANDS[provider]);
|
|
16
|
+
const checks = providers.map((provider) => {
|
|
17
|
+
try {
|
|
18
|
+
const output = exec(COMMANDS[provider], ['mcp', 'list'], {
|
|
19
|
+
encoding: 'utf8', timeout: 15_000, stdio: ['ignore', 'pipe', 'pipe'],
|
|
20
|
+
});
|
|
21
|
+
return { provider, connected: outputHasConnectedClickUp(output) };
|
|
22
|
+
} catch {
|
|
23
|
+
return { provider, connected: false };
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const connectedProviders = checks.filter((check) => check.connected).map((check) => check.provider);
|
|
27
|
+
return Object.freeze({
|
|
28
|
+
passed: connectedProviders.length > 0,
|
|
29
|
+
connected_providers: connectedProviders,
|
|
30
|
+
checks,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"catalog": {
|
|
3
|
-
"snapshot_id": "chati-model-catalog-2026-08-27",
|
|
4
|
-
"published_at": "2026-08-
|
|
3
|
+
"snapshot_id": "chati-model-catalog-2026-08-27-v3",
|
|
4
|
+
"published_at": "2026-08-27T12:00:00.000Z",
|
|
5
5
|
"expires_at": "2026-11-25T00:00:00.000Z",
|
|
6
6
|
"models": [
|
|
7
7
|
{
|
|
8
8
|
"provider_id": "anthropic",
|
|
9
|
-
"model_id": "fable",
|
|
9
|
+
"model_id": "claude-fable-5",
|
|
10
10
|
"actions": [
|
|
11
11
|
"discovery",
|
|
12
12
|
"planning",
|
|
@@ -17,13 +17,12 @@
|
|
|
17
17
|
"tier": "frontier",
|
|
18
18
|
"natural_role": "architecture and design",
|
|
19
19
|
"routing_priority": {
|
|
20
|
-
"discovery":
|
|
21
|
-
"planning":
|
|
20
|
+
"discovery": 78,
|
|
21
|
+
"planning": 94,
|
|
22
22
|
"build": 45,
|
|
23
23
|
"review": 90,
|
|
24
24
|
"adjudication": 95,
|
|
25
25
|
"architect": 100,
|
|
26
|
-
"detail": 100,
|
|
27
26
|
"ux": 100
|
|
28
27
|
},
|
|
29
28
|
"adjudication_priority": 95,
|
|
@@ -31,7 +30,7 @@
|
|
|
31
30
|
},
|
|
32
31
|
{
|
|
33
32
|
"provider_id": "anthropic",
|
|
34
|
-
"model_id": "claude-opus-
|
|
33
|
+
"model_id": "claude-opus-5",
|
|
35
34
|
"actions": [
|
|
36
35
|
"discovery",
|
|
37
36
|
"planning",
|
|
@@ -42,11 +41,13 @@
|
|
|
42
41
|
"tier": "frontier",
|
|
43
42
|
"natural_role": "quality rules and judgment-heavy work",
|
|
44
43
|
"routing_priority": {
|
|
45
|
-
"discovery":
|
|
46
|
-
"planning":
|
|
44
|
+
"discovery": 92,
|
|
45
|
+
"planning": 96,
|
|
47
46
|
"build": 75,
|
|
48
47
|
"review": 95,
|
|
49
48
|
"adjudication": 100,
|
|
49
|
+
"brownfield-wu": 100,
|
|
50
|
+
"detail": 100,
|
|
50
51
|
"qa-planning": 97,
|
|
51
52
|
"qa-implementation": 97
|
|
52
53
|
},
|
|
@@ -65,13 +66,14 @@
|
|
|
65
66
|
"tier": "workhorse",
|
|
66
67
|
"natural_role": "daily implementation and planning craft",
|
|
67
68
|
"routing_priority": {
|
|
68
|
-
"discovery":
|
|
69
|
-
"planning":
|
|
69
|
+
"discovery": 90,
|
|
70
|
+
"planning": 92,
|
|
70
71
|
"build": 98,
|
|
71
72
|
"review": 80,
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
73
|
+
"greenfield-wu": 100,
|
|
74
|
+
"brief": 100,
|
|
75
|
+
"phases": 100,
|
|
76
|
+
"tasks": 100,
|
|
75
77
|
"dev": 98
|
|
76
78
|
},
|
|
77
79
|
"adjudication_priority": 60
|
|
@@ -122,7 +124,7 @@
|
|
|
122
124
|
},
|
|
123
125
|
{
|
|
124
126
|
"provider_id": "openai",
|
|
125
|
-
"model_id": "terra",
|
|
127
|
+
"model_id": "gpt-5.6-terra",
|
|
126
128
|
"actions": [
|
|
127
129
|
"discovery",
|
|
128
130
|
"planning",
|
|
@@ -146,7 +148,7 @@
|
|
|
146
148
|
},
|
|
147
149
|
{
|
|
148
150
|
"provider_id": "openai",
|
|
149
|
-
"model_id": "luna",
|
|
151
|
+
"model_id": "gpt-5.6-luna",
|
|
150
152
|
"actions": [
|
|
151
153
|
"discovery",
|
|
152
154
|
"planning",
|
|
@@ -163,21 +165,6 @@
|
|
|
163
165
|
},
|
|
164
166
|
"adjudication_priority": 30
|
|
165
167
|
},
|
|
166
|
-
{
|
|
167
|
-
"provider_id": "openai",
|
|
168
|
-
"model_id": "nano",
|
|
169
|
-
"actions": [
|
|
170
|
-
"discovery",
|
|
171
|
-
"build"
|
|
172
|
-
],
|
|
173
|
-
"tier": "utility",
|
|
174
|
-
"natural_role": "classification, extraction and cleanup",
|
|
175
|
-
"routing_priority": {
|
|
176
|
-
"discovery": 35,
|
|
177
|
-
"build": 40
|
|
178
|
-
},
|
|
179
|
-
"adjudication_priority": 5
|
|
180
|
-
},
|
|
181
168
|
{
|
|
182
169
|
"provider_id": "xai",
|
|
183
170
|
"model_id": "grok-4.6",
|
|
@@ -223,56 +210,8 @@
|
|
|
223
210
|
},
|
|
224
211
|
"adjudication_priority": 70,
|
|
225
212
|
"highest_reasoning_configuration": "xhigh"
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
"provider_id": "xai",
|
|
229
|
-
"model_id": "grok-4.3",
|
|
230
|
-
"actions": [
|
|
231
|
-
"discovery",
|
|
232
|
-
"planning",
|
|
233
|
-
"build",
|
|
234
|
-
"review"
|
|
235
|
-
],
|
|
236
|
-
"tier": "worker",
|
|
237
|
-
"natural_role": "cost-efficient parallel execution",
|
|
238
|
-
"routing_priority": {
|
|
239
|
-
"discovery": 65,
|
|
240
|
-
"planning": 60,
|
|
241
|
-
"build": 78,
|
|
242
|
-
"review": 60
|
|
243
|
-
},
|
|
244
|
-
"adjudication_priority": 35
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
"provider_id": "xai",
|
|
248
|
-
"model_id": "grok-4.20",
|
|
249
|
-
"actions": [
|
|
250
|
-
"discovery",
|
|
251
|
-
"build"
|
|
252
|
-
],
|
|
253
|
-
"tier": "worker",
|
|
254
|
-
"natural_role": "high-volume structured tasks",
|
|
255
|
-
"routing_priority": {
|
|
256
|
-
"discovery": 55,
|
|
257
|
-
"build": 70
|
|
258
|
-
},
|
|
259
|
-
"adjudication_priority": 20
|
|
260
|
-
},
|
|
261
|
-
{
|
|
262
|
-
"provider_id": "xai",
|
|
263
|
-
"model_id": "grok-build-0.1",
|
|
264
|
-
"actions": [
|
|
265
|
-
"build"
|
|
266
|
-
],
|
|
267
|
-
"tier": "specialist",
|
|
268
|
-
"natural_role": "speed-first implementation in Grok Build",
|
|
269
|
-
"routing_priority": {
|
|
270
|
-
"build": 90,
|
|
271
|
-
"dev": 92
|
|
272
|
-
},
|
|
273
|
-
"adjudication_priority": 10
|
|
274
213
|
}
|
|
275
214
|
]
|
|
276
215
|
},
|
|
277
|
-
"signature": "
|
|
216
|
+
"signature": "tL1JS1RkPfOBDE6rcctrEPN98oQ6FjLurwZnzYglMvrsvvceRbS19INcxmPYQjT+NJv507Vuo/HIkm+J0nQ1Cw=="
|
|
278
217
|
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
{
|
|
2
|
-
"snapshot_id": "chati-model-catalog-2026-08-27",
|
|
3
|
-
"published_at": "2026-08-
|
|
2
|
+
"snapshot_id": "chati-model-catalog-2026-08-27-v3",
|
|
3
|
+
"published_at": "2026-08-27T12:00:00.000Z",
|
|
4
4
|
"expires_at": "2026-11-25T00:00:00.000Z",
|
|
5
5
|
"models": [
|
|
6
6
|
{
|
|
7
7
|
"provider_id": "anthropic",
|
|
8
|
-
"model_id": "fable",
|
|
8
|
+
"model_id": "claude-fable-5",
|
|
9
9
|
"actions": ["discovery", "planning", "build", "review", "adjudication"],
|
|
10
10
|
"tier": "frontier",
|
|
11
11
|
"natural_role": "architecture and design",
|
|
12
|
-
"routing_priority": { "discovery":
|
|
12
|
+
"routing_priority": { "discovery": 78, "planning": 94, "build": 45, "review": 90, "adjudication": 95, "architect": 100, "ux": 100 },
|
|
13
13
|
"adjudication_priority": 95,
|
|
14
14
|
"highest_reasoning_configuration": "xhigh"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"provider_id": "anthropic",
|
|
18
|
-
"model_id": "claude-opus-
|
|
18
|
+
"model_id": "claude-opus-5",
|
|
19
19
|
"actions": ["discovery", "planning", "build", "review", "adjudication"],
|
|
20
20
|
"tier": "frontier",
|
|
21
21
|
"natural_role": "quality rules and judgment-heavy work",
|
|
22
|
-
"routing_priority": { "discovery":
|
|
22
|
+
"routing_priority": { "discovery": 92, "planning": 96, "build": 75, "review": 95, "adjudication": 100, "brownfield-wu": 100, "detail": 100, "qa-planning": 97, "qa-implementation": 97 },
|
|
23
23
|
"adjudication_priority": 100,
|
|
24
24
|
"highest_reasoning_configuration": "xhigh"
|
|
25
25
|
},
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"actions": ["discovery", "planning", "build", "review"],
|
|
30
30
|
"tier": "workhorse",
|
|
31
31
|
"natural_role": "daily implementation and planning craft",
|
|
32
|
-
"routing_priority": { "discovery":
|
|
32
|
+
"routing_priority": { "discovery": 90, "planning": 92, "build": 98, "review": 80, "greenfield-wu": 100, "brief": 100, "phases": 100, "tasks": 100, "dev": 98 },
|
|
33
33
|
"adjudication_priority": 60
|
|
34
34
|
},
|
|
35
35
|
{
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"provider_id": "openai",
|
|
56
|
-
"model_id": "terra",
|
|
56
|
+
"model_id": "gpt-5.6-terra",
|
|
57
57
|
"actions": ["discovery", "planning", "build", "review", "adjudication"],
|
|
58
58
|
"tier": "workhorse",
|
|
59
59
|
"natural_role": "scoped implementation and efficient review",
|
|
@@ -63,22 +63,13 @@
|
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
"provider_id": "openai",
|
|
66
|
-
"model_id": "luna",
|
|
66
|
+
"model_id": "gpt-5.6-luna",
|
|
67
67
|
"actions": ["discovery", "planning", "build", "review"],
|
|
68
68
|
"tier": "worker",
|
|
69
69
|
"natural_role": "low-cost workers and routine tasks",
|
|
70
70
|
"routing_priority": { "discovery": 60, "planning": 55, "build": 72, "review": 60 },
|
|
71
71
|
"adjudication_priority": 30
|
|
72
72
|
},
|
|
73
|
-
{
|
|
74
|
-
"provider_id": "openai",
|
|
75
|
-
"model_id": "nano",
|
|
76
|
-
"actions": ["discovery", "build"],
|
|
77
|
-
"tier": "utility",
|
|
78
|
-
"natural_role": "classification, extraction and cleanup",
|
|
79
|
-
"routing_priority": { "discovery": 35, "build": 40 },
|
|
80
|
-
"adjudication_priority": 5
|
|
81
|
-
},
|
|
82
73
|
{
|
|
83
74
|
"provider_id": "xai",
|
|
84
75
|
"model_id": "grok-4.6",
|
|
@@ -98,33 +89,6 @@
|
|
|
98
89
|
"routing_priority": { "discovery": 82, "planning": 84, "build": 98, "review": 82, "adjudication": 70, "dev": 98 },
|
|
99
90
|
"adjudication_priority": 70,
|
|
100
91
|
"highest_reasoning_configuration": "xhigh"
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
"provider_id": "xai",
|
|
104
|
-
"model_id": "grok-4.3",
|
|
105
|
-
"actions": ["discovery", "planning", "build", "review"],
|
|
106
|
-
"tier": "worker",
|
|
107
|
-
"natural_role": "cost-efficient parallel execution",
|
|
108
|
-
"routing_priority": { "discovery": 65, "planning": 60, "build": 78, "review": 60 },
|
|
109
|
-
"adjudication_priority": 35
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
"provider_id": "xai",
|
|
113
|
-
"model_id": "grok-4.20",
|
|
114
|
-
"actions": ["discovery", "build"],
|
|
115
|
-
"tier": "worker",
|
|
116
|
-
"natural_role": "high-volume structured tasks",
|
|
117
|
-
"routing_priority": { "discovery": 55, "build": 70 },
|
|
118
|
-
"adjudication_priority": 20
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
"provider_id": "xai",
|
|
122
|
-
"model_id": "grok-build-0.1",
|
|
123
|
-
"actions": ["build"],
|
|
124
|
-
"tier": "specialist",
|
|
125
|
-
"natural_role": "speed-first implementation in Grok Build",
|
|
126
|
-
"routing_priority": { "build": 90, "dev": 92 },
|
|
127
|
-
"adjudication_priority": 10
|
|
128
92
|
}
|
|
129
93
|
]
|
|
130
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
tL1JS1RkPfOBDE6rcctrEPN98oQ6FjLurwZnzYglMvrsvvceRbS19INcxmPYQjT+NJv507Vuo/HIkm+J0nQ1Cw==
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { sha256 } from '@chati/core';
|
|
2
2
|
|
|
3
3
|
const PROVIDER_BINDINGS = Object.freeze({
|
|
4
|
-
claude: Object.freeze({ provider_id: 'anthropic', harness_id: 'claude', default_model: 'fable' }),
|
|
4
|
+
claude: Object.freeze({ provider_id: 'anthropic', harness_id: 'claude', default_model: 'claude-fable-5' }),
|
|
5
5
|
codex: Object.freeze({ provider_id: 'openai', harness_id: 'codex', default_model: 'gpt-5.6-sol' }),
|
|
6
6
|
grok: Object.freeze({ provider_id: 'xai', harness_id: 'grok', default_model: 'grok-4.6' }),
|
|
7
7
|
});
|
|
@@ -100,7 +100,7 @@ export function buildWizardV2InstallationInput({
|
|
|
100
100
|
const projectSlug = projectName.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '') || 'project';
|
|
101
101
|
const installation = {
|
|
102
102
|
installation_id: `wizard-${projectSlug}`,
|
|
103
|
-
profile: installationMode === 'internal' ? '
|
|
103
|
+
profile: installationMode === 'internal' ? 'authorized-internal' : 'open',
|
|
104
104
|
enabled_providers,
|
|
105
105
|
capability_snapshot_ref: snapshotId,
|
|
106
106
|
policy_ref: `policy://installation/${snapshotId}`,
|
|
@@ -36,8 +36,15 @@ export function checkRegistry(targetDir) {
|
|
|
36
36
|
// Check each registered entity exists on disk
|
|
37
37
|
const entities = flattenEntitiesMap(registry.entities);
|
|
38
38
|
for (const entity of entities) {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
// Registry entries describe the monorepo source layout. Installed projects
|
|
40
|
+
// bundle the CLI source under .chati.dev/_cli, so health must resolve both
|
|
41
|
+
// layouts instead of reporting bundled runtime files as missing.
|
|
42
|
+
const candidates = [join(targetDir, entity.path)];
|
|
43
|
+
const bundledSourcePrefix = 'packages/chati-dev/src/';
|
|
44
|
+
if (entity.path.startsWith(bundledSourcePrefix)) {
|
|
45
|
+
candidates.push(join(targetDir, resolveFrameworkDir(targetDir), '_cli', entity.path.slice(bundledSourcePrefix.length)));
|
|
46
|
+
}
|
|
47
|
+
if (candidates.some((filePath) => existsSync(filePath))) {
|
|
41
48
|
found.push(entity);
|
|
42
49
|
} else {
|
|
43
50
|
missing.push(entity);
|
|
@@ -193,4 +200,3 @@ function loadRegistry(registryPath) {
|
|
|
193
200
|
return null;
|
|
194
201
|
}
|
|
195
202
|
}
|
|
196
|
-
|