@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 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 preseed` or `bootspring prd create` first to generate tasks.");
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 preseed` or `bootspring prd create` to generate tasks.");
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 preset = opts.preset;
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 preset = opts.preset;
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 docs = PRESETS[opts.preset] || PRESETS.technical;
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 docs = PRESETS[opts.preset] || PRESETS.startup;
50697
- let generated = 0;
50698
- let skipped = 0;
50699
- for (const docType of docs) {
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: "Preseed documents created", detectors: [".bootspring/preseed"] },
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: "Preseed documents created", detectors: [".bootspring/preseed"] },
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: "Preseed documents created", detectors: [".bootspring/preseed"] },
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 preseed init Start with document generation");
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", "preseed", "seed", "deploy", "loop"];
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", "preseed", "seed", "analyze", "audit", "deploy"];
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(" preseed --> seed");
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 findPreseedDocs(projectRoot) {
60983
- const preseedDir = path81.join(projectRoot, ".bootspring", "preseed");
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
- "MARKET_ANALYSIS.md",
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(preseedDir, doc))) {
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 } = findPreseedDocs(projectRoot);
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 preseedDir = path81.join(projectRoot, ".bootspring", "preseed");
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(preseedDir, doc), "utf-8");
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 preseed sync" to update');
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 preseed from-codebase"');
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.3",
21362
+ version: "2.5.5",
21363
21363
  private: true,
21364
21364
  description: "Workspace tooling for the Bootspring monorepo",
21365
21365
  keywords: [
@@ -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.3",
51937
+ version: "2.5.5",
51938
51938
  private: true,
51939
51939
  description: "Workspace tooling for the Bootspring monorepo",
51940
51940
  keywords: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.5.4",
3
+ "version": "2.5.6",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",