@esotech/contextuate 2.1.0 → 2.1.2
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/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.js +131 -0
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js +164 -228
- package/dist/commands/install.js +8 -24
- package/dist/index.js +7 -0
- package/dist/templates/agents/aegis.md +1 -1
- package/dist/templates/agents/archon.md +116 -8
- package/dist/templates/agents/atlas.md +17 -17
- package/dist/templates/agents/canvas.md +1 -1
- package/dist/templates/agents/chronicle.md +1 -1
- package/dist/templates/agents/chronos.md +1 -1
- package/dist/templates/agents/cipher.md +1 -1
- package/dist/templates/agents/crucible.md +1 -1
- package/dist/templates/agents/echo.md +1 -1
- package/dist/templates/agents/forge.md +1 -1
- package/dist/templates/agents/ledger.md +34 -3
- package/dist/templates/agents/meridian.md +1 -1
- package/dist/templates/agents/nexus.md +1 -1
- package/dist/templates/agents/pythia.md +1 -1
- package/dist/templates/agents/scribe.md +1 -1
- package/dist/templates/agents/sentinel.md +1 -1
- package/dist/templates/agents/thoth.md +1 -1
- package/dist/templates/agents/unity.md +1 -1
- package/dist/templates/agents/vox.md +1 -1
- package/dist/templates/agents/weaver.md +1 -1
- package/dist/templates/{skills → commands}/consult.md +1 -1
- package/dist/templates/commands/orchestrate.md +49 -0
- package/dist/templates/framework-agents/documentation-expert.md +3 -3
- package/dist/templates/framework-agents/tools-expert.md +3 -3
- package/dist/templates/templates/contextuate.md +1 -1
- package/dist/templates/tools/agent-creator.md +4 -4
- package/dist/templates/tools/standards-detector.md +1 -1
- package/dist/utils/tools.d.ts +60 -0
- package/dist/utils/tools.js +260 -0
- package/package.json +2 -2
- package/dist/templates/skills/orchestrate.md +0 -173
- package/dist/templates/skills/pythia.md +0 -37
- package/dist/templates/templates/standards/go.standards.md +0 -167
- package/dist/templates/templates/standards/java.standards.md +0 -167
- package/dist/templates/templates/standards/javascript.standards.md +0 -292
- package/dist/templates/templates/standards/php.standards.md +0 -181
- package/dist/templates/templates/standards/python.standards.md +0 -175
- package/dist/templates/tools/agent-creator.tool.md +0 -252
- package/dist/templates/tools/quickref.tool.md +0 -216
- package/dist/templates/tools/spawn.tool.md +0 -31
- package/dist/templates/tools/standards-detector.tool.md +0 -301
- package/dist/templates/version.json +0 -8
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface ToolInfo {
|
|
2
|
+
installed: boolean;
|
|
3
|
+
version: string | null;
|
|
4
|
+
path: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface ToolsConfig {
|
|
7
|
+
ripgrep: ToolInfo;
|
|
8
|
+
}
|
|
9
|
+
export interface ContextuateConfig {
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
description: string;
|
|
13
|
+
repository: string;
|
|
14
|
+
initialized: string;
|
|
15
|
+
updated: string;
|
|
16
|
+
tools: ToolsConfig;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detect ripgrep installation
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectRipgrep(): ToolInfo;
|
|
22
|
+
/**
|
|
23
|
+
* Detect all tools
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectTools(): ToolsConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Detect the current operating system and package manager
|
|
28
|
+
*/
|
|
29
|
+
export declare function detectPlatform(): {
|
|
30
|
+
os: 'macos' | 'linux' | 'windows';
|
|
31
|
+
packageManager: string | null;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Install ripgrep using the appropriate package manager
|
|
35
|
+
*/
|
|
36
|
+
export declare function installRipgrep(): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Prompt user to install missing tools
|
|
39
|
+
*/
|
|
40
|
+
export declare function promptInstallTools(tools: ToolsConfig, nonInteractive?: boolean): Promise<ToolsConfig>;
|
|
41
|
+
/**
|
|
42
|
+
* Process template variables in a file
|
|
43
|
+
*/
|
|
44
|
+
export declare function processTemplateVariables(content: string, tools: ToolsConfig): string;
|
|
45
|
+
/**
|
|
46
|
+
* Process template variables in all files in a directory
|
|
47
|
+
*/
|
|
48
|
+
export declare function processTemplateDirectory(dir: string, tools: ToolsConfig): Promise<number>;
|
|
49
|
+
/**
|
|
50
|
+
* Read contextuate.json config
|
|
51
|
+
*/
|
|
52
|
+
export declare function readContextuateConfig(installDir: string): Promise<ContextuateConfig | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Write contextuate.json config
|
|
55
|
+
*/
|
|
56
|
+
export declare function writeContextuateConfig(installDir: string, config: ContextuateConfig): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Print tool status
|
|
59
|
+
*/
|
|
60
|
+
export declare function printToolStatus(tools: ToolsConfig): void;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.detectRipgrep = detectRipgrep;
|
|
7
|
+
exports.detectTools = detectTools;
|
|
8
|
+
exports.detectPlatform = detectPlatform;
|
|
9
|
+
exports.installRipgrep = installRipgrep;
|
|
10
|
+
exports.promptInstallTools = promptInstallTools;
|
|
11
|
+
exports.processTemplateVariables = processTemplateVariables;
|
|
12
|
+
exports.processTemplateDirectory = processTemplateDirectory;
|
|
13
|
+
exports.readContextuateConfig = readContextuateConfig;
|
|
14
|
+
exports.writeContextuateConfig = writeContextuateConfig;
|
|
15
|
+
exports.printToolStatus = printToolStatus;
|
|
16
|
+
const child_process_1 = require("child_process");
|
|
17
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
18
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
19
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
20
|
+
const path_1 = __importDefault(require("path"));
|
|
21
|
+
const os_1 = __importDefault(require("os"));
|
|
22
|
+
/**
|
|
23
|
+
* Detect if a command exists and get its path
|
|
24
|
+
*/
|
|
25
|
+
function detectCommand(command) {
|
|
26
|
+
try {
|
|
27
|
+
const result = (0, child_process_1.execSync)(`which ${command}`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
28
|
+
return { exists: true, path: result.trim() };
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return { exists: false, path: null };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get ripgrep version
|
|
36
|
+
*/
|
|
37
|
+
function getRipgrepVersion(rgPath) {
|
|
38
|
+
try {
|
|
39
|
+
const result = (0, child_process_1.execSync)(`"${rgPath}" --version`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
40
|
+
const match = result.match(/ripgrep\s+(\d+\.\d+\.\d+)/);
|
|
41
|
+
return match ? match[1] : null;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Detect ripgrep installation
|
|
49
|
+
*/
|
|
50
|
+
function detectRipgrep() {
|
|
51
|
+
const detection = detectCommand('rg');
|
|
52
|
+
if (!detection.exists) {
|
|
53
|
+
return { installed: false, version: null, path: null };
|
|
54
|
+
}
|
|
55
|
+
const version = getRipgrepVersion(detection.path);
|
|
56
|
+
return {
|
|
57
|
+
installed: true,
|
|
58
|
+
version,
|
|
59
|
+
path: detection.path
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Detect all tools
|
|
64
|
+
*/
|
|
65
|
+
function detectTools() {
|
|
66
|
+
return {
|
|
67
|
+
ripgrep: detectRipgrep()
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect the current operating system and package manager
|
|
72
|
+
*/
|
|
73
|
+
function detectPlatform() {
|
|
74
|
+
const platform = os_1.default.platform();
|
|
75
|
+
if (platform === 'darwin') {
|
|
76
|
+
// Check for Homebrew
|
|
77
|
+
const brew = detectCommand('brew');
|
|
78
|
+
return { os: 'macos', packageManager: brew.exists ? 'brew' : null };
|
|
79
|
+
}
|
|
80
|
+
if (platform === 'linux') {
|
|
81
|
+
// Check for common package managers
|
|
82
|
+
if (detectCommand('apt-get').exists) {
|
|
83
|
+
return { os: 'linux', packageManager: 'apt' };
|
|
84
|
+
}
|
|
85
|
+
if (detectCommand('dnf').exists) {
|
|
86
|
+
return { os: 'linux', packageManager: 'dnf' };
|
|
87
|
+
}
|
|
88
|
+
if (detectCommand('yum').exists) {
|
|
89
|
+
return { os: 'linux', packageManager: 'yum' };
|
|
90
|
+
}
|
|
91
|
+
if (detectCommand('pacman').exists) {
|
|
92
|
+
return { os: 'linux', packageManager: 'pacman' };
|
|
93
|
+
}
|
|
94
|
+
return { os: 'linux', packageManager: null };
|
|
95
|
+
}
|
|
96
|
+
if (platform === 'win32') {
|
|
97
|
+
// Check for common Windows package managers
|
|
98
|
+
if (detectCommand('choco').exists) {
|
|
99
|
+
return { os: 'windows', packageManager: 'choco' };
|
|
100
|
+
}
|
|
101
|
+
if (detectCommand('winget').exists) {
|
|
102
|
+
return { os: 'windows', packageManager: 'winget' };
|
|
103
|
+
}
|
|
104
|
+
return { os: 'windows', packageManager: null };
|
|
105
|
+
}
|
|
106
|
+
return { os: 'linux', packageManager: null };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Install ripgrep using the appropriate package manager
|
|
110
|
+
*/
|
|
111
|
+
async function installRipgrep() {
|
|
112
|
+
const platform = detectPlatform();
|
|
113
|
+
let installCommand;
|
|
114
|
+
switch (platform.packageManager) {
|
|
115
|
+
case 'brew':
|
|
116
|
+
installCommand = 'brew install ripgrep';
|
|
117
|
+
break;
|
|
118
|
+
case 'apt':
|
|
119
|
+
installCommand = 'sudo apt-get install -y ripgrep';
|
|
120
|
+
break;
|
|
121
|
+
case 'dnf':
|
|
122
|
+
installCommand = 'sudo dnf install -y ripgrep';
|
|
123
|
+
break;
|
|
124
|
+
case 'yum':
|
|
125
|
+
installCommand = 'sudo yum install -y ripgrep';
|
|
126
|
+
break;
|
|
127
|
+
case 'pacman':
|
|
128
|
+
installCommand = 'sudo pacman -S --noconfirm ripgrep';
|
|
129
|
+
break;
|
|
130
|
+
case 'choco':
|
|
131
|
+
installCommand = 'choco install ripgrep -y';
|
|
132
|
+
break;
|
|
133
|
+
case 'winget':
|
|
134
|
+
installCommand = 'winget install BurntSushi.ripgrep.MSVC';
|
|
135
|
+
break;
|
|
136
|
+
default:
|
|
137
|
+
console.log(chalk_1.default.yellow('[WARN] No supported package manager found.'));
|
|
138
|
+
console.log(chalk_1.default.blue('[INFO] Please install ripgrep manually:'));
|
|
139
|
+
console.log(chalk_1.default.gray(' - macOS: brew install ripgrep'));
|
|
140
|
+
console.log(chalk_1.default.gray(' - Ubuntu/Debian: sudo apt install ripgrep'));
|
|
141
|
+
console.log(chalk_1.default.gray(' - Fedora: sudo dnf install ripgrep'));
|
|
142
|
+
console.log(chalk_1.default.gray(' - Arch: sudo pacman -S ripgrep'));
|
|
143
|
+
console.log(chalk_1.default.gray(' - Windows: choco install ripgrep'));
|
|
144
|
+
console.log(chalk_1.default.gray(' - Or download from: https://github.com/BurntSushi/ripgrep/releases'));
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
console.log(chalk_1.default.blue(`[INFO] Installing ripgrep via ${platform.packageManager}...`));
|
|
148
|
+
console.log(chalk_1.default.gray(` Running: ${installCommand}`));
|
|
149
|
+
return new Promise((resolve) => {
|
|
150
|
+
(0, child_process_1.exec)(installCommand, (error, stdout, stderr) => {
|
|
151
|
+
if (error) {
|
|
152
|
+
console.log(chalk_1.default.red(`[ERROR] Installation failed: ${error.message}`));
|
|
153
|
+
if (stderr) {
|
|
154
|
+
console.log(chalk_1.default.gray(stderr));
|
|
155
|
+
}
|
|
156
|
+
resolve(false);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.log(chalk_1.default.green('[OK] ripgrep installed successfully'));
|
|
160
|
+
resolve(true);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Prompt user to install missing tools
|
|
167
|
+
*/
|
|
168
|
+
async function promptInstallTools(tools, nonInteractive = false) {
|
|
169
|
+
// Check ripgrep
|
|
170
|
+
if (!tools.ripgrep.installed && !nonInteractive) {
|
|
171
|
+
const { installRg } = await inquirer_1.default.prompt([
|
|
172
|
+
{
|
|
173
|
+
type: 'confirm',
|
|
174
|
+
name: 'installRg',
|
|
175
|
+
message: 'ripgrep (rg) is not installed. Would you like to install it? (Recommended for faster code search)',
|
|
176
|
+
default: true,
|
|
177
|
+
},
|
|
178
|
+
]);
|
|
179
|
+
if (installRg) {
|
|
180
|
+
const success = await installRipgrep();
|
|
181
|
+
if (success) {
|
|
182
|
+
// Re-detect after installation
|
|
183
|
+
tools.ripgrep = detectRipgrep();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return tools;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Process template variables in a file
|
|
191
|
+
*/
|
|
192
|
+
function processTemplateVariables(content, tools) {
|
|
193
|
+
// Replace {grep} with rg if ripgrep is installed, otherwise grep
|
|
194
|
+
const grepCommand = tools.ripgrep.installed ? 'rg' : 'grep';
|
|
195
|
+
return content.replace(/\{grep\}/g, grepCommand);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Process template variables in all files in a directory
|
|
199
|
+
*/
|
|
200
|
+
async function processTemplateDirectory(dir, tools) {
|
|
201
|
+
let processedCount = 0;
|
|
202
|
+
if (!fs_extra_1.default.existsSync(dir)) {
|
|
203
|
+
return processedCount;
|
|
204
|
+
}
|
|
205
|
+
const processDir = async (currentDir) => {
|
|
206
|
+
const entries = await fs_extra_1.default.readdir(currentDir, { withFileTypes: true });
|
|
207
|
+
for (const entry of entries) {
|
|
208
|
+
const fullPath = path_1.default.join(currentDir, entry.name);
|
|
209
|
+
if (entry.isDirectory()) {
|
|
210
|
+
await processDir(fullPath);
|
|
211
|
+
}
|
|
212
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
213
|
+
const content = await fs_extra_1.default.readFile(fullPath, 'utf-8');
|
|
214
|
+
const processed = processTemplateVariables(content, tools);
|
|
215
|
+
if (content !== processed) {
|
|
216
|
+
await fs_extra_1.default.writeFile(fullPath, processed);
|
|
217
|
+
processedCount++;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
await processDir(dir);
|
|
223
|
+
return processedCount;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Read contextuate.json config
|
|
227
|
+
*/
|
|
228
|
+
async function readContextuateConfig(installDir) {
|
|
229
|
+
const configPath = path_1.default.join(installDir, 'contextuate.json');
|
|
230
|
+
try {
|
|
231
|
+
if (fs_extra_1.default.existsSync(configPath)) {
|
|
232
|
+
const content = await fs_extra_1.default.readFile(configPath, 'utf-8');
|
|
233
|
+
return JSON.parse(content);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Config doesn't exist or is invalid
|
|
238
|
+
}
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Write contextuate.json config
|
|
243
|
+
*/
|
|
244
|
+
async function writeContextuateConfig(installDir, config) {
|
|
245
|
+
const configPath = path_1.default.join(installDir, 'contextuate.json');
|
|
246
|
+
await fs_extra_1.default.writeFile(configPath, JSON.stringify(config, null, 2));
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Print tool status
|
|
250
|
+
*/
|
|
251
|
+
function printToolStatus(tools) {
|
|
252
|
+
console.log('');
|
|
253
|
+
console.log(chalk_1.default.blue('[INFO] Tool Status:'));
|
|
254
|
+
if (tools.ripgrep.installed) {
|
|
255
|
+
console.log(chalk_1.default.green(` [OK] ripgrep: ${tools.ripgrep.path} (v${tools.ripgrep.version})`));
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
console.log(chalk_1.default.yellow(' [--] ripgrep: not installed (using grep fallback)'));
|
|
259
|
+
}
|
|
260
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@esotech/contextuate",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2",
|
|
4
4
|
"description": "**Standardized AI Context for Software Projects**",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"scripts": {
|
|
13
13
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
14
|
-
"build": "tsc && mkdir -p dist/templates && cp -r src/templates/* dist/templates/ && mkdir -p dist/monitor/hooks && cp src/monitor/hooks/emit-event.js dist/monitor/hooks/ && chmod +x dist/index.js dist/monitor/hooks/emit-event.js dist/monitor/daemon/cli.js dist/monitor/server/cli.js",
|
|
14
|
+
"build": "tsc && rm -rf dist/templates && mkdir -p dist/templates && cp -r src/templates/* dist/templates/ && mkdir -p dist/monitor/hooks && cp src/monitor/hooks/emit-event.js dist/monitor/hooks/ && chmod +x dist/index.js dist/monitor/hooks/emit-event.js dist/monitor/daemon/cli.js dist/monitor/server/cli.js",
|
|
15
15
|
"build:monitor-ui": "cd src/monitor/ui && npm install && npm run build",
|
|
16
16
|
"build:all": "npm run build && npm run build:monitor-ui",
|
|
17
17
|
"prepublishOnly": "npm run build:all"
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
# /orchestrate - Orchestrator Mode Skill
|
|
2
|
-
|
|
3
|
-
Activate the ARCHON agent for coordinated multi-agent task execution.
|
|
4
|
-
|
|
5
|
-
## Agent Invocation
|
|
6
|
-
|
|
7
|
-
**IMPORTANT:** Before proceeding, read and adopt the ARCHON agent persona:
|
|
8
|
-
|
|
9
|
-
**Agent Definition:** [agents/archon.md](../agents/archon.md)
|
|
10
|
-
|
|
11
|
-
Read the agent file above, then follow its guidelines for task analysis, delegation, and synthesis.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
/orchestrate [task description]
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Behavior
|
|
20
|
-
|
|
21
|
-
When this skill is invoked, read the ARCHON agent definition and adopt its persona to:
|
|
22
|
-
|
|
23
|
-
1. **Analyze the task** to identify required domains and complexity
|
|
24
|
-
2. **Delegate to specialist agents** rather than implementing directly
|
|
25
|
-
3. **Coordinate handoffs** between agents for dependent tasks
|
|
26
|
-
4. **Synthesize results** into a cohesive solution
|
|
27
|
-
|
|
28
|
-
## Pre-Orchestration
|
|
29
|
-
|
|
30
|
-
For complex or unfamiliar work, use `/consult` BEFORE `/orchestrate`:
|
|
31
|
-
```
|
|
32
|
-
/consult [research/plan topic] → produces specification
|
|
33
|
-
/orchestrate [implement spec] → delegates to specialists
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Available Specialist Agents
|
|
37
|
-
|
|
38
|
-
> **Agent Roster:** [agent-roles.md](../.contextuate/standards/agent-roles.md)
|
|
39
|
-
|
|
40
|
-
Read the agent roster for the complete list of specialist agents with their domains and when to use each one.
|
|
41
|
-
|
|
42
|
-
## Examples
|
|
43
|
-
|
|
44
|
-
### Multi-domain feature
|
|
45
|
-
```
|
|
46
|
-
/orchestrate Add a new API endpoint with database query, validation, and tests
|
|
47
|
-
```
|
|
48
|
-
Result: Delegates to thoth (query), nexus (API), sentinel (validation), crucible (tests)
|
|
49
|
-
|
|
50
|
-
### Code review workflow
|
|
51
|
-
```
|
|
52
|
-
/orchestrate Review the authentication module for security issues and suggest improvements
|
|
53
|
-
```
|
|
54
|
-
Result: Delegates to atlas (find files), sentinel (security analysis), aegis (code review)
|
|
55
|
-
|
|
56
|
-
### Documentation task
|
|
57
|
-
```
|
|
58
|
-
/orchestrate Document the monitor feature architecture and create API reference
|
|
59
|
-
```
|
|
60
|
-
Result: Delegates to chronicle (architecture doc), scribe (API reference)
|
|
61
|
-
|
|
62
|
-
## Orchestration Rules
|
|
63
|
-
|
|
64
|
-
1. **Never implement directly** - Always delegate to specialist agents
|
|
65
|
-
2. **Provide context** - Give agents specific file paths and patterns to follow
|
|
66
|
-
3. **Track complex tasks** - Use ledger for multi-step work
|
|
67
|
-
4. **Synthesize results** - Combine agent outputs into cohesive solution
|
|
68
|
-
5. **Keep context clean** - Delegate to subagents to preserve main context window
|
|
69
|
-
|
|
70
|
-
## Parallel Execution
|
|
71
|
-
|
|
72
|
-
**CRITICAL: Always spawn independent agents in parallel.**
|
|
73
|
-
|
|
74
|
-
When multiple agents can work independently (no dependencies between their outputs), you MUST launch them in a single message with multiple Task tool calls:
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
Good: Single message with parallel Task calls for independent work
|
|
78
|
-
├── Task: atlas (find auth files)
|
|
79
|
-
├── Task: thoth (analyze schema)
|
|
80
|
-
└── Task: sentinel (security review)
|
|
81
|
-
|
|
82
|
-
Bad: Sequential Task calls when work is independent
|
|
83
|
-
├── Message 1: Task: atlas...
|
|
84
|
-
├── Message 2: Task: thoth...
|
|
85
|
-
└── Message 3: Task: sentinel...
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**Parallel execution rules:**
|
|
89
|
-
- Identify independent tasks that don't depend on each other's output
|
|
90
|
-
- Launch all independent tasks in a single response
|
|
91
|
-
- Only serialize tasks that have true dependencies
|
|
92
|
-
- Use background execution (`run_in_background: true`) for long-running tasks when appropriate
|
|
93
|
-
|
|
94
|
-
## File Contention & Conflict Avoidance
|
|
95
|
-
|
|
96
|
-
When multiple agents may modify the same files, use the **Intent-First Locking Protocol**.
|
|
97
|
-
|
|
98
|
-
> **Full Protocol:** [agent-workflow.md](../.contextuate/standards/agent-workflow.md#conflict-avoidance--file-locking)
|
|
99
|
-
|
|
100
|
-
### Quick Reference
|
|
101
|
-
|
|
102
|
-
**Step 1: Intent Declaration** - Before editing, agents declare intent:
|
|
103
|
-
```yaml
|
|
104
|
-
Status: PLANNING
|
|
105
|
-
Intent:
|
|
106
|
-
- Modify: src/path/to/file.js
|
|
107
|
-
- Create: src/path/to/new-file.js
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Step 2: Archon Validation** - Check against Active Lock Table:
|
|
111
|
-
- **Clear**: Lock the files, approve execution
|
|
112
|
-
- **Conflict**: Queue the agent until files are released
|
|
113
|
-
|
|
114
|
-
**Step 3: Resolution Options:**
|
|
115
|
-
| Scenario | Resolution |
|
|
116
|
-
|----------|------------|
|
|
117
|
-
| Files are free | Lock and proceed |
|
|
118
|
-
| Files locked by another agent | Queue and wait |
|
|
119
|
-
| Highly parallel work | Use Git Worktree isolation |
|
|
120
|
-
|
|
121
|
-
### Git Worktree Alternative
|
|
122
|
-
For highly parallel tasks where locking is too restrictive:
|
|
123
|
-
1. Create disposable Git worktree (branch) per agent
|
|
124
|
-
2. Agent works entirely within worktree
|
|
125
|
-
3. Agent commits and signals ready
|
|
126
|
-
4. **Unity** merges branch into main
|
|
127
|
-
|
|
128
|
-
## Agent Preference Order
|
|
129
|
-
|
|
130
|
-
**CRITICAL: Prefer specialist agents over general-purpose agents.**
|
|
131
|
-
|
|
132
|
-
When deciding which agent to use, follow this preference hierarchy:
|
|
133
|
-
|
|
134
|
-
1. **Custom Specialist Agents** (STRONGLY PREFERRED)
|
|
135
|
-
- aegis, atlas, canvas, chronicle, chronos, cipher, crucible, echo, forge, ledger, meridian, nexus, thoth, scribe, sentinel, unity, vox, weaver
|
|
136
|
-
- These have domain-specific expertise and context
|
|
137
|
-
|
|
138
|
-
2. **Built-in Specialized Agents** (Use only if no specialist fits)
|
|
139
|
-
- Plan, Explore, claude-code-guide
|
|
140
|
-
|
|
141
|
-
3. **General-Purpose Agents** (AVOID unless absolutely necessary)
|
|
142
|
-
- general-purpose - Only use for truly generic tasks that don't fit any specialist
|
|
143
|
-
|
|
144
|
-
**Examples:**
|
|
145
|
-
| Task | Wrong Choice | Right Choice |
|
|
146
|
-
|------|-------------|--------------|
|
|
147
|
-
| Find files related to auth | general-purpose | **atlas** |
|
|
148
|
-
| Write API documentation | general-purpose | **scribe** |
|
|
149
|
-
| Review code quality | Explore | **aegis** |
|
|
150
|
-
| Create database queries | general-purpose | **thoth** |
|
|
151
|
-
| Build new component | general-purpose | **forge** (scaffold) + **canvas** (UI) |
|
|
152
|
-
|
|
153
|
-
**Always ask: "Which specialist agent has domain expertise for this task?"**
|
|
154
|
-
|
|
155
|
-
## Decision Tree
|
|
156
|
-
|
|
157
|
-
```
|
|
158
|
-
Is this a simple, single-domain task?
|
|
159
|
-
├── YES → Delegate to single specialist
|
|
160
|
-
└── NO → Break down and coordinate multiple specialists
|
|
161
|
-
|
|
162
|
-
Does it require exploration first?
|
|
163
|
-
├── YES → Start with atlas for navigation
|
|
164
|
-
└── NO → Proceed to implementation agents
|
|
165
|
-
|
|
166
|
-
Is this multi-step?
|
|
167
|
-
├── YES → Engage ledger for tracking
|
|
168
|
-
└── NO → Direct delegation
|
|
169
|
-
|
|
170
|
-
Should we review the result?
|
|
171
|
-
├── YES → aegis for quality, crucible for tests
|
|
172
|
-
└── NO → Deliver directly
|
|
173
|
-
```
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# /pythia - Strategic Planning Oracle
|
|
2
|
-
|
|
3
|
-
Alias for `/consult`. Activates the PYTHIA agent for strategic planning and research.
|
|
4
|
-
|
|
5
|
-
## Agent Invocation
|
|
6
|
-
|
|
7
|
-
**IMPORTANT:** Before proceeding, read and adopt the PYTHIA agent persona:
|
|
8
|
-
|
|
9
|
-
**Agent Definition:** [agents/pythia.md](../agents/pythia.md)
|
|
10
|
-
|
|
11
|
-
Read the agent file above, then follow its guidelines for research, synthesis, and specification creation.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
/pythia [topic or question]
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
See [/consult](./consult.md) for full documentation and behavior details.
|
|
20
|
-
|
|
21
|
-
## Quick Reference
|
|
22
|
-
|
|
23
|
-
| Command | Purpose |
|
|
24
|
-
|---------|---------|
|
|
25
|
-
| `/pythia [topic]` | Research and plan before implementation |
|
|
26
|
-
| `/consult [topic]` | Same as `/pythia` |
|
|
27
|
-
| `/orchestrate [task]` | Execute implementation with specialist agents |
|
|
28
|
-
|
|
29
|
-
## Example Flow
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
/pythia How should we implement real-time notifications?
|
|
33
|
-
|
|
|
34
|
-
[PYTHIA produces specification]
|
|
35
|
-
|
|
|
36
|
-
/orchestrate Implement the notification system per spec
|
|
37
|
-
```
|