strikethroo 3.0.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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/cli.d.ts +9 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +187 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/conflict-detector.d.ts +24 -0
  8. package/dist/conflict-detector.d.ts.map +1 -0
  9. package/dist/conflict-detector.js +130 -0
  10. package/dist/conflict-detector.js.map +1 -0
  11. package/dist/index.d.ts +22 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +344 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/metadata.d.ts +40 -0
  16. package/dist/metadata.d.ts.map +1 -0
  17. package/dist/metadata.js +121 -0
  18. package/dist/metadata.js.map +1 -0
  19. package/dist/plan-utils.d.ts +35 -0
  20. package/dist/plan-utils.d.ts.map +1 -0
  21. package/dist/plan-utils.js +123 -0
  22. package/dist/plan-utils.js.map +1 -0
  23. package/dist/plan.d.ts +27 -0
  24. package/dist/plan.d.ts.map +1 -0
  25. package/dist/plan.js +279 -0
  26. package/dist/plan.js.map +1 -0
  27. package/dist/prompts.d.ts +21 -0
  28. package/dist/prompts.d.ts.map +1 -0
  29. package/dist/prompts.js +132 -0
  30. package/dist/prompts.js.map +1 -0
  31. package/dist/status.d.ts +73 -0
  32. package/dist/status.d.ts.map +1 -0
  33. package/dist/status.js +375 -0
  34. package/dist/status.js.map +1 -0
  35. package/dist/types.d.ts +274 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +9 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.d.ts +53 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +158 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +94 -0
  44. package/templates/harness/agents/plan-creator.md +95 -0
  45. package/templates/harness/skills/st-create-plan/SKILL.md +120 -0
  46. package/templates/harness/skills/st-create-plan/scripts/find-strikethroo-root.cjs +116 -0
  47. package/templates/harness/skills/st-create-plan/scripts/get-next-plan-id.cjs +197 -0
  48. package/templates/harness/skills/st-execute-blueprint/SKILL.md +147 -0
  49. package/templates/harness/skills/st-execute-blueprint/scripts/create-feature-branch.cjs +359 -0
  50. package/templates/harness/skills/st-execute-blueprint/scripts/find-strikethroo-root.cjs +116 -0
  51. package/templates/harness/skills/st-execute-blueprint/scripts/validate-plan-blueprint.cjs +358 -0
  52. package/templates/harness/skills/st-execute-task/SKILL.md +195 -0
  53. package/templates/harness/skills/st-execute-task/scripts/check-task-dependencies.cjs +420 -0
  54. package/templates/harness/skills/st-execute-task/scripts/find-strikethroo-root.cjs +116 -0
  55. package/templates/harness/skills/st-execute-task/scripts/validate-plan-blueprint.cjs +358 -0
  56. package/templates/harness/skills/st-full-workflow/SKILL.md +413 -0
  57. package/templates/harness/skills/st-full-workflow/scripts/create-feature-branch.cjs +359 -0
  58. package/templates/harness/skills/st-full-workflow/scripts/find-strikethroo-root.cjs +116 -0
  59. package/templates/harness/skills/st-full-workflow/scripts/get-next-plan-id.cjs +197 -0
  60. package/templates/harness/skills/st-full-workflow/scripts/get-next-task-id.cjs +295 -0
  61. package/templates/harness/skills/st-full-workflow/scripts/validate-plan-blueprint.cjs +358 -0
  62. package/templates/harness/skills/st-generate-tasks/SKILL.md +244 -0
  63. package/templates/harness/skills/st-generate-tasks/scripts/find-strikethroo-root.cjs +116 -0
  64. package/templates/harness/skills/st-generate-tasks/scripts/get-next-task-id.cjs +295 -0
  65. package/templates/harness/skills/st-generate-tasks/scripts/validate-plan-blueprint.cjs +358 -0
  66. package/templates/harness/skills/st-refine-plan/SKILL.md +205 -0
  67. package/templates/harness/skills/st-refine-plan/scripts/find-strikethroo-root.cjs +116 -0
  68. package/templates/harness/skills/st-refine-plan/scripts/validate-plan-blueprint.cjs +358 -0
  69. package/templates/strikethroo/README.md +7 -0
  70. package/templates/strikethroo/config/STRIKETHROO.md +76 -0
  71. package/templates/strikethroo/config/hooks/POST_ERROR_DETECTION.md +46 -0
  72. package/templates/strikethroo/config/hooks/POST_EXECUTION.md +25 -0
  73. package/templates/strikethroo/config/hooks/POST_PHASE.md +24 -0
  74. package/templates/strikethroo/config/hooks/POST_PLAN.md +5 -0
  75. package/templates/strikethroo/config/hooks/POST_TASK_GENERATION_ALL.md +41 -0
  76. package/templates/strikethroo/config/hooks/PRE_PHASE.md +21 -0
  77. package/templates/strikethroo/config/hooks/PRE_PLAN.md +42 -0
  78. package/templates/strikethroo/config/hooks/PRE_TASK_ASSIGNMENT.md +32 -0
  79. package/templates/strikethroo/config/hooks/PRE_TASK_EXECUTION.md +1 -0
  80. package/templates/strikethroo/config/templates/BLUEPRINT_TEMPLATE.md +24 -0
  81. package/templates/strikethroo/config/templates/EXECUTION_SUMMARY_TEMPLATE.md +13 -0
  82. package/templates/strikethroo/config/templates/PLAN_TEMPLATE.md +109 -0
  83. package/templates/strikethroo/config/templates/TASK_TEMPLATE.md +36 -0
