openplanr 0.8.0 → 1.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 (227) hide show
  1. package/README.md +142 -52
  2. package/dist/agents/index.d.ts +1 -5
  3. package/dist/agents/index.d.ts.map +1 -1
  4. package/dist/agents/index.js +1 -4
  5. package/dist/agents/index.js.map +1 -1
  6. package/dist/agents/task-parser.d.ts +4 -1
  7. package/dist/agents/task-parser.d.ts.map +1 -1
  8. package/dist/agents/task-parser.js +6 -3
  9. package/dist/agents/task-parser.js.map +1 -1
  10. package/dist/agents/utils.d.ts +0 -4
  11. package/dist/agents/utils.d.ts.map +1 -1
  12. package/dist/agents/utils.js +3 -24
  13. package/dist/agents/utils.js.map +1 -1
  14. package/dist/ai/codebase/context-builder.d.ts +22 -3
  15. package/dist/ai/codebase/context-builder.d.ts.map +1 -1
  16. package/dist/ai/codebase/context-builder.js +202 -14
  17. package/dist/ai/codebase/context-builder.js.map +1 -1
  18. package/dist/ai/codebase/file-reader.d.ts.map +1 -1
  19. package/dist/ai/codebase/file-reader.js +7 -3
  20. package/dist/ai/codebase/file-reader.js.map +1 -1
  21. package/dist/ai/codebase/index.d.ts +3 -1
  22. package/dist/ai/codebase/index.d.ts.map +1 -1
  23. package/dist/ai/codebase/index.js +3 -1
  24. package/dist/ai/codebase/index.js.map +1 -1
  25. package/dist/ai/codebase/pattern-rules.d.ts +28 -0
  26. package/dist/ai/codebase/pattern-rules.d.ts.map +1 -0
  27. package/dist/ai/codebase/pattern-rules.js +186 -0
  28. package/dist/ai/codebase/pattern-rules.js.map +1 -0
  29. package/dist/ai/codebase/rules-reader.d.ts +14 -0
  30. package/dist/ai/codebase/rules-reader.d.ts.map +1 -0
  31. package/dist/ai/codebase/rules-reader.js +25 -0
  32. package/dist/ai/codebase/rules-reader.js.map +1 -0
  33. package/dist/ai/codebase/stack-detector.d.ts.map +1 -1
  34. package/dist/ai/codebase/stack-detector.js +4 -1
  35. package/dist/ai/codebase/stack-detector.js.map +1 -1
  36. package/dist/ai/codebase/tree-generator.d.ts.map +1 -1
  37. package/dist/ai/codebase/tree-generator.js +5 -2
  38. package/dist/ai/codebase/tree-generator.js.map +1 -1
  39. package/dist/ai/errors.js +1 -1
  40. package/dist/ai/errors.js.map +1 -1
  41. package/dist/ai/prompts/prompt-builder.d.ts +12 -0
  42. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  43. package/dist/ai/prompts/prompt-builder.js +45 -3
  44. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  45. package/dist/ai/prompts/system-prompts.d.ts +5 -3
  46. package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
  47. package/dist/ai/prompts/system-prompts.js +74 -13
  48. package/dist/ai/prompts/system-prompts.js.map +1 -1
  49. package/dist/ai/schemas/ai-response-schemas.d.ts +48 -2
  50. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
  51. package/dist/ai/schemas/ai-response-schemas.js +19 -0
  52. package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
  53. package/dist/ai/types.d.ts +4 -2
  54. package/dist/ai/types.d.ts.map +1 -1
  55. package/dist/ai/types.js +3 -1
  56. package/dist/ai/types.js.map +1 -1
  57. package/dist/ai/validation/dependency-chains.d.ts +21 -0
  58. package/dist/ai/validation/dependency-chains.d.ts.map +1 -0
  59. package/dist/ai/validation/dependency-chains.js +114 -0
  60. package/dist/ai/validation/dependency-chains.js.map +1 -0
  61. package/dist/ai/validation/index.d.ts +3 -0
  62. package/dist/ai/validation/index.d.ts.map +1 -0
  63. package/dist/ai/validation/index.js +3 -0
  64. package/dist/ai/validation/index.js.map +1 -0
  65. package/dist/ai/validation/task-validator.d.ts +37 -0
  66. package/dist/ai/validation/task-validator.d.ts.map +1 -0
  67. package/dist/ai/validation/task-validator.js +89 -0
  68. package/dist/ai/validation/task-validator.js.map +1 -0
  69. package/dist/cli/commands/backlog.d.ts +10 -0
  70. package/dist/cli/commands/backlog.d.ts.map +1 -0
  71. package/dist/cli/commands/backlog.js +292 -0
  72. package/dist/cli/commands/backlog.js.map +1 -0
  73. package/dist/cli/commands/checklist.js +4 -4
  74. package/dist/cli/commands/checklist.js.map +1 -1
  75. package/dist/cli/commands/config.js +13 -13
  76. package/dist/cli/commands/config.js.map +1 -1
  77. package/dist/cli/commands/epic.d.ts.map +1 -1
  78. package/dist/cli/commands/epic.js +41 -22
  79. package/dist/cli/commands/epic.js.map +1 -1
  80. package/dist/cli/commands/estimate.d.ts.map +1 -1
  81. package/dist/cli/commands/estimate.js +40 -39
  82. package/dist/cli/commands/estimate.js.map +1 -1
  83. package/dist/cli/commands/export.d.ts +8 -0
  84. package/dist/cli/commands/export.d.ts.map +1 -0
  85. package/dist/cli/commands/export.js +282 -0
  86. package/dist/cli/commands/export.js.map +1 -0
  87. package/dist/cli/commands/feature.js +9 -9
  88. package/dist/cli/commands/feature.js.map +1 -1
  89. package/dist/cli/commands/github.d.ts +8 -0
  90. package/dist/cli/commands/github.d.ts.map +1 -0
  91. package/dist/cli/commands/github.js +415 -0
  92. package/dist/cli/commands/github.js.map +1 -0
  93. package/dist/cli/commands/plan.d.ts.map +1 -1
  94. package/dist/cli/commands/plan.js +104 -50
  95. package/dist/cli/commands/plan.js.map +1 -1
  96. package/dist/cli/commands/quick.d.ts.map +1 -1
  97. package/dist/cli/commands/quick.js +37 -107
  98. package/dist/cli/commands/quick.js.map +1 -1
  99. package/dist/cli/commands/refine.js +21 -21
  100. package/dist/cli/commands/refine.js.map +1 -1
  101. package/dist/cli/commands/search.d.ts.map +1 -1
  102. package/dist/cli/commands/search.js +18 -7
  103. package/dist/cli/commands/search.js.map +1 -1
  104. package/dist/cli/commands/sprint.d.ts +9 -0
  105. package/dist/cli/commands/sprint.d.ts.map +1 -0
  106. package/dist/cli/commands/sprint.js +519 -0
  107. package/dist/cli/commands/sprint.js.map +1 -0
  108. package/dist/cli/commands/status.d.ts.map +1 -1
  109. package/dist/cli/commands/status.js +77 -32
  110. package/dist/cli/commands/status.js.map +1 -1
  111. package/dist/cli/commands/story.js +15 -15
  112. package/dist/cli/commands/story.js.map +1 -1
  113. package/dist/cli/commands/sync.js +11 -7
  114. package/dist/cli/commands/sync.js.map +1 -1
  115. package/dist/cli/commands/task.d.ts +0 -2
  116. package/dist/cli/commands/task.d.ts.map +1 -1
  117. package/dist/cli/commands/task.js +14 -169
  118. package/dist/cli/commands/task.js.map +1 -1
  119. package/dist/cli/commands/template.d.ts +10 -0
  120. package/dist/cli/commands/template.d.ts.map +1 -0
  121. package/dist/cli/commands/template.js +269 -0
  122. package/dist/cli/commands/template.js.map +1 -0
  123. package/dist/cli/helpers/task-creation.d.ts +89 -0
  124. package/dist/cli/helpers/task-creation.d.ts.map +1 -0
  125. package/dist/cli/helpers/task-creation.js +140 -0
  126. package/dist/cli/helpers/task-creation.js.map +1 -0
  127. package/dist/cli/index.js +29 -2
  128. package/dist/cli/index.js.map +1 -1
  129. package/dist/models/schema.d.ts +2 -0
  130. package/dist/models/schema.d.ts.map +1 -1
  131. package/dist/models/schema.js +2 -0
  132. package/dist/models/schema.js.map +1 -1
  133. package/dist/models/types.d.ts +32 -1
  134. package/dist/models/types.d.ts.map +1 -1
  135. package/dist/services/artifact-gathering.d.ts +2 -0
  136. package/dist/services/artifact-gathering.d.ts.map +1 -1
  137. package/dist/services/artifact-gathering.js +26 -7
  138. package/dist/services/artifact-gathering.js.map +1 -1
  139. package/dist/services/artifact-service.d.ts +5 -5
  140. package/dist/services/artifact-service.d.ts.map +1 -1
  141. package/dist/services/artifact-service.js +4 -0
  142. package/dist/services/artifact-service.js.map +1 -1
  143. package/dist/services/config-service.d.ts.map +1 -1
  144. package/dist/services/config-service.js +2 -0
  145. package/dist/services/config-service.js.map +1 -1
  146. package/dist/services/credential-backends.d.ts.map +1 -1
  147. package/dist/services/credential-backends.js +15 -7
  148. package/dist/services/credential-backends.js.map +1 -1
  149. package/dist/services/credentials-service.d.ts.map +1 -1
  150. package/dist/services/credentials-service.js +6 -3
  151. package/dist/services/credentials-service.js.map +1 -1
  152. package/dist/services/github-service.d.ts +83 -0
  153. package/dist/services/github-service.d.ts.map +1 -0
  154. package/dist/services/github-service.js +440 -0
  155. package/dist/services/github-service.js.map +1 -0
  156. package/dist/services/template-service.d.ts +2 -1
  157. package/dist/services/template-service.d.ts.map +1 -1
  158. package/dist/services/template-service.js +3 -1
  159. package/dist/services/template-service.js.map +1 -1
  160. package/dist/templates/backlog/backlog-item.md.hbs +40 -0
  161. package/dist/templates/checklists/agile-checklist.md.hbs +1 -1
  162. package/dist/templates/export/planning-report.html.hbs +230 -0
  163. package/dist/templates/export/planning-report.md.hbs +136 -0
  164. package/dist/templates/quick/quick-task.md.hbs +1 -1
  165. package/dist/templates/rules/claude/CLAUDE.md.hbs +78 -35
  166. package/dist/templates/rules/codex/AGENTS.md.hbs +73 -17
  167. package/dist/templates/rules/cursor/2101-implement-task-list.mdc.hbs +66 -14
  168. package/dist/templates/sprints/sprint.md.hbs +42 -0
  169. package/dist/templates/task-templates/api-integration.json +45 -0
  170. package/dist/templates/task-templates/auth-flow.json +48 -0
  171. package/dist/templates/task-templates/database-migration.json +44 -0
  172. package/dist/templates/task-templates/react-component.json +45 -0
  173. package/dist/templates/task-templates/rest-endpoint.json +53 -0
  174. package/dist/templates/tasks/task-list.md.hbs +1 -1
  175. package/dist/utils/constants.d.ts +4 -0
  176. package/dist/utils/constants.d.ts.map +1 -1
  177. package/dist/utils/constants.js +4 -0
  178. package/dist/utils/constants.js.map +1 -1
  179. package/dist/utils/logger.d.ts +31 -1
  180. package/dist/utils/logger.d.ts.map +1 -1
  181. package/dist/utils/logger.js +92 -9
  182. package/dist/utils/logger.js.map +1 -1
  183. package/dist/utils/markdown.d.ts +3 -2
  184. package/dist/utils/markdown.d.ts.map +1 -1
  185. package/dist/utils/markdown.js +3 -1
  186. package/dist/utils/markdown.js.map +1 -1
  187. package/dist/utils/slugify.d.ts +8 -1
  188. package/dist/utils/slugify.d.ts.map +1 -1
  189. package/dist/utils/slugify.js +18 -2
  190. package/dist/utils/slugify.js.map +1 -1
  191. package/package.json +14 -3
  192. package/dist/agents/agent-factory.d.ts +0 -7
  193. package/dist/agents/agent-factory.d.ts.map +0 -1
  194. package/dist/agents/agent-factory.js +0 -22
  195. package/dist/agents/agent-factory.js.map +0 -1
  196. package/dist/agents/claude-agent.d.ts +0 -18
  197. package/dist/agents/claude-agent.d.ts.map +0 -1
  198. package/dist/agents/claude-agent.js +0 -183
  199. package/dist/agents/claude-agent.js.map +0 -1
  200. package/dist/agents/codex-agent.d.ts +0 -17
  201. package/dist/agents/codex-agent.d.ts.map +0 -1
  202. package/dist/agents/codex-agent.js +0 -124
  203. package/dist/agents/codex-agent.js.map +0 -1
  204. package/dist/agents/cursor-agent.d.ts +0 -14
  205. package/dist/agents/cursor-agent.d.ts.map +0 -1
  206. package/dist/agents/cursor-agent.js +0 -49
  207. package/dist/agents/cursor-agent.js.map +0 -1
  208. package/dist/agents/implementation-bridge.d.ts +0 -30
  209. package/dist/agents/implementation-bridge.d.ts.map +0 -1
  210. package/dist/agents/implementation-bridge.js +0 -256
  211. package/dist/agents/implementation-bridge.js.map +0 -1
  212. package/dist/agents/progress.d.ts +0 -62
  213. package/dist/agents/progress.d.ts.map +0 -1
  214. package/dist/agents/progress.js +0 -155
  215. package/dist/agents/progress.js.map +0 -1
  216. package/dist/agents/prompt-composer.d.ts +0 -30
  217. package/dist/agents/prompt-composer.d.ts.map +0 -1
  218. package/dist/agents/prompt-composer.js +0 -81
  219. package/dist/agents/prompt-composer.js.map +0 -1
  220. package/dist/agents/types.d.ts +0 -25
  221. package/dist/agents/types.d.ts.map +0 -1
  222. package/dist/agents/types.js +0 -8
  223. package/dist/agents/types.js.map +0 -1
  224. package/dist/utils/error-context.d.ts +0 -23
  225. package/dist/utils/error-context.d.ts.map +0 -1
  226. package/dist/utils/error-context.js +0 -94
  227. package/dist/utils/error-context.js.map +0 -1
