brainfile 0.21.2 → 0.22.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 +1 -1
- package/dist/__tests__/helpers/mcp-wire.d.ts +2 -0
- package/dist/__tests__/helpers/mcp-wire.d.ts.map +1 -1
- package/dist/__tests__/helpers/mcp-wire.js +4 -2
- package/dist/__tests__/helpers/mcp-wire.js.map +1 -1
- package/dist/chunk-BNE7R5GK.mjs +5489 -0
- package/dist/chunk-L4WSDMK3.mjs +1973 -0
- package/dist/{chunk-7KU2R7QC.mjs → chunk-XFDTTLSW.mjs} +3230 -4322
- package/dist/cli.js +7 -1
- package/dist/cli.mjs +8078 -5357
- package/dist/commands/add.d.ts +4 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +68 -72
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/boards.d.ts +18 -0
- package/dist/commands/boards.d.ts.map +1 -0
- package/dist/commands/boards.js +166 -0
- package/dist/commands/boards.js.map +1 -0
- package/dist/commands/brief.d.ts +17 -11
- package/dist/commands/brief.d.ts.map +1 -1
- package/dist/commands/brief.js +38 -35
- package/dist/commands/brief.js.map +1 -1
- package/dist/commands/check.d.ts +47 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +134 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/columns.d.ts +48 -0
- package/dist/commands/columns.d.ts.map +1 -0
- package/dist/commands/columns.js +132 -0
- package/dist/commands/columns.js.map +1 -0
- package/dist/commands/complete.js +9 -4
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/decide.d.ts +72 -0
- package/dist/commands/decide.d.ts.map +1 -0
- package/dist/commands/decide.js +264 -0
- package/dist/commands/decide.js.map +1 -0
- package/dist/commands/hooks.d.ts +5 -1
- package/dist/commands/hooks.d.ts.map +1 -1
- package/dist/commands/hooks.js +10 -11
- package/dist/commands/hooks.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.d.ts +27 -0
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +127 -20
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +216 -7
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/log.d.ts +51 -0
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +113 -84
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/mcp.d.ts +5 -2
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +44 -9
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/memory-index.d.ts +34 -0
- package/dist/commands/memory-index.d.ts.map +1 -0
- package/dist/commands/memory-index.js +135 -0
- package/dist/commands/memory-index.js.map +1 -0
- package/dist/commands/merge-driver.d.ts +1 -15
- package/dist/commands/merge-driver.d.ts.map +1 -1
- package/dist/commands/merge-driver.js +8 -134
- package/dist/commands/merge-driver.js.map +1 -1
- package/dist/commands/migrate-tracked.d.ts +1 -1
- package/dist/commands/migrate-tracked.d.ts.map +1 -1
- package/dist/commands/migrate-tracked.js +21 -10
- package/dist/commands/migrate-tracked.js.map +1 -1
- package/dist/commands/patch.d.ts +23 -4
- package/dist/commands/patch.d.ts.map +1 -1
- package/dist/commands/patch.js +149 -91
- package/dist/commands/patch.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +11 -5
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/schema.d.ts +12 -0
- package/dist/commands/schema.d.ts.map +1 -1
- package/dist/commands/schema.js +28 -10
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/search.d.ts +46 -12
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +89 -44
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +175 -10
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/template.d.ts +2 -0
- package/dist/commands/template.d.ts.map +1 -1
- package/dist/commands/template.js +2 -1
- package/dist/commands/template.js.map +1 -1
- package/dist/commands/types.d.ts +31 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js +122 -22
- package/dist/commands/types.js.map +1 -1
- package/dist/commands/where.d.ts +20 -1
- package/dist/commands/where.d.ts.map +1 -1
- package/dist/commands/where.js +56 -6
- package/dist/commands/where.js.map +1 -1
- package/dist/hook.mjs +15 -0
- package/dist/hooks/session-start.d.ts +39 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +181 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/lib/contractRunner.d.ts.map +1 -1
- package/dist/lib/contractRunner.js +8 -0
- package/dist/lib/contractRunner.js.map +1 -1
- package/dist/mcp/helpers.d.ts +29 -1
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +57 -2
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/instructions.d.ts +5 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +57 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/resources.d.ts +9 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +29 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/schemas.d.ts +600 -9
- package/dist/mcp/schemas.d.ts.map +1 -1
- package/dist/mcp/schemas.js +374 -12
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/tools/adr_promote_tool.d.ts +7 -0
- package/dist/mcp/tools/adr_promote_tool.d.ts.map +1 -0
- package/dist/mcp/tools/adr_promote_tool.js +37 -0
- package/dist/mcp/tools/adr_promote_tool.js.map +1 -0
- package/dist/mcp/tools/board_tool.d.ts +7 -0
- package/dist/mcp/tools/board_tool.d.ts.map +1 -0
- package/dist/mcp/tools/board_tool.js +61 -0
- package/dist/mcp/tools/board_tool.js.map +1 -0
- package/dist/mcp/tools/brief_tool.d.ts.map +1 -1
- package/dist/mcp/tools/brief_tool.js +13 -5
- package/dist/mcp/tools/brief_tool.js.map +1 -1
- package/dist/mcp/tools/check_tool.d.ts +6 -0
- package/dist/mcp/tools/check_tool.d.ts.map +1 -0
- package/dist/mcp/tools/check_tool.js +54 -0
- package/dist/mcp/tools/check_tool.js.map +1 -0
- package/dist/mcp/tools/columns_tool.d.ts +7 -0
- package/dist/mcp/tools/columns_tool.d.ts.map +1 -0
- package/dist/mcp/tools/columns_tool.js +94 -0
- package/dist/mcp/tools/columns_tool.js.map +1 -0
- package/dist/mcp/tools/decide_tool.d.ts +91 -0
- package/dist/mcp/tools/decide_tool.d.ts.map +1 -0
- package/dist/mcp/tools/decide_tool.js +141 -0
- package/dist/mcp/tools/decide_tool.js.map +1 -0
- package/dist/mcp/tools/get_task_tool.d.ts.map +1 -1
- package/dist/mcp/tools/get_task_tool.js +62 -4
- package/dist/mcp/tools/get_task_tool.js.map +1 -1
- package/dist/mcp/tools/lint_tool.d.ts +7 -0
- package/dist/mcp/tools/lint_tool.d.ts.map +1 -0
- package/dist/mcp/tools/lint_tool.js +48 -0
- package/dist/mcp/tools/lint_tool.js.map +1 -0
- package/dist/mcp/tools/list_tasks_tool.d.ts.map +1 -1
- package/dist/mcp/tools/list_tasks_tool.js +132 -15
- package/dist/mcp/tools/list_tasks_tool.js.map +1 -1
- package/dist/mcp/tools/log_tool.d.ts +4 -0
- package/dist/mcp/tools/log_tool.d.ts.map +1 -0
- package/dist/mcp/tools/log_tool.js +52 -0
- package/dist/mcp/tools/log_tool.js.map +1 -0
- package/dist/mcp/tools/note_tool.d.ts +7 -0
- package/dist/mcp/tools/note_tool.d.ts.map +1 -0
- package/dist/mcp/tools/note_tool.js +39 -0
- package/dist/mcp/tools/note_tool.js.map +1 -0
- package/dist/mcp/tools/retire_tool.d.ts +4 -0
- package/dist/mcp/tools/retire_tool.d.ts.map +1 -0
- package/dist/mcp/tools/retire_tool.js +81 -0
- package/dist/mcp/tools/retire_tool.js.map +1 -0
- package/dist/mcp/tools/search_tool.d.ts.map +1 -1
- package/dist/mcp/tools/search_tool.js +36 -19
- package/dist/mcp/tools/search_tool.js.map +1 -1
- package/dist/mcp/tools/supersede_tool.d.ts +4 -0
- package/dist/mcp/tools/supersede_tool.d.ts.map +1 -0
- package/dist/mcp/tools/supersede_tool.js +72 -0
- package/dist/mcp/tools/supersede_tool.js.map +1 -0
- package/dist/mcp/tools/sync_tool.d.ts +9 -0
- package/dist/mcp/tools/sync_tool.d.ts.map +1 -0
- package/dist/mcp/tools/sync_tool.js +87 -0
- package/dist/mcp/tools/sync_tool.js.map +1 -0
- package/dist/mcp/tools/task_add_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_add_tool.js +39 -17
- package/dist/mcp/tools/task_add_tool.js.map +1 -1
- package/dist/mcp/tools/task_complete_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_complete_tool.js +3 -2
- package/dist/mcp/tools/task_complete_tool.js.map +1 -1
- package/dist/mcp/tools/task_patch_tool.d.ts.map +1 -1
- package/dist/mcp/tools/task_patch_tool.js +30 -5
- package/dist/mcp/tools/task_patch_tool.js.map +1 -1
- package/dist/mcp/tools/template_tool.d.ts +4 -0
- package/dist/mcp/tools/template_tool.d.ts.map +1 -0
- package/dist/mcp/tools/template_tool.js +70 -0
- package/dist/mcp/tools/template_tool.js.map +1 -0
- package/dist/mcp/tools/types_tool.d.ts +4 -0
- package/dist/mcp/tools/types_tool.d.ts.map +1 -0
- package/dist/mcp/tools/types_tool.js +61 -0
- package/dist/mcp/tools/types_tool.js.map +1 -0
- package/dist/mcp/tools/where_tool.d.ts +4 -0
- package/dist/mcp/tools/where_tool.d.ts.map +1 -0
- package/dist/mcp/tools/where_tool.js +73 -0
- package/dist/mcp/tools/where_tool.js.map +1 -0
- package/dist/schemas/board.json +29 -8
- package/dist/{tui-3Z7ZJV7M.mjs → tui-IR3JKS4Y.mjs} +994 -315
- package/dist/utils/board-autosync.d.ts +1 -10
- package/dist/utils/board-autosync.d.ts.map +1 -1
- package/dist/utils/board-autosync.js +11 -29
- package/dist/utils/board-autosync.js.map +1 -1
- package/dist/utils/board-commit-hooks.d.ts +8 -0
- package/dist/utils/board-commit-hooks.d.ts.map +1 -1
- package/dist/utils/board-commit-hooks.js +45 -1
- package/dist/utils/board-commit-hooks.js.map +1 -1
- package/dist/utils/board-repo.d.ts +1 -119
- package/dist/utils/board-repo.d.ts.map +1 -1
- package/dist/utils/board-repo.js +43 -571
- package/dist/utils/board-repo.js.map +1 -1
- package/dist/utils/board-sync.d.ts +3 -123
- package/dist/utils/board-sync.d.ts.map +1 -1
- package/dist/utils/board-sync.js +34 -551
- package/dist/utils/board-sync.js.map +1 -1
- package/dist/utils/graph.d.ts +20 -0
- package/dist/utils/graph.d.ts.map +1 -0
- package/dist/utils/graph.js +61 -0
- package/dist/utils/graph.js.map +1 -0
- package/dist/utils/related.d.ts +21 -0
- package/dist/utils/related.d.ts.map +1 -0
- package/dist/utils/related.js +36 -0
- package/dist/utils/related.js.map +1 -0
- package/package.json +2 -2
- package/dist/tui/theme.d.ts +0 -98
- package/dist/tui/theme.d.ts.map +0 -1
- package/dist/tui/theme.js +0 -141
- package/dist/tui/theme.js.map +0 -1
package/dist/commands/brief.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Brief command
|
|
3
|
+
* Brief command: the session-start block (spec-11, recoil's `wake`).
|
|
4
4
|
*
|
|
5
|
-
* brainfile brief --agent codex
|
|
6
|
-
* brainfile brief --agent codex --
|
|
7
|
-
* brainfile brief --agent codex --
|
|
5
|
+
* brainfile brief --agent codex Budgeted block (~1,600 chars)
|
|
6
|
+
* brainfile brief --agent codex --max-chars 0 Everything
|
|
7
|
+
* brainfile brief --agent codex --peek Same, without advancing the checkpoint
|
|
8
|
+
* brainfile brief --agent codex --json Machine-readable envelope
|
|
8
9
|
*
|
|
9
|
-
* The
|
|
10
|
-
*
|
|
10
|
+
* The block has lanes: heads up (work resting on a superseded decision,
|
|
11
|
+
* decisions whose predicates broke), current decisions, your tasks (or the
|
|
12
|
+
* work in flight), what changed since this agent's checkpoint, and the docs
|
|
13
|
+
* that bear on the tasks (from the local index, when there is one). The
|
|
14
|
+
* SessionStart hook injects the same block.
|
|
11
15
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
16
|
+
* `--json` keeps the checkpoint lanes (`lanes`: a first brief's orientation,
|
|
17
|
+
* later the delta) and adds the block's `sections`, `text`, `maxChars` and
|
|
18
|
+
* `truncated`.
|
|
15
19
|
*
|
|
16
20
|
* @packageDocumentation
|
|
17
21
|
*/
|
|
@@ -57,8 +61,8 @@ exports.briefCommand = briefCommand;
|
|
|
57
61
|
const fs = __importStar(require("fs"));
|
|
58
62
|
const chalk_1 = __importDefault(require("chalk"));
|
|
59
63
|
const core_1 = require("@brainfile/core");
|
|
64
|
+
const memory_1 = require("@brainfile/core/memory");
|
|
60
65
|
const v2_detect_1 = require("../utils/v2-detect");
|
|
61
|
-
const theme_1 = require("../tui/theme");
|
|
62
66
|
const logger_1 = require("../utils/logger");
|
|
63
67
|
const cli_error_1 = require("../utils/cli-error");
|
|
64
68
|
const brainfile_path_1 = require("../utils/brainfile-path");
|
|
@@ -121,7 +125,7 @@ function runBrief(options) {
|
|
|
121
125
|
const dirs = (0, v2_detect_1.getV2Dirs)(filePath);
|
|
122
126
|
const peek = options.peek === true;
|
|
123
127
|
const state = (0, core_1.readBriefState)(filePath, agent);
|
|
124
|
-
const result = (0,
|
|
128
|
+
const result = (0, memory_1.composeBrief)(dirs, agent, { lastBriefAt: state.lastBriefAt, maxChars: parseMaxChars(options.maxChars) });
|
|
125
129
|
// Peek is a caller-side no-op on the write step only — the brief itself is
|
|
126
130
|
// identical either way, and no state file is created on a first-ever peek.
|
|
127
131
|
if (!peek) {
|
|
@@ -129,33 +133,32 @@ function runBrief(options) {
|
|
|
129
133
|
}
|
|
130
134
|
return { ...result, peek };
|
|
131
135
|
}
|
|
136
|
+
function parseMaxChars(value) {
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
return memory_1.DEFAULT_BRIEF_MAX_CHARS;
|
|
139
|
+
const n = typeof value === 'number' ? value : Number.parseInt(String(value), 10);
|
|
140
|
+
if (!Number.isFinite(n) || n < 0) {
|
|
141
|
+
throw new cli_error_1.CLIError(`--max-chars must be a number of characters, 0 for no limit (got '${value}')`);
|
|
142
|
+
}
|
|
143
|
+
return n;
|
|
144
|
+
}
|
|
132
145
|
// ============================================================================
|
|
133
146
|
// Rendering
|
|
134
147
|
// ============================================================================
|
|
148
|
+
/** The block as plain text, lightly styled on a terminal (chalk is a no-op when piped). */
|
|
135
149
|
function renderBrief(result, logger) {
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// Align the why-column so the eye can scan reasons independently of text.
|
|
150
|
-
const width = Math.max(...lane.items.map((item) => laneKey(item.taskId).length));
|
|
151
|
-
for (const item of lane.items) {
|
|
152
|
-
const key = laneKey(item.taskId).padEnd(width);
|
|
153
|
-
const prefix = key.trim().length > 0 ? chalk_1.default.cyan(key) : key;
|
|
154
|
-
logger.log(` ${prefix} ${item.text} ${chalk_1.default.gray(`(${item.why})`)}`);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
function laneKey(taskId) {
|
|
159
|
-
return taskId ? `${theme_1.GLYPHS.pointer} ${taskId}` : '';
|
|
150
|
+
const lines = result.text.split('\n');
|
|
151
|
+
lines.forEach((line, index) => {
|
|
152
|
+
if (index === 0)
|
|
153
|
+
logger.log(chalk_1.default.bold(line) + (result.peek ? chalk_1.default.gray(' (peek)') : ''));
|
|
154
|
+
else if (line.startsWith('## '))
|
|
155
|
+
logger.log(chalk_1.default.bold(line.slice(3)));
|
|
156
|
+
else if (line.startsWith('! '))
|
|
157
|
+
logger.log(chalk_1.default.yellow(line));
|
|
158
|
+
else if (line.startsWith('(+'))
|
|
159
|
+
logger.log(chalk_1.default.gray(line));
|
|
160
|
+
else
|
|
161
|
+
logger.log(line);
|
|
162
|
+
});
|
|
160
163
|
}
|
|
161
164
|
//# sourceMappingURL=brief.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/commands/brief.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `brainfile check`: is a decision on the board still safe to act on? (spec-11)
|
|
3
|
+
*
|
|
4
|
+
* brainfile check "use axios for the retry client"
|
|
5
|
+
* brainfile check decision-3
|
|
6
|
+
* brainfile check --claim-key dependency.http-client
|
|
7
|
+
* brainfile check --claim-key-prefix dependency "add axios"
|
|
8
|
+
*
|
|
9
|
+
* Finds the claim family the action touches (a decision ID, a claim key, or
|
|
10
|
+
* its words: the local index when there is one, a scan of the decisions
|
|
11
|
+
* when there is not) and answers in recoil's verdict order:
|
|
12
|
+
*
|
|
13
|
+
* use act on the current decision
|
|
14
|
+
* review ask first: two current decisions, a broken predicate
|
|
15
|
+
* (validUntil passed, the source file changed, the package
|
|
16
|
+
* moved), a contradiction of the decision's stance, or no
|
|
17
|
+
* current decision left
|
|
18
|
+
* use_replacement the action matched a superseded decision; use the
|
|
19
|
+
* current one instead
|
|
20
|
+
* no_decision nothing on the board speaks to it
|
|
21
|
+
*
|
|
22
|
+
* Exit codes, for scripts: 0 use or no_decision, 2 review, 3 use_replacement,
|
|
23
|
+
* 1 an error (no board, bad arguments).
|
|
24
|
+
*
|
|
25
|
+
* @packageDocumentation
|
|
26
|
+
*/
|
|
27
|
+
import { type CheckPrefixResult } from '@brainfile/core/memory';
|
|
28
|
+
import type { CheckResult } from '@brainfile/core';
|
|
29
|
+
import { type Logger } from '../utils/logger';
|
|
30
|
+
export declare const CHECK_COMMAND_HELP: string;
|
|
31
|
+
export interface CheckCommandOptions {
|
|
32
|
+
file?: string;
|
|
33
|
+
claimKey?: string;
|
|
34
|
+
claimKeyPrefix?: string;
|
|
35
|
+
json?: boolean;
|
|
36
|
+
/** The action, joined, or a decision ID. */
|
|
37
|
+
query?: string;
|
|
38
|
+
}
|
|
39
|
+
export type CheckCommandResult = (CheckResult & {
|
|
40
|
+
matchedBy: string;
|
|
41
|
+
exitCode: number;
|
|
42
|
+
}) | (CheckPrefixResult & {
|
|
43
|
+
exitCode: number;
|
|
44
|
+
});
|
|
45
|
+
/** Run a check and print it. Sets `process.exitCode` from the verdict unless `setExitCode` is false. */
|
|
46
|
+
export declare function checkCommand(options: CheckCommandOptions, logger?: Logger, setExitCode?: boolean): CheckCommandResult;
|
|
47
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAK7D,eAAO,MAAM,kBAAkB,QAYmD,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAC1B,CAAC,WAAW,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,CAAC,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE/C,wGAAwG;AACxG,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,GAAE,MAAsB,EAAE,WAAW,UAAO,GAAG,kBAAkB,CA2BjI"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `brainfile check`: is a decision on the board still safe to act on? (spec-11)
|
|
4
|
+
*
|
|
5
|
+
* brainfile check "use axios for the retry client"
|
|
6
|
+
* brainfile check decision-3
|
|
7
|
+
* brainfile check --claim-key dependency.http-client
|
|
8
|
+
* brainfile check --claim-key-prefix dependency "add axios"
|
|
9
|
+
*
|
|
10
|
+
* Finds the claim family the action touches (a decision ID, a claim key, or
|
|
11
|
+
* its words: the local index when there is one, a scan of the decisions
|
|
12
|
+
* when there is not) and answers in recoil's verdict order:
|
|
13
|
+
*
|
|
14
|
+
* use act on the current decision
|
|
15
|
+
* review ask first: two current decisions, a broken predicate
|
|
16
|
+
* (validUntil passed, the source file changed, the package
|
|
17
|
+
* moved), a contradiction of the decision's stance, or no
|
|
18
|
+
* current decision left
|
|
19
|
+
* use_replacement the action matched a superseded decision; use the
|
|
20
|
+
* current one instead
|
|
21
|
+
* no_decision nothing on the board speaks to it
|
|
22
|
+
*
|
|
23
|
+
* Exit codes, for scripts: 0 use or no_decision, 2 review, 3 use_replacement,
|
|
24
|
+
* 1 an error (no board, bad arguments).
|
|
25
|
+
*
|
|
26
|
+
* @packageDocumentation
|
|
27
|
+
*/
|
|
28
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
29
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
30
|
+
};
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.CHECK_COMMAND_HELP = void 0;
|
|
33
|
+
exports.checkCommand = checkCommand;
|
|
34
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
35
|
+
const memory_1 = require("@brainfile/core/memory");
|
|
36
|
+
const logger_1 = require("../utils/logger");
|
|
37
|
+
const cli_error_1 = require("../utils/cli-error");
|
|
38
|
+
const brainfile_path_1 = require("../utils/brainfile-path");
|
|
39
|
+
const v2_only_1 = require("../utils/v2-only");
|
|
40
|
+
exports.CHECK_COMMAND_HELP = `
|
|
41
|
+
Examples:
|
|
42
|
+
brainfile check "use axios for the retry client"
|
|
43
|
+
brainfile check decision-3
|
|
44
|
+
brainfile check --claim-key dependency.http-client
|
|
45
|
+
brainfile check --claim-key-prefix dependency "add axios"
|
|
46
|
+
brainfile check "add axios" --json
|
|
47
|
+
|
|
48
|
+
Verdicts: use (follow the current decision) · review (ask first) ·
|
|
49
|
+
use_replacement (the decision you named was replaced) · no_decision.
|
|
50
|
+
Name the subject next to the verb ("use axios", "drop axios") so the stance
|
|
51
|
+
rule can catch a contradiction.
|
|
52
|
+
Exit codes: 0 use or no_decision, 2 review, 3 use_replacement, 1 error.`.trimEnd();
|
|
53
|
+
/** Run a check and print it. Sets `process.exitCode` from the verdict unless `setExitCode` is false. */
|
|
54
|
+
function checkCommand(options, logger = logger_1.defaultLogger, setExitCode = true) {
|
|
55
|
+
const query = options.query?.trim() ?? '';
|
|
56
|
+
const claimKey = options.claimKey?.trim() ?? '';
|
|
57
|
+
const prefix = options.claimKeyPrefix?.trim() ?? '';
|
|
58
|
+
if (claimKey && prefix)
|
|
59
|
+
throw new cli_error_1.CLIError('choose --claim-key or --claim-key-prefix, not both');
|
|
60
|
+
if (!query && !claimKey && !prefix) {
|
|
61
|
+
throw new cli_error_1.CLIError('check needs an action, a decision ID, --claim-key or --claim-key-prefix', undefined, 'Usage: brainfile check "<action>" | <decision-id> | --claim-key <key> | --claim-key-prefix <prefix>');
|
|
62
|
+
}
|
|
63
|
+
const filePath = (0, brainfile_path_1.resolveCliBrainfilePath)(options.file);
|
|
64
|
+
(0, v2_only_1.assertV2Brainfile)(filePath);
|
|
65
|
+
let result;
|
|
66
|
+
if (prefix) {
|
|
67
|
+
const prefixResult = (0, memory_1.checkClaimKeyPrefix)(filePath, prefix, query ? { query } : {});
|
|
68
|
+
result = { ...prefixResult, exitCode: (0, memory_1.checkExitCode)(prefixResult.verdict) };
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const { matchedBy, result: single } = (0, memory_1.checkDecision)(filePath, { ...(query ? { query } : {}), ...(claimKey ? { claimKey } : {}) });
|
|
72
|
+
result = { ...single, matchedBy, exitCode: (0, memory_1.checkExitCode)(single.verdict) };
|
|
73
|
+
}
|
|
74
|
+
if (options.json)
|
|
75
|
+
logger.log(JSON.stringify(result, null, 2));
|
|
76
|
+
else if ('claimKeyPrefix' in result)
|
|
77
|
+
renderPrefix(result, logger);
|
|
78
|
+
else
|
|
79
|
+
renderSingle(result, logger);
|
|
80
|
+
if (setExitCode)
|
|
81
|
+
process.exitCode = result.exitCode;
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
const VERDICT_COLOR = {
|
|
85
|
+
use: chalk_1.default.green,
|
|
86
|
+
review: chalk_1.default.yellow,
|
|
87
|
+
use_replacement: chalk_1.default.cyan,
|
|
88
|
+
no_decision: chalk_1.default.gray,
|
|
89
|
+
};
|
|
90
|
+
function decisionLine(label, d) {
|
|
91
|
+
const facts = [d.status, d.stance && d.subject ? `${d.stance} ${d.subject}` : ''].filter(Boolean).join(' · ');
|
|
92
|
+
return `${chalk_1.default.bold(`${label}:`)} ${chalk_1.default.cyan(d.id)} ${d.title} ${chalk_1.default.gray(`(${facts})`)}`;
|
|
93
|
+
}
|
|
94
|
+
function renderSingle(result, logger) {
|
|
95
|
+
const color = VERDICT_COLOR[result.verdict] ?? ((s) => s);
|
|
96
|
+
logger.log(`${chalk_1.default.bold('Verdict:')} ${color(result.verdict)} ${chalk_1.default.gray(`· ${result.recommendation.replace(/_/g, ' ')} · ${result.reason.replace(/_/g, ' ')}`)}`);
|
|
97
|
+
if (result.verdict === 'no_decision' && !result.claimKey) {
|
|
98
|
+
logger.log(chalk_1.default.gray('No decision on the board speaks to this.'));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (result.claimKey)
|
|
102
|
+
logger.log(`${chalk_1.default.bold('Family:')} ${result.claimKey} ${chalk_1.default.gray(`(matched by ${result.matchedBy.replace('_', ' ')})`)}`);
|
|
103
|
+
if (result.current)
|
|
104
|
+
logger.log(decisionLine('Current', result.current));
|
|
105
|
+
if (result.matched && result.matched.id !== result.current?.id)
|
|
106
|
+
logger.log(decisionLine('Matched', result.matched));
|
|
107
|
+
if (result.replacement)
|
|
108
|
+
logger.log(decisionLine('Use instead', result.replacement));
|
|
109
|
+
if (result.requestedAction && result.requestedAction !== 'unknown') {
|
|
110
|
+
logger.log(`${chalk_1.default.bold('Your action:')} ${result.requestedAction.replace(/_/g, ' ')} ${chalk_1.default.gray(`(decision ${result.stance} ${result.subject})`)}`);
|
|
111
|
+
}
|
|
112
|
+
for (const p of result.predicates) {
|
|
113
|
+
const pc = p.status === 'broken' ? chalk_1.default.yellow : p.status === 'holds' ? chalk_1.default.green : chalk_1.default.gray;
|
|
114
|
+
const detail = [p.expected ? `wants ${p.expected}` : '', p.actual ? `found ${p.actual}` : ''].filter(Boolean).join(', ');
|
|
115
|
+
logger.log(`${chalk_1.default.bold(`${p.kind.replace(/_/g, ' ')}:`)} ${pc(p.status)} ${chalk_1.default.gray(`(${p.reason.replace(/_/g, ' ')}${detail ? `; ${detail}` : ''})`)}`);
|
|
116
|
+
}
|
|
117
|
+
if (result.advisory)
|
|
118
|
+
logger.log(`${chalk_1.default.bold('Holds while:')} ${result.advisory}`);
|
|
119
|
+
if (result.recheck)
|
|
120
|
+
logger.log(`${chalk_1.default.bold('Recheck:')} ${result.recheck}`);
|
|
121
|
+
const history = result.family.filter((d) => d.id !== result.current?.id && d.id !== result.matched?.id);
|
|
122
|
+
if (history.length > 0) {
|
|
123
|
+
logger.log(chalk_1.default.gray(`History: ${history.map((d) => `${d.id} (${d.status}${d.supersededBy ? ` by ${d.supersededBy}` : ''})`).join(', ')}`));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function renderPrefix(result, logger) {
|
|
127
|
+
const color = VERDICT_COLOR[result.verdict] ?? ((s) => s);
|
|
128
|
+
logger.log(`${chalk_1.default.bold('Verdict:')} ${color(result.verdict)} ${chalk_1.default.gray(`· ${result.familyCount} famil${result.familyCount === 1 ? 'y' : 'ies'} under ${result.claimKeyPrefix}${result.decidingClaimKey ? ` · decided by ${result.decidingClaimKey}` : ''}`)}`);
|
|
129
|
+
for (const family of result.families) {
|
|
130
|
+
const c = VERDICT_COLOR[family.verdict] ?? ((s) => s);
|
|
131
|
+
logger.log(` ${c(family.verdict.padEnd(15))} ${family.claimKey} ${chalk_1.default.gray(`${family.current ? family.current.id : 'no current decision'} · ${family.reason.replace(/_/g, ' ')}`)}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `brainfile columns` (spec-13): the board's columns.
|
|
3
|
+
*
|
|
4
|
+
* brainfile columns list them, with task counts
|
|
5
|
+
* brainfile columns add "In Review" --after in-progress
|
|
6
|
+
* brainfile columns rename in-review "Review"
|
|
7
|
+
* brainfile columns reorder backlog todo in-progress review done
|
|
8
|
+
* brainfile columns remove review --move-to in-progress
|
|
9
|
+
*
|
|
10
|
+
* The edits are core's (`addColumnFile` and friends), written through the
|
|
11
|
+
* board config writer; the MCP `columns` tool calls the same functions.
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
import { type ColumnConfig, type ColumnSummary } from '@brainfile/core';
|
|
16
|
+
import { type Logger } from '../utils/logger';
|
|
17
|
+
export declare const COLUMNS_COMMAND_HELP: string;
|
|
18
|
+
export interface ColumnsBaseOptions {
|
|
19
|
+
file?: string;
|
|
20
|
+
json?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface ColumnsAddOptions extends ColumnsBaseOptions {
|
|
23
|
+
id?: string;
|
|
24
|
+
after?: string;
|
|
25
|
+
before?: string;
|
|
26
|
+
completion?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface ColumnsRemoveOptions extends ColumnsBaseOptions {
|
|
29
|
+
moveTo?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ColumnsCommandResult {
|
|
32
|
+
success: true;
|
|
33
|
+
columns: ColumnSummary[];
|
|
34
|
+
column?: ColumnConfig;
|
|
35
|
+
moved?: string[];
|
|
36
|
+
movedTo?: ColumnConfig;
|
|
37
|
+
}
|
|
38
|
+
/** `columns` / `columns list`: every column, in order, with its task count. */
|
|
39
|
+
export declare function columnsListCommand(options: ColumnsBaseOptions, logger?: Logger): ColumnsCommandResult;
|
|
40
|
+
/** `columns add <title>`: a new column, last unless --after or --before. */
|
|
41
|
+
export declare function columnsAddCommand(title: string | undefined, options: ColumnsAddOptions, logger?: Logger): ColumnsCommandResult;
|
|
42
|
+
/** `columns rename <column> <title>`: a new title; the ID, and the tasks, stay. */
|
|
43
|
+
export declare function columnsRenameCommand(column: string | undefined, title: string | undefined, options: ColumnsBaseOptions, logger?: Logger): ColumnsCommandResult;
|
|
44
|
+
/** `columns reorder <column...>`: the ones named first, the rest after in their order. */
|
|
45
|
+
export declare function columnsReorderCommand(order: string[] | undefined, options: ColumnsBaseOptions, logger?: Logger): ColumnsCommandResult;
|
|
46
|
+
/** `columns remove <column> [--move-to <column>]`. */
|
|
47
|
+
export declare function columnsRemoveCommand(column: string | undefined, options: ColumnsRemoveOptions, logger?: Logger): ColumnsCommandResult;
|
|
48
|
+
//# sourceMappingURL=columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/commands/columns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,iBAAiB,CAAC;AAM7D,eAAO,MAAM,oBAAoB,QAWsB,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AA8CD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,GAAE,MAAsB,GAAG,oBAAoB,CAGpH;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,GAAE,MAAsB,GAAG,oBAAoB,CAW7I;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,GAAE,MAAsB,GAAG,oBAAoB,CAK7K;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,GAAE,MAAsB,GAAG,oBAAoB,CAIpJ;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,GAAE,MAAsB,GAAG,oBAAoB,CAUpJ"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `brainfile columns` (spec-13): the board's columns.
|
|
4
|
+
*
|
|
5
|
+
* brainfile columns list them, with task counts
|
|
6
|
+
* brainfile columns add "In Review" --after in-progress
|
|
7
|
+
* brainfile columns rename in-review "Review"
|
|
8
|
+
* brainfile columns reorder backlog todo in-progress review done
|
|
9
|
+
* brainfile columns remove review --move-to in-progress
|
|
10
|
+
*
|
|
11
|
+
* The edits are core's (`addColumnFile` and friends), written through the
|
|
12
|
+
* board config writer; the MCP `columns` tool calls the same functions.
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.COLUMNS_COMMAND_HELP = void 0;
|
|
21
|
+
exports.columnsListCommand = columnsListCommand;
|
|
22
|
+
exports.columnsAddCommand = columnsAddCommand;
|
|
23
|
+
exports.columnsRenameCommand = columnsRenameCommand;
|
|
24
|
+
exports.columnsReorderCommand = columnsReorderCommand;
|
|
25
|
+
exports.columnsRemoveCommand = columnsRemoveCommand;
|
|
26
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
27
|
+
const core_1 = require("@brainfile/core");
|
|
28
|
+
const logger_1 = require("../utils/logger");
|
|
29
|
+
const cli_error_1 = require("../utils/cli-error");
|
|
30
|
+
const errorHandler_1 = require("../utils/errorHandler");
|
|
31
|
+
const brainfile_path_1 = require("../utils/brainfile-path");
|
|
32
|
+
const v2_only_1 = require("../utils/v2-only");
|
|
33
|
+
exports.COLUMNS_COMMAND_HELP = `
|
|
34
|
+
Examples:
|
|
35
|
+
brainfile columns List them, with task counts
|
|
36
|
+
brainfile columns add "In Review" --after in-progress
|
|
37
|
+
brainfile columns add Shipped --completion Tasks moved there are completed
|
|
38
|
+
brainfile columns rename in-review Review The ID stays, so its tasks stay
|
|
39
|
+
brainfile columns reorder backlog todo in-progress The ones named first, the rest after
|
|
40
|
+
brainfile columns remove review --move-to in-progress
|
|
41
|
+
|
|
42
|
+
Columns are named by ID or title. remove refuses a column that still holds
|
|
43
|
+
tasks unless --move-to says where they go; they move there without being
|
|
44
|
+
completed. The last column is never removed.`.trimEnd();
|
|
45
|
+
function boardPath(file) {
|
|
46
|
+
const filePath = (0, brainfile_path_1.resolveCliBrainfilePath)(file);
|
|
47
|
+
(0, v2_only_1.assertV2Brainfile)(filePath);
|
|
48
|
+
return filePath;
|
|
49
|
+
}
|
|
50
|
+
function unwrap(result, hint) {
|
|
51
|
+
if (!result.success || !result.columns) {
|
|
52
|
+
throw new cli_error_1.CLIError(result.error ?? 'The columns were not changed', errorHandler_1.ExitCode.USER_ERROR, hint);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
columns: result.columns,
|
|
57
|
+
...(result.column ? { column: result.column } : {}),
|
|
58
|
+
...(result.moved ? { moved: result.moved } : {}),
|
|
59
|
+
...(result.movedTo ? { movedTo: result.movedTo } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function printColumns(columns, logger) {
|
|
63
|
+
const idWidth = Math.max('ID'.length, ...columns.map((c) => c.id.length));
|
|
64
|
+
const titleWidth = Math.max('TITLE'.length, ...columns.map((c) => c.title.length));
|
|
65
|
+
logger.log(chalk_1.default.gray(` ${'ID'.padEnd(idWidth)} ${'TITLE'.padEnd(titleWidth)} TASKS`));
|
|
66
|
+
for (const column of columns) {
|
|
67
|
+
const count = String(column.taskCount).padEnd(5);
|
|
68
|
+
const note = column.completionColumn ? chalk_1.default.gray(' completion column') : '';
|
|
69
|
+
logger.log(` ${column.id.padEnd(idWidth)} ${column.title.padEnd(titleWidth)} ${count}${note}`.trimEnd());
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function report(result, options, headline, logger) {
|
|
73
|
+
if (options.json) {
|
|
74
|
+
const { success: _success, ...payload } = result;
|
|
75
|
+
logger.log(JSON.stringify(payload, null, 2));
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
if (headline) {
|
|
79
|
+
logger.log(chalk_1.default.green(headline));
|
|
80
|
+
logger.log('');
|
|
81
|
+
}
|
|
82
|
+
printColumns(result.columns, logger);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
/** `columns` / `columns list`: every column, in order, with its task count. */
|
|
86
|
+
function columnsListCommand(options, logger = logger_1.defaultLogger) {
|
|
87
|
+
const result = unwrap((0, core_1.listColumnsFile)(boardPath(options.file)));
|
|
88
|
+
return report(result, options, null, logger);
|
|
89
|
+
}
|
|
90
|
+
/** `columns add <title>`: a new column, last unless --after or --before. */
|
|
91
|
+
function columnsAddCommand(title, options, logger = logger_1.defaultLogger) {
|
|
92
|
+
if (!title?.trim())
|
|
93
|
+
throw (0, cli_error_1.missingRequired)('<title>', 'brainfile columns add <title> [--id <id>] [--after <column> | --before <column>] [--completion]');
|
|
94
|
+
const result = unwrap((0, core_1.addColumnFile)(boardPath(options.file), {
|
|
95
|
+
title,
|
|
96
|
+
...(options.id ? { id: options.id } : {}),
|
|
97
|
+
...(options.after ? { after: options.after } : {}),
|
|
98
|
+
...(options.before ? { before: options.before } : {}),
|
|
99
|
+
...(options.completion ? { completionColumn: true } : {}),
|
|
100
|
+
}));
|
|
101
|
+
const column = result.column;
|
|
102
|
+
return report(result, options, `Added column ${column.id} (${column.title}).`, logger);
|
|
103
|
+
}
|
|
104
|
+
/** `columns rename <column> <title>`: a new title; the ID, and the tasks, stay. */
|
|
105
|
+
function columnsRenameCommand(column, title, options, logger = logger_1.defaultLogger) {
|
|
106
|
+
if (!column?.trim() || !title?.trim())
|
|
107
|
+
throw (0, cli_error_1.missingRequired)('<column> and <title>', 'brainfile columns rename <column> <title>');
|
|
108
|
+
const result = unwrap((0, core_1.renameColumnFile)(boardPath(options.file), column, title));
|
|
109
|
+
const renamed = result.column;
|
|
110
|
+
return report(result, options, `Renamed column ${renamed.id} to ${renamed.title}.`, logger);
|
|
111
|
+
}
|
|
112
|
+
/** `columns reorder <column...>`: the ones named first, the rest after in their order. */
|
|
113
|
+
function columnsReorderCommand(order, options, logger = logger_1.defaultLogger) {
|
|
114
|
+
if (!order || order.length === 0)
|
|
115
|
+
throw (0, cli_error_1.missingRequired)('<columns...>', 'brainfile columns reorder <column> [column...]');
|
|
116
|
+
const result = unwrap((0, core_1.reorderColumnsFile)(boardPath(options.file), order));
|
|
117
|
+
return report(result, options, 'Columns reordered.', logger);
|
|
118
|
+
}
|
|
119
|
+
/** `columns remove <column> [--move-to <column>]`. */
|
|
120
|
+
function columnsRemoveCommand(column, options, logger = logger_1.defaultLogger) {
|
|
121
|
+
if (!column?.trim())
|
|
122
|
+
throw (0, cli_error_1.missingRequired)('<column>', 'brainfile columns remove <column> [--move-to <column>]');
|
|
123
|
+
const raw = (0, core_1.removeColumnFile)(boardPath(options.file), column, options.moveTo ? { moveTo: options.moveTo } : {});
|
|
124
|
+
const holdsTasks = !raw.success && !options.moveTo && /holds \d+ task/.test(raw.error ?? '');
|
|
125
|
+
const result = unwrap(raw, holdsTasks ? `To move them first: brainfile columns remove ${column} --move-to <column>` : undefined);
|
|
126
|
+
const removed = result.column;
|
|
127
|
+
const moved = result.moved && result.moved.length > 0 && result.movedTo
|
|
128
|
+
? `; moved ${result.moved.join(', ')} to ${result.movedTo.id}`
|
|
129
|
+
: '';
|
|
130
|
+
return report(result, options, `Removed column ${removed.id}${moved}.`, logger);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.js","sourceRoot":"","sources":["../../src/commands/columns.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,20 +87,25 @@ function completeV2(filePath, taskId, force, logger) {
|
|
|
87
87
|
}
|
|
88
88
|
const { doc, filePath: taskPath } = found;
|
|
89
89
|
const task = doc.task;
|
|
90
|
-
const
|
|
90
|
+
const types = (0, core_1.readBoardConfig)(filePath)?.config.types;
|
|
91
|
+
const typeName = (0, core_1.resolveDocType)(task.type, types).name;
|
|
92
|
+
const label = typeName.charAt(0).toUpperCase() + typeName.slice(1);
|
|
93
|
+
// Any parent with open children refuses, not only an epic (spec-12);
|
|
94
|
+
// a decision is never completed.
|
|
95
|
+
const result = (0, core_1.completeTaskFile)(taskPath, dirs.logsDir, { force, types });
|
|
91
96
|
if (!result.success) {
|
|
92
97
|
if (result.incompleteChildren?.length) {
|
|
93
|
-
logger.warn(chalk_1.default.yellow(
|
|
98
|
+
logger.warn(chalk_1.default.yellow(`${label} ${taskId} has incomplete child tasks:`));
|
|
94
99
|
for (const child of result.incompleteChildren) {
|
|
95
100
|
logger.warn(chalk_1.default.yellow(` - ${child.id}: ${child.title}`));
|
|
96
101
|
}
|
|
97
102
|
logger.warn(chalk_1.default.yellow('Aborting completion. Re-run with --force to override.'));
|
|
98
|
-
throw (0, cli_error_1.operationFailed)(
|
|
103
|
+
throw (0, cli_error_1.operationFailed)(`${label} ${taskId} has ${result.incompleteChildren.length} incomplete child task(s). Use --force to override.`);
|
|
99
104
|
}
|
|
100
105
|
throw (0, cli_error_1.operationFailed)(result.error || `Failed to complete task: ${taskId}`);
|
|
101
106
|
}
|
|
102
107
|
if (result.incompleteChildren?.length) {
|
|
103
|
-
logger.warn(chalk_1.default.yellow(`Completing
|
|
108
|
+
logger.warn(chalk_1.default.yellow(`Completing ${typeName} ${taskId} with --force despite ${result.incompleteChildren.length} incomplete child task(s).`));
|
|
104
109
|
}
|
|
105
110
|
const completedAt = result.task?.completedAt ?? new Date().toISOString();
|
|
106
111
|
logger.log(chalk_1.default.green('Task completed!'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CH,0CASC;AAjDD,2CAA6B;AAC7B,kDAA0B;AAC1B,4CAA6D;AAC7D,kDAAoF;AACpF,4DAAkE;AAClE,8CAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"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"}
|