groundplan 0.1.1 → 0.2.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/README.md +1 -1
- package/dist/args.d.ts +2 -0
- package/dist/args.js +7 -0
- package/dist/args.js.map +1 -1
- package/dist/commands/analyze.d.ts +7 -0
- package/dist/commands/analyze.js +38 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/blueprint.d.ts +7 -0
- package/dist/commands/blueprint.js +102 -0
- package/dist/commands/blueprint.js.map +1 -0
- package/dist/commands/improve.d.ts +7 -0
- package/dist/commands/improve.js +35 -0
- package/dist/commands/improve.js.map +1 -0
- package/dist/commands/new.d.ts +5 -0
- package/dist/commands/new.js +313 -188
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/recommend.d.ts +5 -8
- package/dist/commands/recommend.js +30 -76
- package/dist/commands/recommend.js.map +1 -1
- package/dist/index.js +28 -6
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -15,6 +15,6 @@ The templates and catalog live in [`@opengroundplan/core`](https://www.npmjs.com
|
|
|
15
15
|
which this package depends on; installing the CLI brings them with it.
|
|
16
16
|
|
|
17
17
|
Full documentation, architecture notes, and the contributor guide are in the
|
|
18
|
-
[repository](https://github.com/groundplan/
|
|
18
|
+
[repository](https://github.com/groundplan/opengroundplan#readme).
|
|
19
19
|
|
|
20
20
|
MIT licensed.
|
package/dist/args.d.ts
CHANGED
|
@@ -6,3 +6,5 @@ export interface Args {
|
|
|
6
6
|
export declare function parseArgs(argv: string[]): Args;
|
|
7
7
|
export declare function flagString(args: Args, name: string): string | undefined;
|
|
8
8
|
export declare function flagBool(args: Args, name: string): boolean;
|
|
9
|
+
/** Comma-separated flag value → trimmed, non-empty items. `undefined` when the flag is absent. */
|
|
10
|
+
export declare function flagList(args: Args, name: string): string[] | undefined;
|
package/dist/args.js
CHANGED
|
@@ -27,4 +27,11 @@ export function flagString(args, name) {
|
|
|
27
27
|
export function flagBool(args, name) {
|
|
28
28
|
return args.flags[name] === true || args.flags[name] === 'true';
|
|
29
29
|
}
|
|
30
|
+
/** Comma-separated flag value → trimmed, non-empty items. `undefined` when the flag is absent. */
|
|
31
|
+
export function flagList(args, name) {
|
|
32
|
+
const value = flagString(args, name);
|
|
33
|
+
if (value === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
return value.split(',').map((s) => s.trim()).filter(Boolean);
|
|
36
|
+
}
|
|
30
37
|
//# sourceMappingURL=args.js.map
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAqC,EAAE,CAAC;IAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,IAAY;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,IAAY;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;AAClE,CAAC"}
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAqC,EAAE,CAAC;IAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,IAAY;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,IAAY;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;AAClE,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,IAAY;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type GroundplanConfig } from '@opengroundplan/core';
|
|
2
|
+
/**
|
|
3
|
+
* `groundplan analyze <dir>` — inspect an existing repository and report its stack, present and
|
|
4
|
+
* missing capabilities, a quality scorecard, an improvement roadmap, and a CTO verdict — the same
|
|
5
|
+
* review a new project gets, run over code that already exists.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cmdAnalyze(argv: string[], _config: GroundplanConfig): Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
import { analyzeRepo, renderAnalysis } from '@opengroundplan/core';
|
|
6
|
+
import { flagBool, flagString, parseArgs } from '../args.js';
|
|
7
|
+
/**
|
|
8
|
+
* `groundplan analyze <dir>` — inspect an existing repository and report its stack, present and
|
|
9
|
+
* missing capabilities, a quality scorecard, an improvement roadmap, and a CTO verdict — the same
|
|
10
|
+
* review a new project gets, run over code that already exists.
|
|
11
|
+
*/
|
|
12
|
+
export async function cmdAnalyze(argv, _config) {
|
|
13
|
+
const args = parseArgs(argv);
|
|
14
|
+
const asJson = flagBool(args, 'json');
|
|
15
|
+
const dir = path.resolve(args.positional[0] ?? '.');
|
|
16
|
+
if (!fs.existsSync(dir))
|
|
17
|
+
throw new Error(`No such directory: ${dir}`);
|
|
18
|
+
const analysis = analyzeRepo(dir);
|
|
19
|
+
const files = renderAnalysis(analysis);
|
|
20
|
+
if (asJson) {
|
|
21
|
+
console.log(files['analysis.json']);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const outDir = path.resolve(flagString(args, 'out') ?? path.join(dir, 'groundplan-analysis'));
|
|
25
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
26
|
+
for (const [name, content] of Object.entries(files))
|
|
27
|
+
fs.writeFileSync(path.join(outDir, name), content, 'utf8');
|
|
28
|
+
p.intro(pc.bgCyan(pc.black(' groundplan analyze ')));
|
|
29
|
+
console.log(`\n${pc.bold(analysis.facts.stack)} repo ${pc.dim(`— ${analysis.overall}/100, ${analysis.facts.dependencies} deps`)}`);
|
|
30
|
+
if (analysis.facts.missing.length)
|
|
31
|
+
console.log(pc.yellow(`Missing baseline: ${analysis.facts.missing.join(', ')}`));
|
|
32
|
+
console.log(`${analysis.cto.verdict === 'needs-work' ? pc.red(analysis.cto.summary) : pc.dim(analysis.cto.summary)}`);
|
|
33
|
+
console.log(`\n${pc.dim('Wrote:')}`);
|
|
34
|
+
for (const name of Object.keys(files))
|
|
35
|
+
console.log(` ${pc.cyan(path.join(path.basename(outDir), name))}`);
|
|
36
|
+
p.outro(`${pc.green('✔')} analysis at ${pc.cyan(outDir)}`);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type GroundplanConfig } from '@opengroundplan/core';
|
|
2
|
+
/**
|
|
3
|
+
* `groundplan blueprint "<idea>"` — an engineering blueprint from a sentence: understanding,
|
|
4
|
+
* requirements, architecture decisions, a roadmap, and a task backlog. Writes documents, not a
|
|
5
|
+
* repository; run `groundplan new` to scaffold once the plan is agreed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cmdBlueprint(argv: string[], config: GroundplanConfig): Promise<void>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
import { availableAgents, buildBlueprint, inferSelection, loadCatalog, loadMemories, recall, rememberProject, renderBlueprint, } from '@opengroundplan/core';
|
|
6
|
+
import { flagBool, flagList, flagString, parseArgs } from '../args.js';
|
|
7
|
+
/**
|
|
8
|
+
* `groundplan blueprint "<idea>"` — an engineering blueprint from a sentence: understanding,
|
|
9
|
+
* requirements, architecture decisions, a roadmap, and a task backlog. Writes documents, not a
|
|
10
|
+
* repository; run `groundplan new` to scaffold once the plan is agreed.
|
|
11
|
+
*/
|
|
12
|
+
export async function cmdBlueprint(argv, config) {
|
|
13
|
+
const args = parseArgs(argv);
|
|
14
|
+
const asJson = flagBool(args, 'json');
|
|
15
|
+
const idea = readIdea(args);
|
|
16
|
+
if (!idea)
|
|
17
|
+
throw new Error('Describe the project: groundplan blueprint "<idea>" (or --brief <file>).');
|
|
18
|
+
const catalog = await loadCatalog(config);
|
|
19
|
+
if (catalog.blueprints.size === 0) {
|
|
20
|
+
throw new Error('No blueprints installed. Run `groundplan doctor` and check templates/.');
|
|
21
|
+
}
|
|
22
|
+
// The one shared inference pipeline — same reasoning `new` runs, no duplicated logic.
|
|
23
|
+
const { selection, gaps } = await inferSelection(idea, catalog, config, {
|
|
24
|
+
overrides: collectOverrides(args),
|
|
25
|
+
useModel: !flagBool(args, 'no-ai'),
|
|
26
|
+
});
|
|
27
|
+
const blueprint = buildBlueprint(idea, selection, catalog, gaps, availableAgents(catalog));
|
|
28
|
+
const files = renderBlueprint(blueprint);
|
|
29
|
+
if (asJson) {
|
|
30
|
+
console.log(JSON.stringify(blueprint, null, 2));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const outDir = path.resolve(flagString(args, 'out') ?? `${slug(idea)}-blueprint`);
|
|
34
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
35
|
+
for (const [name, content] of Object.entries(files)) {
|
|
36
|
+
const dest = path.join(outDir, name);
|
|
37
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true }); // some docs (adr/) live in subdirs
|
|
38
|
+
fs.writeFileSync(dest, content, 'utf8');
|
|
39
|
+
}
|
|
40
|
+
// Reusable knowledge (off unless GROUNDPLAN_KNOWLEDGE is set): surface prior art, then record this.
|
|
41
|
+
const signals = selection.intent.matched.map((m) => m.signal);
|
|
42
|
+
const priors = recall({ signals, family: selection.intent.family }, loadMemories(config.knowledgePath));
|
|
43
|
+
rememberProject(config.knowledgePath, {
|
|
44
|
+
idea,
|
|
45
|
+
stack: selection.stack,
|
|
46
|
+
architecture: selection.architecture,
|
|
47
|
+
layers: selection.layers,
|
|
48
|
+
family: selection.intent.family,
|
|
49
|
+
signals,
|
|
50
|
+
});
|
|
51
|
+
p.intro(pc.bgCyan(pc.black(' groundplan blueprint ')));
|
|
52
|
+
console.log(`\n${pc.bold(blueprint.architecture.name)} on ${pc.cyan(selection.stack)} ${pc.dim(`— ${Math.round(blueprint.confidence * 100)}% confidence`)}`);
|
|
53
|
+
for (const prior of priors) {
|
|
54
|
+
console.log(pc.dim(` prior art (${Math.round(prior.score * 100)}%): ${prior.memory.architecture ?? 'no overlay'} on ${prior.memory.stack} — "${prior.memory.idea.slice(0, 48)}"`));
|
|
55
|
+
}
|
|
56
|
+
console.log(`${pc.dim(`${blueprint.requirements.length} requirements · ${blueprint.decisions.length} decisions · ${blueprint.tasks.length} tasks`)}`);
|
|
57
|
+
if (blueprint.gaps.length)
|
|
58
|
+
console.log(pc.yellow(`${blueprint.gaps.length} capability gap(s) flagged in risks.md`));
|
|
59
|
+
console.log(`\n${pc.dim('Wrote:')}`);
|
|
60
|
+
for (const name of Object.keys(files))
|
|
61
|
+
console.log(` ${pc.cyan(path.join(path.basename(outDir), name))}`);
|
|
62
|
+
p.outro(`${pc.green('✔')} blueprint at ${pc.cyan(outDir)} — run ${pc.bold(`groundplan new "${idea.slice(0, 32)}${idea.length > 32 ? '…' : ''}"`)} to scaffold it`);
|
|
63
|
+
}
|
|
64
|
+
function collectOverrides(args) {
|
|
65
|
+
const overrides = {};
|
|
66
|
+
const stack = flagString(args, 'stack');
|
|
67
|
+
if (stack)
|
|
68
|
+
overrides.stack = stack;
|
|
69
|
+
const architecture = flagString(args, 'architecture');
|
|
70
|
+
if (architecture)
|
|
71
|
+
overrides.architecture = architecture;
|
|
72
|
+
const base = flagString(args, 'base');
|
|
73
|
+
if (base)
|
|
74
|
+
overrides.base = base;
|
|
75
|
+
const layers = flagList(args, 'layers');
|
|
76
|
+
if (layers)
|
|
77
|
+
overrides.layers = layers;
|
|
78
|
+
const adapters = flagList(args, 'adapters');
|
|
79
|
+
if (adapters)
|
|
80
|
+
overrides.adapters = adapters;
|
|
81
|
+
return overrides;
|
|
82
|
+
}
|
|
83
|
+
function readIdea(args) {
|
|
84
|
+
const file = flagString(args, 'brief');
|
|
85
|
+
if (file) {
|
|
86
|
+
if (!fs.existsSync(file))
|
|
87
|
+
throw new Error(`Cannot read "${file}" — file not found.`);
|
|
88
|
+
return fs.readFileSync(file, 'utf8').trim();
|
|
89
|
+
}
|
|
90
|
+
return args.positional.join(' ').trim();
|
|
91
|
+
}
|
|
92
|
+
function slug(text) {
|
|
93
|
+
return (text
|
|
94
|
+
.toLowerCase()
|
|
95
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
96
|
+
.trim()
|
|
97
|
+
.split(/\s+/)
|
|
98
|
+
.filter((w) => !['a', 'an', 'the', 'build', 'create', 'for', 'with'].includes(w))
|
|
99
|
+
.slice(0, 3)
|
|
100
|
+
.join('-') || 'project');
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=blueprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../src/commands/blueprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type GroundplanConfig } from '@opengroundplan/core';
|
|
2
|
+
/**
|
|
3
|
+
* `groundplan improve <dir>` — analyze a repo and propose the smallest set of justified changes
|
|
4
|
+
* that raise its quality, with a before/after score. It never edits code; it produces the plan
|
|
5
|
+
* and delegates the change to `groundplan new` or an agent.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cmdImprove(argv: string[], _config: GroundplanConfig): Promise<void>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
import { planImprovements, renderImprovement } from '@opengroundplan/core';
|
|
6
|
+
import { flagBool, flagString, parseArgs } from '../args.js';
|
|
7
|
+
/**
|
|
8
|
+
* `groundplan improve <dir>` — analyze a repo and propose the smallest set of justified changes
|
|
9
|
+
* that raise its quality, with a before/after score. It never edits code; it produces the plan
|
|
10
|
+
* and delegates the change to `groundplan new` or an agent.
|
|
11
|
+
*/
|
|
12
|
+
export async function cmdImprove(argv, _config) {
|
|
13
|
+
const args = parseArgs(argv);
|
|
14
|
+
const asJson = flagBool(args, 'json');
|
|
15
|
+
const dir = path.resolve(args.positional[0] ?? '.');
|
|
16
|
+
if (!fs.existsSync(dir))
|
|
17
|
+
throw new Error(`No such directory: ${dir}`);
|
|
18
|
+
const improvement = planImprovements(dir);
|
|
19
|
+
const files = renderImprovement(improvement);
|
|
20
|
+
if (asJson) {
|
|
21
|
+
console.log(files['improve.json']);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const outDir = path.resolve(flagString(args, 'out') ?? path.join(dir, 'groundplan-analysis'));
|
|
25
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
26
|
+
for (const [name, content] of Object.entries(files))
|
|
27
|
+
fs.writeFileSync(path.join(outDir, name), content, 'utf8');
|
|
28
|
+
const delta = improvement.afterOverall - improvement.before.overall;
|
|
29
|
+
p.intro(pc.bgCyan(pc.black(' groundplan improve ')));
|
|
30
|
+
console.log(`\n${pc.bold(`${improvement.before.overall} → ${improvement.afterOverall}/100`)} ${pc.dim(`(${delta >= 0 ? '+' : ''}${delta})`)} · ${improvement.changes.length} change(s)`);
|
|
31
|
+
for (const c of improvement.changes)
|
|
32
|
+
console.log(` ${pc.green('+')} ${c.layer} ${pc.dim(`— ${c.why}`)}`);
|
|
33
|
+
p.outro(`${pc.green('✔')} plan at ${pc.cyan(path.join(outDir, 'improve-report.md'))}`);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=improve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"improve.js","sourceRoot":"","sources":["../../src/commands/improve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAyB,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,OAAyB;IACxE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;IAEtE,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC9F,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEhH,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IACpE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;IACzL,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;AACzF,CAAC"}
|
package/dist/commands/new.d.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import { type GroundplanConfig } from '@opengroundplan/core';
|
|
2
|
+
/**
|
|
3
|
+
* `groundplan new` — describe a project, get a repository. The brief drives everything; the
|
|
4
|
+
* interview only appears for a fork the description genuinely left open. `--yes` and
|
|
5
|
+
* `--non-interactive` suppress even those, taking the inferred default for each.
|
|
6
|
+
*/
|
|
2
7
|
export declare function cmdNew(argv: string[], config: GroundplanConfig): Promise<void>;
|
package/dist/commands/new.js
CHANGED
|
@@ -1,49 +1,55 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
1
2
|
import path from 'node:path';
|
|
2
3
|
import * as p from '@clack/prompts';
|
|
3
4
|
import pc from 'picocolors';
|
|
4
|
-
import { apply,
|
|
5
|
-
import { flagBool, flagString, parseArgs } from '../args.js';
|
|
6
|
-
|
|
5
|
+
import { apply, autoSelect, buildPlan, commandVars, delegationToolsJson, engineGlobals, hasRequiredFailure, inferSelection, loadCatalog, renderAdapterFiles, resolve, resolveVariableDefaults, runChecks, verificationPlan, writeAdapterFiles, } from '@opengroundplan/core';
|
|
6
|
+
import { flagBool, flagList, flagString, parseArgs } from '../args.js';
|
|
7
|
+
/**
|
|
8
|
+
* `groundplan new` — describe a project, get a repository. The brief drives everything; the
|
|
9
|
+
* interview only appears for a fork the description genuinely left open. `--yes` and
|
|
10
|
+
* `--non-interactive` suppress even those, taking the inferred default for each.
|
|
11
|
+
*/
|
|
7
12
|
export async function cmdNew(argv, config) {
|
|
8
13
|
const args = parseArgs(argv);
|
|
14
|
+
const asJson = flagBool(args, 'json');
|
|
15
|
+
const yes = flagBool(args, 'yes');
|
|
9
16
|
const dryRun = flagBool(args, 'dry-run');
|
|
10
|
-
|
|
17
|
+
const nonInteractive = asJson || yes || flagBool(args, 'non-interactive');
|
|
18
|
+
if (!asJson)
|
|
19
|
+
p.intro(pc.bgCyan(pc.black(' groundplan new ')));
|
|
11
20
|
const catalog = await loadCatalog(config);
|
|
12
21
|
if (catalog.blueprints.size === 0) {
|
|
13
22
|
throw new Error('No blueprints installed. Run `groundplan doctor` and check templates/.');
|
|
14
23
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
let description = readBrief(args);
|
|
25
|
+
if (!description && !nonInteractive)
|
|
26
|
+
description = await askBrief();
|
|
27
|
+
if (!description) {
|
|
28
|
+
throw new Error('Nothing to build from. Give a description, or --brief <file> / --from-readme / --from-spec.');
|
|
29
|
+
}
|
|
30
|
+
// The one shared inference pipeline — the model (when configured) proposes catalog-constrained
|
|
31
|
+
// overrides, explicit flags win, and the deterministic planner fills the rest.
|
|
32
|
+
const inferred = await inferSelection(description, catalog, config, {
|
|
33
|
+
overrides: collectOverrides(args),
|
|
34
|
+
useModel: !flagBool(args, 'no-ai'),
|
|
24
35
|
});
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}),
|
|
43
|
-
...commandVars(selected.order, answers.stack, config),
|
|
44
|
-
...(await askBlueprintVariables(selected.order, { base, stack: answers.stack, architecture })),
|
|
45
|
-
};
|
|
46
|
-
const plan = await buildPlan({ solution: solutionName, target, blueprints: selected.order, adapters, architecture, vars }, config);
|
|
36
|
+
const gaps = inferred.gaps;
|
|
37
|
+
let selection = inferred.selection;
|
|
38
|
+
if (inferred.viaModel)
|
|
39
|
+
selection.assumptions.unshift(`Understood by ${config.ai.inferModel}`);
|
|
40
|
+
if (!nonInteractive)
|
|
41
|
+
selection = await refine(description, catalog, config, selection, inferred.baseOverrides);
|
|
42
|
+
const name = await resolveName(args, description, nonInteractive);
|
|
43
|
+
const target = path.resolve(flagString(args, 'target') ?? name);
|
|
44
|
+
const plan = await planFromSelection(selection, name, target, catalog, config);
|
|
45
|
+
if (asJson) {
|
|
46
|
+
console.log(JSON.stringify(toJson(selection, plan, name, target, gaps), null, 2));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
printSelection(selection);
|
|
50
|
+
if (gaps.length) {
|
|
51
|
+
p.log.warn(`Not in the catalog yet — you'll need to add these yourself:\n ${gaps.join('\n ')}`);
|
|
52
|
+
}
|
|
47
53
|
printPlan(plan);
|
|
48
54
|
for (const warning of plan.warnings)
|
|
49
55
|
p.log.warn(warning);
|
|
@@ -51,21 +57,222 @@ export async function cmdNew(argv, config) {
|
|
|
51
57
|
p.outro(pc.dim('Dry run — nothing written.'));
|
|
52
58
|
return;
|
|
53
59
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
p.
|
|
57
|
-
|
|
60
|
+
if (!yes) {
|
|
61
|
+
const approved = await p.confirm({ message: `Write ${plan.files.length} files to ${target}?` });
|
|
62
|
+
if (p.isCancel(approved) || !approved) {
|
|
63
|
+
p.cancel('Nothing written.');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
58
66
|
}
|
|
67
|
+
await generate(selection, plan, name, target, catalog, config, flagBool(args, 'verify'));
|
|
68
|
+
}
|
|
69
|
+
/* ── input ─────────────────────────────────────────────────────────────────── */
|
|
70
|
+
/** Resolve the brief from flags or the positional argument; empty string when there is none. */
|
|
71
|
+
function readBrief(args) {
|
|
72
|
+
const file = flagString(args, 'brief');
|
|
73
|
+
if (file)
|
|
74
|
+
return readFileBrief(file);
|
|
75
|
+
if (flagBool(args, 'from-readme'))
|
|
76
|
+
return readFileBrief('README.md');
|
|
77
|
+
if (flagBool(args, 'from-spec'))
|
|
78
|
+
return readFileBrief(findSpec());
|
|
79
|
+
const positional = args.positional[0];
|
|
80
|
+
if (!positional)
|
|
81
|
+
return '';
|
|
82
|
+
if (isFileArg(positional))
|
|
83
|
+
return readFileBrief(positional);
|
|
84
|
+
if (/\s/.test(positional.trim()))
|
|
85
|
+
return positional.trim(); // a sentence, not a name
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
function isFileArg(arg) {
|
|
89
|
+
return /\.(md|txt|markdown)$/i.test(arg) || fileExists(arg);
|
|
90
|
+
}
|
|
91
|
+
function readFileBrief(file) {
|
|
92
|
+
if (!file)
|
|
93
|
+
throw new Error('No spec file found. Looked for ./spec.md and specs/*/spec.md.');
|
|
94
|
+
if (!fileExists(file))
|
|
95
|
+
throw new Error(`Cannot read "${file}" — file not found.`);
|
|
96
|
+
return fs.readFileSync(file, 'utf8').trim();
|
|
97
|
+
}
|
|
98
|
+
function findSpec() {
|
|
99
|
+
if (fileExists('spec.md'))
|
|
100
|
+
return 'spec.md';
|
|
101
|
+
const dirs = fileExists('specs') ? fs.readdirSync('specs', { withFileTypes: true }) : [];
|
|
102
|
+
for (const dir of dirs.filter((d) => d.isDirectory()).sort().reverse()) {
|
|
103
|
+
const candidate = path.join('specs', dir.name, 'spec.md');
|
|
104
|
+
if (fileExists(candidate))
|
|
105
|
+
return candidate;
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
function fileExists(file) {
|
|
110
|
+
try {
|
|
111
|
+
fs.accessSync(file);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function collectOverrides(args) {
|
|
119
|
+
const overrides = {};
|
|
120
|
+
const stack = flagString(args, 'stack');
|
|
121
|
+
if (stack)
|
|
122
|
+
overrides.stack = stack;
|
|
123
|
+
const architecture = flagString(args, 'architecture');
|
|
124
|
+
if (architecture)
|
|
125
|
+
overrides.architecture = architecture;
|
|
126
|
+
const base = flagString(args, 'base');
|
|
127
|
+
if (base)
|
|
128
|
+
overrides.base = base;
|
|
129
|
+
const layers = flagList(args, 'layers');
|
|
130
|
+
if (layers)
|
|
131
|
+
overrides.layers = layers;
|
|
132
|
+
const adapters = flagList(args, 'adapters');
|
|
133
|
+
if (adapters)
|
|
134
|
+
overrides.adapters = adapters;
|
|
135
|
+
return overrides;
|
|
136
|
+
}
|
|
137
|
+
/* ── interactive refinement — only the questions the brief left open ─────────── */
|
|
138
|
+
const REFINABLE = new Set(['stack', 'priorities', 'architecture', 'base']);
|
|
139
|
+
const PRIORITY_CHOICES = [
|
|
140
|
+
{ value: 'simplicity', label: 'Simplicity', hint: 'ship fast, few moving parts' },
|
|
141
|
+
{ value: 'scalability', label: 'Scalability', hint: 'grow with load' },
|
|
142
|
+
{ value: 'deployability', label: 'Deployability', hint: 'deploy often, independently' },
|
|
143
|
+
{ value: 'testability', label: 'Testability', hint: 'fast, isolated tests' },
|
|
144
|
+
{ value: 'evolvability', label: 'Evolvability', hint: 'change direction cheaply' },
|
|
145
|
+
{ value: 'fault-tolerance', label: 'Fault tolerance', hint: 'survive partial failure' },
|
|
146
|
+
{ value: 'maintainability', label: 'Maintainability', hint: 'easy to change safely' },
|
|
147
|
+
{ value: 'responsiveness', label: 'Responsiveness', hint: 'low latency to the user' },
|
|
148
|
+
{ value: 'cost', label: 'Low cost', hint: 'minimize infrastructure spend' },
|
|
149
|
+
];
|
|
150
|
+
async function refine(description, catalog, config, selection, baseOverrides) {
|
|
151
|
+
const overrides = { ...baseOverrides };
|
|
152
|
+
const handled = new Set();
|
|
153
|
+
for (;;) {
|
|
154
|
+
const question = selection.questions.find((q) => REFINABLE.has(q.field) && !handled.has(q.field));
|
|
155
|
+
if (!question)
|
|
156
|
+
break;
|
|
157
|
+
handled.add(question.field);
|
|
158
|
+
if (question.field === 'priorities') {
|
|
159
|
+
overrides.priorities = await askPriorities();
|
|
160
|
+
}
|
|
161
|
+
else if (question.field === 'stack') {
|
|
162
|
+
overrides.stack = (await askSelect('Primary stack', question.options, question.chosen));
|
|
163
|
+
}
|
|
164
|
+
else if (question.field === 'architecture') {
|
|
165
|
+
overrides.architecture = await askSelect('Architecture', question.options, question.chosen);
|
|
166
|
+
}
|
|
167
|
+
else if (question.field === 'base') {
|
|
168
|
+
overrides.base = await askSelect('Base template', question.options, question.chosen);
|
|
169
|
+
}
|
|
170
|
+
selection = autoSelect(description, catalog, { defaultAdapters: config.defaultAdapters, overrides });
|
|
171
|
+
}
|
|
172
|
+
return selection;
|
|
173
|
+
}
|
|
174
|
+
async function askSelect(message, options, initial) {
|
|
175
|
+
const value = await p.select({
|
|
176
|
+
message,
|
|
177
|
+
initialValue: initial,
|
|
178
|
+
options: options.map((o) => ({ value: o.id, label: o.label, hint: o.hint })),
|
|
179
|
+
});
|
|
180
|
+
assertNotCancelled(value);
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
183
|
+
async function askPriorities() {
|
|
184
|
+
const chosen = (await p.multiselect({
|
|
185
|
+
message: 'What matters most? (pick 2-4)',
|
|
186
|
+
options: PRIORITY_CHOICES,
|
|
187
|
+
required: true,
|
|
188
|
+
}));
|
|
189
|
+
assertNotCancelled(chosen);
|
|
190
|
+
const priorities = {};
|
|
191
|
+
chosen.forEach((c, i) => (priorities[c] = Math.max(5 - i, 2)));
|
|
192
|
+
return priorities;
|
|
193
|
+
}
|
|
194
|
+
async function askBrief() {
|
|
195
|
+
const value = await p.text({
|
|
196
|
+
message: 'Describe your project in a sentence or two',
|
|
197
|
+
placeholder: 'An AI tutoring platform with realtime voice and screen monitoring',
|
|
198
|
+
validate: (v) => (v.trim().length > 0 ? undefined : 'Say a little about what you are building'),
|
|
199
|
+
});
|
|
200
|
+
assertNotCancelled(value);
|
|
201
|
+
return value.trim();
|
|
202
|
+
}
|
|
203
|
+
async function resolveName(args, description, nonInteractive) {
|
|
204
|
+
const explicit = flagString(args, 'name') ?? bareNameArg(args) ?? targetName(args);
|
|
205
|
+
if (explicit)
|
|
206
|
+
return explicit;
|
|
207
|
+
const derived = slugify(description) || 'app';
|
|
208
|
+
if (nonInteractive)
|
|
209
|
+
return derived;
|
|
210
|
+
const value = await p.text({ message: 'Project name', defaultValue: derived, placeholder: derived });
|
|
211
|
+
assertNotCancelled(value);
|
|
212
|
+
return value.trim() || derived;
|
|
213
|
+
}
|
|
214
|
+
/** A bare positional token (`groundplan new acme-billing`) is a name, not a brief. */
|
|
215
|
+
function bareNameArg(args) {
|
|
216
|
+
const positional = args.positional[0];
|
|
217
|
+
if (positional && !isFileArg(positional) && !/\s/.test(positional.trim()))
|
|
218
|
+
return positional.trim();
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
function targetName(args) {
|
|
222
|
+
const target = flagString(args, 'target');
|
|
223
|
+
return target ? path.basename(target) : undefined;
|
|
224
|
+
}
|
|
225
|
+
const NAME_FILLERS = new Set(['build', 'create', 'make', 'a', 'an', 'the', 'my', 'some', 'app', 'for']);
|
|
226
|
+
/** A repo name from the first few meaningful words — "Build an AI tutoring…" → "ai-tutoring". */
|
|
227
|
+
function slugify(text) {
|
|
228
|
+
const words = text
|
|
229
|
+
.toLowerCase()
|
|
230
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
231
|
+
.trim()
|
|
232
|
+
.split(/\s+/)
|
|
233
|
+
.filter((w) => w && !NAME_FILLERS.has(w));
|
|
234
|
+
return words.slice(0, 3).join('-');
|
|
235
|
+
}
|
|
236
|
+
/* ── plan assembly ───────────────────────────────────────────────────────────── */
|
|
237
|
+
async function planFromSelection(selection, name, target, catalog, config) {
|
|
238
|
+
const selected = resolve({ base: selection.base, architecture: selection.architecture, layers: selection.layers }, catalog.blueprints);
|
|
239
|
+
const adapterEntries = selection.adapters
|
|
240
|
+
.map((id) => catalog.adapters.get(id))
|
|
241
|
+
.filter((a) => a !== undefined);
|
|
242
|
+
const globals = engineGlobals({
|
|
243
|
+
solutionName: name,
|
|
244
|
+
base: selection.base,
|
|
245
|
+
stack: selection.stack,
|
|
246
|
+
teamSize: selection.teamSize,
|
|
247
|
+
architecture: selection.architecture,
|
|
248
|
+
adapters: selection.adapters,
|
|
249
|
+
today: new Date().toISOString().slice(0, 10),
|
|
250
|
+
delegationTools: delegationToolsJson(adapterEntries),
|
|
251
|
+
});
|
|
252
|
+
const cmds = commandVars(selected.order, selection.stack, config);
|
|
253
|
+
const context = { base: selection.base, stack: selection.stack, architecture: selection.architecture };
|
|
254
|
+
const { vars: filled } = resolveVariableDefaults(selected.order, { ...context, ...globals, ...cmds });
|
|
255
|
+
return buildPlan({
|
|
256
|
+
solution: name,
|
|
257
|
+
target,
|
|
258
|
+
blueprints: selected.order,
|
|
259
|
+
adapters: selection.adapters,
|
|
260
|
+
architecture: selection.architecture,
|
|
261
|
+
vars: { ...globals, ...cmds, ...filled },
|
|
262
|
+
}, config);
|
|
263
|
+
}
|
|
264
|
+
async function generate(selection, plan, name, target, catalog, config, verify) {
|
|
59
265
|
const spinner = p.spinner();
|
|
60
266
|
spinner.start('Generating');
|
|
61
267
|
const result = await apply(plan, config, { onProgress: (m) => spinner.message(m) });
|
|
62
268
|
spinner.stop(`Wrote ${result.written.length} files`);
|
|
63
|
-
|
|
64
|
-
|
|
269
|
+
const adapterEntries = selection.adapters
|
|
270
|
+
.map((id) => catalog.adapters.get(id))
|
|
271
|
+
.filter((a) => a !== undefined);
|
|
65
272
|
const emitted = await renderAdapterFiles({
|
|
66
|
-
adapters:
|
|
273
|
+
adapters: adapterEntries,
|
|
67
274
|
registry: [...catalog.registry.values()],
|
|
68
|
-
vars,
|
|
275
|
+
vars: plan.variables,
|
|
69
276
|
config,
|
|
70
277
|
});
|
|
71
278
|
await writeAdapterFiles(target, emitted.files);
|
|
@@ -89,154 +296,42 @@ export async function cmdNew(argv, config) {
|
|
|
89
296
|
process.exitCode = 1;
|
|
90
297
|
return;
|
|
91
298
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
validate: (v) => (v.trim().length > 0 ? undefined : 'Required'),
|
|
99
|
-
});
|
|
100
|
-
assertNotCancelled(value);
|
|
101
|
-
return value.trim();
|
|
102
|
-
}
|
|
103
|
-
async function pickArchitecture(ranked) {
|
|
104
|
-
if (ranked.length === 0)
|
|
105
|
-
return undefined;
|
|
106
|
-
const value = await p.select({
|
|
107
|
-
message: 'Architecture',
|
|
108
|
-
options: ranked.slice(0, 6).map((r, i) => ({
|
|
109
|
-
value: r.architecture.id,
|
|
110
|
-
label: `${r.architecture.name}${i === 0 ? pc.green(' ← recommended') : ''}`,
|
|
111
|
-
hint: `${Math.round(r.fit * 100)}% fit — ${r.architecture.keyTradeoff}`,
|
|
112
|
-
})),
|
|
113
|
-
});
|
|
114
|
-
assertNotCancelled(value);
|
|
115
|
-
return value;
|
|
116
|
-
}
|
|
117
|
-
async function pickBase(catalog, stack, architecture) {
|
|
118
|
-
const bases = [...catalog.blueprints.values()].filter((b) => b.kind === 'base' &&
|
|
119
|
-
b.stack === stack &&
|
|
120
|
-
(!architecture || b.supportsArchitectures.length === 0 || b.supportsArchitectures.includes(architecture)));
|
|
121
|
-
if (bases.length === 0) {
|
|
122
|
-
// Two very different causes; saying "no base for this stack" when eight exist sends the
|
|
123
|
-
// reader looking in the wrong place.
|
|
124
|
-
const forStack = [...catalog.blueprints.values()].filter((b) => b.kind === 'base' && b.stack === stack);
|
|
125
|
-
throw new Error(forStack.length === 0
|
|
126
|
-
? `No base template for stack "${stack}" yet.`
|
|
127
|
-
: `No ${stack} base supports the "${architecture}" architecture. ` +
|
|
128
|
-
`Bases for this stack: ${forStack.map((b) => b.id).join(', ')}. ` +
|
|
129
|
-
`A base opts in through supportsArchitectures in its blueprint.yaml.`);
|
|
130
|
-
}
|
|
131
|
-
if (bases.length === 1)
|
|
132
|
-
return bases[0].id;
|
|
133
|
-
const value = await p.select({
|
|
134
|
-
message: 'Base template',
|
|
135
|
-
options: bases.map((b) => ({ value: b.id, label: b.name, hint: b.description })),
|
|
136
|
-
});
|
|
137
|
-
assertNotCancelled(value);
|
|
138
|
-
return value;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Choice sets are asked first as pick-one (database, ORM, auth provider…), then everything
|
|
142
|
-
* else as checkboxes. Presenting exclusive alternatives as checkboxes invites a selection
|
|
143
|
-
* the resolver will only reject afterwards.
|
|
144
|
-
*/
|
|
145
|
-
async function pickLayers(catalog, base) {
|
|
146
|
-
const baseStack = catalog.blueprints.get(base)?.stack;
|
|
147
|
-
const layers = [...catalog.blueprints.values()].filter((b) => b.kind === 'layer' && (!b.stack || b.stack === baseStack));
|
|
148
|
-
if (layers.length === 0)
|
|
149
|
-
return [];
|
|
150
|
-
const selected = [];
|
|
151
|
-
const sets = choiceSets(layers);
|
|
152
|
-
for (const [setName, options] of [...sets.entries()].sort()) {
|
|
153
|
-
const preselected = options.find((o) => o.choiceDefault);
|
|
154
|
-
const value = await p.select({
|
|
155
|
-
message: `${setName.replace(/-/g, ' ')}`,
|
|
156
|
-
initialValue: preselected?.id,
|
|
157
|
-
options: [
|
|
158
|
-
...options.map((o) => ({ value: o.id, label: o.name, hint: o.description })),
|
|
159
|
-
{ value: '', label: 'None', hint: 'skip this' },
|
|
160
|
-
],
|
|
161
|
-
});
|
|
162
|
-
assertNotCancelled(value);
|
|
163
|
-
if (value)
|
|
164
|
-
selected.push(value);
|
|
165
|
-
}
|
|
166
|
-
const rest = layers.filter((l) => !l.choiceSet);
|
|
167
|
-
if (rest.length === 0)
|
|
168
|
-
return selected;
|
|
169
|
-
const extras = await p.multiselect({
|
|
170
|
-
message: 'Capabilities',
|
|
171
|
-
options: rest.map((l) => ({ value: l.id, label: l.name, hint: l.description })),
|
|
172
|
-
required: false,
|
|
173
|
-
});
|
|
174
|
-
assertNotCancelled(extras);
|
|
175
|
-
return [...selected, ...extras];
|
|
176
|
-
}
|
|
177
|
-
async function pickAdapters(catalog, config) {
|
|
178
|
-
const available = [...catalog.adapters.values()];
|
|
179
|
-
if (available.length === 0)
|
|
180
|
-
return [];
|
|
181
|
-
const value = await p.multiselect({
|
|
182
|
-
message: 'Which AI coding tools will touch this repo?',
|
|
183
|
-
options: available.map((a) => ({
|
|
184
|
-
value: a.id,
|
|
185
|
-
label: a.name,
|
|
186
|
-
hint: a.readsAgentsMd ? 'reads AGENTS.md natively' : 'needs a wrapper file',
|
|
187
|
-
})),
|
|
188
|
-
initialValues: config.defaultAdapters.filter((id) => catalog.adapters.has(id)),
|
|
189
|
-
required: false,
|
|
190
|
-
});
|
|
191
|
-
assertNotCancelled(value);
|
|
192
|
-
return value;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Only asks questions the selected blueprints actually declared, and only those whose `when`
|
|
196
|
-
* holds. Skipping the condition asked a .NET user which Python package manager to use, and —
|
|
197
|
-
* worse — recorded an answer the templates then rendered as fact.
|
|
198
|
-
*
|
|
199
|
-
* A skipped variable still takes its declared default, because a template may reference it
|
|
200
|
-
* even on a stack that was never asked: the docker layer's compose file names a Dockerfile
|
|
201
|
-
* whose suffix only one stack chooses.
|
|
202
|
-
*/
|
|
203
|
-
async function askBlueprintVariables(blueprints, context) {
|
|
204
|
-
const answers = {};
|
|
205
|
-
const asked = new Set();
|
|
206
|
-
const skipped = [];
|
|
207
|
-
for (const blueprint of blueprints) {
|
|
208
|
-
for (const variable of blueprint.variables) {
|
|
209
|
-
if (asked.has(variable.name))
|
|
210
|
-
continue;
|
|
211
|
-
asked.add(variable.name);
|
|
212
|
-
if (!testCondition(variable.when, { ...context, ...answers })) {
|
|
213
|
-
skipped.push(variable);
|
|
214
|
-
asked.delete(variable.name);
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
const value = variable.type === 'boolean'
|
|
218
|
-
? await p.confirm({ message: variable.prompt, initialValue: Boolean(variable.default) })
|
|
219
|
-
: variable.type === 'select'
|
|
220
|
-
? await p.select({
|
|
221
|
-
message: variable.prompt,
|
|
222
|
-
options: (variable.choices ?? []).map((c) => ({ value: c.value, label: c.label })),
|
|
223
|
-
})
|
|
224
|
-
: await p.text({
|
|
225
|
-
message: variable.prompt,
|
|
226
|
-
defaultValue: variable.default === undefined ? '' : String(variable.default),
|
|
227
|
-
});
|
|
228
|
-
assertNotCancelled(value);
|
|
229
|
-
answers[variable.name] = value;
|
|
299
|
+
if (verify) {
|
|
300
|
+
const failed = await runVerification(selection.stack, target, config);
|
|
301
|
+
if (failed) {
|
|
302
|
+
p.outro(pc.red(`${name} generated, but a check failed. See ${pc.cyan(target)}.`));
|
|
303
|
+
process.exitCode = 1;
|
|
304
|
+
return;
|
|
230
305
|
}
|
|
231
306
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
307
|
+
p.outro(`${pc.green('✔')} ${name} ready at ${pc.cyan(target)}`);
|
|
308
|
+
}
|
|
309
|
+
/** Run the stack's own checks against the generated repo; returns true if any failed. */
|
|
310
|
+
async function runVerification(stack, target, config) {
|
|
311
|
+
const checks = verificationPlan(stack, config);
|
|
312
|
+
if (checks.length === 0)
|
|
313
|
+
return false;
|
|
314
|
+
const spinner = p.spinner();
|
|
315
|
+
spinner.start('Verifying');
|
|
316
|
+
const results = await runChecks(target, checks, config, { onProgress: (n) => spinner.message(`Verifying — ${n}`) });
|
|
317
|
+
spinner.stop('Verification');
|
|
318
|
+
let anyFailed = false;
|
|
319
|
+
for (const r of results) {
|
|
320
|
+
if (r.ok)
|
|
321
|
+
p.log.success(`${r.name}: ${r.command}`);
|
|
322
|
+
else {
|
|
323
|
+
anyFailed = true;
|
|
324
|
+
p.log.error(`${r.name} failed: ${r.command}\n${pc.dim(r.output.slice(-800))}`);
|
|
237
325
|
}
|
|
238
326
|
}
|
|
239
|
-
return
|
|
327
|
+
return anyFailed;
|
|
328
|
+
}
|
|
329
|
+
/* ── output ─────────────────────────────────────────────────────────────────── */
|
|
330
|
+
function printSelection(selection) {
|
|
331
|
+
const pct = Math.round(selection.confidence * 100);
|
|
332
|
+
console.log(`\n${pc.bold('Understood')} ${pc.dim(`— ${pct}% confidence`)}`);
|
|
333
|
+
for (const note of selection.assumptions)
|
|
334
|
+
console.log(` ${pc.green('·')} ${pc.dim(note)}`);
|
|
240
335
|
}
|
|
241
336
|
function printPlan(plan) {
|
|
242
337
|
const byBlueprint = new Map();
|
|
@@ -247,8 +342,9 @@ function printPlan(plan) {
|
|
|
247
342
|
for (const [blueprint, count] of byBlueprint) {
|
|
248
343
|
console.log(` ${pc.cyan(blueprint.padEnd(24))} ${pc.dim(`${count} files`)}`);
|
|
249
344
|
}
|
|
250
|
-
if (plan.adapters.length)
|
|
345
|
+
if (plan.adapters.length) {
|
|
251
346
|
console.log(` ${pc.cyan('ai-tools'.padEnd(24))} ${pc.dim(plan.adapters.join(', '))}`);
|
|
347
|
+
}
|
|
252
348
|
if (plan.postApply.length) {
|
|
253
349
|
console.log(`\n${pc.dim('After writing:')}`);
|
|
254
350
|
for (const step of plan.postApply) {
|
|
@@ -257,6 +353,35 @@ function printPlan(plan) {
|
|
|
257
353
|
}
|
|
258
354
|
console.log();
|
|
259
355
|
}
|
|
356
|
+
function toJson(selection, plan, name, target, gaps) {
|
|
357
|
+
return {
|
|
358
|
+
name,
|
|
359
|
+
target,
|
|
360
|
+
confidence: selection.confidence,
|
|
361
|
+
gaps,
|
|
362
|
+
stack: selection.stack,
|
|
363
|
+
architecture: selection.architecture,
|
|
364
|
+
base: selection.base,
|
|
365
|
+
layers: selection.layers,
|
|
366
|
+
adapters: selection.adapters,
|
|
367
|
+
intent: {
|
|
368
|
+
matched: selection.intent.matched,
|
|
369
|
+
priorities: selection.intent.priorities,
|
|
370
|
+
teamSize: selection.teamSize,
|
|
371
|
+
},
|
|
372
|
+
ranked: selection.ranked.slice(0, 5).map((r) => ({
|
|
373
|
+
id: r.architecture.id,
|
|
374
|
+
name: r.architecture.name,
|
|
375
|
+
fit: Math.round(r.fit * 100) / 100,
|
|
376
|
+
reasons: r.reasons,
|
|
377
|
+
concerns: r.concerns,
|
|
378
|
+
})),
|
|
379
|
+
assumptions: selection.assumptions,
|
|
380
|
+
questions: selection.questions,
|
|
381
|
+
files: plan.files.map((f) => ({ path: f.path, from: f.fromBlueprint })),
|
|
382
|
+
postApply: plan.postApply,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
260
385
|
function assertNotCancelled(value) {
|
|
261
386
|
if (p.isCancel(value)) {
|
|
262
387
|
p.cancel('Cancelled.');
|
package/dist/commands/new.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
family?: 'application' | 'system' | 'frontend' | 'data' | 'ai';
|
|
7
|
-
}
|
|
8
|
-
export declare function askAnswers(): Promise<Answers>;
|
|
1
|
+
import { type GroundplanConfig } from '@opengroundplan/core';
|
|
2
|
+
/**
|
|
3
|
+
* `groundplan recommend "<brief>"` — rank architectures against a described project, and say
|
|
4
|
+
* why the top one won and why the runners-up did not. No scaffolding, no interview.
|
|
5
|
+
*/
|
|
9
6
|
export declare function cmdRecommend(argv: string[], config: GroundplanConfig): Promise<void>;
|
|
@@ -1,101 +1,55 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
-
import {
|
|
4
|
-
import { parseArgs } from '../args.js';
|
|
5
|
-
/**
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
{ value: 'deployability', label: 'Deployability', hint: 'deploy often, independently' },
|
|
10
|
-
{ value: 'testability', label: 'Testability', hint: 'fast, isolated tests' },
|
|
11
|
-
{ value: 'evolvability', label: 'Evolvability', hint: 'change direction cheaply' },
|
|
12
|
-
{ value: 'fault-tolerance', label: 'Fault tolerance', hint: 'survive partial failure' },
|
|
13
|
-
{ value: 'maintainability', label: 'Maintainability', hint: 'easy to change safely' },
|
|
14
|
-
{ value: 'elasticity', label: 'Elasticity', hint: 'absorb sudden spikes' },
|
|
15
|
-
{ value: 'responsiveness', label: 'Responsiveness', hint: 'low latency to the user' },
|
|
16
|
-
{ value: 'cost', label: 'Low cost', hint: 'minimize infrastructure spend' },
|
|
17
|
-
];
|
|
18
|
-
export async function askAnswers() {
|
|
19
|
-
const stack = (await p.select({
|
|
20
|
-
message: 'Primary stack',
|
|
21
|
-
options: [
|
|
22
|
-
{ value: 'typescript', label: 'TypeScript / Next.js / React' },
|
|
23
|
-
{ value: 'python', label: 'Python / FastAPI / AI-ML' },
|
|
24
|
-
{ value: 'dotnet', label: '.NET / C#' },
|
|
25
|
-
{ value: 'node', label: 'Node backend / NestJS / Express' },
|
|
26
|
-
{ value: 'go', label: 'Go' },
|
|
27
|
-
{ value: 'polyglot', label: 'Polyglot / monorepo' },
|
|
28
|
-
],
|
|
29
|
-
}));
|
|
30
|
-
assertNotCancelled(stack);
|
|
31
|
-
const teamSizeRaw = await p.text({
|
|
32
|
-
message: 'How many engineers will work on this?',
|
|
33
|
-
placeholder: '4',
|
|
34
|
-
defaultValue: '4',
|
|
35
|
-
validate: (v) => (Number.isFinite(Number(v)) && Number(v) > 0 ? undefined : 'Enter a positive number'),
|
|
36
|
-
});
|
|
37
|
-
assertNotCancelled(teamSizeRaw);
|
|
38
|
-
const family = (await p.select({
|
|
39
|
-
message: 'What are you deciding?',
|
|
40
|
-
options: [
|
|
41
|
-
{ value: 'application', label: 'Application/code structure', hint: 'layered, clean, vertical-slice…' },
|
|
42
|
-
{ value: 'system', label: 'System topology', hint: 'monolith, microservices, event-driven…' },
|
|
43
|
-
{ value: 'frontend', label: 'Frontend structure' },
|
|
44
|
-
{ value: 'ai', label: 'AI/agent architecture' },
|
|
45
|
-
{ value: 'data', label: 'Data architecture' },
|
|
46
|
-
],
|
|
47
|
-
}));
|
|
48
|
-
assertNotCancelled(family);
|
|
49
|
-
const chosen = (await p.multiselect({
|
|
50
|
-
message: 'What matters most? (pick 2-4)',
|
|
51
|
-
options: PRIORITY_CHOICES,
|
|
52
|
-
required: true,
|
|
53
|
-
}));
|
|
54
|
-
assertNotCancelled(chosen);
|
|
55
|
-
// Weight by selection order: the first pick counts most, so ties break meaningfully.
|
|
56
|
-
const priorities = {};
|
|
57
|
-
chosen.forEach((c, i) => {
|
|
58
|
-
priorities[c] = Math.max(5 - i, 2);
|
|
59
|
-
});
|
|
60
|
-
return { stack, teamSize: Number(teamSizeRaw), priorities, family };
|
|
61
|
-
}
|
|
3
|
+
import { autoSelect, loadCatalog } from '@opengroundplan/core';
|
|
4
|
+
import { flagBool, flagString, parseArgs } from '../args.js';
|
|
5
|
+
/**
|
|
6
|
+
* `groundplan recommend "<brief>"` — rank architectures against a described project, and say
|
|
7
|
+
* why the top one won and why the runners-up did not. No scaffolding, no interview.
|
|
8
|
+
*/
|
|
62
9
|
export async function cmdRecommend(argv, config) {
|
|
63
|
-
parseArgs(argv);
|
|
64
|
-
|
|
10
|
+
const args = parseArgs(argv);
|
|
11
|
+
const asJson = flagBool(args, 'json');
|
|
65
12
|
const catalog = await loadCatalog(config);
|
|
66
13
|
if (catalog.architectures.size === 0) {
|
|
67
14
|
throw new Error('Catalog is empty. Run `groundplan doctor` and check catalog/architectures/.');
|
|
68
15
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
p.outro(pc.yellow('No architecture in the catalog fits those constraints.'));
|
|
16
|
+
let description = flagString(args, 'brief') ? '' : args.positional.join(' ').trim();
|
|
17
|
+
if (!description && !asJson)
|
|
18
|
+
description = await askBrief();
|
|
19
|
+
if (!description)
|
|
20
|
+
throw new Error('Describe a project to rank architectures against it.');
|
|
21
|
+
const selection = autoSelect(description, catalog, { defaultAdapters: config.defaultAdapters });
|
|
22
|
+
if (asJson) {
|
|
23
|
+
console.log(JSON.stringify({ confidence: selection.confidence, stack: selection.stack, ranked: selection.ranked }, null, 2));
|
|
78
24
|
return;
|
|
79
25
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
26
|
+
p.intro(pc.bgCyan(pc.black(' groundplan recommend ')));
|
|
27
|
+
console.log(`\n${pc.dim(`Read as ${selection.stack}, ${Math.round(selection.confidence * 100)}% confidence`)}\n`);
|
|
28
|
+
for (const [rank, result] of selection.ranked.slice(0, 5).entries()) {
|
|
29
|
+
const chosen = result.architecture.id === selection.architecture;
|
|
30
|
+
const badge = chosen ? pc.green('▸ RECOMMENDED') : pc.dim(` #${rank + 1}`);
|
|
83
31
|
console.log(`${badge} ${pc.bold(result.architecture.name)} ${pc.dim(`(${Math.round(result.fit * 100)}% fit)`)}`);
|
|
84
32
|
console.log(` ${pc.dim(result.architecture.oneLine)}`);
|
|
85
33
|
for (const reason of result.reasons.slice(0, 3))
|
|
86
34
|
console.log(` ${pc.green('+')} ${reason}`);
|
|
87
35
|
for (const concern of result.concerns.slice(0, 3))
|
|
88
36
|
console.log(` ${pc.yellow('!')} ${concern}`);
|
|
89
|
-
if (
|
|
37
|
+
if (chosen)
|
|
90
38
|
console.log(` ${pc.dim('trade-off: ' + result.architecture.keyTradeoff)}`);
|
|
91
39
|
console.log();
|
|
92
40
|
}
|
|
93
|
-
p.outro(pc.dim('Run `groundplan new <
|
|
41
|
+
p.outro(pc.dim('Run `groundplan new "<the same description>"` to scaffold it.'));
|
|
94
42
|
}
|
|
95
|
-
function
|
|
43
|
+
async function askBrief() {
|
|
44
|
+
const value = await p.text({
|
|
45
|
+
message: 'Describe your project in a sentence or two',
|
|
46
|
+
placeholder: 'An AI tutoring platform with realtime voice and screen monitoring',
|
|
47
|
+
validate: (v) => (v.trim().length > 0 ? undefined : 'Say a little about what you are building'),
|
|
48
|
+
});
|
|
96
49
|
if (p.isCancel(value)) {
|
|
97
50
|
p.cancel('Cancelled.');
|
|
98
51
|
process.exit(0);
|
|
99
52
|
}
|
|
53
|
+
return value.trim();
|
|
100
54
|
}
|
|
101
55
|
//# sourceMappingURL=recommend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/commands/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/commands/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAyB,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,MAAwB;IACzE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpF,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM;QAAE,WAAW,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC5D,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAE1F,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IAEhG,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7H,OAAO;IACT,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAElH,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,SAAS,CAAC,YAAY,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjH,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QAC/F,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;QACnG,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,4CAA4C;QACrD,WAAW,EAAE,mEAAmE;QAChF,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0CAA0C,CAAC;KAChG,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,20 +6,26 @@
|
|
|
6
6
|
import pc from 'picocolors';
|
|
7
7
|
import { loadConfig } from '@opengroundplan/core';
|
|
8
8
|
import { cmdNew } from './commands/new.js';
|
|
9
|
+
import { cmdBlueprint } from './commands/blueprint.js';
|
|
10
|
+
import { cmdAnalyze } from './commands/analyze.js';
|
|
11
|
+
import { cmdImprove } from './commands/improve.js';
|
|
9
12
|
import { cmdList } from './commands/list.js';
|
|
10
13
|
import { cmdRecommend } from './commands/recommend.js';
|
|
11
14
|
import { cmdSyncAgents } from './commands/sync-agents.js';
|
|
12
15
|
import { cmdDoctor } from './commands/doctor.js';
|
|
13
16
|
const COMMANDS = {
|
|
14
|
-
new: { run: cmdNew, help: '
|
|
17
|
+
new: { run: cmdNew, help: 'Describe a project in a sentence; get the repository' },
|
|
18
|
+
blueprint: { run: cmdBlueprint, help: 'Describe a project; get a full engineering blueprint (docs + tasks)' },
|
|
19
|
+
analyze: { run: cmdAnalyze, help: 'Analyze an existing repository: scores, gaps, improvement roadmap' },
|
|
20
|
+
improve: { run: cmdImprove, help: 'Propose justified improvements to a repo, with a before/after score' },
|
|
15
21
|
list: { run: cmdList, help: 'List architectures, blueprints, adapters, registry items' },
|
|
16
|
-
recommend: { run: cmdRecommend, help: 'Rank architectures against
|
|
22
|
+
recommend: { run: cmdRecommend, help: 'Rank architectures against a described project' },
|
|
17
23
|
'sync-agents': { run: cmdSyncAgents, help: 'Regenerate AI-tool files from agent-kit in an existing repo' },
|
|
18
24
|
doctor: { run: cmdDoctor, help: 'Validate the catalog and report dangling references' },
|
|
19
25
|
};
|
|
20
26
|
function usage() {
|
|
21
27
|
console.log(`
|
|
22
|
-
${pc.bold('groundplan')} —
|
|
28
|
+
${pc.bold('groundplan')} — describe a project, get a repository
|
|
23
29
|
|
|
24
30
|
${pc.dim('Usage:')} groundplan <command> [options]
|
|
25
31
|
|
|
@@ -27,11 +33,27 @@ ${Object.entries(COMMANDS)
|
|
|
27
33
|
.map(([name, { help }]) => ` ${pc.cyan(name.padEnd(13))} ${help}`)
|
|
28
34
|
.join('\n')}
|
|
29
35
|
|
|
30
|
-
${pc.dim('
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
${pc.dim('Examples:')}
|
|
37
|
+
groundplan new "An AI tutoring platform with realtime voice and screen monitoring"
|
|
38
|
+
groundplan new --from-readme infer from ./README.md
|
|
39
|
+
groundplan new --brief brief.txt --yes
|
|
40
|
+
groundplan recommend "high-traffic multi-tenant billing SaaS"
|
|
41
|
+
|
|
42
|
+
${pc.dim('new flags:')}
|
|
43
|
+
--brief <file> Read the description from a file
|
|
44
|
+
--from-readme Read the description from ./README.md
|
|
45
|
+
--from-spec Read the description from ./spec.md or specs/*/spec.md
|
|
46
|
+
--yes Take every inferred default; ask nothing
|
|
47
|
+
--json Print the plan as JSON; write nothing
|
|
48
|
+
--dry-run Show the plan; write nothing
|
|
49
|
+
--name <name> Repository name (default: inferred from the description)
|
|
33
50
|
--target <dir> Output directory (default: ./<name>)
|
|
51
|
+
--stack, --architecture, --base, --layers, --adapters Override any inference
|
|
52
|
+
--no-ai Skip the model; use only the offline deterministic inference
|
|
53
|
+
--verify After generating, run the stack's typecheck/lint/build/test and report
|
|
34
54
|
|
|
55
|
+
${pc.dim('AI inference is optional: set GROUNDPLAN_MODEL_INFER + a key (or an Anthropic profile)')}
|
|
56
|
+
${pc.dim('to let a model read the brief. Without one, inference stays deterministic and offline.')}
|
|
35
57
|
${pc.dim('Configuration is environment-driven; see docs/ARCHITECTURE.md section 8.')}
|
|
36
58
|
`);
|
|
37
59
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,QAAQ,GAAG;IACf,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "groundplan",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Groundplan CLI: prepare a repository — pick an architecture, assemble it from templates, and wire it for every AI coding tool.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Groundplan contributors",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/groundplan/
|
|
9
|
+
"url": "git+https://github.com/groundplan/opengroundplan.git",
|
|
10
10
|
"directory": "packages/cli"
|
|
11
11
|
},
|
|
12
|
-
"homepage": "https://github.com/groundplan/
|
|
13
|
-
"bugs": "https://github.com/groundplan/
|
|
12
|
+
"homepage": "https://github.com/groundplan/opengroundplan#readme",
|
|
13
|
+
"bugs": "https://github.com/groundplan/opengroundplan/issues",
|
|
14
14
|
"keywords": [
|
|
15
15
|
"cli",
|
|
16
16
|
"scaffolding",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@clack/prompts": "^0.9.0",
|
|
40
40
|
"picocolors": "^1.1.1",
|
|
41
|
-
"@opengroundplan/core": "0.
|
|
41
|
+
"@opengroundplan/core": "0.2.0"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsc -p tsconfig.json",
|