@girardmedia/bootspring 2.4.0 → 2.5.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.
@@ -1848,7 +1848,7 @@ declare namespace projectState {
1848
1848
  * @module core/task-extractor
1849
1849
  */
1850
1850
  type TaskComplexity = 'low' | 'medium' | 'high';
1851
- type TaskStatus = 'pending' | 'in_progress' | 'completed';
1851
+ type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'skipped';
1852
1852
  type TaskPhase = 'foundation' | 'mvp' | 'launch' | string;
1853
1853
  interface Task {
1854
1854
  id?: string;
@@ -1913,6 +1913,10 @@ interface ExtractFromDocsOptions {
1913
1913
  interface SyncFromTaskQueueOptions {
1914
1914
  replace?: boolean | undefined;
1915
1915
  }
1916
+ interface SyncPlanningTasksOptions extends SyncFromTaskQueueOptions {
1917
+ preferTodo?: boolean | undefined;
1918
+ allowLegacyQueue?: boolean | undefined;
1919
+ }
1916
1920
  /**
1917
1921
  * Main extraction function - parse all seed documents
1918
1922
  */
@@ -1974,10 +1978,27 @@ declare function extractFromSeedFile(projectRoot: string): ExtractionResult;
1974
1978
  * Parses both table format and detailed task sections
1975
1979
  */
1976
1980
  declare function extractFromTaskQueue(content: string): Task[];
1981
+ /**
1982
+ * Extract tasks from TODO.md
1983
+ * Parses both the lightweight checklist format and the enriched metadata format.
1984
+ */
1985
+ declare function extractFromTodo(content: string): Task[];
1977
1986
  /**
1978
1987
  * Load and extract from TASK_QUEUE.md in planning directory
1979
1988
  */
1980
1989
  declare function extractFromTaskQueueFile(projectRoot: string): ExtractionResult;
1990
+ /**
1991
+ * Load and extract from TODO.md in planning directory
1992
+ */
1993
+ declare function extractFromTodoFile(projectRoot: string): ExtractionResult;
1994
+ /**
1995
+ * Load planning tasks from the canonical TODO.md surface first, then fall back
1996
+ * to legacy TASK_QUEUE.md when allowed.
1997
+ */
1998
+ declare function extractFromPlanningFiles(projectRoot: string, options?: {
1999
+ preferTodo?: boolean | undefined;
2000
+ allowLegacyQueue?: boolean | undefined;
2001
+ }): ExtractionResult;
1981
2002
  /**
1982
2003
  * Sync tasks from TASK_QUEUE.md to BUILD_STATE.json
1983
2004
  * Options:
@@ -1989,6 +2010,23 @@ declare function syncFromTaskQueue(projectRoot: string, options?: SyncFromTaskQu
1989
2010
  updated: number;
1990
2011
  total: number;
1991
2012
  };
2013
+ /**
2014
+ * Sync tasks from canonical TODO.md to BUILD_STATE.json
2015
+ */
2016
+ declare function syncFromTodo(projectRoot: string, options?: SyncFromTaskQueueOptions): {
2017
+ added: number;
2018
+ updated: number;
2019
+ total: number;
2020
+ };
2021
+ /**
2022
+ * Sync tasks from planning source of truth into BUILD_STATE.json.
2023
+ * Canonical behavior is TODO.md-first with legacy TASK_QUEUE.md fallback.
2024
+ */
2025
+ declare function syncFromPlanningFiles(projectRoot: string, options?: SyncPlanningTasksOptions): {
2026
+ added: number;
2027
+ updated: number;
2028
+ total: number;
2029
+ };
1992
2030
 
1993
2031
  type taskExtractor_DocumentMap = DocumentMap;
1994
2032
  type taskExtractor_ExtractFromDocsOptions = ExtractFromDocsOptions;
@@ -1999,6 +2037,7 @@ type taskExtractor_Integrations = Integrations;
1999
2037
  type taskExtractor_MvpCriterion = MvpCriterion;
2000
2038
  type taskExtractor_RoadmapExtraction = RoadmapExtraction;
2001
2039
  type taskExtractor_SyncFromTaskQueueOptions = SyncFromTaskQueueOptions;
2040
+ type taskExtractor_SyncPlanningTasksOptions = SyncPlanningTasksOptions;
2002
2041
  type taskExtractor_Task = Task;
2003
2042
  type taskExtractor_TaskComplexity = TaskComplexity;
2004
2043
  type taskExtractor_TaskPhase = TaskPhase;
@@ -2007,6 +2046,7 @@ declare const taskExtractor_deduplicateTasks: typeof deduplicateTasks;
2007
2046
  declare const taskExtractor_estimateComplexity: typeof estimateComplexity;
2008
2047
  declare const taskExtractor_extractAcceptanceCriteria: typeof extractAcceptanceCriteria;
2009
2048
  declare const taskExtractor_extractFromDocs: typeof extractFromDocs;
2049
+ declare const taskExtractor_extractFromPlanningFiles: typeof extractFromPlanningFiles;
2010
2050
  declare const taskExtractor_extractFromPrd: typeof extractFromPrd;
2011
2051
  declare const taskExtractor_extractFromPreseedDir: typeof extractFromPreseedDir;
2012
2052
  declare const taskExtractor_extractFromRoadmap: typeof extractFromRoadmap;
@@ -2015,13 +2055,17 @@ declare const taskExtractor_extractFromSeedFile: typeof extractFromSeedFile;
2015
2055
  declare const taskExtractor_extractFromTaskQueue: typeof extractFromTaskQueue;
2016
2056
  declare const taskExtractor_extractFromTaskQueueFile: typeof extractFromTaskQueueFile;
2017
2057
  declare const taskExtractor_extractFromTechnicalSpec: typeof extractFromTechnicalSpec;
2058
+ declare const taskExtractor_extractFromTodo: typeof extractFromTodo;
2059
+ declare const taskExtractor_extractFromTodoFile: typeof extractFromTodoFile;
2018
2060
  declare const taskExtractor_extractIntegrations: typeof extractIntegrations;
2019
2061
  declare const taskExtractor_extractMvpCriteria: typeof extractMvpCriteria;
2020
2062
  declare const taskExtractor_extractSection: typeof extractSection;
2021
2063
  declare const taskExtractor_orderByDependencies: typeof orderByDependencies;
2064
+ declare const taskExtractor_syncFromPlanningFiles: typeof syncFromPlanningFiles;
2022
2065
  declare const taskExtractor_syncFromTaskQueue: typeof syncFromTaskQueue;
2066
+ declare const taskExtractor_syncFromTodo: typeof syncFromTodo;
2023
2067
  declare namespace taskExtractor {
2024
- export { type taskExtractor_DocumentMap as DocumentMap, type taskExtractor_ExtractFromDocsOptions as ExtractFromDocsOptions, type taskExtractor_ExtractSectionOptions as ExtractSectionOptions, type taskExtractor_ExtractionMetadata as ExtractionMetadata, type taskExtractor_ExtractionResult as ExtractionResult, type taskExtractor_Integrations as Integrations, type taskExtractor_MvpCriterion as MvpCriterion, type Phase$1 as Phase, type taskExtractor_RoadmapExtraction as RoadmapExtraction, type taskExtractor_SyncFromTaskQueueOptions as SyncFromTaskQueueOptions, type taskExtractor_Task as Task, type taskExtractor_TaskComplexity as TaskComplexity, type taskExtractor_TaskPhase as TaskPhase, type taskExtractor_TaskStatus as TaskStatus, taskExtractor_deduplicateTasks as deduplicateTasks, taskExtractor_estimateComplexity as estimateComplexity, taskExtractor_extractAcceptanceCriteria as extractAcceptanceCriteria, taskExtractor_extractFromDocs as extractFromDocs, taskExtractor_extractFromPrd as extractFromPrd, taskExtractor_extractFromPreseedDir as extractFromPreseedDir, taskExtractor_extractFromRoadmap as extractFromRoadmap, taskExtractor_extractFromSeed as extractFromSeed, taskExtractor_extractFromSeedFile as extractFromSeedFile, taskExtractor_extractFromTaskQueue as extractFromTaskQueue, taskExtractor_extractFromTaskQueueFile as extractFromTaskQueueFile, taskExtractor_extractFromTechnicalSpec as extractFromTechnicalSpec, taskExtractor_extractIntegrations as extractIntegrations, taskExtractor_extractMvpCriteria as extractMvpCriteria, taskExtractor_extractSection as extractSection, taskExtractor_orderByDependencies as orderByDependencies, taskExtractor_syncFromTaskQueue as syncFromTaskQueue };
2068
+ export { type taskExtractor_DocumentMap as DocumentMap, type taskExtractor_ExtractFromDocsOptions as ExtractFromDocsOptions, type taskExtractor_ExtractSectionOptions as ExtractSectionOptions, type taskExtractor_ExtractionMetadata as ExtractionMetadata, type taskExtractor_ExtractionResult as ExtractionResult, type taskExtractor_Integrations as Integrations, type taskExtractor_MvpCriterion as MvpCriterion, type Phase$1 as Phase, type taskExtractor_RoadmapExtraction as RoadmapExtraction, type taskExtractor_SyncFromTaskQueueOptions as SyncFromTaskQueueOptions, type taskExtractor_SyncPlanningTasksOptions as SyncPlanningTasksOptions, type taskExtractor_Task as Task, type taskExtractor_TaskComplexity as TaskComplexity, type taskExtractor_TaskPhase as TaskPhase, type taskExtractor_TaskStatus as TaskStatus, taskExtractor_deduplicateTasks as deduplicateTasks, taskExtractor_estimateComplexity as estimateComplexity, taskExtractor_extractAcceptanceCriteria as extractAcceptanceCriteria, taskExtractor_extractFromDocs as extractFromDocs, taskExtractor_extractFromPlanningFiles as extractFromPlanningFiles, taskExtractor_extractFromPrd as extractFromPrd, taskExtractor_extractFromPreseedDir as extractFromPreseedDir, taskExtractor_extractFromRoadmap as extractFromRoadmap, taskExtractor_extractFromSeed as extractFromSeed, taskExtractor_extractFromSeedFile as extractFromSeedFile, taskExtractor_extractFromTaskQueue as extractFromTaskQueue, taskExtractor_extractFromTaskQueueFile as extractFromTaskQueueFile, taskExtractor_extractFromTechnicalSpec as extractFromTechnicalSpec, taskExtractor_extractFromTodo as extractFromTodo, taskExtractor_extractFromTodoFile as extractFromTodoFile, taskExtractor_extractIntegrations as extractIntegrations, taskExtractor_extractMvpCriteria as extractMvpCriteria, taskExtractor_extractSection as extractSection, taskExtractor_orderByDependencies as orderByDependencies, taskExtractor_syncFromPlanningFiles as syncFromPlanningFiles, taskExtractor_syncFromTaskQueue as syncFromTaskQueue, taskExtractor_syncFromTodo as syncFromTodo };
2025
2069
  }
2026
2070
 
2027
2071
  /**
package/dist/core.js CHANGED
@@ -1600,7 +1600,7 @@ var require_package = __commonJS({
1600
1600
  "package.json"(exports2, module2) {
1601
1601
  module2.exports = {
1602
1602
  name: "@girardmedia/bootspring",
1603
- version: "2.4.0",
1603
+ version: "2.5.0",
1604
1604
  description: "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
1605
1605
  keywords: [
1606
1606
  "ai",
@@ -1654,6 +1654,9 @@ var require_package = __commonJS({
1654
1654
  start: "node bin/bootspring.js",
1655
1655
  dashboard: "node bin/bootspring.js dashboard",
1656
1656
  mcp: "node dist/mcp-server.js",
1657
+ "version:sync": "node scripts/sync-version-metadata.js",
1658
+ "verify:version-sync": "node scripts/sync-version-metadata.js --check",
1659
+ "release:prepare": "npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract && npm run verify:release-gates",
1657
1660
  pretest: "npm run build",
1658
1661
  test: "vitest run",
1659
1662
  "test:launch-smoke": "vitest run __tests__/unit/cli-first-run-smoke.test.js __tests__/unit/health-fresh-start.test.ts __tests__/unit/session-project-scope.test.ts __tests__/unit/auth-cli-mixed-states.test.ts __tests__/unit/api-client-project-auth-fallback.test.js __tests__/unit/cli-help-surface.test.js __tests__/unit/cli-command-manifest.test.js",
@@ -1664,7 +1667,7 @@ var require_package = __commonJS({
1664
1667
  "lint:fix": "eslint . --fix",
1665
1668
  typecheck: "tsc --noEmit",
1666
1669
  "typecheck:active": "tsc --noEmit -p tsconfig.active.json",
1667
- build: "tsup && npm run build:cli",
1670
+ build: "npm run version:sync && tsup && npm run build:cli",
1668
1671
  "build:cli": "cd monorepo && pnpm build --filter @bootspring/cli && cd .. && mkdir -p dist/cli && cp monorepo/apps/cli/dist/index.cjs dist/cli/index.cjs",
1669
1672
  "build:watch": "tsup --watch",
1670
1673
  dev: "tsx watch src/index.ts",
@@ -1674,13 +1677,13 @@ var require_package = __commonJS({
1674
1677
  "verify:thin-client-contract": "node scripts/verify-thin-client-contract.js",
1675
1678
  "build:mcp-contract": "node scripts/export-mcp-contract.js",
1676
1679
  "verify:mcp-contract": "node scripts/export-mcp-contract.js --check",
1677
- "planning:sync": "node scripts/sync-planning-queue.js",
1678
- "planning:sync:check": "node scripts/sync-planning-queue.js --check",
1679
- "planning:realign": "node scripts/sync-planning-queue.js --sync-runtime",
1680
+ "planning:sync": "node scripts/sync-planning-state.js",
1681
+ "planning:sync:check": "node scripts/sync-planning-state.js --check",
1682
+ "planning:realign": "node scripts/sync-planning-state.js --sync-runtime",
1680
1683
  "verify:package": "node scripts/check-package-boundaries.js",
1681
1684
  "db:sync": "node shared/db/sync.js",
1682
1685
  "db:sync:check": "node shared/db/sync.js --check",
1683
- prepublishOnly: "npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
1686
+ prepublishOnly: "npm run verify:version-sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
1684
1687
  },
1685
1688
  devDependencies: {
1686
1689
  "@eslint/js": "^9.39.2",
@@ -1 +1 @@
1
- export { A as AccessInfo, j as AgentData, k as AssistResponseData, B as BoundInvoker, l as BuildCapabilitiesOptions, C as CapabilitiesInfo, m as CapabilitiesManifest, n as ContextValidationResult, F as FilteredWorkflows, I as IntentDetectionData, o as InvocationContext, p as InvokeParallelOptions, q as InvokeSequenceOptions, r as InvokeToolOptions, s as InvokeToolResult, L as ListOptions, t as MAX_CALL_DEPTH, M as MCPCapabilities, a as MCPContent, b as MCPInputSchema, c as MCPPrompt, d as MCPPromptArgument, e as MCPPropertySchema, f as MCPResource, g as MCPTool, h as MCPToolResult, u as MCPToolResultWithMeta, O as OrchestratorStatus, P as PRDData, v as PackInfo, w as ParallelResult, x as PlatformInfo, y as PolicyInfo, z as PolicyProfile, D as ProgressInfo, E as ProjectContextDisplay, Q as QualityCheckResult, G as QualityGateResults, R as RESOURCES, H as ResourceDefinition, J as ResourceHandler, K as ResourceResponse, S as SequenceResult, N as SkillData, T as SkillsCapability, U as SuccessOptions, V as TOOLS, W as TelemetryCapability, X as TodoItem, Y as ToolCall, Z as ToolDefinition, _ as ToolHandler, $ as ToolSequenceResult, a0 as ValidationResult, a1 as WorkflowAccessContext, a2 as WorkflowDefinition, a3 as WorkflowsCapability, a4 as agentDetails, a5 as assistResponse, a6 as buildCapabilities, a7 as capabilitiesList, a8 as contextSummary, a9 as contextValidation, aa as createBoundInvoker, ab as createInvocationContext, ac as error, ad as generateProgressBar, ae as getAvailableTools, af as getCurrentContext, ag as getRegistry, ah as getToolDefinition, ai as hasTool, aj as intentDetection, ak as invokeTool, al as invokeToolParallel, am as invokeToolSequence, an as list, ao as loopStatus, ap as main, aq as orchestratorStatus, ar as qualityResults, as as resourceHandlers, at as skillDetails, au as success, av as todoList, aw as toolHandlers, ax as trackTelemetry, ay as validateDependencies, az as warning } from '../index-QqbeEiDm.js';
1
+ export { A as AccessInfo, j as AgentData, k as AssistResponseData, B as BoundInvoker, l as BuildCapabilitiesOptions, C as CapabilitiesInfo, m as CapabilitiesManifest, n as ContextValidationResult, F as FilteredWorkflows, I as IntentDetectionData, o as InvocationContext, p as InvokeParallelOptions, q as InvokeSequenceOptions, r as InvokeToolOptions, s as InvokeToolResult, L as ListOptions, t as MAX_CALL_DEPTH, M as MCPCapabilities, a as MCPContent, b as MCPInputSchema, c as MCPPrompt, d as MCPPromptArgument, e as MCPPropertySchema, f as MCPResource, g as MCPTool, h as MCPToolResult, u as MCPToolResultWithMeta, O as OrchestratorStatus, P as PRDData, v as PackInfo, w as ParallelResult, x as PlatformInfo, y as PolicyInfo, z as PolicyProfile, D as ProgressInfo, E as ProjectContextDisplay, Q as QualityCheckResult, G as QualityGateResults, R as RESOURCES, H as ResourceDefinition, J as ResourceHandler, K as ResourceResponse, S as SequenceResult, N as SkillData, T as SkillsCapability, U as SuccessOptions, V as TOOLS, W as TelemetryCapability, X as TodoItem, Y as ToolCall, Z as ToolDefinition, _ as ToolHandler, $ as ToolSequenceResult, a0 as ValidationResult, a1 as WorkflowAccessContext, a2 as WorkflowDefinition, a3 as WorkflowsCapability, a4 as agentDetails, a5 as assistResponse, a6 as buildCapabilities, a7 as capabilitiesList, a8 as contextSummary, a9 as contextValidation, aa as createBoundInvoker, ab as createInvocationContext, ac as error, ad as generateProgressBar, ae as getAvailableTools, af as getCurrentContext, ag as getRegistry, ah as getToolDefinition, ai as hasTool, aj as intentDetection, ak as invokeTool, al as invokeToolParallel, am as invokeToolSequence, an as list, ao as loopStatus, ap as main, aq as orchestratorStatus, ar as qualityResults, as as resourceHandlers, at as skillDetails, au as success, av as todoList, aw as toolHandlers, ax as trackTelemetry, ay as validateDependencies, az as warning } from '../index-DvGc3BRk.js';
@@ -45,7 +45,7 @@ var require_package = __commonJS({
45
45
  "package.json"(exports2, module2) {
46
46
  module2.exports = {
47
47
  name: "@girardmedia/bootspring",
48
- version: "2.4.0",
48
+ version: "2.5.0",
49
49
  description: "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
50
50
  keywords: [
51
51
  "ai",
@@ -99,6 +99,9 @@ var require_package = __commonJS({
99
99
  start: "node bin/bootspring.js",
100
100
  dashboard: "node bin/bootspring.js dashboard",
101
101
  mcp: "node dist/mcp-server.js",
102
+ "version:sync": "node scripts/sync-version-metadata.js",
103
+ "verify:version-sync": "node scripts/sync-version-metadata.js --check",
104
+ "release:prepare": "npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract && npm run verify:release-gates",
102
105
  pretest: "npm run build",
103
106
  test: "vitest run",
104
107
  "test:launch-smoke": "vitest run __tests__/unit/cli-first-run-smoke.test.js __tests__/unit/health-fresh-start.test.ts __tests__/unit/session-project-scope.test.ts __tests__/unit/auth-cli-mixed-states.test.ts __tests__/unit/api-client-project-auth-fallback.test.js __tests__/unit/cli-help-surface.test.js __tests__/unit/cli-command-manifest.test.js",
@@ -109,7 +112,7 @@ var require_package = __commonJS({
109
112
  "lint:fix": "eslint . --fix",
110
113
  typecheck: "tsc --noEmit",
111
114
  "typecheck:active": "tsc --noEmit -p tsconfig.active.json",
112
- build: "tsup && npm run build:cli",
115
+ build: "npm run version:sync && tsup && npm run build:cli",
113
116
  "build:cli": "cd monorepo && pnpm build --filter @bootspring/cli && cd .. && mkdir -p dist/cli && cp monorepo/apps/cli/dist/index.cjs dist/cli/index.cjs",
114
117
  "build:watch": "tsup --watch",
115
118
  dev: "tsx watch src/index.ts",
@@ -119,13 +122,13 @@ var require_package = __commonJS({
119
122
  "verify:thin-client-contract": "node scripts/verify-thin-client-contract.js",
120
123
  "build:mcp-contract": "node scripts/export-mcp-contract.js",
121
124
  "verify:mcp-contract": "node scripts/export-mcp-contract.js --check",
122
- "planning:sync": "node scripts/sync-planning-queue.js",
123
- "planning:sync:check": "node scripts/sync-planning-queue.js --check",
124
- "planning:realign": "node scripts/sync-planning-queue.js --sync-runtime",
125
+ "planning:sync": "node scripts/sync-planning-state.js",
126
+ "planning:sync:check": "node scripts/sync-planning-state.js --check",
127
+ "planning:realign": "node scripts/sync-planning-state.js --sync-runtime",
125
128
  "verify:package": "node scripts/check-package-boundaries.js",
126
129
  "db:sync": "node shared/db/sync.js",
127
130
  "db:sync:check": "node shared/db/sync.js --check",
128
- prepublishOnly: "npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
131
+ prepublishOnly: "npm run verify:version-sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
129
132
  },
130
133
  devDependencies: {
131
134
  "@eslint/js": "^9.39.2",
@@ -4,7 +4,7 @@
4
4
  * Generates planning artifacts for the autonomous build loop:
5
5
  * - MASTER_PLAN.md - Vision + phases + progress tracker
6
6
  * - TODO.md - Checkbox list by phase
7
- * - TASK_QUEUE.md - Ordered tasks with acceptance criteria
7
+ * - TASK_QUEUE.md - Legacy compatibility mirror only when explicitly requested
8
8
  * - CONTEXT.md - Condensed context for AI iterations
9
9
  *
10
10
  * @package bootspring
@@ -45,11 +45,14 @@ function generateAll(projectRoot, docs, tasks, options = {}) {
45
45
  fs.writeFileSync(todoPath, todo);
46
46
  files.todo = todoPath;
47
47
 
48
- // Generate TASK_QUEUE.md
49
- const queue = generateImplementationQueue(tasks, options);
50
- const queuePath = path.join(planningDir, 'TASK_QUEUE.md');
51
- fs.writeFileSync(queuePath, queue);
52
- files.implementationQueue = queuePath;
48
+ const legacyQueuePath = path.join(planningDir, 'TASK_QUEUE.md');
49
+ const includeLegacyTaskQueue = options.includeLegacyTaskQueue === true;
50
+
51
+ if (includeLegacyTaskQueue) {
52
+ const queue = generateImplementationQueue(tasks, options);
53
+ fs.writeFileSync(legacyQueuePath, queue);
54
+ files.implementationQueue = legacyQueuePath;
55
+ }
53
56
 
54
57
  // Generate CONTEXT.md
55
58
  const context = generateContext(docs, tasks, options);
@@ -663,7 +666,7 @@ function extractTechStack(docs) {
663
666
  * @param {string} projectRoot - Project root path
664
667
  * @param {object} state - Current build state
665
668
  */
666
- function updateFromState(projectRoot, state) {
669
+ function updateFromState(projectRoot, state, options = {}) {
667
670
  if (!state || !state.implementationQueue) return;
668
671
 
669
672
  const tasks = state.implementationQueue;
@@ -673,10 +676,11 @@ function updateFromState(projectRoot, state) {
673
676
  const todo = generateTodo(tasks, { projectName: state.projectName });
674
677
  fs.writeFileSync(path.join(planningDir, 'TODO.md'), todo);
675
678
 
676
- // Legacy: also regenerate TASK_QUEUE.md if it already exists (backward compat)
677
- const queuePath = path.join(planningDir, 'TASK_QUEUE.md');
678
- if (fs.existsSync(queuePath)) {
679
- const existingQueue = fs.readFileSync(queuePath, 'utf-8');
679
+ if (options.includeLegacyTaskQueue === true) {
680
+ const queuePath = path.join(planningDir, 'TASK_QUEUE.md');
681
+ const existingQueue = fs.existsSync(queuePath)
682
+ ? fs.readFileSync(queuePath, 'utf-8')
683
+ : '';
680
684
  const existingVersionMatch = existingQueue.match(/\*\*Current Version:\*\*\s*([^\n]+)/i)
681
685
  || existingQueue.match(/>\s*Current Version:\s*([^\n]+)/i);
682
686
  const queueVersion = existingVersionMatch
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",
@@ -54,6 +54,9 @@
54
54
  "start": "node bin/bootspring.js",
55
55
  "dashboard": "node bin/bootspring.js dashboard",
56
56
  "mcp": "node dist/mcp-server.js",
57
+ "version:sync": "node scripts/sync-version-metadata.js",
58
+ "verify:version-sync": "node scripts/sync-version-metadata.js --check",
59
+ "release:prepare": "npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract && npm run verify:release-gates",
57
60
  "pretest": "npm run build",
58
61
  "test": "vitest run",
59
62
  "test:launch-smoke": "vitest run __tests__/unit/cli-first-run-smoke.test.js __tests__/unit/health-fresh-start.test.ts __tests__/unit/session-project-scope.test.ts __tests__/unit/auth-cli-mixed-states.test.ts __tests__/unit/api-client-project-auth-fallback.test.js __tests__/unit/cli-help-surface.test.js __tests__/unit/cli-command-manifest.test.js",
@@ -64,7 +67,7 @@
64
67
  "lint:fix": "eslint . --fix",
65
68
  "typecheck": "tsc --noEmit",
66
69
  "typecheck:active": "tsc --noEmit -p tsconfig.active.json",
67
- "build": "tsup && npm run build:cli",
70
+ "build": "npm run version:sync && tsup && npm run build:cli",
68
71
  "build:cli": "cd monorepo && pnpm build --filter @bootspring/cli && cd .. && mkdir -p dist/cli && cp monorepo/apps/cli/dist/index.cjs dist/cli/index.cjs",
69
72
  "build:watch": "tsup --watch",
70
73
  "dev": "tsx watch src/index.ts",
@@ -74,13 +77,13 @@
74
77
  "verify:thin-client-contract": "node scripts/verify-thin-client-contract.js",
75
78
  "build:mcp-contract": "node scripts/export-mcp-contract.js",
76
79
  "verify:mcp-contract": "node scripts/export-mcp-contract.js --check",
77
- "planning:sync": "node scripts/sync-planning-queue.js",
78
- "planning:sync:check": "node scripts/sync-planning-queue.js --check",
79
- "planning:realign": "node scripts/sync-planning-queue.js --sync-runtime",
80
+ "planning:sync": "node scripts/sync-planning-state.js",
81
+ "planning:sync:check": "node scripts/sync-planning-state.js --check",
82
+ "planning:realign": "node scripts/sync-planning-state.js --sync-runtime",
80
83
  "verify:package": "node scripts/check-package-boundaries.js",
81
84
  "db:sync": "node shared/db/sync.js",
82
85
  "db:sync:check": "node shared/db/sync.js --check",
83
- "prepublishOnly": "npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
86
+ "prepublishOnly": "npm run verify:version-sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
84
87
  },
85
88
  "devDependencies": {
86
89
  "@eslint/js": "^9.39.2",