@@ -0,0 +1,274 @@
1
+ /**
2
+ * TypeScript Type Definitions
3
+ *
4
+ * This file contains all TypeScript interfaces, types, and enums
5
+ * used throughout the Strikethroo CLI application
6
+ */
7
+ /**
8
+ * Supported AI harnesses for task management
9
+ */
10
+ export type Harness = 'claude' | 'codex' | 'cursor' | 'gemini' | 'github' | 'opencode';
11
+ /**
12
+ * Options for the init command
13
+ */
14
+ export interface InitOptions {
15
+ /**
16
+ * Comma-separated list of harnesses to configure
17
+ */
18
+ harnesses: string;
19
+ /**
20
+ * Optional destination directory for the configuration
21
+ */
22
+ destinationDirectory?: string;
23
+ /**
24
+ * Force overwrite all files without prompting
25
+ */
26
+ force?: boolean;
27
+ }
28
+ /**
29
+ * Configuration for directory structure
30
+ */
31
+ export interface DirectoryConfig {
32
+ /**
33
+ * Path to the directory
34
+ */
35
+ path: string;
36
+ /**
37
+ * Optional list of files to create in the directory
38
+ */
39
+ files?: string[];
40
+ }
41
+ /**
42
+ * Task status enumeration
43
+ */
44
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'cancelled';
45
+ /**
46
+ * Task priority levels
47
+ */
48
+ export type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';
49
+ /**
50
+ * Individual task definition
51
+ */
52
+ export interface Task {
53
+ /**
54
+ * Unique identifier for the task
55
+ */
56
+ id: string;
57
+ /**
58
+ * Task title/name
59
+ */
60
+ title: string;
61
+ /**
62
+ * Detailed task description
63
+ */
64
+ description?: string;
65
+ /**
66
+ * Current status of the task
67
+ */
68
+ status: TaskStatus;
69
+ /**
70
+ * Task priority level
71
+ */
72
+ priority: TaskPriority;
73
+ /**
74
+ * Task creation timestamp
75
+ */
76
+ createdAt: Date;
77
+ /**
78
+ * Last update timestamp
79
+ */
80
+ updatedAt: Date;
81
+ /**
82
+ * Optional due date
83
+ */
84
+ dueDate?: Date;
85
+ /**
86
+ * Tags associated with the task
87
+ */
88
+ tags: string[];
89
+ /**
90
+ * AI harness assigned to the task
91
+ */
92
+ assignedTo?: Harness;
93
+ }
94
+ /**
95
+ * Task list configuration
96
+ */
97
+ export interface TaskList {
98
+ /**
99
+ * List name/identifier
100
+ */
101
+ name: string;
102
+ /**
103
+ * List description
104
+ */
105
+ description?: string;
106
+ /**
107
+ * Tasks in the list
108
+ */
109
+ tasks: Task[];
110
+ /**
111
+ * Creation timestamp
112
+ */
113
+ createdAt: Date;
114
+ /**
115
+ * Last update timestamp
116
+ */
117
+ updatedAt: Date;
118
+ }
119
+ /**
120
+ * CLI command options base interface
121
+ */
122
+ export interface BaseCommandOptions {
123
+ /**
124
+ * Enable verbose logging
125
+ */
126
+ verbose?: boolean;
127
+ /**
128
+ * Dry run mode - show what would be done without executing
129
+ */
130
+ dryRun?: boolean;
131
+ }
132
+ /**
133
+ * Harness configuration
134
+ */
135
+ export interface HarnessConfig {
136
+ /**
137
+ * Harness type
138
+ */
139
+ type: Harness;
140
+ /**
141
+ * API endpoint URL
142
+ */
143
+ endpoint?: string;
144
+ /**
145
+ * API key for authentication
146
+ */
147
+ apiKey?: string;
148
+ /**
149
+ * Model name/version to use
150
+ */
151
+ model?: string;
152
+ /**
153
+ * Additional configuration options
154
+ */
155
+ options?: Record<string, unknown>;
156
+ }
157
+ /**
158
+ * Project configuration
159
+ */
160
+ export interface ProjectConfig {
161
+ /**
162
+ * Project name
163
+ */
164
+ name: string;
165
+ /**
166
+ * Project description
167
+ */
168
+ description?: string;
169
+ /**
170
+ * Default harness for the project
171
+ */
172
+ defaultHarness?: Harness;
173
+ /**
174
+ * Configured harnesses
175
+ */
176
+ harnesses: HarnessConfig[];
177
+ /**
178
+ * Project creation timestamp
179
+ */
180
+ createdAt: Date;
181
+ /**
182
+ * Configuration file version
183
+ */
184
+ version: string;
185
+ }
186
+ /**
187
+ * Validation result interface
188
+ */
189
+ export interface ValidationResult {
190
+ /**
191
+ * Whether validation passed
192
+ */
193
+ valid: boolean;
194
+ /**
195
+ * Validation errors if any
196
+ */
197
+ errors: string[];
198
+ /**
199
+ * Validation warnings if any
200
+ */
201
+ warnings: string[];
202
+ }
203
+ /**
204
+ * Command execution result
205
+ */
206
+ export interface CommandResult {
207
+ /**
208
+ * Whether command executed successfully
209
+ */
210
+ success: boolean;
211
+ /**
212
+ * Result message
213
+ */
214
+ message: string;
215
+ /**
216
+ * Additional data from command execution
217
+ */
218
+ data?: unknown;
219
+ /**
220
+ * Error information if command failed
221
+ */
222
+ error?: Error;
223
+ }
224
+ /**
225
+ * Metadata tracking for init command file management
226
+ */
227
+ export interface InitMetadata {
228
+ /**
229
+ * Package version at time of init
230
+ */
231
+ version: string;
232
+ /**
233
+ * Workspace schema version. Bumped only when .ai/strikethroo/ shape changes incompatibly.
234
+ */
235
+ workspaceSchemaVersion: number;
236
+ /**
237
+ * Timestamp of last init operation
238
+ */
239
+ timestamp: string;
240
+ /**
241
+ * Map of relative file paths to SHA-256 hashes
242
+ */
243
+ files: Record<string, string>;
244
+ }
245
+ /**
246
+ * Represents a file conflict detected during init
247
+ */
248
+ export interface FileConflict {
249
+ /**
250
+ * Relative path from .ai/strikethroo/ directory
251
+ */
252
+ relativePath: string;
253
+ /**
254
+ * User's current file content
255
+ */
256
+ userFileContent: string;
257
+ /**
258
+ * New incoming file content from package
259
+ */
260
+ newFileContent: string;
261
+ /**
262
+ * Original hash from metadata when file was first copied
263
+ */
264
+ originalHash: string;
265
+ /**
266
+ * Current hash of user's file
267
+ */
268
+ currentHash: string;
269
+ }
270
+ /**
271
+ * User's resolution choice for file conflicts
272
+ */
273
+ export type ConflictResolution = 'keep' | 'overwrite' | 'keep-all' | 'overwrite-all';
274
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC;IACf;;OAEG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,KAAK,EAAE,IAAI,EAAE,CAAC;IACd;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;IACd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC;IAChB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;OAEG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,eAAe,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * TypeScript Type Definitions
4
+ *
5
+ * This file contains all TypeScript interfaces, types, and enums
6
+ * used throughout the Strikethroo CLI application
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Helper Functions for the CLI
3
+ *
4
+ * Validation helpers for the `--harnesses` option.
5
+ */
6
+ import { Harness } from './types';
7
+ /**
8
+ * Parse comma-separated harness values into an array
9
+ * @param value - Comma-separated string of harness names
10
+ * @returns Array of harness names
11
+ * @throws Error if invalid harness names are provided
12
+ */
13
+ export declare function parseHarnesses(value: string): Harness[];
14
+ /**
15
+ * Validate that all harnesses are supported
16
+ * @param harnesses - Array of harnesses to validate
17
+ * @throws Error if any harness is invalid or array is empty
18
+ */
19
+ export declare function validateHarnesses(harnesses: Harness[]): void;
20
+ export interface MarkdownFrontmatter {
21
+ [key: string]: string;
22
+ }
23
+ /**
24
+ * Extract YAML frontmatter and body from a markdown string.
25
+ * Returns an empty frontmatter object when no fences are found.
26
+ */
27
+ export declare function parseFrontmatter(content: string): {
28
+ frontmatter: MarkdownFrontmatter;
29
+ body: string;
30
+ };
31
+ /**
32
+ * Escape a string for use inside a TOML basic (double-quoted) string.
33
+ */
34
+ export declare function escapeTomlString(str: string): string;
35
+ /**
36
+ * Escape a string for use inside a TOML multi-line basic (triple-quoted) string.
37
+ */
38
+ export declare function escapeTomlTripleQuotedString(str: string): string;
39
+ /**
40
+ * Convert a canonical agent markdown template (with YAML frontmatter
41
+ * containing `name` and `description`) into Codex's TOML agent format.
42
+ */
43
+ export declare function convertAgentMdToToml(mdContent: string): string;
44
+ export interface AgentFormatInfo {
45
+ format: 'md' | 'toml';
46
+ extension: string;
47
+ directory: string;
48
+ }
49
+ /**
50
+ * Return the agent file format, extension, and target directory for a harness.
51
+ */
52
+ export declare function getAgentFormat(harness: Harness): AgentFormatInfo;
53
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAWlC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAqBvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAY5D;AAID,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IACjD,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CA+CA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAehE"}
package/dist/utils.js ADDED
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * Helper Functions for the CLI
4
+ *
5
+ * Validation helpers for the `--harnesses` option.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.parseHarnesses = parseHarnesses;
9
+ exports.validateHarnesses = validateHarnesses;
10
+ exports.parseFrontmatter = parseFrontmatter;
11
+ exports.escapeTomlString = escapeTomlString;
12
+ exports.escapeTomlTripleQuotedString = escapeTomlTripleQuotedString;
13
+ exports.convertAgentMdToToml = convertAgentMdToToml;
14
+ exports.getAgentFormat = getAgentFormat;
15
+ const VALID_HARNESSES = [
16
+ 'claude',
17
+ 'codex',
18
+ 'cursor',
19
+ 'gemini',
20
+ 'github',
21
+ 'opencode',
22
+ ];
23
+ /**
24
+ * Parse comma-separated harness values into an array
25
+ * @param value - Comma-separated string of harness names
26
+ * @returns Array of harness names
27
+ * @throws Error if invalid harness names are provided
28
+ */
29
+ function parseHarnesses(value) {
30
+ if (!value.trim()) {
31
+ throw new Error('Harnesses parameter cannot be empty');
32
+ }
33
+ const harnesses = value
34
+ .split(',')
35
+ .map(a => a.trim().toLowerCase())
36
+ .filter(a => a.length > 0);
37
+ const invalidHarnesses = harnesses.filter((harness) => !VALID_HARNESSES.includes(harness));
38
+ if (invalidHarnesses.length > 0) {
39
+ throw new Error(`Invalid harness(es): ${invalidHarnesses.join(', ')}. Valid options are: ${VALID_HARNESSES.join(', ')}`);
40
+ }
41
+ return Array.from(new Set(harnesses));
42
+ }
43
+ /**
44
+ * Validate that all harnesses are supported
45
+ * @param harnesses - Array of harnesses to validate
46
+ * @throws Error if any harness is invalid or array is empty
47
+ */
48
+ function validateHarnesses(harnesses) {
49
+ if (harnesses.length === 0) {
50
+ throw new Error('At least one harness must be specified');
51
+ }
52
+ for (const harness of harnesses) {
53
+ if (!VALID_HARNESSES.includes(harness)) {
54
+ throw new Error(`Invalid harness: ${harness}. Supported harnesses: ${VALID_HARNESSES.join(', ')}`);
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Extract YAML frontmatter and body from a markdown string.
60
+ * Returns an empty frontmatter object when no fences are found.
61
+ */
62
+ function parseFrontmatter(content) {
63
+ const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n([\s\S]*))?$/;
64
+ const match = content.match(frontmatterRegex);
65
+ if (!match) {
66
+ return { frontmatter: {}, body: content };
67
+ }
68
+ const frontmatter = {};
69
+ const lines = (match[1] || '').split('\n');
70
+ let currentKey = '';
71
+ let multilineValue = [];
72
+ const flushMultiline = () => {
73
+ if (currentKey && multilineValue.length > 0) {
74
+ frontmatter[currentKey] = multilineValue.join('\n');
75
+ }
76
+ currentKey = '';
77
+ multilineValue = [];
78
+ };
79
+ for (const line of lines) {
80
+ if (currentKey && (line.startsWith(' ') || line.startsWith('\t'))) {
81
+ multilineValue.push(line.replace(/^ {2}/, '').replace(/^\t/, ''));
82
+ continue;
83
+ }
84
+ flushMultiline();
85
+ const trimmed = line.trim();
86
+ if (!trimmed || trimmed.startsWith('#'))
87
+ continue;
88
+ const colonIndex = trimmed.indexOf(':');
89
+ if (colonIndex === -1)
90
+ continue;
91
+ const key = trimmed.substring(0, colonIndex).trim();
92
+ const value = trimmed.substring(colonIndex + 1).trim();
93
+ if (value === '|' || value === '>') {
94
+ currentKey = key;
95
+ multilineValue = [];
96
+ }
97
+ else {
98
+ frontmatter[key] = value.replace(/^["']|["']$/g, '');
99
+ }
100
+ }
101
+ flushMultiline();
102
+ return { frontmatter, body: (match[2] || '').trimStart() };
103
+ }
104
+ /**
105
+ * Escape a string for use inside a TOML basic (double-quoted) string.
106
+ */
107
+ function escapeTomlString(str) {
108
+ return str
109
+ .replace(/\\/g, '\\\\')
110
+ .replace(/"/g, '\\"')
111
+ .replace(/\n/g, '\\n')
112
+ .replace(/\r/g, '\\r')
113
+ .replace(/\t/g, '\\t');
114
+ }
115
+ /**
116
+ * Escape a string for use inside a TOML multi-line basic (triple-quoted) string.
117
+ */
118
+ function escapeTomlTripleQuotedString(str) {
119
+ return str.replace(/\\\\/g, '\\\\\\\\').replace(/"""/g, '"\\""');
120
+ }
121
+ /**
122
+ * Convert a canonical agent markdown template (with YAML frontmatter
123
+ * containing `name` and `description`) into Codex's TOML agent format.
124
+ */
125
+ function convertAgentMdToToml(mdContent) {
126
+ const { frontmatter, body } = parseFrontmatter(mdContent);
127
+ const name = escapeTomlString(frontmatter.name || '');
128
+ const description = escapeTomlString((frontmatter.description || '').trim());
129
+ const instructions = escapeTomlTripleQuotedString(body.trim());
130
+ return [
131
+ `name = "${name}"`,
132
+ `description = "${description}"`,
133
+ `developer_instructions = """`,
134
+ instructions,
135
+ `"""`,
136
+ '',
137
+ ].join('\n');
138
+ }
139
+ /**
140
+ * Return the agent file format, extension, and target directory for a harness.
141
+ */
142
+ function getAgentFormat(harness) {
143
+ switch (harness) {
144
+ case 'codex':
145
+ return { format: 'toml', extension: '.toml', directory: '.codex/agents' };
146
+ case 'github':
147
+ return { format: 'md', extension: '.agent.md', directory: '.github/agents' };
148
+ case 'claude':
149
+ return { format: 'md', extension: '.md', directory: '.claude/agents' };
150
+ case 'gemini':
151
+ return { format: 'md', extension: '.md', directory: '.gemini/agents' };
152
+ case 'cursor':
153
+ return { format: 'md', extension: '.md', directory: '.cursor/agents' };
154
+ case 'opencode':
155
+ return { format: 'md', extension: '.md', directory: '.opencode/agents' };
156
+ }
157
+ }
158
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAmBH,wCAqBC;AAOD,8CAYC;AAYD,4CAkDC;AAKD,4CAOC;AAKD,oEAEC;AAMD,oDAcC;AAWD,wCAeC;AAtLD,MAAM,eAAe,GAAuB;IAC1C,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,UAAU;CACX,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,SAAS,GAAG,KAAK;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE7B,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CACvC,CAAC,OAAO,EAAqB,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAkB,CAAC,CAC9E,CAAC;IAEF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,wBAAwB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxG,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAc,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,SAAoB;IACpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,oBAAoB,OAAO,0BAA0B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAQD;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,OAAe;IAI9C,MAAM,gBAAgB,GAAG,iDAAiD,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,cAAc,GAAa,EAAE,CAAC;IAElC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,UAAU,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,WAAW,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,UAAU,GAAG,EAAE,CAAC;QAChB,cAAc,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACnE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAClE,SAAS;QACX,CAAC;QAED,cAAc,EAAE,CAAC;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,SAAS;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEvD,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,UAAU,GAAG,GAAG,CAAC;YACjB,cAAc,GAAG,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,cAAc,EAAE,CAAC;IAEjB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAgB,4BAA4B,CAAC,GAAW;IACtD,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,SAAiB;IACpD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/D,OAAO;QACL,WAAW,IAAI,GAAG;QAClB,kBAAkB,WAAW,GAAG;QAChC,8BAA8B;QAC9B,YAAY;QACZ,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAQD;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAgB;IAC7C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;QAC5E,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAC/E,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QACzE,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QACzE,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QACzE,KAAK,UAAU;YACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "strikethroo",
3
+ "version": "3.0.0",
4
+ "description": "Task management for AI coding assistants",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "strikethroo": "dist/cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc && npm run build:skills && npm run build:skill-prompts",
11
+ "build:skills": "tsc --noEmit -p tsconfig.skill-scripts.json && node scripts/build-skills.cjs",
12
+ "build:skill-prompts": "node scripts/build-skill-prompts.cjs",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/cli.js",
15
+ "test": "jest",
16
+ "test:watch": "jest --watch",
17
+ "lint": "eslint 'src/**/*.ts' --ignore-pattern 'src/**/*.test.ts' --ignore-pattern 'src/**/__tests__/**'",
18
+ "lint:fix": "eslint 'src/**/*.ts' --ignore-pattern 'src/**/*.test.ts' --ignore-pattern 'src/**/__tests__/**' --fix",
19
+ "format": "prettier --write src/**/*.ts",
20
+ "commitlint": "commitlint --edit",
21
+ "clean": "rm -rf dist",
22
+ "prepublishOnly": "npm run build",
23
+ "prepare": "husky",
24
+ "security:audit": "npm audit",
25
+ "security:audit-json": "npm audit --json",
26
+ "security:fix": "npm audit fix",
27
+ "security:fix-force": "npm audit fix --force"
28
+ },
29
+ "keywords": [
30
+ "cli",
31
+ "task-management",
32
+ "ai",
33
+ "npx",
34
+ "typescript"
35
+ ],
36
+ "author": "e0ipso",
37
+ "license": "proprietary",
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "engines": {
42
+ "node": ">=22.14.0"
43
+ },
44
+ "files": [
45
+ "dist/",
46
+ "templates/",
47
+ "LICENSE"
48
+ ],
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/e0ipso/strikethroo.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/e0ipso/strikethroo/issues"
55
+ },
56
+ "homepage": "https://github.com/e0ipso/strikethroo#readme",
57
+ "dependencies": {
58
+ "chalk": "^5.6.0",
59
+ "commander": "^11.1.0",
60
+ "diff": "^5.2.0",
61
+ "fs-extra": "^11.3.1",
62
+ "gray-matter": "^4.0.3",
63
+ "inquirer": "^9.3.8"
64
+ },
65
+ "devDependencies": {
66
+ "@commitlint/cli": "^19.8.1",
67
+ "@commitlint/config-conventional": "^19.8.1",
68
+ "@eslint/js": "^9.34.0",
69
+ "@semantic-release/changelog": "^6.0.3",
70
+ "@semantic-release/commit-analyzer": "^13.0.1",
71
+ "@semantic-release/git": "^10.0.1",
72
+ "@semantic-release/github": "^12.0.2",
73
+ "@semantic-release/npm": "^13.1.3",
74
+ "@semantic-release/release-notes-generator": "^14.1.0",
75
+ "@types/diff": "^5.2.3",
76
+ "@types/fs-extra": "^11.0.4",
77
+ "@types/inquirer": "^9.0.9",
78
+ "@types/jest": "^30.0.0",
79
+ "@types/node": "^24.3.0",
80
+ "@typescript-eslint/eslint-plugin": "^8.41.0",
81
+ "@typescript-eslint/parser": "^8.41.0",
82
+ "esbuild": "^0.28.0",
83
+ "eslint": "^9.34.0",
84
+ "eslint-config-prettier": "^10.1.8",
85
+ "eslint-plugin-prettier": "^5.5.4",
86
+ "husky": "^9.1.7",
87
+ "jest": "^30.1.2",
88
+ "prettier": "^3.6.2",
89
+ "semantic-release": "^25.0.2",
90
+ "ts-jest": "^29.4.1",
91
+ "ts-node": "^10.9.2",
92
+ "typescript": "^5.9.2"
93
+ }
94
+ }