@girardmedia/bootspring 2.5.4 → 2.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +51 -96
- package/dist/core.js +1 -1
- package/dist/mcp-server.js +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -47820,7 +47820,7 @@ function registerBuildCommand(program3) {
|
|
|
47820
47820
|
const tasks = loadTasks();
|
|
47821
47821
|
if (tasks.length === 0) {
|
|
47822
47822
|
print.warning("No tasks found in planning/TODO.md (legacy fallback: planning/TASK_QUEUE.md)");
|
|
47823
|
-
print.info("Run `bootspring
|
|
47823
|
+
print.info("Run `bootspring seed init` or `bootspring prd create` first to generate tasks.");
|
|
47824
47824
|
return;
|
|
47825
47825
|
}
|
|
47826
47826
|
const newState = {
|
|
@@ -47914,7 +47914,7 @@ ${supplementaryContent}
|
|
|
47914
47914
|
console.log("");
|
|
47915
47915
|
if (!hasTodo && !hasQueue) {
|
|
47916
47916
|
print.warning("No task files found to recover from.");
|
|
47917
|
-
print.info("Run `bootspring
|
|
47917
|
+
print.info("Run `bootspring seed init` or `bootspring prd create` to generate tasks.");
|
|
47918
47918
|
return;
|
|
47919
47919
|
}
|
|
47920
47920
|
if (!hasState) {
|
|
@@ -50413,7 +50413,7 @@ function getContextStatus() {
|
|
|
50413
50413
|
if (!fs32.existsSync(dir)) {
|
|
50414
50414
|
const legacyDir = path34.join(process.cwd(), LEGACY_PRESEED_DIR);
|
|
50415
50415
|
if (fs32.existsSync(legacyDir)) {
|
|
50416
|
-
const files2 = fs32.readdirSync(legacyDir).filter((f) => f.endsWith(".md"));
|
|
50416
|
+
const files2 = fs32.readdirSync(legacyDir).filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
50417
50417
|
return { docs: files2, total: files2.length };
|
|
50418
50418
|
}
|
|
50419
50419
|
return { docs: [], total: 0 };
|
|
@@ -50484,6 +50484,23 @@ function generateDocTemplate(docType, projectName) {
|
|
|
50484
50484
|
*Edit this file with your project details, then run \`bootspring seed status\` to verify.*
|
|
50485
50485
|
`;
|
|
50486
50486
|
}
|
|
50487
|
+
function generateTemplates(contextDir, preset, projectName, force) {
|
|
50488
|
+
const docs = PRESETS[preset] || PRESETS.startup;
|
|
50489
|
+
let generated = 0;
|
|
50490
|
+
let skipped = 0;
|
|
50491
|
+
for (const docType of docs) {
|
|
50492
|
+
const meta3 = CONTEXT_DOCS[docType];
|
|
50493
|
+
if (!meta3) continue;
|
|
50494
|
+
const filePath = path34.join(contextDir, meta3.name);
|
|
50495
|
+
if (fs32.existsSync(filePath) && !force) {
|
|
50496
|
+
skipped++;
|
|
50497
|
+
continue;
|
|
50498
|
+
}
|
|
50499
|
+
fs32.writeFileSync(filePath, generateDocTemplate(docType, projectName));
|
|
50500
|
+
generated++;
|
|
50501
|
+
}
|
|
50502
|
+
return { generated, skipped };
|
|
50503
|
+
}
|
|
50487
50504
|
function detectStack(projectRoot) {
|
|
50488
50505
|
let name = path34.basename(projectRoot);
|
|
50489
50506
|
const stack = [];
|
|
@@ -50536,21 +50553,7 @@ function registerSeedCommand(program3) {
|
|
|
50536
50553
|
if (!fs32.existsSync(readmePath) || opts.force) {
|
|
50537
50554
|
fs32.writeFileSync(readmePath, generateContextReadme());
|
|
50538
50555
|
}
|
|
50539
|
-
const
|
|
50540
|
-
const docs = PRESETS[preset] || PRESETS.startup;
|
|
50541
|
-
let generated = 0;
|
|
50542
|
-
let skipped = 0;
|
|
50543
|
-
for (const docType of docs) {
|
|
50544
|
-
const meta3 = CONTEXT_DOCS[docType];
|
|
50545
|
-
if (!meta3) continue;
|
|
50546
|
-
const filePath = path34.join(contextDir, meta3.name);
|
|
50547
|
-
if (fs32.existsSync(filePath) && !opts.force) {
|
|
50548
|
-
skipped++;
|
|
50549
|
-
continue;
|
|
50550
|
-
}
|
|
50551
|
-
fs32.writeFileSync(filePath, generateDocTemplate(docType, projectName));
|
|
50552
|
-
generated++;
|
|
50553
|
-
}
|
|
50556
|
+
const { generated, skipped } = generateTemplates(contextDir, opts.preset, projectName, !!opts.force);
|
|
50554
50557
|
print.success(`Created ${CONTEXT_DIR}/`);
|
|
50555
50558
|
if (generated > 0) print.success(`Generated ${generated} document template(s)`);
|
|
50556
50559
|
if (skipped > 0) print.dim(`Skipped ${skipped} (already exist, use --force to overwrite)`);
|
|
@@ -50578,28 +50581,14 @@ function registerSeedCommand(program3) {
|
|
|
50578
50581
|
if (!fs32.existsSync(readmePath)) {
|
|
50579
50582
|
fs32.writeFileSync(readmePath, generateContextReadme());
|
|
50580
50583
|
}
|
|
50581
|
-
const
|
|
50582
|
-
const docs = PRESETS[preset] || PRESETS.startup;
|
|
50583
|
-
let generated = 0;
|
|
50584
|
-
let skipped = 0;
|
|
50585
|
-
for (const docType of docs) {
|
|
50586
|
-
const meta3 = CONTEXT_DOCS[docType];
|
|
50587
|
-
if (!meta3) continue;
|
|
50588
|
-
const filePath = path34.join(contextDir, meta3.name);
|
|
50589
|
-
if (fs32.existsSync(filePath) && !opts.force) {
|
|
50590
|
-
skipped++;
|
|
50591
|
-
continue;
|
|
50592
|
-
}
|
|
50593
|
-
fs32.writeFileSync(filePath, generateDocTemplate(docType, projectName));
|
|
50594
|
-
generated++;
|
|
50595
|
-
}
|
|
50584
|
+
const { generated, skipped } = generateTemplates(contextDir, opts.preset, projectName, !!opts.force);
|
|
50596
50585
|
if (generated > 0) print.success(` Generated: ${generated} template(s)`);
|
|
50597
50586
|
if (skipped > 0) print.dim(` Skipped: ${skipped} (already exist, use --force to overwrite)`);
|
|
50598
50587
|
console.log("");
|
|
50599
50588
|
console.log(`${COLORS.bold}Step 3/3: Status${COLORS.reset}`);
|
|
50600
50589
|
const status = getContextStatus();
|
|
50601
50590
|
for (const doc of status.docs) {
|
|
50602
|
-
console.log(` \u2713 ${doc}`);
|
|
50591
|
+
console.log(` ${COLORS.green}\u2713${COLORS.reset} ${doc}`);
|
|
50603
50592
|
}
|
|
50604
50593
|
console.log("");
|
|
50605
50594
|
console.log(`${COLORS.bold}Next:${COLORS.reset}`);
|
|
@@ -50633,16 +50622,7 @@ ${COLORS.bold}Detected Features:${COLORS.reset}`);
|
|
|
50633
50622
|
console.log(` ${features.join(", ")}`);
|
|
50634
50623
|
}
|
|
50635
50624
|
const contextDir = ensureContextDir();
|
|
50636
|
-
const
|
|
50637
|
-
let generated = 0;
|
|
50638
|
-
for (const docType of docs) {
|
|
50639
|
-
const meta3 = CONTEXT_DOCS[docType];
|
|
50640
|
-
if (!meta3) continue;
|
|
50641
|
-
const filePath = path34.join(contextDir, meta3.name);
|
|
50642
|
-
if (fs32.existsSync(filePath) && !opts.force) continue;
|
|
50643
|
-
fs32.writeFileSync(filePath, generateDocTemplate(docType, projectName));
|
|
50644
|
-
generated++;
|
|
50645
|
-
}
|
|
50625
|
+
const { generated } = generateTemplates(contextDir, opts.preset, projectName, !!opts.force);
|
|
50646
50626
|
console.log("");
|
|
50647
50627
|
print.success(`Generated ${generated} template(s) in ${CONTEXT_DIR}/`);
|
|
50648
50628
|
console.log("");
|
|
@@ -50693,21 +50673,10 @@ ${COLORS.bold}Detected Features:${COLORS.reset}`);
|
|
|
50693
50673
|
projectName = pkg.name || projectName;
|
|
50694
50674
|
} catch {
|
|
50695
50675
|
}
|
|
50696
|
-
const
|
|
50697
|
-
|
|
50698
|
-
|
|
50699
|
-
|
|
50700
|
-
const meta3 = CONTEXT_DOCS[docType];
|
|
50701
|
-
if (!meta3) continue;
|
|
50702
|
-
const filePath = path34.join(contextDir, meta3.name);
|
|
50703
|
-
if (fs32.existsSync(filePath) && !opts.force) {
|
|
50704
|
-
skipped++;
|
|
50705
|
-
print.dim(` Skipped: ${meta3.name} (exists)`);
|
|
50706
|
-
continue;
|
|
50707
|
-
}
|
|
50708
|
-
fs32.writeFileSync(filePath, generateDocTemplate(docType, projectName));
|
|
50709
|
-
print.success(` Generated: ${meta3.name}`);
|
|
50710
|
-
generated++;
|
|
50676
|
+
const { generated, skipped } = generateTemplates(contextDir, opts.preset, projectName, !!opts.force);
|
|
50677
|
+
const status = getContextStatus();
|
|
50678
|
+
for (const doc of status.docs) {
|
|
50679
|
+
print.success(` ${doc}`);
|
|
50711
50680
|
}
|
|
50712
50681
|
console.log("");
|
|
50713
50682
|
print.info(`${generated} generated, ${skipped} skipped in ${CONTEXT_DIR}/`);
|
|
@@ -50813,21 +50782,6 @@ ${COLORS.bold}Detected Features:${COLORS.reset}`);
|
|
|
50813
50782
|
console.log(" bootspring build next # Get next task");
|
|
50814
50783
|
console.log(" bootspring build status # Check progress");
|
|
50815
50784
|
});
|
|
50816
|
-
seed.command("scaffold").description("Generate project structure from SEED.md").option("--preset <preset>", "Use preset instead of SEED.md").option("--dry-run", "Show plan without creating files").action((opts) => {
|
|
50817
|
-
print.header("Seed Scaffold");
|
|
50818
|
-
const seedPath = path34.join(process.cwd(), "SEED.md");
|
|
50819
|
-
if (!opts.preset && !fs32.existsSync(seedPath)) {
|
|
50820
|
-
print.error("No SEED.md found");
|
|
50821
|
-
print.info("Run `bootspring seed merge` first");
|
|
50822
|
-
return;
|
|
50823
|
-
}
|
|
50824
|
-
if (opts.dryRun) {
|
|
50825
|
-
print.info("[DRY RUN] No files will be created");
|
|
50826
|
-
}
|
|
50827
|
-
print.info("Scaffold runs through `bootspring build start`");
|
|
50828
|
-
console.log("");
|
|
50829
|
-
console.log(" bootspring build start # Initialize build from SEED.md");
|
|
50830
|
-
});
|
|
50831
50785
|
seed.action(() => {
|
|
50832
50786
|
seed.outputHelp();
|
|
50833
50787
|
console.log("");
|
|
@@ -53047,7 +53001,7 @@ init_src();
|
|
|
53047
53001
|
var PROJECT_TYPES = ["development", "content", "business"];
|
|
53048
53002
|
var CHECKPOINT_DEFS = {
|
|
53049
53003
|
development: [
|
|
53050
|
-
{ id: "preseed", label: "
|
|
53004
|
+
{ id: "preseed", label: "Context documents created", detectors: [".bootspring/context", ".bootspring/preseed"] },
|
|
53051
53005
|
{ id: "seed", label: "SEED.md generated", detectors: ["SEED.md"] },
|
|
53052
53006
|
{ id: "scaffold", label: "Project scaffolded", detectors: ["src", "package.json"] },
|
|
53053
53007
|
{ id: "build-plan", label: "Build plan created", detectors: ["planning/TODO.md", "planning/TASK_QUEUE.md"] },
|
|
@@ -53057,14 +53011,14 @@ var CHECKPOINT_DEFS = {
|
|
|
53057
53011
|
{ id: "launched", label: "Project launched", detectors: [] }
|
|
53058
53012
|
],
|
|
53059
53013
|
content: [
|
|
53060
|
-
{ id: "preseed", label: "
|
|
53014
|
+
{ id: "preseed", label: "Context documents created", detectors: [".bootspring/context", ".bootspring/preseed"] },
|
|
53061
53015
|
{ id: "seed", label: "SEED.md generated", detectors: ["SEED.md"] },
|
|
53062
53016
|
{ id: "content-plan", label: "Content plan created", detectors: ["planning"] },
|
|
53063
53017
|
{ id: "first-content", label: "First content piece", detectors: ["content"] },
|
|
53064
53018
|
{ id: "published", label: "Content published", detectors: [] }
|
|
53065
53019
|
],
|
|
53066
53020
|
business: [
|
|
53067
|
-
{ id: "preseed", label: "
|
|
53021
|
+
{ id: "preseed", label: "Context documents created", detectors: [".bootspring/context", ".bootspring/preseed"] },
|
|
53068
53022
|
{ id: "business-plan", label: "Business plan created", detectors: ["planning/BUSINESS_PLAN.md"] },
|
|
53069
53023
|
{ id: "model", label: "Business model canvas", detectors: ["planning/BUSINESS_MODEL_CANVAS.md"] },
|
|
53070
53024
|
{ id: "competitors", label: "Competitive analysis", detectors: ["planning/COMPETITIVE_ANALYSIS.md"] },
|
|
@@ -53140,7 +53094,7 @@ function registerCheckpointCommand(program3) {
|
|
|
53140
53094
|
print.dim("No checkpoint tracking found.");
|
|
53141
53095
|
console.log("\nGet started:");
|
|
53142
53096
|
console.log(" bootspring checkpoint init Initialize checkpoint tracking");
|
|
53143
|
-
console.log(" bootspring
|
|
53097
|
+
console.log(" bootspring seed init Start with document generation");
|
|
53144
53098
|
return;
|
|
53145
53099
|
}
|
|
53146
53100
|
const syncResult = syncCheckpoints(projectRoot, state);
|
|
@@ -54737,7 +54691,7 @@ function drawProgressBar(progress, width = 20) {
|
|
|
54737
54691
|
}
|
|
54738
54692
|
function getWorkflowStates(projectRoot) {
|
|
54739
54693
|
const workflows = {};
|
|
54740
|
-
const names = ["onboard", "analyze", "audit", "
|
|
54694
|
+
const names = ["onboard", "analyze", "audit", "seed", "context", "deploy", "loop", "preseed"];
|
|
54741
54695
|
for (const name of names) {
|
|
54742
54696
|
const stateFile = path46.join(projectRoot, ".bootspring", name, "workflow-state.json");
|
|
54743
54697
|
if (fs44.existsSync(stateFile)) {
|
|
@@ -54800,7 +54754,7 @@ function getTodoStats(projectRoot) {
|
|
|
54800
54754
|
}
|
|
54801
54755
|
}
|
|
54802
54756
|
function drawWorkflowPipeline(workflows) {
|
|
54803
|
-
const pipelineOrder = ["onboard", "
|
|
54757
|
+
const pipelineOrder = ["onboard", "seed", "analyze", "audit", "deploy"];
|
|
54804
54758
|
console.log("\nWorkflow Pipeline\n");
|
|
54805
54759
|
for (const name of pipelineOrder) {
|
|
54806
54760
|
const workflow = workflows[name];
|
|
@@ -54903,12 +54857,10 @@ function registerVisualizeCommand(program3) {
|
|
|
54903
54857
|
console.log(" onboard");
|
|
54904
54858
|
console.log(" |");
|
|
54905
54859
|
console.log(" v");
|
|
54906
|
-
console.log("
|
|
54907
|
-
console.log(" |
|
|
54908
|
-
console.log("
|
|
54909
|
-
console.log("
|
|
54910
|
-
console.log(" v");
|
|
54911
|
-
console.log(" analyze");
|
|
54860
|
+
console.log(" seed");
|
|
54861
|
+
console.log(" |");
|
|
54862
|
+
console.log(" v");
|
|
54863
|
+
console.log(" analyze");
|
|
54912
54864
|
console.log(" |");
|
|
54913
54865
|
console.log(" v");
|
|
54914
54866
|
console.log(" audit");
|
|
@@ -60979,29 +60931,32 @@ init_cjs_shims();
|
|
|
60979
60931
|
var fs80 = __toESM(require("fs"));
|
|
60980
60932
|
var path81 = __toESM(require("path"));
|
|
60981
60933
|
init_src();
|
|
60982
|
-
function
|
|
60983
|
-
|
|
60934
|
+
function findContextDocs(projectRoot) {
|
|
60935
|
+
let dir = path81.join(projectRoot, ".bootspring", "context");
|
|
60936
|
+
if (!fs80.existsSync(dir)) {
|
|
60937
|
+
dir = path81.join(projectRoot, ".bootspring", "preseed");
|
|
60938
|
+
}
|
|
60984
60939
|
const expectedDocs = [
|
|
60985
60940
|
"VISION.md",
|
|
60986
60941
|
"PRD.md",
|
|
60987
60942
|
"TECHNICAL_SPEC.md",
|
|
60988
60943
|
"AUDIENCE.md",
|
|
60989
|
-
"
|
|
60944
|
+
"MARKET.md",
|
|
60990
60945
|
"ROADMAP.md"
|
|
60991
60946
|
];
|
|
60992
60947
|
const found = [];
|
|
60993
60948
|
const missing = [];
|
|
60994
60949
|
for (const doc of expectedDocs) {
|
|
60995
|
-
if (fs80.existsSync(path81.join(
|
|
60950
|
+
if (fs80.existsSync(path81.join(dir, doc))) {
|
|
60996
60951
|
found.push(doc);
|
|
60997
60952
|
} else {
|
|
60998
60953
|
missing.push(doc);
|
|
60999
60954
|
}
|
|
61000
60955
|
}
|
|
61001
|
-
return { found, missing };
|
|
60956
|
+
return { found, missing, dir };
|
|
61002
60957
|
}
|
|
61003
60958
|
function validateDocCoherence(projectRoot) {
|
|
61004
|
-
const { found, missing } =
|
|
60959
|
+
const { found, missing } = findContextDocs(projectRoot);
|
|
61005
60960
|
const issues = [];
|
|
61006
60961
|
const totalExpected = found.length + missing.length;
|
|
61007
60962
|
let score = totalExpected > 0 ? Math.round(found.length / totalExpected * 100) : 0;
|
|
@@ -61021,11 +60976,11 @@ function validateDocCoherence(projectRoot) {
|
|
|
61021
60976
|
});
|
|
61022
60977
|
score = Math.max(score - 10, 0);
|
|
61023
60978
|
}
|
|
61024
|
-
const
|
|
60979
|
+
const { dir: docsDir } = findContextDocs(projectRoot);
|
|
61025
60980
|
const docContents = {};
|
|
61026
60981
|
for (const doc of found) {
|
|
61027
60982
|
try {
|
|
61028
|
-
docContents[doc] = fs80.readFileSync(path81.join(
|
|
60983
|
+
docContents[doc] = fs80.readFileSync(path81.join(docsDir, doc), "utf-8");
|
|
61029
60984
|
} catch {
|
|
61030
60985
|
}
|
|
61031
60986
|
}
|
|
@@ -61156,10 +61111,10 @@ function registerValidateCommand(program3) {
|
|
|
61156
61111
|
print.success("Documents are well-aligned");
|
|
61157
61112
|
} else if (results.coherenceScore >= 60) {
|
|
61158
61113
|
print.warning("Documents need some attention");
|
|
61159
|
-
print.info('Run "bootspring
|
|
61114
|
+
print.info('Run "bootspring seed generate --force" to update');
|
|
61160
61115
|
} else {
|
|
61161
61116
|
print.error("Documents have significant alignment issues");
|
|
61162
|
-
print.info('Consider regenerating with "bootspring
|
|
61117
|
+
print.info('Consider regenerating with "bootspring seed from-codebase"');
|
|
61163
61118
|
}
|
|
61164
61119
|
if (opts.json) {
|
|
61165
61120
|
console.log("");
|
package/dist/core.js
CHANGED
|
@@ -21359,7 +21359,7 @@ var require_package = __commonJS({
|
|
|
21359
21359
|
"../../../package.json"(exports2, module2) {
|
|
21360
21360
|
module2.exports = {
|
|
21361
21361
|
name: "bootspring-workspace",
|
|
21362
|
-
version: "2.5.
|
|
21362
|
+
version: "2.5.5",
|
|
21363
21363
|
private: true,
|
|
21364
21364
|
description: "Workspace tooling for the Bootspring monorepo",
|
|
21365
21365
|
keywords: [
|
package/dist/mcp-server.js
CHANGED
|
@@ -51934,7 +51934,7 @@ var require_package = __commonJS({
|
|
|
51934
51934
|
"../../../package.json"(exports2, module2) {
|
|
51935
51935
|
module2.exports = {
|
|
51936
51936
|
name: "bootspring-workspace",
|
|
51937
|
-
version: "2.5.
|
|
51937
|
+
version: "2.5.5",
|
|
51938
51938
|
private: true,
|
|
51939
51939
|
description: "Workspace tooling for the Bootspring monorepo",
|
|
51940
51940
|
keywords: [
|