@backlog-md/core 0.1.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 (50) hide show
  1. package/README.md +114 -0
  2. package/dist/abstractions/GitAdapter.d.ts +83 -0
  3. package/dist/abstractions/GitAdapter.d.ts.map +1 -0
  4. package/dist/abstractions/GitAdapter.js +12 -0
  5. package/dist/abstractions/GitAdapter.js.map +1 -0
  6. package/dist/abstractions/index.d.ts +9 -0
  7. package/dist/abstractions/index.d.ts.map +1 -0
  8. package/dist/abstractions/index.js +8 -0
  9. package/dist/abstractions/index.js.map +1 -0
  10. package/dist/core/Core.d.ts +91 -0
  11. package/dist/core/Core.d.ts.map +1 -0
  12. package/dist/core/Core.js +170 -0
  13. package/dist/core/Core.js.map +1 -0
  14. package/dist/core/config-parser.d.ts +16 -0
  15. package/dist/core/config-parser.d.ts.map +1 -0
  16. package/dist/core/config-parser.js +166 -0
  17. package/dist/core/config-parser.js.map +1 -0
  18. package/dist/core/index.d.ts +6 -0
  19. package/dist/core/index.d.ts.map +1 -0
  20. package/dist/core/index.js +6 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/index.d.ts +16 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +27 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/markdown/index.d.ts +40 -0
  27. package/dist/markdown/index.d.ts.map +1 -0
  28. package/dist/markdown/index.js +230 -0
  29. package/dist/markdown/index.js.map +1 -0
  30. package/dist/test-adapters/MockGitAdapter.d.ts +73 -0
  31. package/dist/test-adapters/MockGitAdapter.d.ts.map +1 -0
  32. package/dist/test-adapters/MockGitAdapter.js +197 -0
  33. package/dist/test-adapters/MockGitAdapter.js.map +1 -0
  34. package/dist/test-adapters/index.d.ts +17 -0
  35. package/dist/test-adapters/index.d.ts.map +1 -0
  36. package/dist/test-adapters/index.js +21 -0
  37. package/dist/test-adapters/index.js.map +1 -0
  38. package/dist/types/index.d.ts +209 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/index.js +11 -0
  41. package/dist/types/index.js.map +1 -0
  42. package/dist/utils/index.d.ts +5 -0
  43. package/dist/utils/index.d.ts.map +1 -0
  44. package/dist/utils/index.js +5 -0
  45. package/dist/utils/index.js.map +1 -0
  46. package/dist/utils/sorting.d.ts +21 -0
  47. package/dist/utils/sorting.d.ts.map +1 -0
  48. package/dist/utils/sorting.js +66 -0
  49. package/dist/utils/sorting.js.map +1 -0
  50. package/package.json +99 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Backlog.md Config Parser
