@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.
Files changed (155) hide show
  1. package/README.md +164 -0
  2. package/dist/.build-info.json +9 -0
  3. package/dist/build-config.d.ts +25 -0
  4. package/dist/build-config.d.ts.map +1 -0
  5. package/dist/build-config.js +27 -0
  6. package/dist/build-config.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +246 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/handlers/auth.handlers.d.ts +13 -0
  12. package/dist/handlers/auth.handlers.d.ts.map +1 -0
  13. package/dist/handlers/auth.handlers.js +99 -0
  14. package/dist/handlers/auth.handlers.js.map +1 -0
  15. package/dist/handlers/index.d.ts +11 -0
  16. package/dist/handlers/index.d.ts.map +1 -0
  17. package/dist/handlers/index.js +11 -0
  18. package/dist/handlers/index.js.map +1 -0
  19. package/dist/handlers/project.handlers.d.ts +29 -0
  20. package/dist/handlers/project.handlers.d.ts.map +1 -0
  21. package/dist/handlers/project.handlers.js +200 -0
  22. package/dist/handlers/project.handlers.js.map +1 -0
  23. package/dist/handlers/requirement.handlers.d.ts +32 -0
  24. package/dist/handlers/requirement.handlers.d.ts.map +1 -0
  25. package/dist/handlers/requirement.handlers.js +234 -0
  26. package/dist/handlers/requirement.handlers.js.map +1 -0
  27. package/dist/handlers/status.handlers.d.ts +12 -0
  28. package/dist/handlers/status.handlers.d.ts.map +1 -0
  29. package/dist/handlers/status.handlers.js +209 -0
  30. package/dist/handlers/status.handlers.js.map +1 -0
  31. package/dist/handlers/task.handlers.d.ts +29 -0
  32. package/dist/handlers/task.handlers.d.ts.map +1 -0
  33. package/dist/handlers/task.handlers.js +272 -0
  34. package/dist/handlers/task.handlers.js.map +1 -0
  35. package/dist/handlers/types.d.ts +10 -0
  36. package/dist/handlers/types.d.ts.map +1 -0
  37. package/dist/handlers/types.js +5 -0
  38. package/dist/handlers/types.js.map +1 -0
  39. package/dist/services/auth.d.ts +41 -0
  40. package/dist/services/auth.d.ts.map +1 -0
  41. package/dist/services/auth.js +498 -0
  42. package/dist/services/auth.js.map +1 -0
  43. package/dist/services/claude.d.ts +18 -0
  44. package/dist/services/claude.d.ts.map +1 -0
  45. package/dist/services/claude.js +164 -0
  46. package/dist/services/claude.js.map +1 -0
  47. package/dist/services/context-manager.d.ts +170 -0
  48. package/dist/services/context-manager.d.ts.map +1 -0
  49. package/dist/services/context-manager.js +261 -0
  50. package/dist/services/context-manager.js.map +1 -0
  51. package/dist/services/credential-store.d.ts +47 -0
  52. package/dist/services/credential-store.d.ts.map +1 -0
  53. package/dist/services/credential-store.js +88 -0
  54. package/dist/services/credential-store.js.map +1 -0
  55. package/dist/services/oauth2-auth.d.ts +60 -0
  56. package/dist/services/oauth2-auth.d.ts.map +1 -0
  57. package/dist/services/oauth2-auth.js +377 -0
  58. package/dist/services/oauth2-auth.js.map +1 -0
  59. package/dist/services/project-service.d.ts +22 -0
  60. package/dist/services/project-service.d.ts.map +1 -0
  61. package/dist/services/project-service.js +52 -0
  62. package/dist/services/project-service.js.map +1 -0
  63. package/dist/services/requirement-service.d.ts +32 -0
  64. package/dist/services/requirement-service.d.ts.map +1 -0
  65. package/dist/services/requirement-service.js +91 -0
  66. package/dist/services/requirement-service.js.map +1 -0
  67. package/dist/services/task-service.d.ts +22 -0
  68. package/dist/services/task-service.d.ts.map +1 -0
  69. package/dist/services/task-service.js +52 -0
  70. package/dist/services/task-service.js.map +1 -0
  71. package/dist/test/setup.d.ts +2 -0
  72. package/dist/test/setup.d.ts.map +1 -0
  73. package/dist/test/setup.js +40 -0
  74. package/dist/test/setup.js.map +1 -0
  75. package/dist/types/api.d.ts +16 -0
  76. package/dist/types/api.d.ts.map +1 -0
  77. package/dist/types/api.js +5 -0
  78. package/dist/types/api.js.map +1 -0
  79. package/dist/types/auth.d.ts +68 -0
  80. package/dist/types/auth.d.ts.map +1 -0
  81. package/dist/types/auth.js +2 -0
  82. package/dist/types/auth.js.map +1 -0
  83. package/dist/types/claude.d.ts +22 -0
  84. package/dist/types/claude.d.ts.map +1 -0
  85. package/dist/types/claude.js +2 -0
  86. package/dist/types/claude.js.map +1 -0
  87. package/dist/types/project.d.ts +32 -0
  88. package/dist/types/project.d.ts.map +1 -0
  89. package/dist/types/project.js +5 -0
  90. package/dist/types/project.js.map +1 -0
  91. package/dist/types/requirement.d.ts +69 -0
  92. package/dist/types/requirement.d.ts.map +1 -0
  93. package/dist/types/requirement.js +5 -0
  94. package/dist/types/requirement.js.map +1 -0
  95. package/dist/types/task.d.ts +44 -0
  96. package/dist/types/task.d.ts.map +1 -0
  97. package/dist/types/task.js +5 -0
  98. package/dist/types/task.js.map +1 -0
  99. package/dist/utils/axios-retry.d.ts +25 -0
  100. package/dist/utils/axios-retry.d.ts.map +1 -0
  101. package/dist/utils/axios-retry.js +174 -0
  102. package/dist/utils/axios-retry.js.map +1 -0
  103. package/dist/utils/axios-with-auth.d.ts +10 -0
  104. package/dist/utils/axios-with-auth.d.ts.map +1 -0
  105. package/dist/utils/axios-with-auth.js +118 -0
  106. package/dist/utils/axios-with-auth.js.map +1 -0
  107. package/dist/utils/cli-tools.d.ts +30 -0
  108. package/dist/utils/cli-tools.d.ts.map +1 -0
  109. package/dist/utils/cli-tools.js +131 -0
  110. package/dist/utils/cli-tools.js.map +1 -0
  111. package/dist/utils/command-execution.d.ts +30 -0
  112. package/dist/utils/command-execution.d.ts.map +1 -0
  113. package/dist/utils/command-execution.js +264 -0
  114. package/dist/utils/command-execution.js.map +1 -0
  115. package/dist/utils/command-parser.d.ts +85 -0
  116. package/dist/utils/command-parser.d.ts.map +1 -0
  117. package/dist/utils/command-parser.js +287 -0
  118. package/dist/utils/command-parser.js.map +1 -0
  119. package/dist/utils/config.d.ts +9 -0
  120. package/dist/utils/config.d.ts.map +1 -0
  121. package/dist/utils/config.js +59 -0
  122. package/dist/utils/config.js.map +1 -0
  123. package/dist/utils/error-formatter.d.ts +17 -0
  124. package/dist/utils/error-formatter.d.ts.map +1 -0
  125. package/dist/utils/error-formatter.js +115 -0
  126. package/dist/utils/error-formatter.js.map +1 -0
  127. package/dist/utils/formatting.d.ts +10 -0
  128. package/dist/utils/formatting.d.ts.map +1 -0
  129. package/dist/utils/formatting.js +122 -0
  130. package/dist/utils/formatting.js.map +1 -0
  131. package/dist/utils/git.d.ts +55 -0
  132. package/dist/utils/git.d.ts.map +1 -0
  133. package/dist/utils/git.js +131 -0
  134. package/dist/utils/git.js.map +1 -0
  135. package/dist/utils/jwt.d.ts +45 -0
  136. package/dist/utils/jwt.d.ts.map +1 -0
  137. package/dist/utils/jwt.js +64 -0
  138. package/dist/utils/jwt.js.map +1 -0
  139. package/dist/utils/logger.d.ts +36 -0
  140. package/dist/utils/logger.d.ts.map +1 -0
  141. package/dist/utils/logger.js +176 -0
  142. package/dist/utils/logger.js.map +1 -0
  143. package/dist/utils/requirements.d.ts +28 -0
  144. package/dist/utils/requirements.d.ts.map +1 -0
  145. package/dist/utils/requirements.js +54 -0
  146. package/dist/utils/requirements.js.map +1 -0
  147. package/dist/utils/status-parser.d.ts +95 -0
  148. package/dist/utils/status-parser.d.ts.map +1 -0
  149. package/dist/utils/status-parser.js +189 -0
  150. package/dist/utils/status-parser.js.map +1 -0
  151. package/dist/utils/tasks.d.ts +9 -0
  152. package/dist/utils/tasks.d.ts.map +1 -0
  153. package/dist/utils/tasks.js +38 -0
  154. package/dist/utils/tasks.js.map +1 -0
  155. 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
+ }