@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,197 @@
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
+ export class MockGitAdapter {
8
+ projectRoot;
9
+ config = {
10
+ currentBranch: "main",
11
+ isClean: true,
12
+ isRepository: true,
13
+ branches: ["main"],
14
+ remoteBranches: [],
15
+ remotes: ["origin"],
16
+ trees: new Map(),
17
+ };
18
+ commandHistory = [];
19
+ mockResponses = new Map();
20
+ constructor(projectRoot = "/mock/project") {
21
+ this.projectRoot = projectRoot;
22
+ }
23
+ // --- GitAdapter implementation ---
24
+ async exec(args, options) {
25
+ this.commandHistory.push({
26
+ args,
27
+ options,
28
+ timestamp: new Date(),
29
+ });
30
+ // Check for mock response
31
+ const key = args.join(" ");
32
+ const mockResponse = this.mockResponses.get(key);
33
+ if (mockResponse) {
34
+ if (mockResponse instanceof Error) {
35
+ throw mockResponse;
36
+ }
37
+ return mockResponse;
38
+ }
39
+ // Default behavior based on command
40
+ return this.handleCommand(args);
41
+ }
42
+ async isGitRepository(_path) {
43
+ return this.config.isRepository;
44
+ }
45
+ async initRepository(_path) {
46
+ this.config.isRepository = true;
47
+ this.config.branches = ["main"];
48
+ this.config.currentBranch = "main";
49
+ }
50
+ // --- Test configuration methods ---
51
+ /**
52
+ * Set the current branch
53
+ */
54
+ mockBranch(name) {
55
+ this.config.currentBranch = name;
56
+ if (!this.config.branches.includes(name)) {
57
+ this.config.branches.push(name);
58
+ }
59
+ return this;
60
+ }
61
+ /**
62
+ * Set available branches
63
+ */
64
+ mockBranches(local, remote = []) {
65
+ this.config.branches = local;
66
+ this.config.remoteBranches = remote;
67
+ return this;
68
+ }
69
+ /**
70
+ * Set available remotes
71
+ */
72
+ mockRemotes(remotes) {
73
+ this.config.remotes = remotes;
74
+ return this;
75
+ }
76
+ /**
77
+ * Set whether the repository is clean
78
+ */
79
+ mockClean(isClean) {
80
+ this.config.isClean = isClean;
81
+ return this;
82
+ }
83
+ /**
84
+ * Set whether the path is a git repository
85
+ */
86
+ mockIsRepository(isRepo) {
87
+ this.config.isRepository = isRepo;
88
+ return this;
89
+ }
90
+ /**
91
+ * Mock file tree for a specific ref
92
+ */
93
+ mockTree(ref, files) {
94
+ this.config.trees.set(ref, new Map(Object.entries(files)));
95
+ return this;
96
+ }
97
+ /**
98
+ * Set a mock response for a specific command
99
+ */
100
+ mockResponse(args, response) {
101
+ this.mockResponses.set(args.join(" "), response);
102
+ return this;
103
+ }
104
+ // --- Assertion helpers ---
105
+ /**
106
+ * Get command history
107
+ */
108
+ getCommandHistory() {
109
+ return [...this.commandHistory];
110
+ }
111
+ /**
112
+ * Assert a command was called
113
+ */
114
+ assertCommandCalled(args) {
115
+ const key = args.join(" ");
116
+ const found = this.commandHistory.some((entry) => entry.args.join(" ") === key);
117
+ if (!found) {
118
+ throw new Error(`Expected command "${key}" to be called, but it was not.\n` +
119
+ `Commands called: ${this.commandHistory.map((e) => e.args.join(" ")).join(", ")}`);
120
+ }
121
+ }
122
+ /**
123
+ * Assert a command was called a specific number of times
124
+ */
125
+ assertCommandCalledTimes(args, times) {
126
+ const key = args.join(" ");
127
+ const count = this.commandHistory.filter((entry) => entry.args.join(" ") === key).length;
128
+ if (count !== times) {
129
+ throw new Error(`Expected command "${key}" to be called ${times} times, but it was called ${count} times.`);
130
+ }
131
+ }
132
+ /**
133
+ * Clear command history
134
+ */
135
+ clearHistory() {
136
+ this.commandHistory = [];
137
+ return this;
138
+ }
139
+ /**
140
+ * Reset all mock state
141
+ */
142
+ reset() {
143
+ this.config = {
144
+ currentBranch: "main",
145
+ isClean: true,
146
+ isRepository: true,
147
+ branches: ["main"],
148
+ remoteBranches: [],
149
+ remotes: ["origin"],
150
+ trees: new Map(),
151
+ };
152
+ this.commandHistory = [];
153
+ this.mockResponses.clear();
154
+ return this;
155
+ }
156
+ // --- Private helpers ---
157
+ handleCommand(args) {
158
+ const [command, ...rest] = args;
159
+ switch (command) {
160
+ case "status":
161
+ return {
162
+ stdout: this.config.isClean ? "" : "M some-file.md\n",
163
+ stderr: "",
164
+ exitCode: 0,
165
+ };
166
+ case "branch":
167
+ if (rest.includes("--show-current")) {
168
+ return { stdout: this.config.currentBranch, stderr: "", exitCode: 0 };
169
+ }
170
+ if (rest.includes("-r")) {
171
+ return { stdout: this.config.remoteBranches.join("\n"), stderr: "", exitCode: 0 };
172
+ }
173
+ if (rest.includes("-a")) {
174
+ return {
175
+ stdout: [...this.config.branches, ...this.config.remoteBranches].join("\n"),
176
+ stderr: "",
177
+ exitCode: 0,
178
+ };
179
+ }
180
+ return { stdout: this.config.branches.join("\n"), stderr: "", exitCode: 0 };
181
+ case "remote":
182
+ return { stdout: this.config.remotes.join("\n"), stderr: "", exitCode: 0 };
183
+ case "rev-parse":
184
+ if (rest.includes("--is-inside-work-tree")) {
185
+ return {
186
+ stdout: this.config.isRepository ? "true" : "",
187
+ stderr: this.config.isRepository ? "" : "fatal: not a git repository",
188
+ exitCode: this.config.isRepository ? 0 : 128,
189
+ };
190
+ }
191
+ return { stdout: "", stderr: "", exitCode: 0 };
192
+ default:
193
+ return { stdout: "", stderr: "", exitCode: 0 };
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=MockGitAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockGitAdapter.js","sourceRoot":"","sources":["../../src/test-adapters/MockGitAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Test adapters for @backlog-md/core
3
+ *
4
+ * Provides in-memory and mock implementations of adapters for testing.
5
+ */
6
+ export { InMemoryFileSystemAdapter } from "@principal-ai/repository-abstraction";
7
+ export { MockGitAdapter } from "./MockGitAdapter";
8
+ export type { FileSystemAdapter, GlobAdapter, GlobOptions, } from "@principal-ai/repository-abstraction";
9
+ export type { GitAdapter, GitExecResult } from "../abstractions";
10
+ /**
11
+ * Create a complete set of test adapters
12
+ */
13
+ export declare function createTestAdapters(): {
14
+ fs: any;
15
+ git: any;
16
+ };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEjE;;GAEG;AACH,wBAAgB,kBAAkB;;;EAQjC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Test adapters for @backlog-md/core
3
+ *
4
+ * Provides in-memory and mock implementations of adapters for testing.
5
+ */
6
+ // Re-export InMemoryFileSystemAdapter from repository-abstraction
7
+ export { InMemoryFileSystemAdapter } from "@principal-ai/repository-abstraction";
8
+ // Backlog-specific mock adapters
9
+ export { MockGitAdapter } from "./MockGitAdapter";
10
+ /**
11
+ * Create a complete set of test adapters
12
+ */
13
+ export function createTestAdapters() {
14
+ const { InMemoryFileSystemAdapter } = require("@principal-ai/repository-abstraction");
15
+ const { MockGitAdapter } = require("./MockGitAdapter");
16
+ return {
17
+ fs: new InMemoryFileSystemAdapter(),
18
+ git: new MockGitAdapter(),
19
+ };
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test-adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,kEAAkE;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,iCAAiC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWlD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACtF,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEvD,OAAO;QACL,EAAE,EAAE,IAAI,yBAAyB,EAAE;QACnC,GAAG,EAAE,IAAI,cAAc,EAAE;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Type definitions for @backlog-md/core
3
+ * These types match the Backlog.md codebase exactly for compatibility
4
+ */
5
+ export type TaskStatus = string;
6
+ export interface AcceptanceCriterion {
7
+ index: number;
8
+ text: string;
9
+ checked: boolean;
10
+ }
11
+ export interface AcceptanceCriterionInput {
12
+ text: string;
13
+ checked?: boolean;
14
+ }
15
+ export interface Task {
16
+ id: string;
17
+ title: string;
18
+ status: TaskStatus;
19
+ assignee: string[];
20
+ reporter?: string;
21
+ createdDate: string;
22
+ updatedDate?: string;
23
+ labels: string[];
24
+ milestone?: string;
25
+ dependencies: string[];
26
+ readonly rawContent?: string;
27
+ description?: string;
28
+ implementationPlan?: string;
29
+ implementationNotes?: string;
30
+ /** Structured acceptance criteria parsed from body (checked state + text + index) */
31
+ acceptanceCriteriaItems?: AcceptanceCriterion[];
32
+ parentTaskId?: string;
33
+ subtasks?: string[];
34
+ priority?: "high" | "medium" | "low";
35
+ branch?: string;
36
+ ordinal?: number;
37
+ filePath?: string;
38
+ lastModified?: Date;
39
+ source?: "local" | "remote" | "completed" | "local-branch";
40
+ /** Optional per-task callback command to run on status change (overrides global config) */
41
+ onStatusChange?: string;
42
+ }
43
+ /**
44
+ * Check if a task is locally editable (not from a remote or other local branch)
45
+ */
46
+ export declare function isLocalEditableTask(task: Task): boolean;
47
+ export interface TaskCreateInput {
48
+ title: string;
49
+ description?: string;
50
+ status?: TaskStatus;
51
+ priority?: "high" | "medium" | "low";
52
+ labels?: string[];
53
+ assignee?: string[];
54
+ dependencies?: string[];
55
+ parentTaskId?: string;
56
+ implementationPlan?: string;
57
+ implementationNotes?: string;
58
+ acceptanceCriteria?: AcceptanceCriterionInput[];
59
+ rawContent?: string;
60
+ }
61
+ export interface TaskUpdateInput {
62
+ title?: string;
63
+ description?: string;
64
+ status?: TaskStatus;
65
+ priority?: "high" | "medium" | "low";
66
+ labels?: string[];
67
+ addLabels?: string[];
68
+ removeLabels?: string[];
69
+ assignee?: string[];
70
+ ordinal?: number;
71
+ dependencies?: string[];
72
+ addDependencies?: string[];
73
+ removeDependencies?: string[];
74
+ implementationPlan?: string;
75
+ appendImplementationPlan?: string[];
76
+ clearImplementationPlan?: boolean;
77
+ implementationNotes?: string;
78
+ appendImplementationNotes?: string[];
79
+ clearImplementationNotes?: boolean;
80
+ acceptanceCriteria?: AcceptanceCriterionInput[];
81
+ addAcceptanceCriteria?: Array<AcceptanceCriterionInput | string>;
82
+ removeAcceptanceCriteria?: number[];
83
+ checkAcceptanceCriteria?: number[];
84
+ uncheckAcceptanceCriteria?: number[];
85
+ rawContent?: string;
86
+ }
87
+ export interface TaskListFilter {
88
+ status?: string;
89
+ assignee?: string;
90
+ priority?: "high" | "medium" | "low";
91
+ parentTaskId?: string;
92
+ labels?: string[];
93
+ }
94
+ export interface Decision {
95
+ id: string;
96
+ title: string;
97
+ date: string;
98
+ status: "proposed" | "accepted" | "rejected" | "superseded";
99
+ context: string;
100
+ decision: string;
101
+ consequences: string;
102
+ alternatives?: string;
103
+ readonly rawContent: string;
104
+ }
105
+ export interface Document {
106
+ id: string;
107
+ title: string;
108
+ type: "readme" | "guide" | "specification" | "other";
109
+ createdDate: string;
110
+ updatedDate?: string;
111
+ rawContent: string;
112
+ tags?: string[];
113
+ name?: string;
114
+ path?: string;
115
+ lastModified?: string;
116
+ }
117
+ export type SearchResultType = "task" | "document" | "decision";
118
+ export type SearchPriorityFilter = "high" | "medium" | "low";
119
+ export interface SearchMatch {
120
+ key?: string;
121
+ indices: Array<[number, number]>;
122
+ value?: unknown;
123
+ }
124
+ export interface SearchFilters {
125
+ status?: string | string[];
126
+ priority?: SearchPriorityFilter | SearchPriorityFilter[];
127
+ assignee?: string | string[];
128
+ labels?: string | string[];
129
+ }
130
+ export interface SearchOptions {
131
+ query?: string;
132
+ limit?: number;
133
+ types?: SearchResultType[];
134
+ filters?: SearchFilters;
135
+ }
136
+ export interface TaskSearchResult {
137
+ type: "task";
138
+ score: number | null;
139
+ task: Task;
140
+ matches?: SearchMatch[];
141
+ }
142
+ export interface DocumentSearchResult {
143
+ type: "document";
144
+ score: number | null;
145
+ document: Document;
146
+ matches?: SearchMatch[];
147
+ }
148
+ export interface DecisionSearchResult {
149
+ type: "decision";
150
+ score: number | null;
151
+ decision: Decision;
152
+ matches?: SearchMatch[];
153
+ }
154
+ export type SearchResult = TaskSearchResult | DocumentSearchResult | DecisionSearchResult;
155
+ export interface Sequence {
156
+ /** 1-based sequence index */
157
+ index: number;
158
+ /** Tasks that can be executed in parallel within this sequence */
159
+ tasks: Task[];
160
+ }
161
+ export interface BacklogConfig {
162
+ projectName: string;
163
+ defaultAssignee?: string;
164
+ defaultReporter?: string;
165
+ statuses: string[];
166
+ labels: string[];
167
+ milestones: string[];
168
+ defaultStatus?: string;
169
+ dateFormat: string;
170
+ maxColumnWidth?: number;
171
+ taskResolutionStrategy?: "most_recent" | "most_progressed";
172
+ defaultEditor?: string;
173
+ autoOpenBrowser?: boolean;
174
+ defaultPort?: number;
175
+ remoteOperations?: boolean;
176
+ autoCommit?: boolean;
177
+ zeroPaddedIds?: number;
178
+ timezonePreference?: string;
179
+ includeDateTimeInDates?: boolean;
180
+ bypassGitHooks?: boolean;
181
+ checkActiveBranches?: boolean;
182
+ activeBranchDays?: number;
183
+ /** Global callback command to run on any task status change. Supports $TASK_ID, $OLD_STATUS, $NEW_STATUS, $TASK_TITLE variables. */
184
+ onStatusChange?: string;
185
+ mcp?: {
186
+ http?: {
187
+ host?: string;
188
+ port?: number;
189
+ auth?: {
190
+ type?: "bearer" | "basic" | "none";
191
+ token?: string;
192
+ username?: string;
193
+ password?: string;
194
+ };
195
+ cors?: {
196
+ origin?: string | string[];
197
+ credentials?: boolean;
198
+ };
199
+ enableDnsRebindingProtection?: boolean;
200
+ allowedHosts?: string[];
201
+ allowedOrigins?: string[];
202
+ };
203
+ };
204
+ }
205
+ export interface ParsedMarkdown {
206
+ frontmatter: Record<string, unknown>;
207
+ content: string;
208
+ }
209
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Type definitions for @backlog-md/core
3
+ * These types match the Backlog.md codebase exactly for compatibility
4
+ */
5
+ /**
6
+ * Check if a task is locally editable (not from a remote or other local branch)
7
+ */
8
+ export function isLocalEditableTask(task) {
9
+ return task.source === undefined || task.source === "local" || task.source === "completed";
10
+ }
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8CH;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Utility functions for @backlog-md/core
3
+ */
4
+ export { sortTasks, groupTasksByStatus } from "./sorting";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Utility functions for @backlog-md/core
3
+ */
4
+ export { sortTasks, groupTasksByStatus } from "./sorting";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Task sorting utilities
3
+ */
4
+ import type { Task } from "../types";
5
+ /**
6
+ * Sort tasks by: ordinal → priority → createdDate
7
+ *
8
+ * - Tasks with ordinal are sorted first by ordinal
9
+ * - Then by priority (high → medium → low)
10
+ * - Finally by createdDate (newest first)
11
+ */
12
+ export declare function sortTasks(tasks: Task[]): Task[];
13
+ /**
14
+ * Group tasks by status
15
+ *
16
+ * @param tasks - Tasks to group
17
+ * @param statuses - Ordered list of statuses (for column ordering)
18
+ * @returns Map with status as key and sorted tasks as value
19
+ */
20
+ export declare function groupTasksByStatus(tasks: Task[], statuses: string[]): Map<string, Task[]>;
21
+ //# sourceMappingURL=sorting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorting.d.ts","sourceRoot":"","sources":["../../src/utils/sorting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAQrC;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAkB/C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,EAAE,EACb,QAAQ,EAAE,MAAM,EAAE,GACjB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAyBrB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Task sorting utilities
3
+ */
4
+ const PRIORITY_ORDER = {
5
+ high: 0,
6
+ medium: 1,
7
+ low: 2,
8
+ };
9
+ /**
10
+ * Sort tasks by: ordinal → priority → createdDate
11
+ *
12
+ * - Tasks with ordinal are sorted first by ordinal
13
+ * - Then by priority (high → medium → low)
14
+ * - Finally by createdDate (newest first)
15
+ */
16
+ export function sortTasks(tasks) {
17
+ return [...tasks].sort((a, b) => {
18
+ // 1. Ordinal (if both have it)
19
+ if (a.ordinal !== undefined && b.ordinal !== undefined) {
20
+ return a.ordinal - b.ordinal;
21
+ }
22
+ // Tasks with ordinal come before tasks without
23
+ if (a.ordinal !== undefined)
24
+ return -1;
25
+ if (b.ordinal !== undefined)
26
+ return 1;
27
+ // 2. Priority (high → medium → low → undefined)
28
+ const aPri = a.priority ? PRIORITY_ORDER[a.priority] : 3;
29
+ const bPri = b.priority ? PRIORITY_ORDER[b.priority] : 3;
30
+ if (aPri !== bPri)
31
+ return aPri - bPri;
32
+ // 3. Created date (newest first)
33
+ return b.createdDate.localeCompare(a.createdDate);
34
+ });
35
+ }
36
+ /**
37
+ * Group tasks by status
38
+ *
39
+ * @param tasks - Tasks to group
40
+ * @param statuses - Ordered list of statuses (for column ordering)
41
+ * @returns Map with status as key and sorted tasks as value
42
+ */
43
+ export function groupTasksByStatus(tasks, statuses) {
44
+ const grouped = new Map();
45
+ // Initialize with all configured statuses (preserves column order)
46
+ for (const status of statuses) {
47
+ grouped.set(status, []);
48
+ }
49
+ // Group tasks
50
+ for (const task of tasks) {
51
+ const list = grouped.get(task.status);
52
+ if (list) {
53
+ list.push(task);
54
+ }
55
+ else {
56
+ // Task has a status not in the config - add it anyway
57
+ grouped.set(task.status, [task]);
58
+ }
59
+ }
60
+ // Sort tasks within each status
61
+ for (const [status, statusTasks] of grouped) {
62
+ grouped.set(status, sortTasks(statusTasks));
63
+ }
64
+ return grouped;
65
+ }
66
+ //# sourceMappingURL=sorting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorting.js","sourceRoot":"","sources":["../../src/utils/sorting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,cAAc,GAA2B;IAC7C,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,+BAA+B;QAC/B,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACvD,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC/B,CAAC;QACD,+CAA+C;QAC/C,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAEtC,gDAAgD;QAChD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC;QAEtC,iCAAiC;QACjC,OAAO,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,QAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,mEAAmE;IACnE,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,cAAc;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}