groundplan 0.1.0 → 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 +2 -2
- 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/doctor.d.ts +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/doctor.js.map +1 -1
- 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/list.d.ts +1 -1
- package/dist/commands/list.js +1 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new.d.ts +6 -1
- 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/commands/sync-agents.d.ts +1 -1
- package/dist/commands/sync-agents.js +1 -1
- package/dist/commands/sync-agents.js.map +1 -1
- package/dist/index.js +29 -7
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -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":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type GroundplanConfig } from '@
|
|
1
|
+
import { type GroundplanConfig } from '@opengroundplan/core';
|
|
2
2
|
/**
|
|
3
3
|
* Regenerates every AI tool's wrapper file from AGENTS.md in an existing repo.
|
|
4
4
|
* Run it after editing AGENTS.md so no tool's view can drift from the source of truth.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import pc from 'picocolors';
|
|
4
|
-
import { AGENTS_FILE, collectTokens, loadCatalog, renderContent, } from '@
|
|
4
|
+
import { AGENTS_FILE, collectTokens, loadCatalog, renderContent, } from '@opengroundplan/core';
|
|
5
5
|
import { flagBool, flagString, parseArgs } from '../args.js';
|
|
6
6
|
/**
|
|
7
7
|
* Regenerates every AI tool's wrapper file from AGENTS.md in an existing repo.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-agents.js","sourceRoot":"","sources":["../../src/commands/sync-agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,GAEd,MAAM,
|
|
1
|
+
{"version":3,"file":"sync-agents.js","sourceRoot":"","sources":["../../src/commands/sync-agents.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,22 +4,28 @@
|
|
|
4
4
|
* instead of "decide everything again".
|
|
5
5
|
*/
|
|
6
6
|
import pc from 'picocolors';
|
|
7
|
-
import { loadConfig } from '@
|
|
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,
|
|
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
|
-
"@
|
|
41
|
+
"@opengroundplan/core": "0.2.0"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsc -p tsconfig.json",
|