@@ -1,28 +1,80 @@
1
1
  ---
2
- description: "Implement Task List — manage task-by-task implementation for {{projectName}}"
2
+ description: "Implement Task List — context-aware task implementation guide for {{projectName}}"
3
3
  globs: ""
4
4
  alwaysApply: false
5
5
  ---
6
6
 
7
7
  # Implement Task List
8
8
 
9
- You are an implementation assistant. Guide one-task-at-a-time implementation.
9
+ You are an implementation assistant for **{{projectName}}**. Before writing any code, you MUST gather full planning context by reading the artifact hierarchy.
10
10
 
11
- ## Rules
11
+ ## Context-Gathering Protocol
12
12
 
13
- 1. Only work on ONE subtask at a time
14
- 2. Wait for user approval before moving to the next subtask
15
- 3. After completing a subtask, update the task list by checking the box
16
- 4. Reference acceptance criteria from the linked user story's Gherkin file
13
+ Before implementing ANY subtask, follow this exact sequence:
17
14
 
18
- ## Process
15
+ ### Step 1: Read the Task List
16
+ - Open the task file from `{{agilePath}}/tasks/` (e.g., `TASK-001-*.md`)
17
+ - Parse the frontmatter to find `storyId` or `featureId`
18
+ - Identify the target subtask (first unchecked `- [ ]` item)
19
+ - Read ALL subtasks to understand the full scope and dependencies
19
20
 
