multimodel-dev-os 0.3.0
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/.ai/agents/README.md +23 -0
- package/.ai/agents/coder.md +11 -0
- package/.ai/agents/devops.md +8 -0
- package/.ai/agents/multimodel-orchestrator.md +105 -0
- package/.ai/agents/planner.md +11 -0
- package/.ai/agents/qa-tester.md +8 -0
- package/.ai/agents/reviewer.md +11 -0
- package/.ai/agents/security-auditor.md +8 -0
- package/.ai/agents/seo-auditor.md +8 -0
- package/.ai/checks/README.md +38 -0
- package/.ai/checks/context-budget.md +7 -0
- package/.ai/checks/pre-commit.md +8 -0
- package/.ai/checks/pre-deploy.md +8 -0
- package/.ai/checks/pre-implementation.md +7 -0
- package/.ai/checks/regression-checklist.md +8 -0
- package/.ai/config.yaml +60 -0
- package/.ai/context/README.md +18 -0
- package/.ai/context/architecture.md +15 -0
- package/.ai/context/business-rules.md +12 -0
- package/.ai/context/context-budget.md +12 -0
- package/.ai/context/deployment-rules.md +15 -0
- package/.ai/context/model-map.md +11 -0
- package/.ai/context/project-brief.md +17 -0
- package/.ai/context/seo-rules.md +15 -0
- package/.ai/prompts/README.md +37 -0
- package/.ai/prompts/generate-tests.md +5 -0
- package/.ai/prompts/handoff-to-next-model.md +5 -0
- package/.ai/prompts/implement-safely.md +5 -0
- package/.ai/prompts/plan-first.md +5 -0
- package/.ai/prompts/review-diff.md +5 -0
- package/.ai/prompts/summarize-session.md +5 -0
- package/.ai/session-logs/.gitkeep +1 -0
- package/.ai/session-logs/README.md +49 -0
- package/.ai/skills/README.md +34 -0
- package/.ai/skills/bug-fix.md +9 -0
- package/.ai/skills/caveman-bug-fix.md +2 -0
- package/.ai/skills/caveman-context-handoff.md +2 -0
- package/.ai/skills/caveman-feature-build.md +2 -0
- package/.ai/skills/context-routing.md +8 -0
- package/.ai/skills/cpanel-deploy.md +9 -0
- package/.ai/skills/example-skill.md +38 -0
- package/.ai/skills/landing-page-optimization.md +8 -0
- package/.ai/skills/model-routing.md +7 -0
- package/.ai/skills/nextjs-feature-build.md +9 -0
- package/.ai/skills/refactor.md +9 -0
- package/.ai/skills/seo-implementation.md +8 -0
- package/.ai/templates/AGENTS.caveman.md +12 -0
- package/.ai/templates/MEMORY.caveman.md +14 -0
- package/.ai/templates/RUNBOOK.caveman.md +22 -0
- package/.ai/templates/TASKS.caveman.md +7 -0
- package/.ai/templates/bug-report-template.md +14 -0
- package/.ai/templates/feature-spec-template.md +14 -0
- package/.ai/templates/project-memory-template.md +12 -0
- package/.ai/templates/session-log-template.md +16 -0
- package/.ai/templates/task-template.md +16 -0
- package/AGENTS.md +79 -0
- package/LICENSE +21 -0
- package/MEMORY.md +42 -0
- package/README.md +197 -0
- package/RUNBOOK.md +73 -0
- package/TASKS.md +28 -0
- package/adapters/antigravity/.gemini/settings.json +13 -0
- package/adapters/antigravity/AGENTS.md +29 -0
- package/adapters/antigravity/setup.md +36 -0
- package/adapters/claude/CLAUDE.md +31 -0
- package/adapters/claude/setup.md +35 -0
- package/adapters/codex/AGENTS.md +27 -0
- package/adapters/codex/setup.md +25 -0
- package/adapters/cursor/.cursorrules +30 -0
- package/adapters/cursor/setup.md +35 -0
- package/adapters/gemini/GEMINI.md +31 -0
- package/adapters/gemini/setup.md +34 -0
- package/adapters/vscode/.vscode/settings.json +21 -0
- package/adapters/vscode/setup.md +40 -0
- package/bin/multimodel-dev-os.js +267 -0
- package/docs/adapters.md +79 -0
- package/docs/architecture.md +64 -0
- package/docs/caveman-mode.md +74 -0
- package/docs/cli-roadmap.md +44 -0
- package/docs/faq.md +66 -0
- package/docs/installers.md +58 -0
- package/docs/multimodel-workflow.md +121 -0
- package/docs/npm-publishing.md +74 -0
- package/docs/quickstart.md +85 -0
- package/docs/testing-v0.2.md +73 -0
- package/examples/ecommerce-store/.ai/config.yaml +4 -0
- package/examples/ecommerce-store/AGENTS.md +5 -0
- package/examples/ecommerce-store/MEMORY.md +4 -0
- package/examples/general-app/.ai/config.yaml +4 -0
- package/examples/general-app/AGENTS.md +5 -0
- package/examples/general-app/MEMORY.md +4 -0
- package/examples/nextjs-saas/.ai/config.yaml +4 -0
- package/examples/nextjs-saas/AGENTS.md +13 -0
- package/examples/nextjs-saas/MEMORY.md +5 -0
- package/examples/seo-landing-page/.ai/config.yaml +4 -0
- package/examples/seo-landing-page/AGENTS.md +5 -0
- package/examples/seo-landing-page/MEMORY.md +5 -0
- package/examples/wordpress-site/.ai/config.yaml +4 -0
- package/examples/wordpress-site/AGENTS.md +5 -0
- package/examples/wordpress-site/MEMORY.md +4 -0
- package/package.json +43 -0
- package/scripts/install.ps1 +230 -0
- package/scripts/install.sh +237 -0
- package/scripts/pack-template.sh +39 -0
- package/scripts/verify.sh +271 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* multimodel-dev-os CLI
|
|
5
|
+
* Dependency-free local initialization and validation utility.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync } from 'fs';
|
|
9
|
+
import { join, dirname, resolve } from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
const sourceRoot = resolve(__dirname, '..');
|
|
15
|
+
|
|
16
|
+
let version = '0.3.0';
|
|
17
|
+
try {
|
|
18
|
+
const pkgData = JSON.parse(readFileSync(resolve(sourceRoot, 'package.json'), 'utf8'));
|
|
19
|
+
version = pkgData.version;
|
|
20
|
+
} catch (e) {}
|
|
21
|
+
|
|
22
|
+
const ARGS = process.argv.slice(2);
|
|
23
|
+
|
|
24
|
+
// Parse parameters manually to avoid external dependencies
|
|
25
|
+
function parseArgs(args) {
|
|
26
|
+
const params = {
|
|
27
|
+
command: null,
|
|
28
|
+
target: process.cwd(),
|
|
29
|
+
template: 'general-app',
|
|
30
|
+
adapters: [],
|
|
31
|
+
caveman: false,
|
|
32
|
+
dryRun: false,
|
|
33
|
+
force: false,
|
|
34
|
+
help: false
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
for (let i = 0; i < args.length; i++) {
|
|
38
|
+
const arg = args[i];
|
|
39
|
+
if (arg === '--target' || arg === '-t') {
|
|
40
|
+
params.target = resolve(args[++i]);
|
|
41
|
+
} else if (arg === '--template') {
|
|
42
|
+
params.template = args[++i];
|
|
43
|
+
} else if (arg === '--adapter' || arg === '-a') {
|
|
44
|
+
params.adapters.push(args[++i]);
|
|
45
|
+
} else if (arg === '--caveman') {
|
|
46
|
+
params.caveman = true;
|
|
47
|
+
} else if (arg === '--dry-run' || arg === '-d') {
|
|
48
|
+
params.dryRun = true;
|
|
49
|
+
} else if (arg === '--force' || arg === '-f') {
|
|
50
|
+
params.force = true;
|
|
51
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
52
|
+
params.help = true;
|
|
53
|
+
} else if (!params.command && !arg.startsWith('-')) {
|
|
54
|
+
params.command = arg;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return params;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const params = parseArgs(ARGS);
|
|
61
|
+
const COMMAND = params.command;
|
|
62
|
+
|
|
63
|
+
if (params.help || !COMMAND) {
|
|
64
|
+
showHelp();
|
|
65
|
+
process.exit(0);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (COMMAND === 'init') {
|
|
69
|
+
handleInit(params);
|
|
70
|
+
} else if (COMMAND === 'verify') {
|
|
71
|
+
handleVerify(params);
|
|
72
|
+
} else {
|
|
73
|
+
console.error(`\x1b[31mUnknown command: ${COMMAND}\x1b[0m`);
|
|
74
|
+
showHelp();
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function showHelp() {
|
|
79
|
+
console.log(`\n🧠 \x1b[36mmultimodel-dev-os CLI v${version}\x1b[0m`);
|
|
80
|
+
console.log('====================================');
|
|
81
|
+
console.log('Usage: node bin/multimodel-dev-os.js <command> [options]\n');
|
|
82
|
+
console.log('Commands:');
|
|
83
|
+
console.log(' init Initialize a project with configs and adapters');
|
|
84
|
+
console.log(' verify Validate structural integrity of an existing project\n');
|
|
85
|
+
console.log('Options:');
|
|
86
|
+
console.log(' -t, --target <path> Target folder destination (default: current working directory)');
|
|
87
|
+
console.log(' --template <name> Template profile: nextjs-saas, wordpress-site, ecommerce-store,');
|
|
88
|
+
console.log(' seo-landing-page, general-app (default: general-app)');
|
|
89
|
+
console.log(' -a, --adapter <name> Inject specific adapter: codex, antigravity, cursor, claude, gemini, vscode');
|
|
90
|
+
console.log(' --caveman Use minimal-token templates (~79% fewer tokens)');
|
|
91
|
+
console.log(' -d, --dry-run Preview planned file actions without modifying the filesystem');
|
|
92
|
+
console.log(' -f, --force Overwrite existing files without prompting\n');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function handleInit(options) {
|
|
96
|
+
console.log(`\n\x1b[34mInitializing multimodel-dev-os in: ${options.target}\x1b[0m`);
|
|
97
|
+
console.log(`Template profile: \x1b[32m${options.template}\x1b[0m`);
|
|
98
|
+
if (options.caveman) console.log('Bone variant: \x1b[33mCaveman Mode Active\x1b[0m');
|
|
99
|
+
if (options.dryRun) console.log('\x1b[36mDry Run active - no actual modifications will occur\x1b[0m');
|
|
100
|
+
|
|
101
|
+
const operations = [];
|
|
102
|
+
const conflicts = [];
|
|
103
|
+
|
|
104
|
+
// Determine core source files based on template and mode
|
|
105
|
+
let agentsSrc = join(sourceRoot, 'AGENTS.md');
|
|
106
|
+
let memorySrc = join(sourceRoot, 'MEMORY.md');
|
|
107
|
+
let tasksSrc = join(sourceRoot, 'TASKS.md');
|
|
108
|
+
let runbookSrc = join(sourceRoot, 'RUNBOOK.md');
|
|
109
|
+
let configSrc = join(sourceRoot, '.ai', 'config.yaml');
|
|
110
|
+
|
|
111
|
+
// Load custom template directories if selected
|
|
112
|
+
if (options.template !== 'general-app') {
|
|
113
|
+
const templateDir = join(sourceRoot, 'examples', options.template);
|
|
114
|
+
if (existsSync(templateDir)) {
|
|
115
|
+
agentsSrc = join(templateDir, 'AGENTS.md');
|
|
116
|
+
memorySrc = join(templateDir, 'MEMORY.md');
|
|
117
|
+
configSrc = join(templateDir, '.ai', 'config.yaml');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Handle Caveman Mode overrides
|
|
122
|
+
if (options.caveman) {
|
|
123
|
+
agentsSrc = join(sourceRoot, '.ai', 'templates', 'AGENTS.caveman.md');
|
|
124
|
+
memorySrc = join(sourceRoot, '.ai', 'templates', 'MEMORY.caveman.md');
|
|
125
|
+
tasksSrc = join(sourceRoot, '.ai', 'templates', 'TASKS.caveman.md');
|
|
126
|
+
runbookSrc = join(sourceRoot, '.ai', 'templates', 'RUNBOOK.caveman.md');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// 1. Core Root Files
|
|
130
|
+
operations.push({ dest: 'AGENTS.md', src: agentsSrc });
|
|
131
|
+
operations.push({ dest: 'MEMORY.md', src: memorySrc });
|
|
132
|
+
operations.push({ dest: 'TASKS.md', src: tasksSrc });
|
|
133
|
+
operations.push({ dest: 'RUNBOOK.md', src: runbookSrc });
|
|
134
|
+
operations.push({ dest: '.ai/config.yaml', src: configSrc });
|
|
135
|
+
|
|
136
|
+
// 2. .ai/ Subdirectories & Core Specification Files
|
|
137
|
+
const aiSubdirs = ['context', 'agents', 'skills', 'prompts', 'checks', 'templates', 'session-logs'];
|
|
138
|
+
aiSubdirs.forEach(sub => {
|
|
139
|
+
const srcDir = join(sourceRoot, '.ai', sub);
|
|
140
|
+
if (existsSync(srcDir)) {
|
|
141
|
+
readdirSync(srcDir).forEach(file => {
|
|
142
|
+
operations.push({
|
|
143
|
+
dest: join('.ai', sub, file),
|
|
144
|
+
src: join(srcDir, file)
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// 3. Selected Adapters
|
|
151
|
+
options.adapters.forEach(adapter => {
|
|
152
|
+
const adapterDir = join(sourceRoot, 'adapters', adapter);
|
|
153
|
+
if (existsSync(adapterDir)) {
|
|
154
|
+
// Helper function to read recursive files in adapter
|
|
155
|
+
const copyRecursive = (currSrc, currRel) => {
|
|
156
|
+
if (statSync(currSrc).isDirectory()) {
|
|
157
|
+
readdirSync(currSrc).forEach(file => {
|
|
158
|
+
copyRecursive(join(currSrc, file), join(currRel, file));
|
|
159
|
+
});
|
|
160
|
+
} else {
|
|
161
|
+
operations.push({
|
|
162
|
+
dest: join('adapters', adapter, currRel),
|
|
163
|
+
src: currSrc
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
readdirSync(adapterDir).forEach(file => {
|
|
168
|
+
copyRecursive(join(adapterDir, file), file);
|
|
169
|
+
});
|
|
170
|
+
} else {
|
|
171
|
+
console.warn(`\x1b[33mWarning: Adapter '${adapter}' not found. Skipping.\x1b[0m`);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Check for conflicts
|
|
176
|
+
operations.forEach(op => {
|
|
177
|
+
const targetFile = join(options.target, op.dest);
|
|
178
|
+
if (existsSync(targetFile)) {
|
|
179
|
+
if (!options.force) {
|
|
180
|
+
conflicts.push(op.dest);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
if (conflicts.length > 0) {
|
|
186
|
+
console.error('\n\x1b[31m[ABORT] Overwrite Conflict Detected!\x1b[0m');
|
|
187
|
+
console.error('The following files already exist in the target directory:');
|
|
188
|
+
conflicts.forEach(c => console.error(` - ${c}`));
|
|
189
|
+
console.error('\nRun command with \x1b[33m--force\x1b[0m to overwrite these files.');
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Execute operations
|
|
194
|
+
operations.forEach(op => {
|
|
195
|
+
const targetFile = join(options.target, op.dest);
|
|
196
|
+
const targetDir = dirname(targetFile);
|
|
197
|
+
|
|
198
|
+
if (options.dryRun) {
|
|
199
|
+
console.log(` \x1b[36m[DRY-RUN] WOULD CREATE:\x1b[0m ${op.dest}`);
|
|
200
|
+
} else {
|
|
201
|
+
if (!existsSync(targetDir)) {
|
|
202
|
+
mkdirSync(targetDir, { recursive: true });
|
|
203
|
+
}
|
|
204
|
+
const data = readFileSync(op.src);
|
|
205
|
+
writeFileSync(targetFile, data);
|
|
206
|
+
console.log(` \x1b[32mCREATE:\x1b[0m ${op.dest}`);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
console.log(`\n\x1b[32m✔ Project initialized successfully! [Total Operations: ${operations.length}]\x1b[0m\n`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function handleVerify(options) {
|
|
214
|
+
console.log(`\n\x1b[34mRunning strict verification in: ${options.target}\x1b[0m\n`);
|
|
215
|
+
|
|
216
|
+
let passed = 0;
|
|
217
|
+
let failed = 0;
|
|
218
|
+
|
|
219
|
+
const assertFile = (relPath) => {
|
|
220
|
+
const fullPath = join(options.target, relPath);
|
|
221
|
+
if (existsSync(fullPath) && statSync(fullPath).isFile()) {
|
|
222
|
+
console.log(` \x1b[32m✓\x1b[0m ${relPath}`);
|
|
223
|
+
passed++;
|
|
224
|
+
} else {
|
|
225
|
+
console.error(` \x1b[31m✗ ${relPath} (missing)\x1b[0m`);
|
|
226
|
+
failed++;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
// 1. Core Files
|
|
231
|
+
const rootFiles = ['AGENTS.md', 'MEMORY.md', 'TASKS.md', 'RUNBOOK.md', '.ai/config.yaml'];
|
|
232
|
+
rootFiles.forEach(assertFile);
|
|
233
|
+
|
|
234
|
+
// 2. .ai/context
|
|
235
|
+
const contextFiles = [
|
|
236
|
+
'.ai/context/project-brief.md',
|
|
237
|
+
'.ai/context/architecture.md',
|
|
238
|
+
'.ai/context/business-rules.md',
|
|
239
|
+
'.ai/context/seo-rules.md',
|
|
240
|
+
'.ai/context/deployment-rules.md',
|
|
241
|
+
'.ai/context/model-map.md',
|
|
242
|
+
'.ai/context/context-budget.md'
|
|
243
|
+
];
|
|
244
|
+
contextFiles.forEach(assertFile);
|
|
245
|
+
|
|
246
|
+
// 3. .ai/agents
|
|
247
|
+
const agentFiles = [
|
|
248
|
+
'.ai/agents/multimodel-orchestrator.md',
|
|
249
|
+
'.ai/agents/planner.md',
|
|
250
|
+
'.ai/agents/coder.md',
|
|
251
|
+
'.ai/agents/reviewer.md',
|
|
252
|
+
'.ai/agents/qa-tester.md',
|
|
253
|
+
'.ai/agents/security-auditor.md',
|
|
254
|
+
'.ai/agents/seo-auditor.md',
|
|
255
|
+
'.ai/agents/devops.md'
|
|
256
|
+
];
|
|
257
|
+
agentFiles.forEach(assertFile);
|
|
258
|
+
|
|
259
|
+
console.log('\n=====================================');
|
|
260
|
+
if (failed > 0) {
|
|
261
|
+
console.error(` \x1b[31mVerification FAILED. [Passed: ${passed}, Failed: ${failed}]\x1b[0m\n`);
|
|
262
|
+
process.exit(1);
|
|
263
|
+
} else {
|
|
264
|
+
console.log(` \x1b[32mVerification PASSED. [All ${passed} files present]\x1b[0m\n`);
|
|
265
|
+
process.exit(0);
|
|
266
|
+
}
|
|
267
|
+
}
|
package/docs/adapters.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Adapter Guide
|
|
2
|
+
|
|
3
|
+
> How to create, maintain, and contribute adapters for AI coding tools.
|
|
4
|
+
|
|
5
|
+
## What is an Adapter?
|
|
6
|
+
|
|
7
|
+
An adapter translates the root `AGENTS.md` source of truth into a tool's native configuration format. It does **not** contain original instructions — it references the root files.
|
|
8
|
+
|
|
9
|
+
## Adapter Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
adapters/{tool-name}/
|
|
13
|
+
├── {tool-native-file} # e.g., CLAUDE.md, .cursorrules
|
|
14
|
+
├── setup.md # Human-readable setup guide
|
|
15
|
+
└── {config-files} # Optional tool-native config
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Creating a New Adapter
|
|
19
|
+
|
|
20
|
+
### Step 1: Research the Tool
|
|
21
|
+
|
|
22
|
+
- What file(s) does the tool auto-detect? (e.g., `CLAUDE.md`, `.cursorrules`)
|
|
23
|
+
- Where does it expect config files? (e.g., `.vscode/`, `.gemini/`)
|
|
24
|
+
- What format does it use? (markdown, JSON, YAML, plain text)
|
|
25
|
+
|
|
26
|
+
### Step 2: Create the Adapter Directory
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
mkdir -p adapters/your-tool/
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Step 3: Create the Native File
|
|
33
|
+
|
|
34
|
+
Start with this template:
|
|
35
|
+
|
|
36
|
+
```markdown
|
|
37
|
+
<!-- AUTO-GENERATED REFERENCE — Source of truth: /AGENTS.md -->
|
|
38
|
+
<!-- Do not edit this file directly. Edit /AGENTS.md and re-sync. -->
|
|
39
|
+
|
|
40
|
+
# {Tool Name} Agent Instructions
|
|
41
|
+
|
|
42
|
+
This project uses multimodel-dev-os.
|
|
43
|
+
Full instructions: /AGENTS.md
|
|
44
|
+
|
|
45
|
+
## Tool-Specific Notes
|
|
46
|
+
{What's unique about this tool's behavior}
|
|
47
|
+
|
|
48
|
+
## References
|
|
49
|
+
- /AGENTS.md
|
|
50
|
+
- /MEMORY.md
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Step 4: Create `setup.md`
|
|
54
|
+
|
|
55
|
+
Include:
|
|
56
|
+
- Overview (1 paragraph)
|
|
57
|
+
- Setup steps (numbered list)
|
|
58
|
+
- How it works (brief explanation)
|
|
59
|
+
- Tips (3-5 bullets)
|
|
60
|
+
- Troubleshooting table
|
|
61
|
+
|
|
62
|
+
### Step 5: Submit a PR
|
|
63
|
+
|
|
64
|
+
See [CONTRIBUTING.md](../CONTRIBUTING.md).
|
|
65
|
+
|
|
66
|
+
## Maintaining Adapters
|
|
67
|
+
|
|
68
|
+
- When a tool changes its config format, update the adapter
|
|
69
|
+
- Test adapter files with the actual tool before submitting
|
|
70
|
+
- Keep adapter files under 50 lines — they're references, not full configs
|
|
71
|
+
- Version adapter changes in `CHANGELOG.md`
|
|
72
|
+
|
|
73
|
+
## Adapter Best Practices
|
|
74
|
+
|
|
75
|
+
1. **Never duplicate** instructions from `AGENTS.md`
|
|
76
|
+
2. **Always reference** root files with absolute paths (`/AGENTS.md`)
|
|
77
|
+
3. **Include only** tool-specific overrides or behavior notes
|
|
78
|
+
4. **Test with the actual tool** — don't guess at file detection behavior
|
|
79
|
+
5. **Document quirks** — if a tool has unusual behavior, note it in `setup.md`
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## Design Principles
|
|
4
|
+
|
|
5
|
+
1. **Markdown-first** — all configuration is human-readable markdown or YAML
|
|
6
|
+
2. **Vendor-neutral** — no tool is the source of truth; the root files are
|
|
7
|
+
3. **Zero dependencies** — no runtime, no package manager, no build step
|
|
8
|
+
4. **Non-destructive** — installers never overwrite, adapters never conflict
|
|
9
|
+
5. **Progressive complexity** — start with `AGENTS.md`, add orchestrator later
|
|
10
|
+
|
|
11
|
+
## Layer Architecture
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
┌──────────────────────────────────────┐
|
|
15
|
+
│ Human Layer │
|
|
16
|
+
│ README.md CONTRIBUTING.md docs/ │
|
|
17
|
+
├──────────────────────────────────────┤
|
|
18
|
+
│ Source of Truth Layer │
|
|
19
|
+
│ AGENTS.md MEMORY.md TASKS.md │
|
|
20
|
+
│ RUNBOOK.md │
|
|
21
|
+
├──────────────────────────────────────┤
|
|
22
|
+
│ AI Operating Layer │
|
|
23
|
+
│ .ai/config.yaml │
|
|
24
|
+
│ .ai/agents/multimodel-orchestrator.md│
|
|
25
|
+
│ .ai/context/ .ai/prompts/ │
|
|
26
|
+
│ .ai/skills/ .ai/checks/ │
|
|
27
|
+
│ .ai/session-logs/ .ai/templates/ │
|
|
28
|
+
├──────────────────────────────────────┤
|
|
29
|
+
│ Adapter Layer │
|
|
30
|
+
│ adapters/codex/ │
|
|
31
|
+
│ adapters/antigravity/ │
|
|
32
|
+
│ adapters/cursor/ │
|
|
33
|
+
│ adapters/claude/ │
|
|
34
|
+
│ adapters/gemini/ │
|
|
35
|
+
│ adapters/vscode/ │
|
|
36
|
+
└──────────────────────────────────────┘
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Data Flow
|
|
40
|
+
|
|
41
|
+
1. **User edits** root markdown files (`AGENTS.md`, etc.)
|
|
42
|
+
2. **Adapters read** from root files and translate to tool-native format
|
|
43
|
+
3. **AI agents** read their adapter file + root files
|
|
44
|
+
4. **Agents write** results back to `TASKS.md`, `MEMORY.md`, and session logs
|
|
45
|
+
5. **Orchestrator** coordinates multi-agent workflows via session logs
|
|
46
|
+
|
|
47
|
+
## File Ownership
|
|
48
|
+
|
|
49
|
+
| File | Owner | Who Reads | Who Writes |
|
|
50
|
+
|------|-------|-----------|------------|
|
|
51
|
+
| `AGENTS.md` | Human | All agents | Human |
|
|
52
|
+
| `MEMORY.md` | Shared | All agents | Human + agents |
|
|
53
|
+
| `TASKS.md` | Shared | All agents | Human + agents |
|
|
54
|
+
| `RUNBOOK.md` | Human | All agents | Human |
|
|
55
|
+
| `.ai/config.yaml` | Human | System | Human |
|
|
56
|
+
| `.ai/session-logs/*.md` | Agents | Next agent | Current agent |
|
|
57
|
+
| `adapters/*/` | Community | Specific tool | Maintainers |
|
|
58
|
+
|
|
59
|
+
## Security Considerations
|
|
60
|
+
|
|
61
|
+
- Never store secrets in any multimodel-dev-os file
|
|
62
|
+
- Handoff logs may contain sensitive context — gitignored by default
|
|
63
|
+
- Adapter config files should not contain API keys or tokens
|
|
64
|
+
- Use `.env` files (gitignored) for secrets, referenced in `RUNBOOK.md`
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Caveman Mode
|
|
2
|
+
|
|
3
|
+
> Cut ~79% of tokens from your AI context without losing functionality.
|
|
4
|
+
|
|
5
|
+
## Why Caveman Mode?
|
|
6
|
+
|
|
7
|
+
AI agents consume tokens for every file they read. In large projects, context windows fill up fast. Caveman Mode provides stripped-down templates that preserve structure but eliminate:
|
|
8
|
+
|
|
9
|
+
- Comments and explanations
|
|
10
|
+
- Examples and sample data
|
|
11
|
+
- Verbose headers
|
|
12
|
+
- Decorative whitespace
|
|
13
|
+
|
|
14
|
+
## Token Budget
|
|
15
|
+
|
|
16
|
+
| File | Standard | Caveman | Savings |
|
|
17
|
+
|------|----------|---------|---------|
|
|
18
|
+
| `AGENTS.md` | ~500 tokens | ~120 tokens | 76% |
|
|
19
|
+
| `MEMORY.md` | ~400 tokens | ~80 tokens | 80% |
|
|
20
|
+
| `TASKS.md` | ~300 tokens | ~60 tokens | 80% |
|
|
21
|
+
| `RUNBOOK.md` | ~400 tokens | ~80 tokens | 80% |
|
|
22
|
+
| **Total** | **~1,600** | **~340** | **~79%** |
|
|
23
|
+
|
|
24
|
+
## How to Use
|
|
25
|
+
|
|
26
|
+
### Fresh Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
curl -fsSL .../install.sh | bash -s -- --caveman
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Convert Existing Project
|
|
33
|
+
|
|
34
|
+
Replace root files with caveman variants:
|
|
35
|
+
```bash
|
|
36
|
+
cp .ai/templates/AGENTS.caveman.md AGENTS.md
|
|
37
|
+
cp .ai/templates/MEMORY.caveman.md MEMORY.md
|
|
38
|
+
cp .ai/templates/TASKS.caveman.md TASKS.md
|
|
39
|
+
cp .ai/templates/RUNBOOK.caveman.md RUNBOOK.md
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Update config:
|
|
43
|
+
```yaml
|
|
44
|
+
# .ai/config.yaml
|
|
45
|
+
mode: "caveman"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Switch Back to Standard
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Re-download standard templates
|
|
52
|
+
curl -fsSL .../AGENTS.md -o AGENTS.md
|
|
53
|
+
# Or restore from git
|
|
54
|
+
git checkout -- AGENTS.md MEMORY.md TASKS.md RUNBOOK.md
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Caveman Writing Rules
|
|
58
|
+
|
|
59
|
+
If you're writing your own caveman-style files:
|
|
60
|
+
|
|
61
|
+
1. No comments — every token must be actionable
|
|
62
|
+
2. No examples — agents know common patterns
|
|
63
|
+
3. No headers longer than 3 words
|
|
64
|
+
4. No blank lines between sections
|
|
65
|
+
5. Use abbreviations: `dev`, `deps`, `cfg`, `env`
|
|
66
|
+
6. Use `null` for missing values
|
|
67
|
+
7. Tables over prose — always
|
|
68
|
+
|
|
69
|
+
## When NOT to Use Caveman Mode
|
|
70
|
+
|
|
71
|
+
- New projects where you need detailed templates as guides
|
|
72
|
+
- Teams where multiple humans need to read the files
|
|
73
|
+
- When you have plenty of context window budget
|
|
74
|
+
- When onboarding new team members who need explanations
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# CLI Roadmap
|
|
2
|
+
|
|
3
|
+
> The local `node bin/multimodel-dev-os.js` CLI tool is fully implemented in v0.2.0!
|
|
4
|
+
|
|
5
|
+
## Current CLI Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Initialize project with configurations
|
|
9
|
+
node bin/multimodel-dev-os.js init
|
|
10
|
+
|
|
11
|
+
# Initialize with specific template and adapters
|
|
12
|
+
node bin/multimodel-dev-os.js init --template nextjs-saas --adapter cursor --adapter claude
|
|
13
|
+
|
|
14
|
+
# Run dry-run preview
|
|
15
|
+
node bin/multimodel-dev-os.js init --dry-run
|
|
16
|
+
|
|
17
|
+
# Force overwrite existing files
|
|
18
|
+
node bin/multimodel-dev-os.js init --force
|
|
19
|
+
|
|
20
|
+
# Check structural health of target directory
|
|
21
|
+
node bin/multimodel-dev-os.js verify
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## CLI Roadmap & Commands Status
|
|
25
|
+
|
|
26
|
+
| Command | Purpose | Target Version | Status |
|
|
27
|
+
|---------|---------|----------------|--------|
|
|
28
|
+
| `init` | Scaffold multimodel-dev-os into a project | v0.2.0 | ✅ Completed |
|
|
29
|
+
| `verify` | Check that all required files exist and are valid | v0.2.0 | ✅ Completed |
|
|
30
|
+
| `sync` | Regenerate adapter files from root AGENTS.md | v0.3.0 | 📋 Planned |
|
|
31
|
+
| `add-adapter` | Add a new adapter to the project | v0.3.0 | 📋 Planned |
|
|
32
|
+
|
|
33
|
+
## Requirements Completed in v0.2.0
|
|
34
|
+
|
|
35
|
+
- [x] `package.json` with `bin` entry
|
|
36
|
+
- [x] CLI argument parser (implemented purely with Node.js built-ins)
|
|
37
|
+
- [x] Template profile injection (Next.js SaaS, WordPress, etc.)
|
|
38
|
+
- [x] Conflict protection and `--force` overrides
|
|
39
|
+
- [x] Dry-run preview mode
|
|
40
|
+
- [x] Tested on Node 18+ and Windows/macOS/Linux
|
|
41
|
+
|
|
42
|
+
## Future Releases (v0.3.0+)
|
|
43
|
+
- Publish package to npm as `multimodel-dev-os` to support `npx` execution.
|
|
44
|
+
- Implement the `sync` subcommand to parse custom override markers inside adapters and align them with changes in root instructions.
|
package/docs/faq.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# FAQ
|
|
2
|
+
|
|
3
|
+
## General
|
|
4
|
+
|
|
5
|
+
**What is multimodel-dev-os?**
|
|
6
|
+
A set of markdown files and conventions that let multiple AI coding tools
|
|
7
|
+
(Codex, Cursor, Claude, Gemini, Antigravity, VS Code) share the same
|
|
8
|
+
project context. Not a runtime. Not an AI agent. Think `.editorconfig`
|
|
9
|
+
but for AI tools.
|
|
10
|
+
|
|
11
|
+
**Is this an operating system?**
|
|
12
|
+
No. "Dev OS" is a metaphor for the shared operating layer between tools.
|
|
13
|
+
It's just markdown files in your repo.
|
|
14
|
+
|
|
15
|
+
**What does "multimodel" mean?**
|
|
16
|
+
Multiple AI models/tools working on the same project.
|
|
17
|
+
Not "multimodal" (multiple input types like text + image).
|
|
18
|
+
|
|
19
|
+
## Setup
|
|
20
|
+
|
|
21
|
+
**Do I need Node.js?**
|
|
22
|
+
No. The installer scripts use bash or PowerShell only.
|
|
23
|
+
`package.json` is included for metadata and future CLI support.
|
|
24
|
+
|
|
25
|
+
**Can I use just one AI tool?**
|
|
26
|
+
Yes. Use a single adapter. The multi-agent features are optional.
|
|
27
|
+
|
|
28
|
+
**Which files are required?**
|
|
29
|
+
At minimum: `AGENTS.md`. Everything else is optional.
|
|
30
|
+
The installer creates the full structure, but you can delete what you
|
|
31
|
+
don't need.
|
|
32
|
+
|
|
33
|
+
## Adapters
|
|
34
|
+
|
|
35
|
+
**Do I copy adapter files to my project root?**
|
|
36
|
+
Yes, for tools that auto-detect specific files:
|
|
37
|
+
- Cursor → copy `.cursorrules` to root
|
|
38
|
+
- Claude → copy `CLAUDE.md` to root
|
|
39
|
+
- VS Code → copy `.vscode/` to root
|
|
40
|
+
|
|
41
|
+
**My tool isn't listed. Can I add one?**
|
|
42
|
+
Yes. See [docs/adapters.md](adapters.md) for the guide. PRs welcome.
|
|
43
|
+
|
|
44
|
+
**Will adapters break if a tool changes its config format?**
|
|
45
|
+
Possibly. Adapters are community-maintained. File an issue if you
|
|
46
|
+
notice an adapter is outdated.
|
|
47
|
+
|
|
48
|
+
## Caveman Mode
|
|
49
|
+
|
|
50
|
+
**When should I use Caveman Mode?**
|
|
51
|
+
When your context window is tight, your model is small, or you're
|
|
52
|
+
optimizing for API cost. It cuts ~79% of tokens.
|
|
53
|
+
|
|
54
|
+
**Can I mix standard and caveman files?**
|
|
55
|
+
Yes. Each file is independent. You could have a standard `AGENTS.md`
|
|
56
|
+
and a caveman `TASKS.md`.
|
|
57
|
+
|
|
58
|
+
## Orchestrator
|
|
59
|
+
|
|
60
|
+
**Does the orchestrator run agents automatically?**
|
|
61
|
+
No, not in v0.1. It's a protocol spec — conventions for how agents
|
|
62
|
+
should coordinate. Runtime orchestration is planned for v0.2+.
|
|
63
|
+
|
|
64
|
+
**Do I need the orchestrator for single-agent workflows?**
|
|
65
|
+
No. The orchestrator is only relevant when multiple agents work
|
|
66
|
+
on the same codebase.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Installers
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Cross-platform scripts that scaffold multimodel-dev-os into any project. Located in `scripts/`.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
### macOS / Linux / WSL (`install.sh`)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Standard install (interactive adapter selection)
|
|
13
|
+
curl -fsSL https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main/scripts/install.sh | bash
|
|
14
|
+
|
|
15
|
+
# Caveman Mode (minimal tokens)
|
|
16
|
+
curl -fsSL https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main/scripts/install.sh | bash -s -- --caveman
|
|
17
|
+
|
|
18
|
+
# All adapters, no prompts
|
|
19
|
+
curl -fsSL https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main/scripts/install.sh | bash -s -- --all
|
|
20
|
+
|
|
21
|
+
# Dry run (preview only)
|
|
22
|
+
curl -fsSL https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main/scripts/install.sh | bash -s -- --dry-run
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Windows (`install.ps1`)
|
|
26
|
+
|
|
27
|
+
```powershell
|
|
28
|
+
# Standard install
|
|
29
|
+
irm https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main/scripts/install.ps1 | iex
|
|
30
|
+
|
|
31
|
+
# With flags (download first, then run)
|
|
32
|
+
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/rizvee/multimodel-dev-os/main/scripts/install.ps1" -OutFile install.ps1
|
|
33
|
+
.\install.ps1 -Caveman -All
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Flags
|
|
37
|
+
|
|
38
|
+
| Flag | Bash | PowerShell | Effect |
|
|
39
|
+
|------|------|------------|--------|
|
|
40
|
+
| Caveman Mode | `--caveman` | `-Caveman` | Install minimal-token templates |
|
|
41
|
+
| All adapters | `--all` | `-All` | Skip adapter selection prompt |
|
|
42
|
+
| Dry run | `--dry-run` | `-DryRun` | Preview without creating files |
|
|
43
|
+
| Help | `--help` | `-Help` | Show usage information |
|
|
44
|
+
|
|
45
|
+
## Behavior
|
|
46
|
+
|
|
47
|
+
- **Non-destructive** — never overwrites existing files by default.
|
|
48
|
+
- **CLI-integrated** — bundles our zero-dependency CLI `bin/multimodel-dev-os.js` script so you can perform advanced target-directory routing and local schema verifications after installation.
|
|
49
|
+
- **Selective** — choose which adapters to install.
|
|
50
|
+
- **Offline-safe** — fails gracefully if downloads fail.
|
|
51
|
+
|
|
52
|
+
## What Gets Created
|
|
53
|
+
|
|
54
|
+
The installer creates:
|
|
55
|
+
1. Root files: `AGENTS.md`, `MEMORY.md`, `TASKS.md`, `RUNBOOK.md`
|
|
56
|
+
2. Core configuration utilities: `.gitattributes` (enforces LF line endings) and `bin/multimodel-dev-os.js` CLI
|
|
57
|
+
3. `.ai/` directory with config, skills, checks, templates
|
|
58
|
+
4. Selected adapter directories under `adapters/`
|