@brainfile/cli 0.17.0 → 0.17.2

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.
Files changed (93) hide show
  1. package/.brainfile/brainfile.md.v1.bak +171 -0
  2. package/.brainfile/logs/task-1.md +206 -0
  3. package/.brainfile/logs/task-2.md +482 -0
  4. package/.brainfile/logs/task-3.md +314 -0
  5. package/.github/workflows/release.yml +35 -0
  6. package/README.md +3 -5
  7. package/dist/cli.js +30 -53
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/add.d.ts +2 -0
  10. package/dist/commands/add.d.ts.map +1 -1
  11. package/dist/commands/add.js +16 -2
  12. package/dist/commands/add.js.map +1 -1
  13. package/dist/commands/complete.d.ts +5 -7
  14. package/dist/commands/complete.d.ts.map +1 -1
  15. package/dist/commands/complete.js +76 -127
  16. package/dist/commands/complete.js.map +1 -1
  17. package/dist/commands/contract.d.ts +46 -2
  18. package/dist/commands/contract.d.ts.map +1 -1
  19. package/dist/commands/contract.js +499 -2
  20. package/dist/commands/contract.js.map +1 -1
  21. package/dist/commands/mcp.d.ts.map +1 -1
  22. package/dist/commands/mcp.js +1037 -1763
  23. package/dist/commands/mcp.js.map +1 -1
  24. package/dist/commands/migrate.d.ts +2 -2
  25. package/dist/commands/migrate.d.ts.map +1 -1
  26. package/dist/commands/migrate.js +127 -89
  27. package/dist/commands/migrate.js.map +1 -1
  28. package/dist/commands/move.js.map +1 -1
  29. package/dist/commands/schema.d.ts.map +1 -1
  30. package/dist/commands/schema.js +6 -1
  31. package/dist/commands/schema.js.map +1 -1
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/lib/contractRunner.d.ts.map +1 -1
  37. package/dist/lib/contractRunner.js +76 -49
  38. package/dist/lib/contractRunner.js.map +1 -1
  39. package/dist/mcp/tools/contract.d.ts +25 -0
  40. package/dist/mcp/tools/contract.d.ts.map +1 -0
  41. package/dist/mcp/tools/contract.js +33 -0
  42. package/dist/mcp/tools/contract.js.map +1 -0
  43. package/dist/utils/config.d.ts.map +1 -1
  44. package/dist/utils/config.js +22 -9
  45. package/dist/utils/config.js.map +1 -1
  46. package/dist/utils/contractSpec.d.ts +2 -0
  47. package/dist/utils/contractSpec.d.ts.map +1 -1
  48. package/dist/utils/contractSpec.js +5 -1
  49. package/dist/utils/contractSpec.js.map +1 -1
  50. package/dist/utils/hook-settings.d.ts.map +1 -1
  51. package/dist/utils/hook-settings.js +5 -1
  52. package/dist/utils/hook-settings.js.map +1 -1
  53. package/dist/validation/command-lint.d.ts +11 -0
  54. package/dist/validation/command-lint.d.ts.map +1 -0
  55. package/dist/validation/command-lint.js +88 -0
  56. package/dist/validation/command-lint.js.map +1 -0
  57. package/package.json +2 -2
  58. package/dist/commands/context.d.ts +0 -19
  59. package/dist/commands/context.d.ts.map +0 -1
  60. package/dist/commands/context.js +0 -103
  61. package/dist/commands/context.js.map +0 -1
  62. package/dist/commands/history.d.ts +0 -18
  63. package/dist/commands/history.d.ts.map +0 -1
  64. package/dist/commands/history.js +0 -92
  65. package/dist/commands/history.js.map +0 -1
  66. package/dist/commands/ledger-rebuild.d.ts +0 -17
  67. package/dist/commands/ledger-rebuild.d.ts.map +0 -1
  68. package/dist/commands/ledger-rebuild.js +0 -287
  69. package/dist/commands/ledger-rebuild.js.map +0 -1
  70. package/dist/commands/ledger.d.ts +0 -20
  71. package/dist/commands/ledger.d.ts.map +0 -1
  72. package/dist/commands/ledger.js +0 -111
  73. package/dist/commands/ledger.js.map +0 -1
  74. package/dist/commands/migrate-ledger.d.ts +0 -17
  75. package/dist/commands/migrate-ledger.d.ts.map +0 -1
  76. package/dist/commands/migrate-ledger.js +0 -127
  77. package/dist/commands/migrate-ledger.js.map +0 -1
  78. package/dist/commands/stats.d.ts +0 -20
  79. package/dist/commands/stats.d.ts.map +0 -1
  80. package/dist/commands/stats.js +0 -151
  81. package/dist/commands/stats.js.map +0 -1
  82. package/dist/tui/components/ArchivePanel.d.ts +0 -16
  83. package/dist/tui/components/ArchivePanel.d.ts.map +0 -1
  84. package/dist/tui/components/ArchivePanel.js +0 -115
  85. package/dist/tui/components/ArchivePanel.js.map +0 -1
  86. package/dist/utils/date-helpers.d.ts +0 -20
  87. package/dist/utils/date-helpers.d.ts.map +0 -1
  88. package/dist/utils/date-helpers.js +0 -54
  89. package/dist/utils/date-helpers.js.map +0 -1
  90. package/dist/utils/v2-tasks.d.ts +0 -121
  91. package/dist/utils/v2-tasks.d.ts.map +0 -1
  92. package/dist/utils/v2-tasks.js +0 -384
  93. package/dist/utils/v2-tasks.js.map +0 -1
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getWorkspaceRelativePath = getWorkspaceRelativePath;
37
+ exports.lintValidationCommand = lintValidationCommand;
38
+ exports.lintValidationCommands = lintValidationCommands;
39
+ const path = __importStar(require("path"));
40
+ const workspace_format_1 = require("../utils/workspace-format");
41
+ function getWorkspaceRelativePath(brainfilePath) {
42
+ const workspaceRoot = (0, workspace_format_1.workspaceRootFromBrainfilePath)(brainfilePath);
43
+ const relativePath = path.relative(process.cwd(), workspaceRoot);
44
+ if (!relativePath || relativePath === '.') {
45
+ return '.';
46
+ }
47
+ return relativePath.split(path.sep).join('/');
48
+ }
49
+ function normalizeShellPath(input) {
50
+ const trimmed = input.trim().replace(/\\/g, '/');
51
+ const withoutLeadingDotSlash = trimmed.replace(/^\.\//, '');
52
+ const normalized = path.posix.normalize(withoutLeadingDotSlash);
53
+ return normalized === '.' ? '' : normalized;
54
+ }
55
+ function escapeForRegex(input) {
56
+ return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
57
+ }
58
+ function lintValidationCommand(command, brainfilePath) {
59
+ const workspacePath = getWorkspaceRelativePath(brainfilePath);
60
+ if (workspacePath === '.') {
61
+ return null;
62
+ }
63
+ const normalizedWorkspacePath = normalizeShellPath(workspacePath);
64
+ if (!normalizedWorkspacePath) {
65
+ return null;
66
+ }
67
+ const pattern = new RegExp(`^\\s*cd\\s+((?:\\./)?${escapeForRegex(normalizedWorkspacePath)})\\s*&&\\s*(.+)$`);
68
+ const match = command.match(pattern);
69
+ if (!match) {
70
+ return null;
71
+ }
72
+ const [, matchedPrefixPath, remainder] = match;
73
+ const suggestion = remainder.trim();
74
+ const matchedPrefix = `cd ${matchedPrefixPath} &&`;
75
+ return {
76
+ command,
77
+ matchedPrefix,
78
+ workspacePath,
79
+ suggestion,
80
+ message: `Validation command contains '${matchedPrefix}' — agents are dispatched into the workspace root, consider using '${suggestion}' instead`,
81
+ };
82
+ }
83
+ function lintValidationCommands(commands, brainfilePath) {
84
+ return (commands ?? [])
85
+ .map((command) => lintValidationCommand(command, brainfilePath))
86
+ .filter((warning) => warning !== null);
87
+ }
88
+ //# sourceMappingURL=command-lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-lint.js","sourceRoot":"","sources":["../../src/validation/command-lint.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,4DASC;AAaD,sDA8BC;AAED,wDAIC;AArED,2CAA6B;AAC7B,gEAA2E;AAU3E,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,MAAM,aAAa,GAAG,IAAA,iDAA8B,EAAC,aAAa,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAEjE,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;QAC1C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAChE,OAAO,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAe,EAAE,aAAqB;IAC1E,MAAM,aAAa,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAC9D,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAClE,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,wBAAwB,cAAc,CAAC,uBAAuB,CAAC,kBAAkB,CAClF,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAAE,iBAAiB,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IAC/C,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,aAAa,GAAG,MAAM,iBAAiB,KAAK,CAAC;IAEnD,OAAO;QACL,OAAO;QACP,aAAa;QACb,aAAa;QACb,UAAU;QACV,OAAO,EAAE,gCAAgC,aAAa,sEAAsE,UAAU,WAAW;KAClJ,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CAAC,QAA8B,EAAE,aAAqB;IAC1F,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;SACpB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;SAC/D,MAAM,CAAC,CAAC,OAAO,EAA2C,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;AACpF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainfile/cli",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "description": "Command-line interface for Brainfile task management",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -34,7 +34,7 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@brainfile/core": "^0.14.0",
37
+ "@brainfile/core": "^0.15.1",
38
38
  "@modelcontextprotocol/sdk": "^1.22.0",
39
39
  "chalk": "^4.1.2",
40
40
  "chokidar": "^4.0.3",
@@ -1,19 +0,0 @@
1
- import { type TaskContextEntry } from '../../../core/dist';
2
- import { type Logger } from '../utils/logger';
3
- export interface ContextOptions {
4
- file: string;
5
- taskId: string;
6
- maxEntries?: number;
7
- maxAge?: number;
8
- }
9
- export interface ContextResult {
10
- success: true;
11
- taskId: string;
12
- count: number;
13
- entries: TaskContextEntry[];
14
- }
15
- /**
16
- * Build scoped task context from ledger history.
17
- */
18
- export declare function contextCommand(options: ContextOptions, logger?: Logger): ContextResult;
19
- //# sourceMappingURL=context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAM7D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAuBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,GAAE,MAAsB,GAAG,aAAa,CAyCrG"}
@@ -1,103 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.contextCommand = contextCommand;
40
- const fs = __importStar(require("fs"));
41
- const chalk_1 = __importDefault(require("chalk"));
42
- const dist_1 = require("../../../core/dist");
43
- const logger_1 = require("../utils/logger");
44
- const cli_error_1 = require("../utils/cli-error");
45
- const brainfile_path_1 = require("../utils/brainfile-path");
46
- const v2_detect_1 = require("../utils/v2-detect");
47
- const date_helpers_1 = require("../utils/date-helpers");
48
- function displayContext(taskId, entries, logger) {
49
- logger.log('');
50
- logger.log(chalk_1.default.bold(`Context for ${taskId} (${entries.length})`));
51
- logger.log(chalk_1.default.gray('─'.repeat(60)));
52
- if (entries.length === 0) {
53
- logger.log(chalk_1.default.gray(' No related history found for the selected scope.'));
54
- logger.log('');
55
- return;
56
- }
57
- for (const entry of entries) {
58
- const record = entry.record;
59
- logger.log(` ${chalk_1.default.gray(`[${record.id}]`)} ${chalk_1.default.white(record.title)}`);
60
- logger.log(` ${chalk_1.default.gray('Completed:')} ${record.completedAt}`);
61
- logger.log(` ${chalk_1.default.gray('Matched files:')} ${entry.matchedFiles.join(', ')}`);
62
- logger.log(` ${chalk_1.default.gray('Summary:')} ${record.summary}`);
63
- logger.log('');
64
- }
65
- }
66
- /**
67
- * Build scoped task context from ledger history.
68
- */
69
- function contextCommand(options, logger = logger_1.defaultLogger) {
70
- const taskId = options.taskId?.trim();
71
- if (!taskId) {
72
- throw (0, cli_error_1.validationError)('context requires a non-empty <task-id> argument');
73
- }
74
- const maxEntries = (0, date_helpers_1.parsePositiveInt)(options.maxEntries, '--max-entries', 5);
75
- const maxAge = (0, date_helpers_1.parsePositiveInt)(options.maxAge, '--max-age', 90);
76
- const filePath = (0, brainfile_path_1.resolveCliBrainfilePath)(options.file);
77
- if (!fs.existsSync(filePath)) {
78
- throw (0, cli_error_1.fileNotFound)(filePath);
79
- }
80
- if (!(0, v2_detect_1.isV2)(filePath)) {
81
- throw (0, cli_error_1.operationFailed)('Context command requires v2 per-task file architecture. Run: brainfile migrate');
82
- }
83
- const dirs = (0, v2_detect_1.getV2Dirs)(filePath);
84
- const found = (0, v2_detect_1.findV2Task)(dirs, taskId, true);
85
- if (!found) {
86
- throw (0, cli_error_1.taskNotFound)(taskId);
87
- }
88
- const task = found.doc.task;
89
- const relatedFiles = task.relatedFiles || [];
90
- const deliverables = task.contract?.deliverables;
91
- const entries = (0, dist_1.getTaskContext)(dirs.logsDir, relatedFiles, deliverables, {
92
- limit: maxEntries,
93
- dateRange: (0, date_helpers_1.buildMaxAgeDateRange)(maxAge),
94
- }).filter((entry) => entry.record.id !== task.id);
95
- displayContext(taskId, entries, logger);
96
- return {
97
- success: true,
98
- taskId,
99
- count: entries.length,
100
- entries,
101
- };
102
- }
103
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,wCAyCC;AAxFD,uCAAyB;AACzB,kDAA0B;AAC1B,6CAA2E;AAC3E,4CAA6D;AAC7D,kDAAkG;AAClG,4DAAkE;AAClE,kDAAiE;AACjE,wDAA+E;AAgB/E,SAAS,cAAc,CAAC,MAAc,EAAE,OAA2B,EAAE,MAAc;IACjF,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,GAAG,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,GAAG,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAuB,EAAE,SAAiB,sBAAa;IACpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAA,2BAAe,EAAC,iDAAiD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,+BAAgB,EAAC,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAA,+BAAgB,EAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,IAAA,wCAAuB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAA,wBAAY,EAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,IAAA,gBAAI,EAAC,QAAQ,CAAC,EAAE,CAAC;QACpB,MAAM,IAAA,2BAAe,EAAC,gFAAgF,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,IAAI,GAAG,IAAA,qBAAS,EAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAA,sBAAU,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAA,wBAAY,EAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;IAEjD,MAAM,OAAO,GAAG,IAAA,qBAAc,EAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE;QACvE,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,IAAA,mCAAoB,EAAC,MAAM,CAAC;KACxC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IAElD,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAExC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -1,18 +0,0 @@
1
- import { type LedgerRecord } from '../../../core/dist';
2
- import { type Logger } from '../utils/logger';
3
- export interface HistoryOptions {
4
- file: string;
5
- filePath: string;
6
- last?: number;
7
- since?: string;
8
- }
9
- export interface HistoryResult {
10
- success: true;
11
- count: number;
12
- records: LedgerRecord[];
13
- }
14
- /**
15
- * Show completion history for a file path from ledger records.
16
- */
17
- export declare function historyCommand(options: HistoryOptions, logger?: Logger): HistoryResult;
18
- //# sourceMappingURL=history.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAM7D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,GAAE,MAAsB,GAAG,aAAa,CA2BrG"}
@@ -1,92 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.historyCommand = historyCommand;
40
- const fs = __importStar(require("fs"));
41
- const chalk_1 = __importDefault(require("chalk"));
42
- const dist_1 = require("../../../core/dist");
43
- const logger_1 = require("../utils/logger");
44
- const cli_error_1 = require("../utils/cli-error");
45
- const brainfile_path_1 = require("../utils/brainfile-path");
46
- const v2_detect_1 = require("../utils/v2-detect");
47
- const date_helpers_1 = require("../utils/date-helpers");
48
- function displayHistory(filePath, records, logger) {
49
- logger.log('');
50
- logger.log(chalk_1.default.bold(`History for ${filePath} (${records.length})`));
51
- logger.log(chalk_1.default.gray('─'.repeat(60)));
52
- if (records.length === 0) {
53
- logger.log(chalk_1.default.gray(' No matching history entries found.'));
54
- logger.log('');
55
- return;
56
- }
57
- for (const record of records) {
58
- logger.log(` ${chalk_1.default.gray(`[${record.id}]`)} ${chalk_1.default.white(record.title)}`);
59
- logger.log(` ${chalk_1.default.gray('Completed:')} ${record.completedAt} ${chalk_1.default.gray('Cycle:')} ${record.cycleTimeHours.toFixed(2)}h`);
60
- if (record.assignee) {
61
- logger.log(` ${chalk_1.default.gray('Assignee:')} ${record.assignee}`);
62
- }
63
- logger.log(` ${chalk_1.default.gray('Summary:')} ${record.summary}`);
64
- logger.log('');
65
- }
66
- }
67
- /**
68
- * Show completion history for a file path from ledger records.
69
- */
70
- function historyCommand(options, logger = logger_1.defaultLogger) {
71
- const targetFile = options.filePath?.trim();
72
- if (!targetFile) {
73
- throw (0, cli_error_1.validationError)('history requires a non-empty <file-path> argument');
74
- }
75
- const filePath = (0, brainfile_path_1.resolveCliBrainfilePath)(options.file);
76
- if (!fs.existsSync(filePath)) {
77
- throw (0, cli_error_1.fileNotFound)(filePath);
78
- }
79
- if (!(0, v2_detect_1.isV2)(filePath)) {
80
- throw (0, cli_error_1.operationFailed)('History command requires v2 per-task file architecture. Run: brainfile migrate');
81
- }
82
- const dateRange = (0, date_helpers_1.buildDateRange)(options.since);
83
- const limit = (0, date_helpers_1.parsePositiveInt)(options.last, '--last');
84
- const dirs = (0, v2_detect_1.getV2Dirs)(filePath);
85
- const records = (0, dist_1.getFileHistory)(dirs.logsDir, targetFile, {
86
- limit,
87
- dateRange,
88
- });
89
- displayHistory(targetFile, records, logger);
90
- return { success: true, count: records.length, records };
91
- }
92
- //# sourceMappingURL=history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import { type LedgerRecord } from '../../../core/dist';
2
- import { type Logger } from '../utils/logger';
3
- export interface LedgerRebuildOptions {
4
- file: string;
5
- }
6
- export interface LedgerRebuildResult {
7
- success: true;
8
- rebuilt: number;
9
- skipped: number;
10
- ledgerPath: string;
11
- records: LedgerRecord[];
12
- }
13
- /**
14
- * Rebuild `logs/ledger.jsonl` from git history.
15
- */
16
- export declare function ledgerRebuildCommand(options: LedgerRebuildOptions, logger?: Logger): LedgerRebuildResult;
17
- //# sourceMappingURL=ledger-rebuild.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ledger-rebuild.d.ts","sourceRoot":"","sources":["../../src/commands/ledger-rebuild.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAQ7D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAqQD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,oBAAoB,EAC7B,MAAM,GAAE,MAAsB,GAC7B,mBAAmB,CAoDrB"}