20
- 1. Read the task list from `{{agilePath}}/tasks/`
21
- 2. Find the first unchecked subtask
22
- 3. Implement it
23
- 4. Mark it complete in the task file
24
- 5. Ask the user to review before proceeding
21
+ ### Step 2: Read the Parent Chain (MANDATORY)
22
+ Follow the artifact hierarchy upward — each level adds critical context:
25
23
 
26
- ## Task Locations
24
+ 1. **User Story** → `{{agilePath}}/stories/US-XXX-*.md`
25
+ - Read the full story (role, goal, benefit, acceptance criteria)
26
+ - Find and read the matching Gherkin file: `{{agilePath}}/stories/US-XXX-gherkin.feature`
27
+ - Extract the parent `featureId` from frontmatter
28
+
29
+ 2. **Feature** → `{{agilePath}}/features/FEAT-XXX-*.md`
30
+ - Read the full feature (overview, functional requirements, technical considerations)
31
+ - Extract the parent `epicId` from frontmatter
32
+
33
+ 3. **Epic** → `{{agilePath}}/epics/EPIC-XXX-*.md`
34
+ - Read the epic summary (business value, problem statement, success criteria)
35
+ - This provides the WHY behind the work
36
+
37
+ ### Step 3: Read Architecture Context
38
+ - Read ALL ADRs in `{{agilePath}}/adrs/` — these are binding technical decisions
39
+ - Check `{{agilePath}}/checklists/AGILE-DEVELOPMENT-GUIDE.md` for current progress
40
+
41
+ ### Step 4: Scan the Codebase
42
+ Before writing code, understand what exists:
43
+
44
+ 1. **Identify the tech stack** — Read `package.json`, `tsconfig.json`, or equivalent
45
+ 2. **Scan the source tree** — List directories under `src/` (or project root)
46
+ 3. **Read architecture files** — Look for these high-priority files:
47
+ - Type definitions: `src/models/types.ts`, `src/types/index.ts`, or `src/types.ts`
48
+ - Core services: `src/services/` — understand CRUD patterns
49
+ - Entry point: `src/index.ts`, `src/main.ts`, or `src/app.ts` — understand registration patterns
50
+ - Config: `src/config.ts` or `src/services/config-service.ts`
51
+ 4. **Find related files** — Search for files matching keywords from the task description
52
+ 5. **Check project rules** — Read `.planr/rules.md` if it exists (MANDATORY rules)
53
+
54
+ ## Implementation Rules
55
+
56
+ 1. **ONE subtask at a time** — implement only the target subtask
57
+ 2. **Wait for user approval** before moving to the next subtask
58
+ 3. **Follow existing patterns** — match the code style, naming conventions, and architecture from Step 4
59
+ 4. **Map to acceptance criteria** — every implementation must satisfy the Gherkin scenarios from Step 2
60
+ 5. **Update the task file** — check the box `- [x]` for completed subtasks
61
+ 6. **Don't modify unrelated code** — stay focused on the target subtask
62
+
63
+ ## Artifact Locations
27
64
  - Task lists: `{{agilePath}}/tasks/`
