@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.
- package/.brainfile/brainfile.md.v1.bak +171 -0
- package/.brainfile/logs/task-1.md +206 -0
- package/.brainfile/logs/task-2.md +482 -0
- package/.brainfile/logs/task-3.md +314 -0
- package/.github/workflows/release.yml +35 -0
- package/README.md +3 -5
- package/dist/cli.js +30 -53
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +16 -2
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/complete.d.ts +5 -7
- package/dist/commands/complete.d.ts.map +1 -1
- package/dist/commands/complete.js +76 -127
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/contract.d.ts +46 -2
- package/dist/commands/contract.d.ts.map +1 -1
- package/dist/commands/contract.js +499 -2
- package/dist/commands/contract.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +1037 -1763
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/migrate.d.ts +2 -2
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +127 -89
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/move.js.map +1 -1
- package/dist/commands/schema.d.ts.map +1 -1
- package/dist/commands/schema.js +6 -1
- package/dist/commands/schema.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/contractRunner.d.ts.map +1 -1
- package/dist/lib/contractRunner.js +76 -49
- package/dist/lib/contractRunner.js.map +1 -1
- package/dist/mcp/tools/contract.d.ts +25 -0
- package/dist/mcp/tools/contract.d.ts.map +1 -0
- package/dist/mcp/tools/contract.js +33 -0
- package/dist/mcp/tools/contract.js.map +1 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +22 -9
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/contractSpec.d.ts +2 -0
- package/dist/utils/contractSpec.d.ts.map +1 -1
- package/dist/utils/contractSpec.js +5 -1
- package/dist/utils/contractSpec.js.map +1 -1
- package/dist/utils/hook-settings.d.ts.map +1 -1
- package/dist/utils/hook-settings.js +5 -1
- package/dist/utils/hook-settings.js.map +1 -1
- package/dist/validation/command-lint.d.ts +11 -0
- package/dist/validation/command-lint.d.ts.map +1 -0
- package/dist/validation/command-lint.js +88 -0
- package/dist/validation/command-lint.js.map +1 -0
- package/package.json +2 -2
- package/dist/commands/context.d.ts +0 -19
- package/dist/commands/context.d.ts.map +0 -1
- package/dist/commands/context.js +0 -103
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/history.d.ts +0 -18
- package/dist/commands/history.d.ts.map +0 -1
- package/dist/commands/history.js +0 -92
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/ledger-rebuild.d.ts +0 -17
- package/dist/commands/ledger-rebuild.d.ts.map +0 -1
- package/dist/commands/ledger-rebuild.js +0 -287
- package/dist/commands/ledger-rebuild.js.map +0 -1
- package/dist/commands/ledger.d.ts +0 -20
- package/dist/commands/ledger.d.ts.map +0 -1
- package/dist/commands/ledger.js +0 -111
- package/dist/commands/ledger.js.map +0 -1
- package/dist/commands/migrate-ledger.d.ts +0 -17
- package/dist/commands/migrate-ledger.d.ts.map +0 -1
- package/dist/commands/migrate-ledger.js +0 -127
- package/dist/commands/migrate-ledger.js.map +0 -1
- package/dist/commands/stats.d.ts +0 -20
- package/dist/commands/stats.d.ts.map +0 -1
- package/dist/commands/stats.js +0 -151
- package/dist/commands/stats.js.map +0 -1
- package/dist/tui/components/ArchivePanel.d.ts +0 -16
- package/dist/tui/components/ArchivePanel.d.ts.map +0 -1
- package/dist/tui/components/ArchivePanel.js +0 -115
- package/dist/tui/components/ArchivePanel.js.map +0 -1
- package/dist/utils/date-helpers.d.ts +0 -20
- package/dist/utils/date-helpers.d.ts.map +0 -1
- package/dist/utils/date-helpers.js +0 -54
- package/dist/utils/date-helpers.js.map +0 -1
- package/dist/utils/v2-tasks.d.ts +0 -121
- package/dist/utils/v2-tasks.d.ts.map +0 -1
- package/dist/utils/v2-tasks.js +0 -384
- package/dist/utils/v2-tasks.js.map +0 -1
package/dist/commands/stats.js
DELETED
|
@@ -1,151 +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.statsCommand = statsCommand;
|
|
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 averageCycleTime(records) {
|
|
49
|
-
if (records.length === 0) {
|
|
50
|
-
return 0;
|
|
51
|
-
}
|
|
52
|
-
const total = records.reduce((sum, record) => sum + record.cycleTimeHours, 0);
|
|
53
|
-
return Number((total / records.length).toFixed(3));
|
|
54
|
-
}
|
|
55
|
-
function findTopAssignee(records) {
|
|
56
|
-
const counts = new Map();
|
|
57
|
-
for (const record of records) {
|
|
58
|
-
if (!record.assignee) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
counts.set(record.assignee, (counts.get(record.assignee) || 0) + 1);
|
|
62
|
-
}
|
|
63
|
-
let topName;
|
|
64
|
-
let topCount = -1;
|
|
65
|
-
for (const [name, count] of counts.entries()) {
|
|
66
|
-
if (count > topCount || (count === topCount && topName && name < topName)) {
|
|
67
|
-
topName = name;
|
|
68
|
-
topCount = count;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return topName;
|
|
72
|
-
}
|
|
73
|
-
function buildTagDistribution(records) {
|
|
74
|
-
const counts = new Map();
|
|
75
|
-
for (const record of records) {
|
|
76
|
-
for (const tag of record.tags || []) {
|
|
77
|
-
counts.set(tag, (counts.get(tag) || 0) + 1);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
const sorted = [...counts.entries()].sort((a, b) => {
|
|
81
|
-
if (b[1] !== a[1]) {
|
|
82
|
-
return b[1] - a[1];
|
|
83
|
-
}
|
|
84
|
-
return a[0].localeCompare(b[0]);
|
|
85
|
-
});
|
|
86
|
-
const distribution = {};
|
|
87
|
-
for (const [tag, count] of sorted) {
|
|
88
|
-
distribution[tag] = count;
|
|
89
|
-
}
|
|
90
|
-
return distribution;
|
|
91
|
-
}
|
|
92
|
-
function calculateValidationFailureRate(records) {
|
|
93
|
-
const validated = records.filter((record) => record.contractStatus === 'done' || record.contractStatus === 'failed');
|
|
94
|
-
if (validated.length === 0) {
|
|
95
|
-
return 0;
|
|
96
|
-
}
|
|
97
|
-
const failures = validated.filter((record) => record.contractStatus === 'failed').length;
|
|
98
|
-
return Number(((failures / validated.length) * 100).toFixed(2));
|
|
99
|
-
}
|
|
100
|
-
function displayStats(result, logger) {
|
|
101
|
-
logger.log('');
|
|
102
|
-
logger.log(chalk_1.default.bold('Ledger stats'));
|
|
103
|
-
logger.log(chalk_1.default.gray('─'.repeat(40)));
|
|
104
|
-
logger.log(` ${chalk_1.default.gray('Total completed:')} ${result.totalCompleted}`);
|
|
105
|
-
logger.log(` ${chalk_1.default.gray('Avg cycle time:')} ${result.avgCycleTimeHours.toFixed(2)}h`);
|
|
106
|
-
logger.log(` ${chalk_1.default.gray('Top assignee:')} ${result.topAssignee || 'n/a'}`);
|
|
107
|
-
logger.log(` ${chalk_1.default.gray('Validation failure rate:')} ${result.validationFailureRate.toFixed(2)}%`);
|
|
108
|
-
const tags = Object.entries(result.tagDistribution);
|
|
109
|
-
if (tags.length === 0) {
|
|
110
|
-
logger.log(` ${chalk_1.default.gray('Tag distribution:')} n/a`);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
logger.log(` ${chalk_1.default.gray('Tag distribution:')}`);
|
|
114
|
-
for (const [tag, count] of tags) {
|
|
115
|
-
logger.log(` - #${tag}: ${count}`);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
logger.log('');
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Aggregate completion analytics from ledger data.
|
|
122
|
-
*/
|
|
123
|
-
function statsCommand(options, logger = logger_1.defaultLogger) {
|
|
124
|
-
const filePath = (0, brainfile_path_1.resolveCliBrainfilePath)(options.file);
|
|
125
|
-
if (!fs.existsSync(filePath)) {
|
|
126
|
-
throw (0, cli_error_1.fileNotFound)(filePath);
|
|
127
|
-
}
|
|
128
|
-
if (!(0, v2_detect_1.isV2)(filePath)) {
|
|
129
|
-
throw (0, cli_error_1.operationFailed)('Stats command requires v2 per-task file architecture. Run: brainfile migrate');
|
|
130
|
-
}
|
|
131
|
-
const dateRange = (0, date_helpers_1.buildDateRange)(options.since);
|
|
132
|
-
const assignee = options.assignee?.trim();
|
|
133
|
-
const tag = options.tag?.trim();
|
|
134
|
-
const dirs = (0, v2_detect_1.getV2Dirs)(filePath);
|
|
135
|
-
const records = (0, dist_1.queryLedger)(dirs.logsDir, {
|
|
136
|
-
assignee: assignee || undefined,
|
|
137
|
-
tags: tag ? [tag] : undefined,
|
|
138
|
-
dateRange,
|
|
139
|
-
});
|
|
140
|
-
const result = {
|
|
141
|
-
success: true,
|
|
142
|
-
totalCompleted: records.length,
|
|
143
|
-
avgCycleTimeHours: averageCycleTime(records),
|
|
144
|
-
topAssignee: findTopAssignee(records),
|
|
145
|
-
tagDistribution: buildTagDistribution(records),
|
|
146
|
-
validationFailureRate: calculateValidationFailureRate(records),
|
|
147
|
-
};
|
|
148
|
-
displayStats(result, logger);
|
|
149
|
-
return result;
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=stats.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { Task } from '@brainfile/core';
|
|
3
|
-
import type { BoardColumn, LayoutMode } from '../types.js';
|
|
4
|
-
export interface ArchivePanelProps {
|
|
5
|
-
archive: Task[];
|
|
6
|
-
selectedIndex: number;
|
|
7
|
-
viewportHeight: number;
|
|
8
|
-
termWidth: number;
|
|
9
|
-
expandedIds: Set<string>;
|
|
10
|
-
mode: string;
|
|
11
|
-
columns: BoardColumn[];
|
|
12
|
-
restoreColumnIndex: number;
|
|
13
|
-
layoutMode?: LayoutMode;
|
|
14
|
-
}
|
|
15
|
-
export declare function ArchivePanel({ archive, selectedIndex, viewportHeight, termWidth, expandedIds, mode, columns, restoreColumnIndex, layoutMode, }: ArchivePanelProps): React.JSX.Element;
|
|
16
|
-
//# sourceMappingURL=ArchivePanel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ArchivePanel.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ArchivePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,aAAa,EACb,cAAc,EACd,SAAS,EACT,WAAW,EACX,IAAI,EACJ,OAAO,EACP,kBAAkB,EAClB,UAAmB,GACpB,EAAE,iBAAiB,qBAqKnB"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.ArchivePanel = ArchivePanel;
|
|
7
|
-
const react_1 = __importDefault(require("react"));
|
|
8
|
-
const ink_1 = require("ink");
|
|
9
|
-
const theme_js_1 = require("../theme.js");
|
|
10
|
-
const utils_js_1 = require("../utils.js");
|
|
11
|
-
function ArchivePanel({ archive, selectedIndex, viewportHeight, termWidth, expandedIds, mode, columns, restoreColumnIndex, layoutMode = 'wide', }) {
|
|
12
|
-
const maxWidth = Math.max(termWidth - 8, 20);
|
|
13
|
-
// Calculate scroll offset
|
|
14
|
-
const scrollPadding = 2;
|
|
15
|
-
const headerRows = layoutMode === 'narrow' ? 4 : 6;
|
|
16
|
-
const visibleTasks = Math.max(viewportHeight - headerRows, 3);
|
|
17
|
-
let scrollOffset = 0;
|
|
18
|
-
if (selectedIndex >= visibleTasks - scrollPadding) {
|
|
19
|
-
scrollOffset = Math.min(selectedIndex - visibleTasks + scrollPadding + 1, Math.max(0, archive.length - visibleTasks));
|
|
20
|
-
}
|
|
21
|
-
const selectedTask = archive[selectedIndex];
|
|
22
|
-
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 1 },
|
|
23
|
-
react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
|
|
24
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
25
|
-
archive.length,
|
|
26
|
-
" archived",
|
|
27
|
-
layoutMode === 'wide' ? ` task${archive.length !== 1 ? 's' : ''}` : ''),
|
|
28
|
-
layoutMode === 'wide' && (react_1.default.createElement(ink_1.Box, { marginLeft: 2 },
|
|
29
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
30
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "j/k"),
|
|
31
|
-
" select",
|
|
32
|
-
' ',
|
|
33
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "Enter"),
|
|
34
|
-
" expand",
|
|
35
|
-
' ',
|
|
36
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "R"),
|
|
37
|
-
" restore",
|
|
38
|
-
' ',
|
|
39
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "d"),
|
|
40
|
-
" delete")))),
|
|
41
|
-
react_1.default.createElement(ink_1.Box, null,
|
|
42
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.border }, theme_js_1.BOX.horizontal.repeat(Math.max(1, termWidth - 4)))),
|
|
43
|
-
mode === 'archive-restore' && selectedTask && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginY: 1 },
|
|
44
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent },
|
|
45
|
-
"Restore \"",
|
|
46
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text }, (0, utils_js_1.truncate)(selectedTask.title, 30)),
|
|
47
|
-
"\" to:"),
|
|
48
|
-
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 }, columns.map((col, idx) => (react_1.default.createElement(ink_1.Box, { key: col.id },
|
|
49
|
-
react_1.default.createElement(ink_1.Text, { color: idx === restoreColumnIndex ? theme_js_1.PALETTE.text : theme_js_1.PALETTE.textMuted, backgroundColor: idx === restoreColumnIndex ? theme_js_1.PALETTE.bgHighlight : undefined, bold: idx === restoreColumnIndex },
|
|
50
|
-
idx === restoreColumnIndex ? theme_js_1.ICONS.pointer : ' ',
|
|
51
|
-
" ",
|
|
52
|
-
col.title,
|
|
53
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim },
|
|
54
|
-
" (",
|
|
55
|
-
col.tasks?.length ?? 0,
|
|
56
|
-
")")))))),
|
|
57
|
-
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
58
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, "j/k to select, Enter to restore, Esc to cancel")))),
|
|
59
|
-
mode === 'archive-delete-confirm' && selectedTask && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginY: 1, paddingX: 1 },
|
|
60
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.error, bold: true }, "Permanently delete this task?"),
|
|
61
|
-
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
62
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
63
|
-
selectedTask.id,
|
|
64
|
-
": ",
|
|
65
|
-
(0, utils_js_1.truncate)(selectedTask.title, maxWidth - 15))),
|
|
66
|
-
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
67
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.warning }, "This cannot be undone.")),
|
|
68
|
-
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
69
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
70
|
-
"Press ",
|
|
71
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success }, "y"),
|
|
72
|
-
" to confirm, ",
|
|
73
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.error }, "n"),
|
|
74
|
-
" to cancel")))),
|
|
75
|
-
mode !== 'archive-restore' && mode !== 'archive-delete-confirm' && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
|
|
76
|
-
archive.length === 0 ? (react_1.default.createElement(ink_1.Box, { paddingY: 1 },
|
|
77
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, "No archived tasks."))) : (archive.slice(scrollOffset, scrollOffset + visibleTasks).map((task, displayIdx) => {
|
|
78
|
-
const actualIdx = scrollOffset + displayIdx;
|
|
79
|
-
const isSelected = actualIdx === selectedIndex;
|
|
80
|
-
const isExpanded = expandedIds.has(task.id);
|
|
81
|
-
return (react_1.default.createElement(ink_1.Box, { key: task.id, flexDirection: "column", paddingY: 0 },
|
|
82
|
-
react_1.default.createElement(ink_1.Box, null,
|
|
83
|
-
react_1.default.createElement(ink_1.Text, { color: isSelected ? theme_js_1.PALETTE.text : theme_js_1.PALETTE.textSecondary, backgroundColor: isSelected ? theme_js_1.PALETTE.bgHighlight : undefined, bold: isSelected },
|
|
84
|
-
isSelected ? theme_js_1.ICONS.pointer : ' ',
|
|
85
|
-
' ',
|
|
86
|
-
isExpanded ? theme_js_1.ICONS.expanded : theme_js_1.ICONS.collapsed,
|
|
87
|
-
' ',
|
|
88
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim }, task.id),
|
|
89
|
-
' ',
|
|
90
|
-
(0, utils_js_1.truncate)(task.title, maxWidth - task.id.length - 8),
|
|
91
|
-
task.priority && (react_1.default.createElement(ink_1.Text, { color: (0, utils_js_1.getPriorityColor)(task.priority) },
|
|
92
|
-
" [",
|
|
93
|
-
task.priority,
|
|
94
|
-
"]")))),
|
|
95
|
-
isExpanded && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginLeft: 4, marginBottom: 1 },
|
|
96
|
-
task.description && (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, (0, utils_js_1.truncate)(task.description, maxWidth - 6))),
|
|
97
|
-
task.tags && task.tags.length > 0 && (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent }, task.tags.map(t => `#${t}`).join(' '))),
|
|
98
|
-
task.assignee && (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
99
|
-
"@",
|
|
100
|
-
task.assignee)),
|
|
101
|
-
task.subtasks && task.subtasks.length > 0 && (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
102
|
-
"Subtasks: ",
|
|
103
|
-
task.subtasks.filter(s => s.completed).length,
|
|
104
|
-
"/",
|
|
105
|
-
task.subtasks.length))))));
|
|
106
|
-
})),
|
|
107
|
-
archive.length > visibleTasks && (react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
108
|
-
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim },
|
|
109
|
-
scrollOffset + 1,
|
|
110
|
-
"-",
|
|
111
|
-
Math.min(scrollOffset + visibleTasks, archive.length),
|
|
112
|
-
" of ",
|
|
113
|
-
archive.length)))))));
|
|
114
|
-
}
|
|
115
|
-
//# sourceMappingURL=ArchivePanel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ArchivePanel.js","sourceRoot":"","sources":["../../../src/tui/components/ArchivePanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { LedgerDateRange } from '../../../core/dist';
|
|
2
|
-
/**
|
|
3
|
-
* Parse a date string and return an ISO-8601 string.
|
|
4
|
-
* Throws a validationError with the given flag name on invalid input.
|
|
5
|
-
*/
|
|
6
|
-
export declare function parseIsoDate(value: string, flagName: string): string;
|
|
7
|
-
/**
|
|
8
|
-
* Build a LedgerDateRange from optional --since/--until string values.
|
|
9
|
-
*/
|
|
10
|
-
export declare function buildDateRange(since?: string, until?: string): LedgerDateRange | undefined;
|
|
11
|
-
/**
|
|
12
|
-
* Build a LedgerDateRange representing "from N days ago".
|
|
13
|
-
*/
|
|
14
|
-
export declare function buildMaxAgeDateRange(maxAgeDays: number): LedgerDateRange;
|
|
15
|
-
/**
|
|
16
|
-
* Validate and return a positive integer, or throw with the given flag name.
|
|
17
|
-
*/
|
|
18
|
-
export declare function parsePositiveInt(value: number | undefined, flagName: string, fallback: number): number;
|
|
19
|
-
export declare function parsePositiveInt(value: number | undefined, flagName: string): number | undefined;
|
|
20
|
-
//# sourceMappingURL=date-helpers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/date-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAmB1F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAGxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;AACxG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseIsoDate = parseIsoDate;
|
|
4
|
-
exports.buildDateRange = buildDateRange;
|
|
5
|
-
exports.buildMaxAgeDateRange = buildMaxAgeDateRange;
|
|
6
|
-
exports.parsePositiveInt = parsePositiveInt;
|
|
7
|
-
const cli_error_1 = require("./cli-error");
|
|
8
|
-
/**
|
|
9
|
-
* Parse a date string and return an ISO-8601 string.
|
|
10
|
-
* Throws a validationError with the given flag name on invalid input.
|
|
11
|
-
*/
|
|
12
|
-
function parseIsoDate(value, flagName) {
|
|
13
|
-
const parsed = Date.parse(value);
|
|
14
|
-
if (!Number.isFinite(parsed)) {
|
|
15
|
-
throw (0, cli_error_1.validationError)(`${flagName} must be a valid date (received: ${value})`);
|
|
16
|
-
}
|
|
17
|
-
return new Date(parsed).toISOString();
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Build a LedgerDateRange from optional --since/--until string values.
|
|
21
|
-
*/
|
|
22
|
-
function buildDateRange(since, until) {
|
|
23
|
-
const range = {};
|
|
24
|
-
if (since) {
|
|
25
|
-
range.from = parseIsoDate(since, '--since');
|
|
26
|
-
}
|
|
27
|
-
if (until) {
|
|
28
|
-
range.to = parseIsoDate(until, '--until');
|
|
29
|
-
}
|
|
30
|
-
if (!range.from && !range.to) {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
if (range.from && range.to && range.from > range.to) {
|
|
34
|
-
throw (0, cli_error_1.validationError)('--since cannot be later than --until');
|
|
35
|
-
}
|
|
36
|
-
return range;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Build a LedgerDateRange representing "from N days ago".
|
|
40
|
-
*/
|
|
41
|
-
function buildMaxAgeDateRange(maxAgeDays) {
|
|
42
|
-
const msPerDay = 24 * 60 * 60 * 1000;
|
|
43
|
-
return { from: new Date(Date.now() - maxAgeDays * msPerDay).toISOString() };
|
|
44
|
-
}
|
|
45
|
-
function parsePositiveInt(value, flagName, fallback) {
|
|
46
|
-
if (value === undefined) {
|
|
47
|
-
return fallback;
|
|
48
|
-
}
|
|
49
|
-
if (!Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {
|
|
50
|
-
throw (0, cli_error_1.validationError)(`${flagName} must be a positive integer`);
|
|
51
|
-
}
|
|
52
|
-
return value;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=date-helpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-helpers.js","sourceRoot":"","sources":["../../src/utils/date-helpers.ts"],"names":[],"mappings":";;AAOA,oCAMC;AAKD,wCAmBC;AAKD,oDAGC;AAOD,4CAQC;AA3DD,2CAA8C;AAE9C;;;GAGG;AACH,SAAgB,YAAY,CAAC,KAAa,EAAE,QAAgB;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAA,2BAAe,EAAC,GAAG,QAAQ,oCAAoC,KAAK,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAc,EAAE,KAAc;IAC3D,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,IAAA,2BAAe,EAAC,sCAAsC,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,UAAkB;IACrD,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAC9E,CAAC;AAOD,SAAgB,gBAAgB,CAAC,KAAyB,EAAE,QAAgB,EAAE,QAAiB;IAC7F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,IAAA,2BAAe,EAAC,GAAG,QAAQ,6BAA6B,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/utils/v2-tasks.d.ts
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* V2 per-task file architecture utilities.
|
|
3
|
-
*
|
|
4
|
-
* In v2, tasks live as individual .md files in .brainfile/tasks/ (active)
|
|
5
|
-
* and .brainfile/logs/ (completed). The brainfile.md is config-only.
|
|
6
|
-
*
|
|
7
|
-
* Task file format:
|
|
8
|
-
* ---
|
|
9
|
-
* id: task-1
|
|
10
|
-
* title: My Task
|
|
11
|
-
* column: todo
|
|
12
|
-
* position: 0
|
|
13
|
-
* priority: high
|
|
14
|
-
* tags: [bug, urgent]
|
|
15
|
-
* assignee: alice
|
|
16
|
-
* contract:
|
|
17
|
-
* status: ready
|
|
18
|
-
* ...
|
|
19
|
-
* ---
|
|
20
|
-
*
|
|
21
|
-
* ## Description
|
|
22
|
-
* Task description here...
|
|
23
|
-
*
|
|
24
|
-
* ## Log
|
|
25
|
-
* - 2026-02-18T10:00:00Z: Created task
|
|
26
|
-
*
|
|
27
|
-
* @packageDocumentation
|
|
28
|
-
*/
|
|
29
|
-
import type { Task, Board } from '@brainfile/core';
|
|
30
|
-
export interface V2Task extends Task {
|
|
31
|
-
column: string;
|
|
32
|
-
position: number;
|
|
33
|
-
completedAt?: string;
|
|
34
|
-
}
|
|
35
|
-
export interface V2TaskFile {
|
|
36
|
-
frontmatter: V2Task;
|
|
37
|
-
description?: string;
|
|
38
|
-
log?: string;
|
|
39
|
-
rawMarkdown: string;
|
|
40
|
-
}
|
|
41
|
-
export interface V2Dirs {
|
|
42
|
-
dotDir: string;
|
|
43
|
-
tasksDir: string;
|
|
44
|
-
logsDir: string;
|
|
45
|
-
brainfilePath: string;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Get the v2 directory structure paths from a brainfile path.
|
|
49
|
-
*/
|
|
50
|
-
export declare function getV2Dirs(brainfilePath: string): V2Dirs;
|
|
51
|
-
/**
|
|
52
|
-
* Check if a brainfile is using v2 per-task file architecture.
|
|
53
|
-
* V2 is detected by the presence of a tasks/ directory in .brainfile/.
|
|
54
|
-
*/
|
|
55
|
-
export declare function isV2(brainfilePath: string): boolean;
|
|
56
|
-
/**
|
|
57
|
-
* Get the file path for a task.
|
|
58
|
-
*/
|
|
59
|
-
export declare function getTaskFilePath(tasksDir: string, taskId: string): string;
|
|
60
|
-
/**
|
|
61
|
-
* Get the file path for a completed task (log).
|
|
62
|
-
*/
|
|
63
|
-
export declare function getLogFilePath(logsDir: string, taskId: string): string;
|
|
64
|
-
/**
|
|
65
|
-
* Ensure the v2 directory structure exists.
|
|
66
|
-
*/
|
|
67
|
-
export declare function ensureV2Dirs(brainfilePath: string): V2Dirs;
|
|
68
|
-
/**
|
|
69
|
-
* Parse a task .md file into frontmatter and markdown sections.
|
|
70
|
-
*/
|
|
71
|
-
export declare function parseTaskFile(content: string): V2TaskFile;
|
|
72
|
-
/**
|
|
73
|
-
* Serialize a task to .md file format.
|
|
74
|
-
*/
|
|
75
|
-
export declare function serializeTaskFile(task: V2Task, description?: string, log?: string): string;
|
|
76
|
-
/**
|
|
77
|
-
* Read a single task file.
|
|
78
|
-
*/
|
|
79
|
-
export declare function readTaskFile(filePath: string): V2TaskFile;
|
|
80
|
-
/**
|
|
81
|
-
* Read all active tasks from the tasks/ directory.
|
|
82
|
-
*/
|
|
83
|
-
export declare function readAllTasks(tasksDir: string): V2TaskFile[];
|
|
84
|
-
/**
|
|
85
|
-
* Read all completed tasks from the logs/ directory.
|
|
86
|
-
*/
|
|
87
|
-
export declare function readAllLogs(logsDir: string): V2TaskFile[];
|
|
88
|
-
/**
|
|
89
|
-
* Find a task by ID across active tasks and optionally logs.
|
|
90
|
-
*/
|
|
91
|
-
export declare function findV2Task(dirs: V2Dirs, taskId: string, searchLogs?: boolean): {
|
|
92
|
-
taskFile: V2TaskFile;
|
|
93
|
-
filePath: string;
|
|
94
|
-
isLog: boolean;
|
|
95
|
-
} | null;
|
|
96
|
-
/**
|
|
97
|
-
* Write a task file.
|
|
98
|
-
*/
|
|
99
|
-
export declare function writeTaskFile(filePath: string, task: V2Task, description?: string, log?: string): void;
|
|
100
|
-
/**
|
|
101
|
-
* Convert a v1 Task to a V2Task with column and position.
|
|
102
|
-
*/
|
|
103
|
-
export declare function taskToV2(task: Task, column: string, position: number): V2Task;
|
|
104
|
-
/**
|
|
105
|
-
* Convert a V2Task back to a v1 Task (stripping column/position).
|
|
106
|
-
*/
|
|
107
|
-
export declare function v2ToTask(v2task: V2Task): Task;
|
|
108
|
-
/**
|
|
109
|
-
* Read the v2 board config (columns, rules, etc. without embedded tasks).
|
|
110
|
-
*/
|
|
111
|
-
export declare function readV2BoardConfig(brainfilePath: string): Board;
|
|
112
|
-
/**
|
|
113
|
-
* Build a full v1-compatible Board from v2 per-task files.
|
|
114
|
-
* Reads the board config and populates column tasks from the tasks/ directory.
|
|
115
|
-
*/
|
|
116
|
-
export declare function buildBoardFromV2(brainfilePath: string): Board;
|
|
117
|
-
/**
|
|
118
|
-
* Generate the next task ID by scanning existing task files.
|
|
119
|
-
*/
|
|
120
|
-
export declare function generateNextV2TaskId(dirs: V2Dirs): string;
|
|
121
|
-
//# sourceMappingURL=v2-tasks.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"v2-tasks.d.ts","sourceRoot":"","sources":["../../src/utils/v2-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAU,MAAM,iBAAiB,CAAC;AAM3D,MAAM,WAAW,MAAO,SAAQ,IAAI;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAK1D;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAwBzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CA2C1F;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAGzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAgB3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAgBzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,OAAe,GAC1B;IAAE,QAAQ,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAcnE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAGtG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG7C;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,KAAK,CAkB9D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,KAAK,CA8B7D;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBzD"}
|