mindforge-cc 1.0.3 → 1.0.5
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/CHANGELOG.md +10 -0
- package/README.md +10 -0
- package/bin/install.js +4 -2
- package/bin/installer-core.js +58 -14
- package/bin/wizard/setup-wizard.js +15 -3
- package/docs/user-guide.md +10 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
All notable changes to MindForge are documented here.
|
|
4
4
|
Format follows [Keep a Changelog](https://keepachangelog.com).
|
|
5
5
|
|
|
6
|
+
## [1.0.5] — v1.0.5 Minimal Install Option — 2026-03-22
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
- `--minimal` flag to install only essential project scaffolding.
|
|
10
|
+
|
|
11
|
+
## [1.0.4] — v1.0.4 Antigravity Install Fix — 2026-03-22
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- Antigravity local install now correctly copies commands and CLAUDE.md into `agents/`.
|
|
15
|
+
|
|
6
16
|
## [1.0.3] — v1.0.3 Antigravity Agents Folder — 2026-03-22
|
|
7
17
|
|
|
8
18
|
### Changed
|
package/README.md
CHANGED
|
@@ -42,6 +42,16 @@ npx mindforge-cc@latest --antigravity --global
|
|
|
42
42
|
|
|
43
43
|
Local installs use `agents/` by default. Legacy `.agent/` is supported for existing projects.
|
|
44
44
|
|
|
45
|
+
Optional: add bin utilities on local install
|
|
46
|
+
```bash
|
|
47
|
+
npx mindforge-cc@latest --claude --local --with-utils
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Optional: minimal project scaffolding
|
|
51
|
+
```bash
|
|
52
|
+
npx mindforge-cc@latest --claude --local --minimal
|
|
53
|
+
```
|
|
54
|
+
|
|
45
55
|
### Both runtimes
|
|
46
56
|
```bash
|
|
47
57
|
npx mindforge-cc@latest --all --global
|
package/bin/install.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* Runtime flags: --claude | --antigravity | --all
|
|
16
16
|
* Scope flags: --global (-g) | --local (-l)
|
|
17
17
|
* Action flags: --install (default) | --update | --uninstall | --check
|
|
18
|
-
* Control flags: --skip-wizard | --dry-run | --verbose | --force
|
|
18
|
+
* Control flags: --skip-wizard | --dry-run | --verbose | --force | --with-utils | --minimal
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
'use strict';
|
|
@@ -53,7 +53,7 @@ const NON_INTERACTIVE_FLAGS = [
|
|
|
53
53
|
'--claude', '--antigravity', '--all',
|
|
54
54
|
'--global', '-g', '--local', '-l',
|
|
55
55
|
'--uninstall', '--update', '--check',
|
|
56
|
-
'--skip-wizard', '--dry-run',
|
|
56
|
+
'--skip-wizard', '--dry-run', '--with-utils', '--minimal',
|
|
57
57
|
];
|
|
58
58
|
|
|
59
59
|
const IS_NON_INTERACTIVE =
|
|
@@ -102,6 +102,8 @@ function printHelp() {
|
|
|
102
102
|
--dry-run Show what would happen without making changes
|
|
103
103
|
--force Override existing installation without backup
|
|
104
104
|
--skip-wizard Skip interactive wizard even in TTY
|
|
105
|
+
--with-utils Install local bin/ utilities (optional)
|
|
106
|
+
--minimal Install only essential project scaffolding
|
|
105
107
|
--verbose Detailed output
|
|
106
108
|
--version, -v Print version
|
|
107
109
|
--help, -h Print this help
|
package/bin/installer-core.js
CHANGED
|
@@ -147,7 +147,13 @@ function verifyInstall(baseDir, cmdsDir, runtime, scope) {
|
|
|
147
147
|
|
|
148
148
|
// ── Install single runtime ────────────────────────────────────────────────────
|
|
149
149
|
async function install(runtime, scope, options = {}) {
|
|
150
|
-
const {
|
|
150
|
+
const {
|
|
151
|
+
dryRun = false,
|
|
152
|
+
force = false,
|
|
153
|
+
verbose = false,
|
|
154
|
+
withUtils = false,
|
|
155
|
+
minimal = false,
|
|
156
|
+
} = options;
|
|
151
157
|
const cfg = RUNTIMES[runtime];
|
|
152
158
|
const baseDir = resolveBaseDir(runtime, scope);
|
|
153
159
|
const cmdsDir = norm(path.join(baseDir, cfg.commandsSubdir));
|
|
@@ -168,7 +174,7 @@ async function install(runtime, scope, options = {}) {
|
|
|
168
174
|
// ── 1. Install CLAUDE.md ────────────────────────────────────────────────────
|
|
169
175
|
const claudeSrc = runtime === 'claude'
|
|
170
176
|
? src('.claude', 'CLAUDE.md')
|
|
171
|
-
: src('.
|
|
177
|
+
: src('.agent', 'CLAUDE.md');
|
|
172
178
|
|
|
173
179
|
if (fsu.exists(claudeSrc)) {
|
|
174
180
|
safeCopyClaude(claudeSrc, path.join(baseDir, 'CLAUDE.md'), { force, verbose });
|
|
@@ -178,7 +184,7 @@ async function install(runtime, scope, options = {}) {
|
|
|
178
184
|
// ── 2. Install commands ─────────────────────────────────────────────────────
|
|
179
185
|
const cmdSrc = runtime === 'claude'
|
|
180
186
|
? src('.claude', 'commands', 'mindforge')
|
|
181
|
-
: src('.
|
|
187
|
+
: src('.agent', 'mindforge');
|
|
182
188
|
|
|
183
189
|
if (fsu.exists(cmdSrc)) {
|
|
184
190
|
fsu.ensureDir(cmdsDir);
|
|
@@ -193,8 +199,29 @@ async function install(runtime, scope, options = {}) {
|
|
|
193
199
|
const forgeSrc = src('.mindforge');
|
|
194
200
|
const forgeDst = path.join(process.cwd(), '.mindforge');
|
|
195
201
|
if (fsu.exists(forgeSrc)) {
|
|
196
|
-
|
|
197
|
-
|
|
202
|
+
if (minimal) {
|
|
203
|
+
const minimalEntries = new Set([
|
|
204
|
+
'MINDFORGE-SCHEMA.json',
|
|
205
|
+
'engine',
|
|
206
|
+
'org',
|
|
207
|
+
'governance',
|
|
208
|
+
'integrations',
|
|
209
|
+
'personas',
|
|
210
|
+
'skills',
|
|
211
|
+
'team',
|
|
212
|
+
]);
|
|
213
|
+
fsu.ensureDir(forgeDst);
|
|
214
|
+
for (const entry of fs.readdirSync(forgeSrc, { withFileTypes: true })) {
|
|
215
|
+
if (!minimalEntries.has(entry.name)) continue;
|
|
216
|
+
const s = path.join(forgeSrc, entry.name);
|
|
217
|
+
const d = path.join(forgeDst, entry.name);
|
|
218
|
+
entry.isDirectory() ? fsu.copyDir(s, d, { excludePatterns: SENSITIVE_EXCLUDE }) : fsu.copy(s, d);
|
|
219
|
+
}
|
|
220
|
+
console.log(` ✅ .mindforge/ (minimal core)`);
|
|
221
|
+
} else {
|
|
222
|
+
fsu.copyDir(forgeSrc, forgeDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
223
|
+
console.log(` ✅ .mindforge/ (framework engine)`);
|
|
224
|
+
}
|
|
198
225
|
}
|
|
199
226
|
|
|
200
227
|
// .planning/ — create only if it doesn't already exist (preserve project state)
|
|
@@ -202,8 +229,18 @@ async function install(runtime, scope, options = {}) {
|
|
|
202
229
|
if (!fsu.exists(planningDst)) {
|
|
203
230
|
const planningSrc = src('.planning');
|
|
204
231
|
if (fsu.exists(planningSrc)) {
|
|
205
|
-
|
|
206
|
-
|
|
232
|
+
if (minimal) {
|
|
233
|
+
fsu.ensureDir(planningDst);
|
|
234
|
+
['STATE.md', 'HANDOFF.json', 'PROJECT.md'].forEach((name) => {
|
|
235
|
+
const s = path.join(planningSrc, name);
|
|
236
|
+
const d = path.join(planningDst, name);
|
|
237
|
+
if (fsu.exists(s)) fsu.copy(s, d);
|
|
238
|
+
});
|
|
239
|
+
console.log(` ✅ .planning/ (minimal state)`);
|
|
240
|
+
} else {
|
|
241
|
+
fsu.copyDir(planningSrc, planningDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
242
|
+
console.log(` ✅ .planning/ (state templates)`);
|
|
243
|
+
}
|
|
207
244
|
}
|
|
208
245
|
} else {
|
|
209
246
|
console.log(` ⏭️ .planning/ already exists — preserved (run /mindforge:health to verify)`);
|
|
@@ -217,13 +254,18 @@ async function install(runtime, scope, options = {}) {
|
|
|
217
254
|
console.log(` ✅ MINDFORGE.md (project constitution)`);
|
|
218
255
|
}
|
|
219
256
|
|
|
220
|
-
// bin/ utilities (
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
fsu.
|
|
225
|
-
|
|
257
|
+
// bin/ utilities (optional)
|
|
258
|
+
if (withUtils) {
|
|
259
|
+
const binDst = path.join(process.cwd(), 'bin');
|
|
260
|
+
const binSrc = src('bin');
|
|
261
|
+
if (fsu.exists(binSrc) && !fsu.exists(binDst)) {
|
|
262
|
+
fsu.copyDir(binSrc, binDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
263
|
+
console.log(` ✅ bin/ (utilities)`);
|
|
264
|
+
} else if (fsu.exists(binDst)) {
|
|
265
|
+
console.log(` ⏭️ bin/ already exists — preserved`);
|
|
266
|
+
}
|
|
226
267
|
}
|
|
268
|
+
|
|
227
269
|
}
|
|
228
270
|
|
|
229
271
|
// ── 4. Verify installation ──────────────────────────────────────────────────
|
|
@@ -273,10 +315,12 @@ async function run(args) {
|
|
|
273
315
|
const dryRun = args.includes('--dry-run');
|
|
274
316
|
const force = args.includes('--force');
|
|
275
317
|
const verbose = args.includes('--verbose');
|
|
318
|
+
const withUtils = args.includes('--with-utils');
|
|
319
|
+
const minimal = args.includes('--minimal');
|
|
276
320
|
const isUninstall = args.includes('--uninstall');
|
|
277
321
|
const isUpdate = args.includes('--update');
|
|
278
322
|
const isCheck = args.includes('--check');
|
|
279
|
-
const options = { dryRun, force, verbose };
|
|
323
|
+
const options = { dryRun, force, verbose, withUtils, minimal };
|
|
280
324
|
|
|
281
325
|
console.log(`\n⚡ MindForge v${VERSION} — Enterprise Agentic Framework\n`);
|
|
282
326
|
|
|
@@ -48,6 +48,16 @@ function askChoice(rl, q, choices, defaultIdx = 0) {
|
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
function askYesNo(rl, q, defaultYes = false) {
|
|
52
|
+
const def = defaultYes ? 'y' : 'n';
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
rl.question(`${q} [${def}]: `, (answer) => {
|
|
55
|
+
const val = (answer.trim() || def).toLowerCase();
|
|
56
|
+
resolve(val === 'y' || val === 'yes');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
51
61
|
function askMultiChoice(rl, q, choices) {
|
|
52
62
|
console.log(`\n${q}`);
|
|
53
63
|
choices.forEach((choice, i) => console.log(` ${i + 1}) ${choice}`));
|
|
@@ -149,11 +159,11 @@ async function configureFeatures(rl) {
|
|
|
149
159
|
return { config, credGuidance };
|
|
150
160
|
}
|
|
151
161
|
|
|
152
|
-
async function install(runtimes, scope) {
|
|
162
|
+
async function install(runtimes, scope, options = {}) {
|
|
153
163
|
const installer = require('../installer-core');
|
|
154
164
|
if (!installer || typeof installer.install !== 'function') return;
|
|
155
165
|
for (const runtime of runtimes) {
|
|
156
|
-
await installer.install(runtime, scope);
|
|
166
|
+
await installer.install(runtime, scope, options);
|
|
157
167
|
}
|
|
158
168
|
}
|
|
159
169
|
|
|
@@ -222,9 +232,11 @@ async function main() {
|
|
|
222
232
|
const runtimes = await selectRuntime(rl, env.runtimes);
|
|
223
233
|
const scope = await selectScope(rl);
|
|
224
234
|
const { config, credGuidance } = await configureFeatures(rl);
|
|
235
|
+
const minimal = await askYesNo(rl, 'Install minimal project scaffolding?', false);
|
|
236
|
+
const withUtils = await askYesNo(rl, 'Install optional bin/ utilities?', false);
|
|
225
237
|
rl.close();
|
|
226
238
|
|
|
227
|
-
await install(runtimes, scope);
|
|
239
|
+
await install(runtimes, scope, { withUtils, minimal });
|
|
228
240
|
await generator.writeIntegrationsConfig(config);
|
|
229
241
|
printNextSteps(runtimes, scope, credGuidance);
|
|
230
242
|
} catch (err) {
|
package/docs/user-guide.md
CHANGED
|
@@ -15,6 +15,16 @@ npx mindforge-cc@latest --claude --global
|
|
|
15
15
|
npx mindforge-cc@latest --claude --local
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
+
Optional utilities:
|
|
19
|
+
```bash
|
|
20
|
+
npx mindforge-cc@latest --claude --local --with-utils
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Minimal scaffolding:
|
|
24
|
+
```bash
|
|
25
|
+
npx mindforge-cc@latest --claude --local --minimal
|
|
26
|
+
```
|
|
27
|
+
|
|
18
28
|
### Antigravity
|
|
19
29
|
```bash
|
|
20
30
|
npx mindforge-cc@latest --antigravity --global
|