28
65
  - User stories: `{{agilePath}}/stories/`
66
+ - Gherkin acceptance criteria: `{{agilePath}}/stories/*-gherkin.feature`
67
+ - Features: `{{agilePath}}/features/`
68
+ - Epics: `{{agilePath}}/epics/`
69
+ - Quick tasks: `{{agilePath}}/quick/`
70
+ - Backlog items: `{{agilePath}}/backlog/`
71
+ - ADRs: `{{agilePath}}/adrs/`
72
+ - Sprints: `{{agilePath}}/sprints/`
73
+
74
+ ## Frontmatter Cross-References
75
+ Artifacts link to their parents via frontmatter fields:
76
+ - Tasks → `storyId: "US-XXX"` or `featureId: "FEAT-XXX"`
77
+ - Stories → `featureId: "FEAT-XXX"`
78
+ - Features → `epicId: "EPIC-XXX"`
79
+
80
+ Always follow these links to build the full context chain.
@@ -0,0 +1,42 @@
1
+ ---
2
+ id: "{{id}}"
3
+ name: "{{name}}"
4
+ startDate: "{{startDate}}"
5
+ endDate: "{{endDate}}"
6
+ duration: "{{duration}}"
7
+ status: "{{status}}"
8
+ created: "{{date}}"
9
+ updated: "{{date}}"
10
+ taskIds: [{{#each taskIds}}"{{this}}"{{#unless @last}}, {{/unless}}{{/each}}]
11
+ ---
12
+
13
+ # {{id}}: {{name}}
14
+
15
+ ## Sprint Details
16
+ - **Duration:** {{duration}}
17
+ - **Start:** {{startDate}}
18
+ - **End:** {{endDate}}
19
+ - **Status:** {{uppercase status}}
20
+
21
+ {{#if goals}}
22
+ ## Goals
23
+ {{#each goals}}
24
+ - {{this}}
25
+ {{/each}}
26
+ {{/if}}
27
+
28
+ ## Tasks
29
+ {{#if taskIds}}
30
+ {{#each taskIds}}
31
+ - [ ] {{this}}
32
+ {{/each}}
33
+ {{else}}
34
+ _No tasks assigned yet. Run `planr sprint add <taskId>` to assign tasks._
35
+ {{/if}}
36
+
37
+ ## Retrospective
38
+ _Complete this section when closing the sprint with `planr sprint close`._
39
+
40
+ ---
41
+ _View progress: `planr sprint status`_
42
+ _Close sprint: `planr sprint close`_
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "api-integration",
3
+ "description": "External API client with retry logic, error handling, and tests",
4
+ "variables": ["serviceName", "baseUrl"],
5
+ "tasks": [
6
+ {
7
+ "id": "1.0",
8
+ "title": "API client setup",
9
+ "subtasks": [
10
+ { "id": "1.1", "title": "Create {{serviceName}} API client module" },
11
+ { "id": "1.2", "title": "Configure base URL, headers, and authentication" },
12
+ { "id": "1.3", "title": "Add environment variables for {{serviceName}} credentials" }
13
+ ]
14
+ },
15
+ {
16
+ "id": "2.0",
17
+ "title": "Implement API methods",
18
+ "subtasks": [
19
+ { "id": "2.1", "title": "Implement core API methods for {{serviceName}}" },
20
+ { "id": "2.2", "title": "Add request/response type definitions" },
21
+ { "id": "2.3", "title": "Add response parsing and data transformation" }
22
+ ]
23
+ },
24
+ {
25
+ "id": "3.0",
26
+ "title": "Reliability and error handling",
27
+ "subtasks": [
28
+ { "id": "3.1", "title": "Add retry logic with exponential backoff" },
29
+ { "id": "3.2", "title": "Add timeout configuration" },
30
+ { "id": "3.3", "title": "Add error classification (retryable vs fatal)" },
31
+ { "id": "3.4", "title": "Add rate limiting / throttling support" }
32
+ ]
33
+ },
34
+ {
35
+ "id": "4.0",
36
+ "title": "Testing",
37
+ "subtasks": [
38
+ { "id": "4.1", "title": "Unit tests with mocked HTTP responses" },
39
+ { "id": "4.2", "title": "Test retry logic and error scenarios" },
40
+ { "id": "4.3", "title": "Test timeout and rate limit handling" },
41
+ { "id": "4.4", "title": "Integration test with {{serviceName}} sandbox (if available)" }
42
+ ]
43
+ }
44
+ ]
45
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "auth-flow",
3
+ "description": "Authentication flow with login, signup, and password reset",
4
+ "variables": ["authProvider"],
5
+ "tasks": [
6
+ {
7
+ "id": "1.0",
8
+ "title": "Authentication infrastructure",
9
+ "subtasks": [
10
+ { "id": "1.1", "title": "Set up {{authProvider}} authentication provider" },
11
+ { "id": "1.2", "title": "Configure session/token management (JWT or session)" },
12
+ { "id": "1.3", "title": "Add auth middleware for protected routes" }
13
+ ]
14
+ },
15
+ {
16
+ "id": "2.0",
17
+ "title": "Implement auth endpoints",
18
+ "subtasks": [
19
+ { "id": "2.1", "title": "POST /auth/signup — user registration" },
20
+ { "id": "2.2", "title": "POST /auth/login — user login" },
21
+ { "id": "2.3", "title": "POST /auth/logout — session termination" },
22
+ { "id": "2.4", "title": "POST /auth/forgot-password — password reset request" },
23
+ { "id": "2.5", "title": "POST /auth/reset-password — password reset confirmation" }
24
+ ]
25
+ },
26
+ {
27
+ "id": "3.0",
28
+ "title": "Security hardening",
29
+ "subtasks": [
30
+ { "id": "3.1", "title": "Add input validation and sanitization" },
31
+ { "id": "3.2", "title": "Implement rate limiting on auth endpoints" },
32
+ { "id": "3.3", "title": "Add password strength requirements" },
33
+ { "id": "3.4", "title": "Secure token storage and rotation" }
34
+ ]
35
+ },
36
+ {
37
+ "id": "4.0",
38
+ "title": "Testing",
39
+ "subtasks": [
40
+ { "id": "4.1", "title": "Test signup flow (valid input, duplicate email, weak password)" },
41
+ { "id": "4.2", "title": "Test login flow (valid credentials, invalid, locked account)" },
42
+ { "id": "4.3", "title": "Test password reset flow end-to-end" },
43
+ { "id": "4.4", "title": "Test auth middleware (valid token, expired, missing)" },
44
+ { "id": "4.5", "title": "Test rate limiting on auth endpoints" }
45
+ ]
46
+ }
47
+ ]
48
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "database-migration",
3
+ "description": "Schema change with migration, rollback, and seed data",
4
+ "variables": ["tableName", "changeDescription"],
5
+ "tasks": [
6
+ {
7
+ "id": "1.0",
8
+ "title": "Plan schema change",
9
+ "subtasks": [
10
+ { "id": "1.1", "title": "Document {{changeDescription}} for {{tableName}} table" },
11
+ { "id": "1.2", "title": "Review impact on existing queries and indexes" },
12
+ { "id": "1.3", "title": "Check for foreign key constraints and cascading effects" }
13
+ ]
14
+ },
15
+ {
16
+ "id": "2.0",
17
+ "title": "Create migration",
18
+ "subtasks": [
19
+ { "id": "2.1", "title": "Write up migration for {{tableName}}" },
20
+ { "id": "2.2", "title": "Write down migration (rollback)" },
21
+ { "id": "2.3", "title": "Test migration on local database" }
22
+ ]
23
+ },
24
+ {
25
+ "id": "3.0",
26
+ "title": "Update application code",
27
+ "subtasks": [
28
+ { "id": "3.1", "title": "Update ORM models/types for {{tableName}}" },
29
+ { "id": "3.2", "title": "Update queries and repository layer" },
30
+ { "id": "3.3", "title": "Update API serialization if schema changed" }
31
+ ]
32
+ },
33
+ {
34
+ "id": "4.0",
35
+ "title": "Testing and validation",
36
+ "subtasks": [
37
+ { "id": "4.1", "title": "Update seed data for {{tableName}}" },
38
+ { "id": "4.2", "title": "Run existing tests and fix breakages" },
39
+ { "id": "4.3", "title": "Test rollback migration works correctly" },
40
+ { "id": "4.4", "title": "Verify data integrity after migration" }
41
+ ]
42
+ }
43
+ ]
44
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "react-component",
3
+ "description": "React component with stories, tests, and types",
4
+ "variables": ["componentName"],
5
+ "tasks": [
6
+ {
7
+ "id": "1.0",
8
+ "title": "Component setup",
9
+ "subtasks": [
10
+ { "id": "1.1", "title": "Create {{componentName}} component file with props interface" },
11
+ { "id": "1.2", "title": "Add component styles (CSS modules or styled-components)" },
12
+ { "id": "1.3", "title": "Export from component index barrel" }
13
+ ]
14
+ },
15
+ {
16
+ "id": "2.0",
17
+ "title": "Implement component logic",
18
+ "subtasks": [
19
+ { "id": "2.1", "title": "Implement {{componentName}} render logic and state" },
20
+ { "id": "2.2", "title": "Add event handlers and callbacks" },
21
+ { "id": "2.3", "title": "Handle loading, error, and empty states" },
22
+ { "id": "2.4", "title": "Add accessibility attributes (aria-labels, roles, keyboard nav)" }
23
+ ]
24
+ },
25
+ {
26
+ "id": "3.0",
27
+ "title": "Storybook stories",
28
+ "subtasks": [
29
+ { "id": "3.1", "title": "Create default story for {{componentName}}" },
30
+ { "id": "3.2", "title": "Add variant stories (sizes, states, themes)" },
31
+ { "id": "3.3", "title": "Add interactive story with controls" }
32
+ ]
33
+ },
34
+ {
35
+ "id": "4.0",
36
+ "title": "Tests",
37
+ "subtasks": [
38
+ { "id": "4.1", "title": "Unit tests for {{componentName}} rendering" },
39
+ { "id": "4.2", "title": "Test user interactions and event handlers" },
40
+ { "id": "4.3", "title": "Test edge cases and error states" },
41
+ { "id": "4.4", "title": "Snapshot or visual regression test" }
42
+ ]
43
+ }
44
+ ]
45
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "rest-endpoint",
3
+ "description": "CRUD REST endpoint with validation, auth, tests, and docs",
4
+ "variables": ["entityName", "basePath"],
5
+ "tasks": [
6
+ {
7
+ "id": "1.0",
8
+ "title": "Define data model and types",
9
+ "subtasks": [
10
+ { "id": "1.1", "title": "Create {{entityName}} interface/type definition" },
11
+ { "id": "1.2", "title": "Add Zod validation schema for {{entityName}}" },
12
+ { "id": "1.3", "title": "Define request/response DTOs" }
13
+ ]
14
+ },
15
+ {
16
+ "id": "2.0",
17
+ "title": "Implement API routes",
18
+ "subtasks": [
19
+ { "id": "2.1", "title": "Create GET {{basePath}} — list all {{entityName}}s" },
20
+ { "id": "2.2", "title": "Create GET {{basePath}}/:id — get single {{entityName}}" },
21
+ { "id": "2.3", "title": "Create POST {{basePath}} — create {{entityName}}" },
22
+ { "id": "2.4", "title": "Create PUT {{basePath}}/:id — update {{entityName}}" },
23
+ { "id": "2.5", "title": "Create DELETE {{basePath}}/:id — delete {{entityName}}" }
24
+ ]
25
+ },
26
+ {
27
+ "id": "3.0",
28
+ "title": "Add middleware and validation",
29
+ "subtasks": [
30
+ { "id": "3.1", "title": "Add request body validation middleware" },
31
+ { "id": "3.2", "title": "Add authentication/authorization checks" },
32
+ { "id": "3.3", "title": "Add error handling and proper HTTP status codes" }
33
+ ]
34
+ },
35
+ {
36
+ "id": "4.0",
37
+ "title": "Write tests",
38
+ "subtasks": [
39
+ { "id": "4.1", "title": "Unit tests for {{entityName}} validation logic" },
40
+ { "id": "4.2", "title": "Integration tests for all CRUD endpoints" },
41
+ { "id": "4.3", "title": "Test error cases (404, 400, 401, 403)" }
42
+ ]
43
+ },
44
+ {
45
+ "id": "5.0",
46
+ "title": "Documentation",
47
+ "subtasks": [
48
+ { "id": "5.1", "title": "Add API documentation for {{basePath}} endpoints" },
49
+ { "id": "5.2", "title": "Update README with new endpoint details" }
50
+ ]
51
+ }
52
+ ]
53
+ }
@@ -44,4 +44,4 @@ status: "pending"
44
44
  {{/if}}
45
45
 
46
46
  ## Notes
47
- _Mark tasks complete by checking the boxes above, or run `planr task implement {{id}}`._
47
+ _Mark tasks complete by checking the boxes above. Use your coding agent (Claude Code, Cursor, Codex) with the generated rules for context-aware implementation._
@@ -7,6 +7,8 @@ export declare const ARTIFACT_DIRS: {
7
7
  readonly stories: "stories";
8
8
  readonly tasks: "tasks";
9
9
  readonly quick: "quick";
10
+ readonly backlog: "backlog";
11
+ readonly sprints: "sprints";
10
12
  readonly adrs: "adrs";
11
13
  readonly checklists: "checklists";
12
14
  };
@@ -16,6 +18,8 @@ export declare const ID_PREFIXES: {
16
18
  readonly story: "US";
17
19
  readonly task: "TASK";
18
20
  readonly quick: "QT";
21
+ readonly backlog: "BL";
22
+ readonly sprint: "SPRINT";
19
23
  readonly adr: "ADR";
20
24
  };
21
25
  export declare function getTemplatesDir(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AAExD,eAAO,MAAM,aAAa;;;;;;;;CAQhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;CAOd,CAAC;AAEX,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AAExD,eAAO,MAAM,aAAa;;;;;;;;;;CAUhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -11,6 +11,8 @@ export const ARTIFACT_DIRS = {
11
11
  stories: 'stories',
12
12
  tasks: 'tasks',
13
13
  quick: 'quick',
14
+ backlog: 'backlog',
15
+ sprints: 'sprints',
14
16
  adrs: 'adrs',
15
17
  checklists: 'checklists',
16
18
  };
@@ -20,6 +22,8 @@ export const ID_PREFIXES = {
20
22
  story: 'US',
21
23
  task: 'TASK',
22
24
  quick: 'QT',
25
+ backlog: 'BL',
26
+ sprint: 'SPRINT',
23
27
  adr: 'ADR',
24
28
  };
25
29
  export function getTemplatesDir() {
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
@@ -16,6 +16,36 @@ export declare const logger: {
16
16
  error(msg: string): void;
17
17
  heading(msg: string): void;
18
18
  dim(msg: string): void;
19
- debug(msg: string): void;
19
+ debug(msg: string, ...args: unknown[]): void;
20
+ };
21
+ export declare const display: {
22
+ /** Print a single formatted line. */
23
+ line(text: string): void;
24
+ /** Print an empty line for spacing. */
25
+ blank(): void;
26
+ /** Print a dim horizontal separator. */
27
+ separator(width?: number, char?: string): void;
28
+ /** Print a bold section heading. */
29
+ heading(text: string): void;
30
+ /** Print a key-value pair with aligned label. */
31
+ keyValue(label: string, value: string, indent?: number): void;
32
+ /** Print a bulleted list item. */
33
+ bullet(text: string, indent?: number): void;
34
+ /** Print a numbered list item. */
35
+ numbered(index: number, text: string, indent?: number): void;
36
+ /** Print a table header row with dim column names. */
37
+ tableHeader(columns: {
38
+ label: string;
39
+ width: number;
40
+ }[], indent?: number): void;
41
+ /** Print a table row with padded columns. */
42
+ tableRow(values: string[], widths: number[], indent?: number): void;
43
+ /** Print a table separator matching column widths. */
44
+ tableSeparator(totalWidth: number, indent?: number, char?: string): void;
45
+ /** Print a progress bar. */
46
+ progressBar(percent: number, width?: number, opts?: {
47
+ label?: string;
48
+ indent?: number;
49
+ }): void;
20
50
  };
21
51
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAM9C,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAG1D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA2BtD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,eAAO,MAAM,MAAM;cACP,MAAM;iBAGH,MAAM;cAGT,MAAM;eAGL,MAAM;iBAGJ,MAAM;aAGV,MAAM;eAGJ,MAAM;CAKlB,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAe9C,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAG1D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA2BtD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,eAAO,MAAM,MAAM;cACP,MAAM;iBAGH,MAAM;cAGT,MAAM;eAGL,MAAM;iBAGJ,MAAM;aAGV,MAAM;eAGJ,MAAM,WAAW,OAAO,EAAE;CAStC,CAAC;AAQF,eAAO,MAAM,OAAO;IAClB,qCAAqC;eAC1B,MAAM;IAGjB,uCAAuC;;IAIvC,wCAAwC;;IAIxC,oCAAoC;kBACtB,MAAM;IAGpB,iDAAiD;oBACjC,MAAM,SAAS,MAAM;IAIrC,kCAAkC;iBACrB,MAAM;IAInB,kCAAkC;oBAClB,MAAM,QAAQ,MAAM;IAIpC,sDAAsD;yBACjC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;IAKvD,6CAA6C;qBAC5B,MAAM,EAAE,UAAU,MAAM,EAAE;IAK3C,sDAAsD;+BAC3B,MAAM;IAIjC,4BAA4B;yBACP,MAAM,yBAAoB;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;CAgBnF,CAAC"}
@@ -1,4 +1,12 @@
1
1
  import chalk from 'chalk';
2
+ // ---------------------------------------------------------------------------
3
+ // Internal output primitives — the only place console.* is allowed.
4
+ // All public APIs (logger.*, display.*) delegate here.
5
+ // ---------------------------------------------------------------------------
6
+ // biome-ignore lint/suspicious/noConsole: logger is the intentional console abstraction
7
+ const out = (...args) => console.log(...args);
8
+ // biome-ignore lint/suspicious/noConsole: logger is the intentional console abstraction
9
+ const outErr = (...args) => console.error(...args);
2
10
  let verboseEnabled = false;
3
11
  const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
4
12
  /** Format token usage for display. Returns empty string if no usage data. */
@@ -28,7 +36,7 @@ export function createSpinner(message) {
28
36
  succeed(msg) {
29
37
  clearInterval(interval);
30
38
  process.stdout.write(`\r${' '.repeat(currentMsg.length + 4)}\r`);
31
- console.log(chalk.green('✓'), msg);
39
+ out(chalk.green('✓'), msg);
32
40
  },
33
41
  };
34
42
  }
@@ -40,27 +48,102 @@ export function isVerbose() {
40
48
  }
41
49
  export const logger = {
42
50
  info(msg) {
43
- console.log(chalk.blue('ℹ'), msg);
51
+ out(chalk.blue('ℹ'), msg);
44
52
  },
45
53
  success(msg) {
46
- console.log(chalk.green('✓'), msg);
54
+ out(chalk.green('✓'), msg);
47
55
  },
48
56
  warn(msg) {
49
- console.log(chalk.yellow('⚠'), msg);
57
+ out(chalk.yellow('⚠'), msg);
50
58
  },
51
59
  error(msg) {
52
- console.error(chalk.red('✗'), msg);
60
+ outErr(chalk.red('✗'), msg);
53
61
  },
54
62
  heading(msg) {
55
- console.log(chalk.bold.cyan(`\n${msg}`));
63
+ out(chalk.bold.cyan(`\n${msg}`));
56
64
  },
57
65
  dim(msg) {
58
- console.log(chalk.dim(msg));
66
+ out(chalk.dim(msg));
59
67
  },
60
- debug(msg) {
68
+ debug(msg, ...args) {
61
69
  if (verboseEnabled) {
62
- console.log(chalk.gray(`[DEBUG] ${msg}`));
70
+ const extra = args.length > 0
71
+ ? ` ${args.map((a) => (a instanceof Error ? (a.stack ?? a.message) : String(a))).join(' ')}`
72
+ : '';
73
+ out(chalk.gray(`[DEBUG] ${msg}${extra}`));
63
74
  }
64
75
  },
65
76
  };
77
+ // ---------------------------------------------------------------------------
78
+ // display — intentional user-facing output
79
+ //
80
+ // Use `display.*` for formatted output the user sees (tables, lists, previews).
81
+ // Use `logger.*` for operational messages (info, warn, error, debug).
82
+ // ---------------------------------------------------------------------------
83
+ export const display = {
84
+ /** Print a single formatted line. */
85
+ line(text) {
86
+ out(text);
87
+ },
88
+ /** Print an empty line for spacing. */
89
+ blank() {
90
+ out('');
91
+ },
92
+ /** Print a dim horizontal separator. */
93
+ separator(width = 50, char = '━') {
94
+ out(chalk.dim(char.repeat(width)));
95
+ },
96
+ /** Print a bold section heading. */
97
+ heading(text) {
98
+ out(chalk.bold(text));
99
+ },
100
+ /** Print a key-value pair with aligned label. */
101
+ keyValue(label, value, indent = 2) {
102
+ const pad = ' '.repeat(indent);
103
+ out(`${pad}${chalk.dim(`${label}:`)} ${value}`);
104
+ },
105
+ /** Print a bulleted list item. */
106
+ bullet(text, indent = 4) {
107
+ const pad = ' '.repeat(indent);
108
+ out(`${pad}• ${text}`);
109
+ },
110
+ /** Print a numbered list item. */
111
+ numbered(index, text, indent = 4) {
112
+ const pad = ' '.repeat(indent);
113
+ out(`${pad}${chalk.dim(`${index}.`)} ${text}`);
114
+ },
115
+ /** Print a table header row with dim column names. */
116
+ tableHeader(columns, indent = 2) {
117
+ const pad = ' '.repeat(indent);
118
+ const header = columns.map((c) => chalk.dim(c.label.padEnd(c.width))).join(' ');
119
+ out(`${pad}${header}`);
120
+ },
121
+ /** Print a table row with padded columns. */
122
+ tableRow(values, widths, indent = 2) {
123
+ const pad = ' '.repeat(indent);
124
+ const row = values.map((v, i) => v.padEnd(widths[i] ?? 0)).join(' ');
125
+ out(`${pad}${row}`);
126
+ },
127
+ /** Print a table separator matching column widths. */
128
+ tableSeparator(totalWidth, indent = 2, char = '─') {
129
+ const pad = ' '.repeat(indent);
130
+ out(`${pad}${char.repeat(totalWidth)}`);
131
+ },
132
+ /** Print a progress bar. */
133
+ progressBar(percent, width = 20, opts = {}) {
134
+ const { label = '', indent = 2 } = opts;
135
+ const pad = ' '.repeat(indent);
136
+ const clamped = Math.max(0, Math.min(100, percent));
137
+ const safeWidth = Math.max(1, width);
138
+ const filled = Math.round((clamped / 100) * safeWidth);
139
+ const empty = safeWidth - filled;
140
+ const bar = `${chalk.green('█'.repeat(filled))}${chalk.dim('░'.repeat(empty))}`;
141
+ const pctStr = clamped >= 75
142
+ ? chalk.green(`${clamped}%`)
143
+ : clamped >= 25
144
+ ? chalk.yellow(`${clamped}%`)
145
+ : chalk.red(`${clamped}%`);
146
+ out(`${pad}${bar} ${pctStr}${label ? ` ${label}` : ''}`);
147
+ },
148
+ };
66
149
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
+ import type { ArtifactFrontmatter } from '../models/types.js';
1
2
  export interface ParsedMarkdown {
2
- data: Record<string, unknown>;
3
+ data: ArtifactFrontmatter;
3
4
  content: string;
4
5
  }
5
6
  export declare function parseMarkdown(raw: string): ParsedMarkdown;
6
- export declare function toMarkdownWithFrontmatter(data: Record<string, unknown>, content: string): string;
7
+ export declare function toMarkdownWithFrontmatter(data: ArtifactFrontmatter, content: string): string;
7
8
  //# sourceMappingURL=markdown.d.ts.map