@braingrid/cli 0.0.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/README.md +164 -0
- package/dist/.build-info.json +9 -0
- package/dist/build-config.d.ts +25 -0
- package/dist/build-config.d.ts.map +1 -0
- package/dist/build-config.js +27 -0
- package/dist/build-config.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +246 -0
- package/dist/cli.js.map +1 -0
- package/dist/handlers/auth.handlers.d.ts +13 -0
- package/dist/handlers/auth.handlers.d.ts.map +1 -0
- package/dist/handlers/auth.handlers.js +99 -0
- package/dist/handlers/auth.handlers.js.map +1 -0
- package/dist/handlers/index.d.ts +11 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +11 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/project.handlers.d.ts +29 -0
- package/dist/handlers/project.handlers.d.ts.map +1 -0
- package/dist/handlers/project.handlers.js +200 -0
- package/dist/handlers/project.handlers.js.map +1 -0
- package/dist/handlers/requirement.handlers.d.ts +32 -0
- package/dist/handlers/requirement.handlers.d.ts.map +1 -0
- package/dist/handlers/requirement.handlers.js +234 -0
- package/dist/handlers/requirement.handlers.js.map +1 -0
- package/dist/handlers/status.handlers.d.ts +12 -0
- package/dist/handlers/status.handlers.d.ts.map +1 -0
- package/dist/handlers/status.handlers.js +209 -0
- package/dist/handlers/status.handlers.js.map +1 -0
- package/dist/handlers/task.handlers.d.ts +29 -0
- package/dist/handlers/task.handlers.d.ts.map +1 -0
- package/dist/handlers/task.handlers.js +272 -0
- package/dist/handlers/task.handlers.js.map +1 -0
- package/dist/handlers/types.d.ts +10 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +5 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/services/auth.d.ts +41 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +498 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/claude.d.ts +18 -0
- package/dist/services/claude.d.ts.map +1 -0
- package/dist/services/claude.js +164 -0
- package/dist/services/claude.js.map +1 -0
- package/dist/services/context-manager.d.ts +170 -0
- package/dist/services/context-manager.d.ts.map +1 -0
- package/dist/services/context-manager.js +261 -0
- package/dist/services/context-manager.js.map +1 -0
- package/dist/services/credential-store.d.ts +47 -0
- package/dist/services/credential-store.d.ts.map +1 -0
- package/dist/services/credential-store.js +88 -0
- package/dist/services/credential-store.js.map +1 -0
- package/dist/services/oauth2-auth.d.ts +60 -0
- package/dist/services/oauth2-auth.d.ts.map +1 -0
- package/dist/services/oauth2-auth.js +377 -0
- package/dist/services/oauth2-auth.js.map +1 -0
- package/dist/services/project-service.d.ts +22 -0
- package/dist/services/project-service.d.ts.map +1 -0
- package/dist/services/project-service.js +52 -0
- package/dist/services/project-service.js.map +1 -0
- package/dist/services/requirement-service.d.ts +32 -0
- package/dist/services/requirement-service.d.ts.map +1 -0
- package/dist/services/requirement-service.js +91 -0
- package/dist/services/requirement-service.js.map +1 -0
- package/dist/services/task-service.d.ts +22 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +52 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +40 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/types/api.d.ts +16 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +5 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/auth.d.ts +68 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/claude.d.ts +22 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +2 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/project.d.ts +32 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +5 -0
- package/dist/types/project.js.map +1 -0
- package/dist/types/requirement.d.ts +69 -0
- package/dist/types/requirement.d.ts.map +1 -0
- package/dist/types/requirement.js +5 -0
- package/dist/types/requirement.js.map +1 -0
- package/dist/types/task.d.ts +44 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/axios-retry.d.ts +25 -0
- package/dist/utils/axios-retry.d.ts.map +1 -0
- package/dist/utils/axios-retry.js +174 -0
- package/dist/utils/axios-retry.js.map +1 -0
- package/dist/utils/axios-with-auth.d.ts +10 -0
- package/dist/utils/axios-with-auth.d.ts.map +1 -0
- package/dist/utils/axios-with-auth.js +118 -0
- package/dist/utils/axios-with-auth.js.map +1 -0
- package/dist/utils/cli-tools.d.ts +30 -0
- package/dist/utils/cli-tools.d.ts.map +1 -0
- package/dist/utils/cli-tools.js +131 -0
- package/dist/utils/cli-tools.js.map +1 -0
- package/dist/utils/command-execution.d.ts +30 -0
- package/dist/utils/command-execution.d.ts.map +1 -0
- package/dist/utils/command-execution.js +264 -0
- package/dist/utils/command-execution.js.map +1 -0
- package/dist/utils/command-parser.d.ts +85 -0
- package/dist/utils/command-parser.d.ts.map +1 -0
- package/dist/utils/command-parser.js +287 -0
- package/dist/utils/command-parser.js.map +1 -0
- package/dist/utils/config.d.ts +9 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +59 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/error-formatter.d.ts +17 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/error-formatter.js +115 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +122 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/git.d.ts +55 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +131 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/jwt.d.ts +45 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +64 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +176 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/requirements.d.ts +28 -0
- package/dist/utils/requirements.d.ts.map +1 -0
- package/dist/utils/requirements.js +54 -0
- package/dist/utils/requirements.js.map +1 -0
- package/dist/utils/status-parser.d.ts +95 -0
- package/dist/utils/status-parser.d.ts.map +1 -0
- package/dist/utils/status-parser.js +189 -0
- package/dist/utils/status-parser.js.map +1 -0
- package/dist/utils/tasks.d.ts +9 -0
- package/dist/utils/tasks.d.ts.map +1 -0
- package/dist/utils/tasks.js +38 -0
- package/dist/utils/tasks.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps natural language keywords to Status enum values
|
|
3
|
+
*/
|
|
4
|
+
export const StatusKeywordMap = {
|
|
5
|
+
// PLANNED status keywords
|
|
6
|
+
todo: 'PLANNED',
|
|
7
|
+
planned: 'PLANNED',
|
|
8
|
+
plan: 'PLANNED',
|
|
9
|
+
pending: 'PLANNED',
|
|
10
|
+
backlog: 'PLANNED',
|
|
11
|
+
// IN_PROGRESS status keywords
|
|
12
|
+
doing: 'IN_PROGRESS',
|
|
13
|
+
active: 'IN_PROGRESS',
|
|
14
|
+
wip: 'IN_PROGRESS',
|
|
15
|
+
'in-progress': 'IN_PROGRESS',
|
|
16
|
+
inprogress: 'IN_PROGRESS',
|
|
17
|
+
in_progress: 'IN_PROGRESS',
|
|
18
|
+
working: 'IN_PROGRESS',
|
|
19
|
+
started: 'IN_PROGRESS',
|
|
20
|
+
// COMPLETED status keywords
|
|
21
|
+
done: 'COMPLETED',
|
|
22
|
+
complete: 'COMPLETED',
|
|
23
|
+
completed: 'COMPLETED',
|
|
24
|
+
finished: 'COMPLETED',
|
|
25
|
+
closed: 'COMPLETED',
|
|
26
|
+
// CANCELLED status keywords
|
|
27
|
+
cancelled: 'CANCELLED',
|
|
28
|
+
canceled: 'CANCELLED',
|
|
29
|
+
cancel: 'CANCELLED',
|
|
30
|
+
abandoned: 'CANCELLED',
|
|
31
|
+
dropped: 'CANCELLED',
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Parses a comma-separated string of status keywords into Status values
|
|
35
|
+
*
|
|
36
|
+
* @param input - Comma-separated status keywords (e.g., "todo,doing" or "done")
|
|
37
|
+
* @returns Array of Status values
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* parseStatusKeywords("todo,doing") // Returns ["PLANNED", "IN_PROGRESS"]
|
|
41
|
+
* parseStatusKeywords("done") // Returns ["COMPLETED"]
|
|
42
|
+
* parseStatusKeywords("") // Returns [] (all statuses)
|
|
43
|
+
*/
|
|
44
|
+
export function parseStatusKeywords(input) {
|
|
45
|
+
// If no input or empty string, return empty array (show all statuses)
|
|
46
|
+
if (!input || input.trim() === '') {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
// Split by comma and clean up whitespace
|
|
50
|
+
const keywords = input
|
|
51
|
+
.split(',')
|
|
52
|
+
.map(k => k.trim().toLowerCase())
|
|
53
|
+
.filter(k => k.length > 0);
|
|
54
|
+
// Remove duplicates while preserving order
|
|
55
|
+
const uniqueKeywords = [...new Set(keywords)];
|
|
56
|
+
// Map keywords to statuses
|
|
57
|
+
const statuses = [];
|
|
58
|
+
const seenStatuses = new Set();
|
|
59
|
+
for (const keyword of uniqueKeywords) {
|
|
60
|
+
const status = StatusKeywordMap[keyword];
|
|
61
|
+
if (status && !seenStatuses.has(status)) {
|
|
62
|
+
statuses.push(status);
|
|
63
|
+
seenStatuses.add(status);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return statuses;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validates status keywords and returns both valid and invalid ones
|
|
70
|
+
*
|
|
71
|
+
* @param keywords - Array of status keywords to validate
|
|
72
|
+
* @returns Object containing valid statuses and invalid keywords
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* validateStatusKeywords(["todo", "invalid"])
|
|
76
|
+
* // Returns { valid: ["PLANNED"], invalid: ["invalid"] }
|
|
77
|
+
*/
|
|
78
|
+
export function validateStatusKeywords(keywords) {
|
|
79
|
+
const valid = [];
|
|
80
|
+
const invalid = [];
|
|
81
|
+
const seenStatuses = new Set();
|
|
82
|
+
for (const keyword of keywords) {
|
|
83
|
+
const normalizedKeyword = keyword.trim().toLowerCase();
|
|
84
|
+
const status = StatusKeywordMap[normalizedKeyword];
|
|
85
|
+
if (status) {
|
|
86
|
+
if (!seenStatuses.has(status)) {
|
|
87
|
+
valid.push(status);
|
|
88
|
+
seenStatuses.add(status);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (normalizedKeyword) {
|
|
92
|
+
invalid.push(keyword);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { valid, invalid };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Formats an error message for invalid status keywords
|
|
99
|
+
*
|
|
100
|
+
* @param invalidKeywords - Array of invalid keywords
|
|
101
|
+
* @returns Formatted error message with suggestions
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* formatStatusError(["invalid", "unknown"])
|
|
105
|
+
* // Returns detailed error message with valid keyword suggestions
|
|
106
|
+
*/
|
|
107
|
+
export function formatStatusError(invalidKeywords) {
|
|
108
|
+
const categorizedKeywords = {
|
|
109
|
+
PLANNED: ['todo', 'planned', 'plan', 'pending', 'backlog'],
|
|
110
|
+
IN_PROGRESS: ['doing', 'active', 'wip', 'in-progress', 'working'],
|
|
111
|
+
COMPLETED: ['done', 'complete', 'completed', 'finished'],
|
|
112
|
+
CANCELLED: ['cancelled', 'canceled', 'cancel', 'abandoned'],
|
|
113
|
+
};
|
|
114
|
+
let errorMsg = `Invalid status keyword${invalidKeywords.length > 1 ? 's' : ''}: ${invalidKeywords.map(k => `"${k}"`).join(', ')}\n\n`;
|
|
115
|
+
errorMsg += 'Valid status keywords:\n';
|
|
116
|
+
for (const [status, keywords] of Object.entries(categorizedKeywords)) {
|
|
117
|
+
errorMsg += ` ${status}: ${keywords.join(', ')}\n`;
|
|
118
|
+
}
|
|
119
|
+
errorMsg += '\nExample: braingrid list --status todo,doing';
|
|
120
|
+
return errorMsg;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Parses and validates status keywords, returning a complete result
|
|
124
|
+
*
|
|
125
|
+
* @param input - Comma-separated status keywords
|
|
126
|
+
* @returns StatusParsingResult with parsed statuses and any errors
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* parseAndValidateStatus("todo,invalid")
|
|
130
|
+
* // Returns {
|
|
131
|
+
* // statuses: ["PLANNED"],
|
|
132
|
+
* // invalid: ["invalid"],
|
|
133
|
+
* // hasErrors: true,
|
|
134
|
+
* // errorMessage: "Invalid status keyword: \"invalid\"..."
|
|
135
|
+
* // }
|
|
136
|
+
*/
|
|
137
|
+
export function parseAndValidateStatus(input) {
|
|
138
|
+
// Handle empty input
|
|
139
|
+
if (!input || input.trim() === '') {
|
|
140
|
+
return {
|
|
141
|
+
statuses: [],
|
|
142
|
+
invalid: [],
|
|
143
|
+
hasErrors: false,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Split and normalize keywords
|
|
147
|
+
const keywords = input
|
|
148
|
+
.split(',')
|
|
149
|
+
.map(k => k.trim())
|
|
150
|
+
.filter(k => k.length > 0);
|
|
151
|
+
// Validate keywords
|
|
152
|
+
const { valid, invalid } = validateStatusKeywords(keywords);
|
|
153
|
+
// Build result
|
|
154
|
+
const result = {
|
|
155
|
+
statuses: valid,
|
|
156
|
+
invalid,
|
|
157
|
+
hasErrors: invalid.length > 0,
|
|
158
|
+
};
|
|
159
|
+
// Add error message if there are invalid keywords
|
|
160
|
+
if (result.hasErrors) {
|
|
161
|
+
result.errorMessage = formatStatusError(invalid);
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Gets all valid status keywords grouped by their Status value
|
|
167
|
+
*
|
|
168
|
+
* @returns Object mapping Status to array of keywords
|
|
169
|
+
*/
|
|
170
|
+
export function getStatusKeywordsByValue() {
|
|
171
|
+
const grouped = {};
|
|
172
|
+
for (const [keyword, status] of Object.entries(StatusKeywordMap)) {
|
|
173
|
+
if (!grouped[status]) {
|
|
174
|
+
grouped[status] = [];
|
|
175
|
+
}
|
|
176
|
+
grouped[status].push(keyword);
|
|
177
|
+
}
|
|
178
|
+
return grouped;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Checks if a given string is a valid status keyword
|
|
182
|
+
*
|
|
183
|
+
* @param keyword - The keyword to check
|
|
184
|
+
* @returns true if the keyword is valid, false otherwise
|
|
185
|
+
*/
|
|
186
|
+
export function isValidStatusKeyword(keyword) {
|
|
187
|
+
return keyword.toLowerCase() in StatusKeywordMap;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=status-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-parser.js","sourceRoot":"","sources":["../../src/utils/status-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RequirementTask as Task } from '../types/requirement.js';
|
|
2
|
+
export declare function formatTaskId(task: Task): string;
|
|
3
|
+
export declare function parseTaskId(input: string): {
|
|
4
|
+
type: 'number' | 'uuid';
|
|
5
|
+
value: string | number;
|
|
6
|
+
};
|
|
7
|
+
export declare function findTaskById(tasks: Task[], identifier: string): Task | null;
|
|
8
|
+
export declare function getTaskStatusIcon(status: string): string;
|
|
9
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/utils/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAElE,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAY9F;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAQ3E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAaxD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function formatTaskId(task) {
|
|
2
|
+
return `TASK-${task.number}`;
|
|
3
|
+
}
|
|
4
|
+
export function parseTaskId(input) {
|
|
5
|
+
const taskMatch = input.match(/^TASK-(\d+)$/i);
|
|
6
|
+
if (taskMatch) {
|
|
7
|
+
return { type: 'number', value: parseInt(taskMatch[1], 10) };
|
|
8
|
+
}
|
|
9
|
+
const numberMatch = input.match(/^\d+$/);
|
|
10
|
+
if (numberMatch) {
|
|
11
|
+
return { type: 'number', value: parseInt(input, 10) };
|
|
12
|
+
}
|
|
13
|
+
return { type: 'uuid', value: input };
|
|
14
|
+
}
|
|
15
|
+
export function findTaskById(tasks, identifier) {
|
|
16
|
+
const parsed = parseTaskId(identifier);
|
|
17
|
+
if (parsed.type === 'number') {
|
|
18
|
+
return tasks.find(task => task.number === parsed.value) || null;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
return tasks.find(task => task.id === parsed.value) || null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function getTaskStatusIcon(status) {
|
|
25
|
+
switch (status) {
|
|
26
|
+
case 'PLANNED':
|
|
27
|
+
return '📋';
|
|
28
|
+
case 'IN_PROGRESS':
|
|
29
|
+
return '🔄';
|
|
30
|
+
case 'COMPLETED':
|
|
31
|
+
return '✅';
|
|
32
|
+
case 'CANCELLED':
|
|
33
|
+
return '❌';
|
|
34
|
+
default:
|
|
35
|
+
return '📋';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/utils/tasks.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,IAAU;IACtC,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAAkB;IAC7D,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACjE,CAAC;SAAM,CAAC;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC/C,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,SAAS;YACb,OAAO,IAAI,CAAC;QACb,KAAK,aAAa;YACjB,OAAO,IAAI,CAAC;QACb,KAAK,WAAW;YACf,OAAO,GAAG,CAAC;QACZ,KAAK,WAAW;YACf,OAAO,GAAG,CAAC;QACZ;YACC,OAAO,IAAI,CAAC;IACd,CAAC;AACF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@braingrid/cli",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "BrainGrid - Turn thoughts into AI-ready specs. Command-line interface for spec-driven development.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cli.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"braingrid": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc -p .",
|
|
12
|
+
"build:dev": "node scripts/build.js development",
|
|
13
|
+
"build:local": "node scripts/build.js local",
|
|
14
|
+
"build:prod": "node scripts/build.js production",
|
|
15
|
+
"dev": "tsx src/cli.ts",
|
|
16
|
+
"dev:local": "NODE_ENV=local tsx src/cli.ts",
|
|
17
|
+
"start": "node dist/cli.js",
|
|
18
|
+
"start:local": "NODE_ENV=local node dist/cli.js",
|
|
19
|
+
"start:dev": "NODE_ENV=development node dist/cli.js",
|
|
20
|
+
"lint": "eslint 'src/**/*.{ts,tsx}'",
|
|
21
|
+
"lint:fix": "eslint 'src/**/*.{ts,tsx}' --fix",
|
|
22
|
+
"format": "prettier --write 'src/**/*.{ts,tsx}'",
|
|
23
|
+
"type-check": "tsc --noEmit",
|
|
24
|
+
"test": "vitest",
|
|
25
|
+
"test:watch": "vitest --watch",
|
|
26
|
+
"test:coverage": "vitest --coverage",
|
|
27
|
+
"test:coverage:ci": "vitest run --coverage",
|
|
28
|
+
"test:all": "vitest run",
|
|
29
|
+
"test:cli": "bash scripts/test-cli.sh",
|
|
30
|
+
"test:cli:verbose": "bash scripts/test-cli.sh --verbose",
|
|
31
|
+
"validate:fix": "pnpm lint:fix && pnpm format && pnpm type-check",
|
|
32
|
+
"docs:fetch-openapi": "gh api repos/BrainGridAI/braingrid-app/contents/src/app/api/v1/openapi.yaml | jq -r '.content' | base64 -D > docs/openapi.yaml",
|
|
33
|
+
"prepare": "husky",
|
|
34
|
+
"prepublishOnly": "pnpm build:prod",
|
|
35
|
+
"preversion": "pnpm validate:fix && pnpm test:all",
|
|
36
|
+
"release:patch": "npm version patch && git push && git push --tags",
|
|
37
|
+
"release:minor": "npm version minor && git push && git push --tags",
|
|
38
|
+
"release:major": "npm version major && git push && git push --tags"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"cli",
|
|
42
|
+
"braingrid",
|
|
43
|
+
"ai",
|
|
44
|
+
"spec-driven-development",
|
|
45
|
+
"requirements",
|
|
46
|
+
"tasks",
|
|
47
|
+
"cursor",
|
|
48
|
+
"claude-code",
|
|
49
|
+
"ai-coding",
|
|
50
|
+
"development-workflow",
|
|
51
|
+
"typescript"
|
|
52
|
+
],
|
|
53
|
+
"author": "BrainGrid <support@braingrid.ai>",
|
|
54
|
+
"license": "UNLICENSED",
|
|
55
|
+
"homepage": "https://www.braingrid.ai",
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "git+https://github.com/BrainGridAI/braingrid-cli.git"
|
|
59
|
+
},
|
|
60
|
+
"bugs": {
|
|
61
|
+
"url": "https://github.com/BrainGridAI/braingrid-cli/issues"
|
|
62
|
+
},
|
|
63
|
+
"files": [
|
|
64
|
+
"dist",
|
|
65
|
+
"README.md",
|
|
66
|
+
"CHANGELOG.md"
|
|
67
|
+
],
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"axios": "^1.10.0",
|
|
70
|
+
"chalk": "^5.3.0",
|
|
71
|
+
"commander": "^12.0.0",
|
|
72
|
+
"conf": "13.0.1",
|
|
73
|
+
"node-machine-id": "1.1.12",
|
|
74
|
+
"open": "^10.1.0"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@types/node": "^20.19.1",
|
|
78
|
+
"@typescript-eslint/eslint-plugin": "^8.39.1",
|
|
79
|
+
"@typescript-eslint/parser": "^8.39.1",
|
|
80
|
+
"@vitest/coverage-v8": "^3.2.3",
|
|
81
|
+
"@vitest/ui": "^3.2.3",
|
|
82
|
+
"eslint": "^9.33.0",
|
|
83
|
+
"eslint-config-prettier": "^10.1.8",
|
|
84
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
85
|
+
"husky": "^9.1.7",
|
|
86
|
+
"lint-staged": "^16.2.3",
|
|
87
|
+
"prettier": "^3.6.2",
|
|
88
|
+
"tsx": "^4.16.2",
|
|
89
|
+
"typescript": "^5.4.0",
|
|
90
|
+
"vitest": "^3.2.3"
|
|
91
|
+
},
|
|
92
|
+
"engines": {
|
|
93
|
+
"node": ">=18.0.0"
|
|
94
|
+
},
|
|
95
|
+
"lint-staged": {
|
|
96
|
+
"src/**/*.{ts,tsx}": [
|
|
97
|
+
"eslint --fix",
|
|
98
|
+
"prettier --write"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
}
|