3
+ *
4
+ * Parses config.yml using a line-by-line approach matching the official Backlog.md
5
+ * implementation. This is more reliable than a generic YAML parser for this format.
6
+ */
7
+ const DEFAULT_STATUSES = ["To Do", "In Progress", "Done"];
8
+ /**
9
+ * Parse Backlog.md config.yml content
10
+ */
11
+ export function parseBacklogConfig(content) {
12
+ const config = {};
13
+ const lines = content.split("\n");
14
+ for (const line of lines) {
15
+ const trimmed = line.trim();
16
+ if (!trimmed || trimmed.startsWith("#"))
17
+ continue;
18
+ const colonIndex = trimmed.indexOf(":");
19
+ if (colonIndex === -1)
20
+ continue;
21
+ const key = trimmed.substring(0, colonIndex).trim();
22
+ const value = trimmed.substring(colonIndex + 1).trim();
23
+ switch (key) {
24
+ case "project_name":
25
+ config.projectName = value.replace(/['"]/g, "");
26
+ break;
27
+ case "default_assignee":
28
+ config.defaultAssignee = value.replace(/['"]/g, "");
29
+ break;
30
+ case "default_reporter":
31
+ config.defaultReporter = value.replace(/['"]/g, "");
32
+ break;
33
+ case "default_status":
34
+ config.defaultStatus = value.replace(/['"]/g, "");
35
+ break;
36
+ case "statuses":
37
+ case "labels":
38
+ case "milestones":
39
+ if (value.startsWith("[") && value.endsWith("]")) {
40
+ const arrayContent = value.slice(1, -1);
41
+ config[key] = arrayContent
42
+ .split(",")
43
+ .map((item) => item.trim().replace(/['"]/g, ""))
44
+ .filter(Boolean);
45
+ }
46
+ break;
47
+ case "date_format":
48
+ config.dateFormat = value.replace(/['"]/g, "");
49
+ break;
50
+ case "max_column_width":
51
+ config.maxColumnWidth = parseInt(value, 10);
52
+ break;
53
+ case "task_resolution_strategy":
54
+ config.taskResolutionStrategy = value.replace(/['"]/g, "");
55
+ break;
56
+ case "default_editor":
57
+ config.defaultEditor = value.replace(/["']/g, "");
58
+ break;
59
+ case "auto_open_browser":
60
+ config.autoOpenBrowser = value.toLowerCase() === "true";
61
+ break;
62
+ case "default_port":
63
+ config.defaultPort = parseInt(value, 10);
64
+ break;
65
+ case "remote_operations":
66
+ config.remoteOperations = value.toLowerCase() === "true";
67
+ break;
68
+ case "auto_commit":
69
+ config.autoCommit = value.toLowerCase() === "true";
70
+ break;
71
+ case "zero_padded_ids":
72
+ config.zeroPaddedIds = parseInt(value, 10);
73
+ break;
74
+ case "timezone_preference":
75
+ config.timezonePreference = value.replace(/['"]/g, "");
76
+ break;
77
+ case "include_date_time_in_dates":
78
+ config.includeDateTimeInDates = value.toLowerCase() === "true";
79
+ break;
80
+ case "bypass_git_hooks":
81
+ config.bypassGitHooks = value.toLowerCase() === "true";
82
+ break;
83
+ case "check_active_branches":
84
+ config.checkActiveBranches = value.toLowerCase() === "true";
85
+ break;
86
+ case "active_branch_days":
87
+ config.activeBranchDays = parseInt(value, 10);
88
+ break;
89
+ }
90
+ }
91
+ // Apply defaults
92
+ return {
93
+ projectName: config.projectName || "Backlog",
94
+ statuses: config.statuses || [...DEFAULT_STATUSES],
95
+ labels: config.labels || [],
96
+ milestones: config.milestones || [],
97
+ defaultStatus: config.defaultStatus || DEFAULT_STATUSES[0],
98
+ dateFormat: config.dateFormat || "YYYY-MM-DD",
99
+ defaultAssignee: config.defaultAssignee,
100
+ defaultReporter: config.defaultReporter,
101
+ maxColumnWidth: config.maxColumnWidth,
102
+ taskResolutionStrategy: config.taskResolutionStrategy,
103
+ defaultEditor: config.defaultEditor,
104
+ autoOpenBrowser: config.autoOpenBrowser,
105
+ defaultPort: config.defaultPort,
106
+ remoteOperations: config.remoteOperations,
107
+ autoCommit: config.autoCommit,
108
+ zeroPaddedIds: config.zeroPaddedIds,
109
+ timezonePreference: config.timezonePreference,
110
+ includeDateTimeInDates: config.includeDateTimeInDates,
111
+ bypassGitHooks: config.bypassGitHooks,
112
+ checkActiveBranches: config.checkActiveBranches,
113
+ activeBranchDays: config.activeBranchDays,
114
+ };
115
+ }
116
+ /**
117
+ * Serialize BacklogConfig to config.yml format
118
+ */
119
+ export function serializeBacklogConfig(config) {
120
+ const lines = [];
121
+ lines.push(`project_name: "${config.projectName}"`);
122
+ if (config.defaultStatus) {
123
+ lines.push(`default_status: "${config.defaultStatus}"`);
124
+ }
125
+ lines.push(`statuses: [${config.statuses.map((s) => `"${s}"`).join(", ")}]`);
126
+ lines.push(`labels: [${(config.labels || []).map((l) => `"${l}"`).join(", ")}]`);
127
+ lines.push(`milestones: [${(config.milestones || []).map((m) => `"${m}"`).join(", ")}]`);
128
+ if (config.dateFormat) {
129
+ lines.push(`date_format: "${config.dateFormat}"`);
130
+ }
131
+ if (config.defaultAssignee) {
132
+ lines.push(`default_assignee: "${config.defaultAssignee}"`);
133
+ }
134
+ if (config.defaultReporter) {
135
+ lines.push(`default_reporter: "${config.defaultReporter}"`);
136
+ }
137
+ if (config.defaultEditor) {
138
+ lines.push(`default_editor: "${config.defaultEditor}"`);
139
+ }
140
+ if (typeof config.autoCommit === "boolean") {
141
+ lines.push(`auto_commit: ${config.autoCommit}`);
142
+ }
143
+ if (typeof config.zeroPaddedIds === "number") {
144
+ lines.push(`zero_padded_ids: ${config.zeroPaddedIds}`);
145
+ }
146
+ if (typeof config.autoOpenBrowser === "boolean") {
147
+ lines.push(`auto_open_browser: ${config.autoOpenBrowser}`);
148
+ }
149
+ if (typeof config.defaultPort === "number") {
150
+ lines.push(`default_port: ${config.defaultPort}`);
151
+ }
152
+ if (typeof config.remoteOperations === "boolean") {
153
+ lines.push(`remote_operations: ${config.remoteOperations}`);
154
+ }
155
+ if (typeof config.bypassGitHooks === "boolean") {
156
+ lines.push(`bypass_git_hooks: ${config.bypassGitHooks}`);
157
+ }
158
+ if (typeof config.checkActiveBranches === "boolean") {
159
+ lines.push(`check_active_branches: ${config.checkActiveBranches}`);
160
+ }
161
+ if (typeof config.activeBranchDays === "number") {
162
+ lines.push(`active_branch_days: ${config.activeBranchDays}`);
163
+ }
164
+ return `${lines.join("\n")}\n`;
165
+ }
166
+ //# sourceMappingURL=config-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-parser.js","sourceRoot":"","sources":["../../src/core/config-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export { Core, type CoreOptions } from "./Core";
5
+ export { parseBacklogConfig, serializeBacklogConfig } from "./config-parser";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export { Core } from "./Core";
5
+ export { parseBacklogConfig, serializeBacklogConfig } from "./config-parser";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAoB,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @backlog-md/core
3
+ *
4
+ * Runtime-agnostic core package for Backlog.md task management.
5
+ * Provides the core business logic for managing tasks, documents, and decisions
6
+ * using the adapter pattern for I/O operations.
7
+ */
8
+ export type { FileSystemAdapter, FileStats, GlobAdapter, GlobOptions, GitAdapter, GitExecResult, GitExecOptions, GitOperationsInterface, } from "./abstractions";
9
+ export type { Task, TaskStatus, TaskCreateInput, TaskUpdateInput, TaskListFilter, AcceptanceCriterion, AcceptanceCriterionInput, Document, Decision, SearchResult, SearchResultType, SearchOptions, SearchFilters, SearchMatch, SearchPriorityFilter, TaskSearchResult, DocumentSearchResult, DecisionSearchResult, Sequence, BacklogConfig, ParsedMarkdown, } from "./types";
10
+ export { isLocalEditableTask } from "./types";
11
+ export { parseTaskMarkdown, serializeTaskMarkdown, type TaskFrontmatter, } from "./markdown";
12
+ export { Core, type CoreOptions } from "./core";
13
+ export { parseBacklogConfig, serializeBacklogConfig } from "./core";
14
+ export { sortTasks, groupTasksByStatus } from "./utils";
15
+ export { InMemoryFileSystemAdapter } from "@principal-ai/repository-abstraction";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,YAAY,EACV,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAMxB,YAAY,EAEV,IAAI,EACJ,UAAU,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EAGxB,QAAQ,EACR,QAAQ,EAGR,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EAGpB,QAAQ,EACR,aAAa,EACb,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAM9C,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAMpE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAMxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @backlog-md/core
3
+ *
4
+ * Runtime-agnostic core package for Backlog.md task management.
5
+ * Provides the core business logic for managing tasks, documents, and decisions
6
+ * using the adapter pattern for I/O operations.
7
+ */
8
+ // Export helper functions
9
+ export { isLocalEditableTask } from "./types";
10
+ // ============================================================================
11
+ // Markdown Parsing & Serialization
12
+ // ============================================================================
13
+ export { parseTaskMarkdown, serializeTaskMarkdown, } from "./markdown";
14
+ // ============================================================================
15
+ // Core API
16
+ // ============================================================================
17
+ export { Core } from "./core";
18
+ export { parseBacklogConfig, serializeBacklogConfig } from "./core";
19
+ // ============================================================================
20
+ // Utilities
21
+ // ============================================================================
22
+ export { sortTasks, groupTasksByStatus } from "./utils";
23
+ // ============================================================================
24
+ // Re-exports from repository-abstraction for convenience
25
+ // ============================================================================
26
+ export { InMemoryFileSystemAdapter } from "@principal-ai/repository-abstraction";
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoDH,0BAA0B;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,OAAO,EAAE,IAAI,EAAoB,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAEpE,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAExD,+EAA+E;AAC/E,yDAAyD;AACzD,+EAA+E;AAE/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Markdown parsing and serialization for @backlog-md/core
3
+ *
4
+ * This module handles conversion between markdown files and Task objects.
5
+ */
6
+ import type { Task } from "../types";
7
+ /**
8
+ * Parsed frontmatter from a task markdown file
9
+ */
10
+ export interface TaskFrontmatter {
11
+ status?: string;
12
+ priority?: "high" | "medium" | "low";
13
+ assignee?: string[];
14
+ reporter?: string;
15
+ labels?: string[];
16
+ milestone?: string;
17
+ dependencies?: string[];
18
+ parentTaskId?: string;
19
+ subtasks?: string[];
20
+ branch?: string;
21
+ ordinal?: number;
22
+ createdDate?: string;
23
+ updatedDate?: string;
24
+ }
25
+ /**
26
+ * Parse task markdown content into a Task object
27
+ *
28
+ * @param content - Raw markdown content
29
+ * @param filePath - Path to the file (for extracting ID from filename)
30
+ * @returns Parsed task object
31
+ */
32
+ export declare function parseTaskMarkdown(content: string, filePath: string): Task;
33
+ /**
34
+ * Serialize a Task object to markdown content
35
+ *
36
+ * @param task - Task to serialize
37
+ * @returns Markdown string
38
+ */
39
+ export declare function serializeTaskMarkdown(task: Task): string;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAuB,MAAM,UAAU,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA0BzE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAgGxD"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Markdown parsing and serialization for @backlog-md/core
3
+ *
4
+ * This module handles conversion between markdown files and Task objects.
5
+ */
6
+ /**
7
+ * Parse task markdown content into a Task object
8
+ *
9
+ * @param content - Raw markdown content
10
+ * @param filePath - Path to the file (for extracting ID from filename)
11
+ * @returns Parsed task object
12
+ */
13
+ export function parseTaskMarkdown(content, filePath) {
14
+ const { frontmatter, title, rawContent, acceptanceCriteria, description } = parseMarkdownContent(content);
15
+ const id = extractIdFromPath(filePath);
16
+ return {
17
+ id,
18
+ title: title || `Task ${id}`,
19
+ status: frontmatter.status || "backlog",
20
+ priority: frontmatter.priority,
21
+ assignee: frontmatter.assignee || [],
22
+ reporter: frontmatter.reporter,
23
+ createdDate: frontmatter.createdDate || new Date().toISOString().split("T")[0],
24
+ updatedDate: frontmatter.updatedDate,
25
+ labels: frontmatter.labels || [],
26
+ milestone: frontmatter.milestone,
27
+ dependencies: frontmatter.dependencies || [],
28
+ parentTaskId: frontmatter.parentTaskId,
29
+ subtasks: frontmatter.subtasks,
30
+ branch: frontmatter.branch,
31
+ ordinal: frontmatter.ordinal,
32
+ rawContent,
33
+ description,
34
+ acceptanceCriteriaItems: acceptanceCriteria,
35
+ filePath,
36
+ };
37
+ }
38
+ /**
39
+ * Serialize a Task object to markdown content
40
+ *
41
+ * @param task - Task to serialize
42
+ * @returns Markdown string
43
+ */
44
+ export function serializeTaskMarkdown(task) {
45
+ const lines = [];
46
+ // Frontmatter
47
+ lines.push("---");
48
+ lines.push(`status: ${task.status}`);
49
+ if (task.priority) {
50
+ lines.push(`priority: ${task.priority}`);
51
+ }
52
+ if (task.assignee && task.assignee.length > 0) {
53
+ lines.push(`assignee: [${task.assignee.join(", ")}]`);
54
+ }
55
+ if (task.reporter) {
56
+ lines.push(`reporter: ${task.reporter}`);
57
+ }
58
+ if (task.labels && task.labels.length > 0) {
59
+ lines.push(`labels: [${task.labels.join(", ")}]`);
60
+ }
61
+ if (task.milestone) {
62
+ lines.push(`milestone: ${task.milestone}`);
63
+ }
64
+ if (task.dependencies && task.dependencies.length > 0) {
65
+ lines.push(`dependencies: [${task.dependencies.join(", ")}]`);
66
+ }
67
+ if (task.parentTaskId) {
68
+ lines.push(`parentTaskId: ${task.parentTaskId}`);
69
+ }
70
+ if (task.subtasks && task.subtasks.length > 0) {
71
+ lines.push(`subtasks: [${task.subtasks.join(", ")}]`);
72
+ }
73
+ if (task.branch) {
74
+ lines.push(`branch: ${task.branch}`);
75
+ }
76
+ if (task.ordinal !== undefined) {
77
+ lines.push(`ordinal: ${task.ordinal}`);
78
+ }
79
+ if (task.createdDate) {
80
+ lines.push(`createdDate: ${task.createdDate}`);
81
+ }
82
+ if (task.updatedDate) {
83
+ lines.push(`updatedDate: ${task.updatedDate}`);
84
+ }
85
+ lines.push("---");
86
+ lines.push("");
87
+ // Title
88
+ lines.push(`# ${task.title}`);
89
+ lines.push("");
90
+ // Description/Body
91
+ if (task.description) {
92
+ lines.push(task.description);
93
+ lines.push("");
94
+ }
95
+ // Acceptance Criteria
96
+ if (task.acceptanceCriteriaItems && task.acceptanceCriteriaItems.length > 0) {
97
+ lines.push("## Acceptance Criteria");
98
+ lines.push("");
99
+ for (const criterion of task.acceptanceCriteriaItems) {
100
+ const checkbox = criterion.checked ? "[x]" : "[ ]";
101
+ lines.push(`- ${checkbox} ${criterion.text}`);
102
+ }
103
+ lines.push("");
104
+ }
105
+ // Implementation Plan
106
+ if (task.implementationPlan) {
107
+ lines.push("## Implementation Plan");
108
+ lines.push("");
109
+ lines.push(task.implementationPlan);
110
+ lines.push("");
111
+ }
112
+ // Implementation Notes
113
+ if (task.implementationNotes) {
114
+ lines.push("## Implementation Notes");
115
+ lines.push("");
116
+ lines.push(task.implementationNotes);
117
+ lines.push("");
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ // --- Internal helpers ---
122
+ function parseMarkdownContent(content) {
123
+ let frontmatter = {};
124
+ let remaining = content;
125
+ // Extract frontmatter
126
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n/);
127
+ if (frontmatterMatch) {
128
+ frontmatter = parseFrontmatter(frontmatterMatch[1]);
129
+ remaining = content.slice(frontmatterMatch[0].length);
130
+ }
131
+ // Extract title (first h1)
132
+ let title = "";
133
+ const titleMatch = remaining.match(/^#\s+(.+)$/m);
134
+ if (titleMatch) {
135
+ title = titleMatch[1].trim();
136
+ }
137
+ // Extract acceptance criteria
138
+ const acceptanceCriteria = parseAcceptanceCriteria(remaining);
139
+ // Raw content is everything after frontmatter
140
+ const rawContent = remaining.trim();
141
+ // Description is the body text between title and first section
142
+ const description = extractDescription(remaining, title);
143
+ return { frontmatter, title, rawContent, description, acceptanceCriteria };
144
+ }
145
+ function parseFrontmatter(raw) {
146
+ const result = {};
147
+ for (const line of raw.split("\n")) {
148
+ const match = line.match(/^(\w+):\s*(.+)$/);
149
+ if (!match)
150
+ continue;
151
+ const [, key, value] = match;
152
+ switch (key) {
153
+ case "status":
154
+ result.status = value.trim();
155
+ break;
156
+ case "priority":
157
+ result.priority = value.trim();
158
+ break;
159
+ case "ordinal":
160
+ result.ordinal = parseInt(value.trim(), 10);
161
+ break;
162
+ case "reporter":
163
+ case "milestone":
164
+ case "parentTaskId":
165
+ case "branch":
166
+ case "createdDate":
167
+ case "updatedDate":
168
+ result[key] = value.trim();
169
+ break;
170
+ case "assignee":
171
+ case "labels":
172
+ case "dependencies":
173
+ case "subtasks":
174
+ result[key] = parseArrayValue(value);
175
+ break;
176
+ }
177
+ }
178
+ return result;
179
+ }
180
+ function parseArrayValue(value) {
181
+ // Handle [item1, item2] or item1, item2
182
+ const cleaned = value.replace(/^\[|\]$/g, "").trim();
183
+ if (!cleaned)
184
+ return [];
185
+ return cleaned
186
+ .split(",")
187
+ .map((s) => s.trim())
188
+ .filter(Boolean);
189
+ }
190
+ function parseAcceptanceCriteria(content) {
191
+ const criteria = [];
192
+ // Look for AC section or just checkbox items
193
+ const checkboxPattern = /^-\s*\[([ xX])\]\s*(.+)$/gm;
194
+ let match;
195
+ let index = 1; // 1-based index as per AcceptanceCriterion
196
+ while ((match = checkboxPattern.exec(content)) !== null) {
197
+ criteria.push({
198
+ index: index++,
199
+ checked: match[1].toLowerCase() === "x",
200
+ text: match[2].trim(),
201
+ });
202
+ }
203
+ return criteria;
204
+ }
205
+ function extractDescription(content, title) {
206
+ let body = content;
207
+ // Remove title line
208
+ if (title) {
209
+ body = body.replace(new RegExp(`^#\\s+${escapeRegex(title)}\\s*$`, "m"), "");
210
+ }
211
+ // Remove known sections
212
+ body = body.replace(/^##\s+Acceptance Criteria[\s\S]*?(?=^##|\z)/m, "");
213
+ body = body.replace(/^##\s+Implementation Plan[\s\S]*?(?=^##|\z)/m, "");
214
+ body = body.replace(/^##\s+Implementation Notes[\s\S]*?(?=^##|\z)/m, "");
215
+ return body.trim();
216
+ }
217
+ function extractIdFromPath(filePath) {
218
+ // Extract from pattern: task-{id} - {title}.md or {id} - {title}.md
219
+ const filename = filePath.split("/").pop() || "";
220
+ const match = filename.match(/^(?:task-)?(\d+(?:\.\d+)?)\s*-/);
221
+ if (match) {
222
+ return match[1];
223
+ }
224
+ // Fallback: use filename without extension
225
+ return filename.replace(/\.md$/, "");
226
+ }
227
+ function escapeRegex(str) {
228
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
229
+ }
230
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Mock Git adapter for testing
3
+ *
4
+ * Provides a configurable mock implementation of GitAdapter
5
+ * that records command history and allows setting up responses.
6
+ */
7
+ import type { GitAdapter, GitExecResult, GitExecOptions } from "../abstractions";
8
+ interface CommandHistoryEntry {
9
+ args: string[];
10
+ options?: GitExecOptions;
11
+ timestamp: Date;
12
+ }
13
+ export declare class MockGitAdapter implements GitAdapter {
14
+ readonly projectRoot: string;
15
+ private config;
16
+ private commandHistory;
17
+ private mockResponses;
18
+ constructor(projectRoot?: string);
19
+ exec(args: string[], options?: GitExecOptions): Promise<GitExecResult>;
20
+ isGitRepository(_path: string): Promise<boolean>;
21
+ initRepository(_path: string): Promise<void>;
22
+ /**
23
+ * Set the current branch
24
+ */
25
+ mockBranch(name: string): this;
26
+ /**
27
+ * Set available branches
28
+ */
29
+ mockBranches(local: string[], remote?: string[]): this;
30
+ /**
31
+ * Set available remotes
32
+ */
33
+ mockRemotes(remotes: string[]): this;
34
+ /**
35
+ * Set whether the repository is clean
36
+ */
37
+ mockClean(isClean: boolean): this;
38
+ /**
39
+ * Set whether the path is a git repository
40
+ */
41
+ mockIsRepository(isRepo: boolean): this;
42
+ /**
43
+ * Mock file tree for a specific ref
44
+ */
45
+ mockTree(ref: string, files: Record<string, string>): this;
46
+ /**
47
+ * Set a mock response for a specific command
48
+ */
49
+ mockResponse(args: string[], response: GitExecResult | Error): this;
50
+ /**
51
+ * Get command history
52
+ */
53
+ getCommandHistory(): CommandHistoryEntry[];
54
+ /**
55
+ * Assert a command was called
56
+ */
57
+ assertCommandCalled(args: string[]): void;
58
+ /**
59
+ * Assert a command was called a specific number of times
60
+ */
61
+ assertCommandCalledTimes(args: string[], times: number): void;
62
+ /**
63
+ * Clear command history
64
+ */
65
+ clearHistory(): this;
66
+ /**
67
+ * Reset all mock state
68
+ */
69
+ reset(): this;
70
+ private handleCommand;
71
+ }
72
+ export {};
73
+ //# sourceMappingURL=MockGitAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockGitAdapter.d.ts","sourceRoot":"","sources":["../../src/test-adapters/MockGitAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAYjF,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,cAAe,YAAW,UAAU;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,MAAM,CAQZ;IAEF,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAAiD;gBAE1D,WAAW,GAAE,MAAwB;IAM3C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAqBtE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,IAAI;IAM1D;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKpC;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKjC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAKvC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAK1D;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,KAAK,GAAG,IAAI;IAOnE;;OAEG;IACH,iBAAiB,IAAI,mBAAmB,EAAE;IAI1C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAWzC;;OAEG;IACH,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAU7D;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAiBb,OAAO,CAAC,aAAa;CA4CtB"}