@zelari/core 0.7.9 → 0.7.11
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/LICENSE +21 -21
- package/dist/agents/councilDirectives.js +46 -46
- package/dist/agents/promptModules.js +65 -65
- package/dist/agents/roles.js +198 -198
- package/dist/agents/skills/builtin/debugging.js +109 -109
- package/dist/agents/skills/builtin/docs.js +172 -172
- package/dist/agents/skills/builtin/git-ops.js +166 -166
- package/dist/agents/skills/builtin/planning.js +123 -123
- package/dist/agents/skills/builtin/refactoring.js +83 -83
- package/dist/agents/skills/builtin/review.js +108 -108
- package/dist/agents/skills/builtin/testing.js +107 -107
- package/dist/agents/skills.js +23 -23
- package/dist/council/modeBanners.js +2 -2
- package/package.json +1 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { registerCodingSkill } from '../../skills.js';
|
|
2
|
-
const CLARIFICATION_PROTOCOL = `
|
|
3
|
-
|
|
4
|
-
WHEN TO ASK THE USER (clarification):
|
|
5
|
-
If a single missing fact would materially change your output (target platform, scope, a binary design choice with significant trade-offs, a constraint you cannot safely assume), pause and ask the user by appending EXACTLY this block at the end of your message:
|
|
6
|
-
|
|
7
|
-
---QUESTION---
|
|
8
|
-
{ "question": "One focused question", "choices": ["Option A", "Option B", "Option C"], "context": "Why this matters" }
|
|
9
|
-
---END---
|
|
10
|
-
|
|
11
|
-
Rules for clarifications:
|
|
12
|
-
- Ask AT MOST ONE question per turn, and only when genuinely blocked.
|
|
13
|
-
- Prefer a small set of concrete "choices" (2-4). The user can still type a custom answer.
|
|
14
|
-
- Do NOT ask for information that could be reasonably assumed or already in shared context.
|
|
2
|
+
const CLARIFICATION_PROTOCOL = `
|
|
3
|
+
|
|
4
|
+
WHEN TO ASK THE USER (clarification):
|
|
5
|
+
If a single missing fact would materially change your output (target platform, scope, a binary design choice with significant trade-offs, a constraint you cannot safely assume), pause and ask the user by appending EXACTLY this block at the end of your message:
|
|
6
|
+
|
|
7
|
+
---QUESTION---
|
|
8
|
+
{ "question": "One focused question", "choices": ["Option A", "Option B", "Option C"], "context": "Why this matters" }
|
|
9
|
+
---END---
|
|
10
|
+
|
|
11
|
+
Rules for clarifications:
|
|
12
|
+
- Ask AT MOST ONE question per turn, and only when genuinely blocked.
|
|
13
|
+
- Prefer a small set of concrete "choices" (2-4). The user can still type a custom answer.
|
|
14
|
+
- Do NOT ask for information that could be reasonably assumed or already in shared context.
|
|
15
15
|
- If you can proceed with a sound documented assumption, DO SO instead of asking.`;
|
|
16
16
|
const writeUnitTests = {
|
|
17
17
|
id: 'write-unit-tests',
|
|
@@ -57,31 +57,31 @@ const writeUnitTests = {
|
|
|
57
57
|
},
|
|
58
58
|
],
|
|
59
59
|
outputSchema: '{ testFile: string; tests: Array<{ name: string; input: unknown; expected?: unknown; options?: Record<string, unknown>; expectedThrows?: string }> }',
|
|
60
|
-
systemPromptFragment: `You are writing Vitest unit tests for a function or module.
|
|
61
|
-
|
|
62
|
-
## Methodology
|
|
63
|
-
1. **Read the source**: understand the function signature, branches, error paths.
|
|
64
|
-
2. **Identify happy paths**: at least 2 tests for typical inputs.
|
|
65
|
-
3. **Identify edge cases** (boundaries): 0, 1, max, empty array, empty string.
|
|
66
|
-
4. **Identify error paths**: invalid input, network errors, partial data.
|
|
67
|
-
5. **Write one test per assertion** — easier to debug when a test fails.
|
|
68
|
-
6. **Use Vitest patterns**: describe/it/expect, vi.fn() for mocks, vi.spyOn for stubs.
|
|
69
|
-
|
|
70
|
-
## Test naming
|
|
71
|
-
- Use \`describe('moduleName', () => { it('does X when Y', ...) })\`.
|
|
72
|
-
- Test name describes behavior, not implementation.
|
|
73
|
-
- Group related tests in the same describe block.
|
|
74
|
-
|
|
75
|
-
## Output format (JSON-typed)
|
|
76
|
-
- testFile: string (the file path)
|
|
77
|
-
- tests: Array<{ name, input, expected, options?, expectedThrows? }>
|
|
78
|
-
|
|
79
|
-
## Anti-patterns to avoid
|
|
80
|
-
- Tests that always pass (tautologies)
|
|
81
|
-
- Tests with multiple assertions (split into separate tests)
|
|
82
|
-
- Tests that depend on test execution order
|
|
83
|
-
- Snapshot tests for non-deterministic output
|
|
84
|
-
|
|
60
|
+
systemPromptFragment: `You are writing Vitest unit tests for a function or module.
|
|
61
|
+
|
|
62
|
+
## Methodology
|
|
63
|
+
1. **Read the source**: understand the function signature, branches, error paths.
|
|
64
|
+
2. **Identify happy paths**: at least 2 tests for typical inputs.
|
|
65
|
+
3. **Identify edge cases** (boundaries): 0, 1, max, empty array, empty string.
|
|
66
|
+
4. **Identify error paths**: invalid input, network errors, partial data.
|
|
67
|
+
5. **Write one test per assertion** — easier to debug when a test fails.
|
|
68
|
+
6. **Use Vitest patterns**: describe/it/expect, vi.fn() for mocks, vi.spyOn for stubs.
|
|
69
|
+
|
|
70
|
+
## Test naming
|
|
71
|
+
- Use \`describe('moduleName', () => { it('does X when Y', ...) })\`.
|
|
72
|
+
- Test name describes behavior, not implementation.
|
|
73
|
+
- Group related tests in the same describe block.
|
|
74
|
+
|
|
75
|
+
## Output format (JSON-typed)
|
|
76
|
+
- testFile: string (the file path)
|
|
77
|
+
- tests: Array<{ name, input, expected, options?, expectedThrows? }>
|
|
78
|
+
|
|
79
|
+
## Anti-patterns to avoid
|
|
80
|
+
- Tests that always pass (tautologies)
|
|
81
|
+
- Tests with multiple assertions (split into separate tests)
|
|
82
|
+
- Tests that depend on test execution order
|
|
83
|
+
- Snapshot tests for non-deterministic output
|
|
84
|
+
|
|
85
85
|
Stay under 500 words.${CLARIFICATION_PROTOCOL}`,
|
|
86
86
|
};
|
|
87
87
|
const writeIntegrationTests = {
|
|
@@ -128,26 +128,26 @@ const writeIntegrationTests = {
|
|
|
128
128
|
},
|
|
129
129
|
],
|
|
130
130
|
outputSchema: '{ testFile: string; scenarios: Array<{ name: string; steps: string[] }>; contracts: Array<{ between: string; contract: string }> }',
|
|
131
|
-
systemPromptFragment: `You are writing integration tests that span multiple components.
|
|
132
|
-
|
|
133
|
-
## Methodology
|
|
134
|
-
1. **Identify the integration boundary**: which 2+ components interact?
|
|
135
|
-
2. **Document the contract**: what does component A promise to component B?
|
|
136
|
-
3. **Test the contract, not the internals**: verify the OBSERVABLE behavior, not the implementation.
|
|
137
|
-
4. **Use real subsystems where possible**: in-memory SQLite instead of mocks; fake HTTP server instead of stubbed client.
|
|
138
|
-
5. **Each scenario is a complete user story**: setup → action → verify.
|
|
139
|
-
|
|
140
|
-
## Output format (JSON-typed)
|
|
141
|
-
- testFile: string
|
|
142
|
-
- scenarios: Array<{ name, steps[] }>
|
|
143
|
-
- contracts: Array<{ between, contract }>
|
|
144
|
-
|
|
145
|
-
## Integration test principles
|
|
146
|
-
- **Minimal mocks**: mock only the OUTSIDE world (network, disk, time), not your own code
|
|
147
|
-
- **Real data**: use realistic test data, not "foo" / "bar"
|
|
148
|
-
- **Deterministic**: avoid timing-based assertions (use polling with timeout)
|
|
149
|
-
- **Cleanup**: each scenario should leave the system in a clean state
|
|
150
|
-
|
|
131
|
+
systemPromptFragment: `You are writing integration tests that span multiple components.
|
|
132
|
+
|
|
133
|
+
## Methodology
|
|
134
|
+
1. **Identify the integration boundary**: which 2+ components interact?
|
|
135
|
+
2. **Document the contract**: what does component A promise to component B?
|
|
136
|
+
3. **Test the contract, not the internals**: verify the OBSERVABLE behavior, not the implementation.
|
|
137
|
+
4. **Use real subsystems where possible**: in-memory SQLite instead of mocks; fake HTTP server instead of stubbed client.
|
|
138
|
+
5. **Each scenario is a complete user story**: setup → action → verify.
|
|
139
|
+
|
|
140
|
+
## Output format (JSON-typed)
|
|
141
|
+
- testFile: string
|
|
142
|
+
- scenarios: Array<{ name, steps[] }>
|
|
143
|
+
- contracts: Array<{ between, contract }>
|
|
144
|
+
|
|
145
|
+
## Integration test principles
|
|
146
|
+
- **Minimal mocks**: mock only the OUTSIDE world (network, disk, time), not your own code
|
|
147
|
+
- **Real data**: use realistic test data, not "foo" / "bar"
|
|
148
|
+
- **Deterministic**: avoid timing-based assertions (use polling with timeout)
|
|
149
|
+
- **Cleanup**: each scenario should leave the system in a clean state
|
|
150
|
+
|
|
151
151
|
Stay under 500 words.${CLARIFICATION_PROTOCOL}`,
|
|
152
152
|
};
|
|
153
153
|
const regressionTest = {
|
|
@@ -180,35 +180,35 @@ const regressionTest = {
|
|
|
180
180
|
input: 'Bug: "Council shows duplicate user message at session resume" was just fixed in commit a3f9d',
|
|
181
181
|
output: {
|
|
182
182
|
testFile: 'tests/regression/duplicate-user-message.test.ts',
|
|
183
|
-
test: `import { describe, it, expect } from 'vitest';
|
|
184
|
-
import { runCouncilPure } from '../agents/councilApi.js';
|
|
185
|
-
|
|
186
|
-
describe('regression: duplicate user message at session resume', () => {
|
|
187
|
-
it('does not render duplicate user message when session resumes with duplicate input', async () => {
|
|
188
|
-
const messages = [
|
|
189
|
-
{ role: 'user' as const, content: 'hi' },
|
|
190
|
-
{ role: 'user' as const, content: 'hi' }, // duplicate from session resume
|
|
191
|
-
];
|
|
192
|
-
const mockProvider = async function* () {
|
|
193
|
-
yield { kind: 'text' as const, delta: 'response' };
|
|
194
|
-
yield { kind: 'finish' as const, reason: 'stop' };
|
|
195
|
-
};
|
|
196
|
-
const events = [];
|
|
197
|
-
for await (const e of runCouncilPure('hi', {
|
|
198
|
-
model: 'test', provider: 'test',
|
|
199
|
-
messages,
|
|
200
|
-
tools: [],
|
|
201
|
-
councilSize: 1,
|
|
202
|
-
debateMode: false,
|
|
203
|
-
ragContext: '',
|
|
204
|
-
workspaceContext: '',
|
|
205
|
-
providerStream: mockProvider,
|
|
206
|
-
}, {})) {
|
|
207
|
-
events.push(e);
|
|
208
|
-
}
|
|
209
|
-
const userMessageDeltas = events.filter(e => e.type === 'message_delta').length;
|
|
210
|
-
expect(userMessageDeltas).toBe(1); // exactly 1, not 2
|
|
211
|
-
});
|
|
183
|
+
test: `import { describe, it, expect } from 'vitest';
|
|
184
|
+
import { runCouncilPure } from '../agents/councilApi.js';
|
|
185
|
+
|
|
186
|
+
describe('regression: duplicate user message at session resume', () => {
|
|
187
|
+
it('does not render duplicate user message when session resumes with duplicate input', async () => {
|
|
188
|
+
const messages = [
|
|
189
|
+
{ role: 'user' as const, content: 'hi' },
|
|
190
|
+
{ role: 'user' as const, content: 'hi' }, // duplicate from session resume
|
|
191
|
+
];
|
|
192
|
+
const mockProvider = async function* () {
|
|
193
|
+
yield { kind: 'text' as const, delta: 'response' };
|
|
194
|
+
yield { kind: 'finish' as const, reason: 'stop' };
|
|
195
|
+
};
|
|
196
|
+
const events = [];
|
|
197
|
+
for await (const e of runCouncilPure('hi', {
|
|
198
|
+
model: 'test', provider: 'test',
|
|
199
|
+
messages,
|
|
200
|
+
tools: [],
|
|
201
|
+
councilSize: 1,
|
|
202
|
+
debateMode: false,
|
|
203
|
+
ragContext: '',
|
|
204
|
+
workspaceContext: '',
|
|
205
|
+
providerStream: mockProvider,
|
|
206
|
+
}, {})) {
|
|
207
|
+
events.push(e);
|
|
208
|
+
}
|
|
209
|
+
const userMessageDeltas = events.filter(e => e.type === 'message_delta').length;
|
|
210
|
+
expect(userMessageDeltas).toBe(1); // exactly 1, not 2
|
|
211
|
+
});
|
|
212
212
|
});`,
|
|
213
213
|
whyRegression: 'Bug was reported 3 times in the last month. The fix (dedup user messages on session resume) was in commit a3f9d. This test guards against future refactors breaking the dedup logic.',
|
|
214
214
|
bugCommit: 'a3f9d',
|
|
@@ -216,26 +216,26 @@ describe('regression: duplicate user message at session resume', () => {
|
|
|
216
216
|
},
|
|
217
217
|
],
|
|
218
218
|
outputSchema: '{ testFile: string; test: string; whyRegression: string; bugCommit: string }',
|
|
219
|
-
systemPromptFragment: `You are converting a fixed bug into a permanent regression test.
|
|
220
|
-
|
|
221
|
-
## Methodology
|
|
222
|
-
1. **Confirm the bug is FIXED**: check git log / recent commits for the fix.
|
|
223
|
-
2. **Write the test**: it should FAIL if you revert the fix (verify this mentally).
|
|
224
|
-
3. **Add a comment** in the test file linking to the bug commit.
|
|
225
|
-
4. **Place in tests/regression/**: separate from unit tests for visibility.
|
|
226
|
-
|
|
227
|
-
## Output format (JSON-typed)
|
|
228
|
-
- testFile: string
|
|
229
|
-
- test: string (the full test code, runnable as-is)
|
|
230
|
-
- whyRegression: string (why this test should stay forever)
|
|
231
|
-
- bugCommit: string (the commit hash that fixed the bug)
|
|
232
|
-
|
|
233
|
-
## Regression test principles
|
|
234
|
-
- **One test per bug** — easier to identify which regression fired
|
|
235
|
-
- **Reference the bug commit** in a comment so future devs understand the history
|
|
236
|
-
- **Minimal repro** — strip to the essential trigger, don't include unrelated setup
|
|
237
|
-
- **Never delete a regression test** without a written justification (the bug came back once, it'll come back again)
|
|
238
|
-
|
|
219
|
+
systemPromptFragment: `You are converting a fixed bug into a permanent regression test.
|
|
220
|
+
|
|
221
|
+
## Methodology
|
|
222
|
+
1. **Confirm the bug is FIXED**: check git log / recent commits for the fix.
|
|
223
|
+
2. **Write the test**: it should FAIL if you revert the fix (verify this mentally).
|
|
224
|
+
3. **Add a comment** in the test file linking to the bug commit.
|
|
225
|
+
4. **Place in tests/regression/**: separate from unit tests for visibility.
|
|
226
|
+
|
|
227
|
+
## Output format (JSON-typed)
|
|
228
|
+
- testFile: string
|
|
229
|
+
- test: string (the full test code, runnable as-is)
|
|
230
|
+
- whyRegression: string (why this test should stay forever)
|
|
231
|
+
- bugCommit: string (the commit hash that fixed the bug)
|
|
232
|
+
|
|
233
|
+
## Regression test principles
|
|
234
|
+
- **One test per bug** — easier to identify which regression fired
|
|
235
|
+
- **Reference the bug commit** in a comment so future devs understand the history
|
|
236
|
+
- **Minimal repro** — strip to the essential trigger, don't include unrelated setup
|
|
237
|
+
- **Never delete a regression test** without a written justification (the bug came back once, it'll come back again)
|
|
238
|
+
|
|
239
239
|
Stay under 300 words.${CLARIFICATION_PROTOCOL}`,
|
|
240
240
|
};
|
|
241
241
|
// Register in topological order
|
package/dist/agents/skills.js
CHANGED
|
@@ -29,11 +29,11 @@ export const SKILL_CATALOG = [
|
|
|
29
29
|
enabledByDefault: true,
|
|
30
30
|
builtin: true,
|
|
31
31
|
requiredTools: ['createDocument', 'updateDocument', 'searchDocuments', 'linkDocuments'],
|
|
32
|
-
systemPromptFragment: `You can manage the Knowledge Vault directly.
|
|
33
|
-
- Documents are markdown files with a path (e.g. "notes/architecture"), title, content, tags, and optional category.
|
|
34
|
-
- Connect documents with [[wikilinks]]: write [[target]] or [[target|alias]] inside the content.
|
|
35
|
-
- Add #hashtags anywhere in the content to tag a document.
|
|
36
|
-
- Optional YAML frontmatter may precede the body (key: value lines wrapped in ---).
|
|
32
|
+
systemPromptFragment: `You can manage the Knowledge Vault directly.
|
|
33
|
+
- Documents are markdown files with a path (e.g. "notes/architecture"), title, content, tags, and optional category.
|
|
34
|
+
- Connect documents with [[wikilinks]]: write [[target]] or [[target|alias]] inside the content.
|
|
35
|
+
- Add #hashtags anywhere in the content to tag a document.
|
|
36
|
+
- Optional YAML frontmatter may precede the body (key: value lines wrapped in ---).
|
|
37
37
|
- Prefer creating durable notes over answering in chat when the information is reusable.`,
|
|
38
38
|
},
|
|
39
39
|
{
|
|
@@ -48,11 +48,11 @@ export const SKILL_CATALOG = [
|
|
|
48
48
|
enabledByDefault: true,
|
|
49
49
|
builtin: true,
|
|
50
50
|
requiredTools: ['createPlan', 'createTask', 'createPhase', 'createMilestone', 'updateTask'],
|
|
51
|
-
systemPromptFragment: `You plan projects hierarchically.
|
|
52
|
-
- Decompose work into phases, then tasks within phases.
|
|
53
|
-
- For each task include: title, description, priority (low|medium|high|critical), and optional tags/subtasks.
|
|
54
|
-
- Define milestones to mark key deliverables.
|
|
55
|
-
- When relevant, reference file paths and acceptance criteria.
|
|
51
|
+
systemPromptFragment: `You plan projects hierarchically.
|
|
52
|
+
- Decompose work into phases, then tasks within phases.
|
|
53
|
+
- For each task include: title, description, priority (low|medium|high|critical), and optional tags/subtasks.
|
|
54
|
+
- Define milestones to mark key deliverables.
|
|
55
|
+
- When relevant, reference file paths and acceptance criteria.
|
|
56
56
|
- Prefer ONE createPlan call (phases with nested tasks + milestone) over many itemized createPhase/createTask calls.`,
|
|
57
57
|
},
|
|
58
58
|
{
|
|
@@ -67,9 +67,9 @@ export const SKILL_CATALOG = [
|
|
|
67
67
|
enabledByDefault: true,
|
|
68
68
|
builtin: true,
|
|
69
69
|
requiredTools: ['addIdea', 'clusterIdeas'],
|
|
70
|
-
systemPromptFragment: `You generate and organize ideas.
|
|
71
|
-
- Produce a diverse set of ideas, then cluster related ones.
|
|
72
|
-
- Tag ideas consistently and assign a category.
|
|
70
|
+
systemPromptFragment: `You generate and organize ideas.
|
|
71
|
+
- Produce a diverse set of ideas, then cluster related ones.
|
|
72
|
+
- Tag ideas consistently and assign a category.
|
|
73
73
|
- Evaluate feasibility and novelty briefly.`,
|
|
74
74
|
},
|
|
75
75
|
{
|
|
@@ -84,9 +84,9 @@ export const SKILL_CATALOG = [
|
|
|
84
84
|
enabledByDefault: false,
|
|
85
85
|
builtin: true,
|
|
86
86
|
requiredTools: ['buildMindMap', 'addNode', 'linkNodes', 'createMindMapNode'],
|
|
87
|
-
systemPromptFragment: `You build mind maps as JSON structures.
|
|
88
|
-
- Root → branches → leaves.
|
|
89
|
-
- Each node has a label and short content.
|
|
87
|
+
systemPromptFragment: `You build mind maps as JSON structures.
|
|
88
|
+
- Root → branches → leaves.
|
|
89
|
+
- Each node has a label and short content.
|
|
90
90
|
- Use semantic colors and connect nodes that relate to vault documents.`,
|
|
91
91
|
},
|
|
92
92
|
{
|
|
@@ -104,10 +104,10 @@ export const SKILL_CATALOG = [
|
|
|
104
104
|
// network tools wherever the executor registry provides them (the
|
|
105
105
|
// executable filter drops them where they don't exist).
|
|
106
106
|
requiredTools: ['searchRAG', 'searchDocuments', 'web_search', 'fetch_url'],
|
|
107
|
-
systemPromptFragment: `You research using the retrieval system and the web.
|
|
108
|
-
- Use the retrieval tool listed in your AVAILABLE TOOLS (searchDocuments or searchRAG) to find prior knowledge before answering.
|
|
109
|
-
- For external facts (library docs, APIs, best practices), use web_search, then fetch_url on the best result.
|
|
110
|
-
- Cite sources (document title or URL) when you rely on retrieved content.
|
|
107
|
+
systemPromptFragment: `You research using the retrieval system and the web.
|
|
108
|
+
- Use the retrieval tool listed in your AVAILABLE TOOLS (searchDocuments or searchRAG) to find prior knowledge before answering.
|
|
109
|
+
- For external facts (library docs, APIs, best practices), use web_search, then fetch_url on the best result.
|
|
110
|
+
- Cite sources (document title or URL) when you rely on retrieved content.
|
|
111
111
|
- Structure analyses with clear sections and a conclusion.`,
|
|
112
112
|
},
|
|
113
113
|
{
|
|
@@ -122,9 +122,9 @@ export const SKILL_CATALOG = [
|
|
|
122
122
|
enabledByDefault: false,
|
|
123
123
|
builtin: true,
|
|
124
124
|
requiredTools: ['createDocument', 'updateDocument'],
|
|
125
|
-
systemPromptFragment: `You write polished documents.
|
|
126
|
-
- Choose an appropriate structure (guide, spec, reference, narrative).
|
|
127
|
-
- Maintain a consistent tone and voice.
|
|
125
|
+
systemPromptFragment: `You write polished documents.
|
|
126
|
+
- Choose an appropriate structure (guide, spec, reference, narrative).
|
|
127
|
+
- Maintain a consistent tone and voice.
|
|
128
128
|
- Use headings, lists, and code blocks where helpful; link related notes with [[wikilinks]].`,
|
|
129
129
|
},
|
|
130
130
|
];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export const DESIGN_PHASE_MODE_BANNER = `COUNCIL RUN MODE: design-phase.
|
|
1
|
+
export const DESIGN_PHASE_MODE_BANNER = `COUNCIL RUN MODE: design-phase.
|
|
2
2
|
Workspace tool emissions described in your role prompt are MANDATORY in this run — prose alone does not count as a deliverable. Persist artifacts via the workspace tools listed in your AVAILABLE TOOLS section.`;
|
|
3
|
-
export const IMPLEMENTATION_MODE_BANNER = `COUNCIL RUN MODE: implementation.
|
|
3
|
+
export const IMPLEMENTATION_MODE_BANNER = `COUNCIL RUN MODE: implementation.
|
|
4
4
|
Prefer write_file, edit_file, and bash for code changes. Design-phase mandatory workspace blocks in your role prompt are INACTIVE in this run — only call workspace tools when they add durable project value.`;
|
|
5
5
|
export function councilModeBanner(runMode) {
|
|
6
6
|
return runMode === 'design-phase'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zelari/core",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.11",
|
|
4
4
|
"description": "Zelari Code core library — provider-neutral agent loop (AgentHarness), multi-agent council orchestration, and built-in skills. Used by the zelari-code CLI; consumable by other agent frontends.",
|
|
5
5
|
"author": "N-THEM Studio",
|
|
6
6
|
"license": "MIT",
|