@hardlydifficult/task-list 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +62 -54
  2. package/dist/FullState.d.ts +14 -15
  3. package/dist/FullState.d.ts.map +1 -1
  4. package/dist/FullState.js +21 -22
  5. package/dist/FullState.js.map +1 -1
  6. package/dist/Project.d.ts +42 -0
  7. package/dist/Project.d.ts.map +1 -0
  8. package/dist/Project.js +65 -0
  9. package/dist/Project.js.map +1 -0
  10. package/dist/Task.d.ts +9 -8
  11. package/dist/Task.d.ts.map +1 -1
  12. package/dist/Task.js +23 -12
  13. package/dist/Task.js.map +1 -1
  14. package/dist/TaskListClient.d.ts +15 -7
  15. package/dist/TaskListClient.d.ts.map +1 -1
  16. package/dist/TaskListClient.js +11 -0
  17. package/dist/TaskListClient.js.map +1 -1
  18. package/dist/index.d.ts +9 -7
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +14 -10
  21. package/dist/index.js.map +1 -1
  22. package/dist/linear/LinearTaskListClient.d.ts +21 -0
  23. package/dist/linear/LinearTaskListClient.d.ts.map +1 -0
  24. package/dist/linear/LinearTaskListClient.js +184 -0
  25. package/dist/linear/LinearTaskListClient.js.map +1 -0
  26. package/dist/linear/index.d.ts +2 -0
  27. package/dist/linear/index.d.ts.map +1 -0
  28. package/dist/linear/index.js +6 -0
  29. package/dist/linear/index.js.map +1 -0
  30. package/dist/trello/TrelloTaskListClient.d.ts +4 -6
  31. package/dist/trello/TrelloTaskListClient.d.ts.map +1 -1
  32. package/dist/trello/TrelloTaskListClient.js +66 -43
  33. package/dist/trello/TrelloTaskListClient.js.map +1 -1
  34. package/dist/types.d.ts +31 -38
  35. package/dist/types.d.ts.map +1 -1
  36. package/package.json +4 -4
  37. package/dist/BoardState.d.ts +0 -36
  38. package/dist/BoardState.d.ts.map +0 -1
  39. package/dist/BoardState.js +0 -62
  40. package/dist/BoardState.js.map +0 -1
  41. package/dist/TaskList.d.ts +0 -20
  42. package/dist/TaskList.d.ts.map +0 -1
  43. package/dist/TaskList.js +0 -31
  44. package/dist/TaskList.js.map +0 -1
package/README.md CHANGED
@@ -13,27 +13,25 @@ npm install @hardlydifficult/task-list
13
13
  ```typescript
14
14
  import { createTaskListClient } from "@hardlydifficult/task-list";
15
15
 
16
- const client = createTaskListClient({ type: "trello" });
16
+ // Trello
17
+ const trello = createTaskListClient({ type: "trello" });
17
18
 
18
- // Get all boards with full state
19
- const state = await client.getBoards();
19
+ // Linear
20
+ const linear = createTaskListClient({
21
+ type: "linear",
22
+ teamId: "team-uuid",
23
+ });
20
24
 
21
- // Chainable lookups
22
- const list = state.findBoard("My Project").findList("To Do");
23
- const label = state.findBoard("My Project").findLabel("Bug");
25
+ // Find a project and create a task
26
+ const project = await linear.findProject("Q1 Roadmap");
24
27
 
25
- // Create a task
26
- const task = await list.createTask("Fix login page", {
28
+ const task = await project.createTask("Fix login", {
27
29
  description: "Users can't log in on mobile",
28
- labels: [label],
30
+ labels: ["Bug"],
29
31
  });
30
32
 
31
33
  // Update a task
32
- await task.update({ name: "Fixed login page" });
33
-
34
- // Move to another list
35
- const doneList = state.findBoard("My Project").findList("Done");
36
- await task.update({ list: doneList });
34
+ await task.update({ status: "Done" });
37
35
  ```
38
36
 
39
37
  ## API
@@ -46,83 +44,93 @@ Factory function — returns a `TaskListClient` based on config type.
46
44
  // Trello (uses TRELLO_API_KEY / TRELLO_API_TOKEN env vars by default)
47
45
  const client = createTaskListClient({ type: "trello" });
48
46
 
49
- // Explicit credentials
47
+ // Trello with explicit credentials
50
48
  const client = createTaskListClient({
51
49
  type: "trello",
52
50
  apiKey: "your-key",
53
51
  token: "your-token",
54
52
  });
53
+
54
+ // Linear (uses LINEAR_API_KEY env var by default)
55
+ const client = createTaskListClient({
56
+ type: "linear",
57
+ teamId: "team-uuid",
58
+ });
59
+
60
+ // Linear with explicit API key
61
+ const client = createTaskListClient({
62
+ type: "linear",
63
+ apiKey: "lin_xxx",
64
+ teamId: "team-uuid",
65
+ });
55
66
  ```
56
67
 
57
68
  ### `TaskListClient`
58
69
 
59
70
  | Method | Returns | Description |
60
71
  |--------|---------|-------------|
61
- | `getBoards()` | `FullState` | All boards with lists, tasks, and labels |
62
- | `getBoard(boardId)` | `BoardState` | Single board with lists, tasks, and labels |
72
+ | `getProjects()` | `FullState` | All projects with statuses, tasks, and labels |
73
+ | `getProject(projectId)` | `Project` | Single project with statuses, tasks, and labels |
63
74
  | `getTask(taskId)` | `Task` | Single task by ID |
75
+ | `findProject(name)` | `Project` | Find project by name (case-insensitive partial match) |
64
76
 
65
77
  ### `FullState`
66
78
 
79
+ | Property | Type | Description |
80
+ |----------|------|-------------|
81
+ | `projects` | `Project[]` | All projects |
82
+
67
83
  | Method | Returns | Description |
68
84
  |--------|---------|-------------|
69
- | `findBoard(name)` | `BoardState` | Find by name (case-insensitive partial match) |
70
- | `findTask(taskId)` | `Task` | Find task by ID across all boards |
85
+ | `findProject(name)` | `Project` | Find by name (case-insensitive partial match) |
86
+ | `findTask(taskId)` | `Task` | Find task by ID across all projects |
71
87
 
72
- ### `BoardState`
88
+ ### `Project`
73
89
 
74
90
  | Property | Type | Description |
75
91
  |----------|------|-------------|
76
- | `board` | `Board` | Board info (id, name, url) |
77
- | `lists` | `TaskList[]` | All lists on the board |
78
- | `tasks` | `Task[]` | All tasks on the board |
79
- | `labels` | `Label[]` | All labels on the board |
92
+ | `id` | `string` | Project identifier |
93
+ | `name` | `string` | Project name |
94
+ | `url` | `string` | Project URL |
95
+ | `statuses` | `string[]` | Available status names |
96
+ | `labels` | `string[]` | Available label names |
97
+ | `tasks` | `Task[]` | All tasks in the project |
80
98
 
81
99
  | Method | Returns | Description |
82
100
  |--------|---------|-------------|
83
- | `findList(name)` | `TaskList` | Find by name (case-insensitive partial match) |
101
+ | `createTask(name, options?)` | `Task` | Create a task in this project |
84
102
  | `findTask(taskId)` | `Task` | Find task by ID |
85
- | `findLabel(name)` | `Label` | Find by name (case-insensitive partial match) |
86
103
 
87
- ### `TaskList`
88
-
89
- | Method | Returns | Description |
90
- |--------|---------|-------------|
91
- | `createTask(name, options?)` | `Task` | Create a task in this list |
92
-
93
- Options: `{ description?: string, labels?: Label[] }`
104
+ Options: `{ description?: string, status?: string, labels?: string[] }`
94
105
 
95
106
  ### `Task`
96
107
 
97
- | Property | Type |
98
- |----------|------|
99
- | `id` | `string` |
100
- | `name` | `string` |
101
- | `description` | `string` |
102
- | `listId` | `string` |
103
- | `boardId` | `string` |
104
- | `labels` | `Label[]` |
105
- | `url` | `string` |
108
+ | Property | Type | Description |
109
+ |----------|------|-------------|
110
+ | `id` | `string` | Task identifier |
111
+ | `name` | `string` | Task name |
112
+ | `description` | `string` | Task description |
113
+ | `status` | `string` | Current status name |
114
+ | `projectId` | `string` | Parent project ID |
115
+ | `labels` | `string[]` | Label names |
116
+ | `url` | `string` | Task URL |
106
117
 
107
118
  | Method | Returns | Description |
108
119
  |--------|---------|-------------|
109
120
  | `update(params)` | `Task` | Update and return new Task with server state |
110
121
 
111
- Params: `{ name?: string, description?: string, list?: TaskList, labels?: Label[] }`
122
+ Params: `{ name?: string, description?: string, status?: string, labels?: string[] }`
112
123
 
113
- ## Switching Providers
124
+ ## Concept Mapping
114
125
 
115
- Change the config zero client code changes:
116
-
117
- ```typescript
118
- // Before
119
- const client = createTaskListClient({ type: "trello" });
120
-
121
- // After
122
- const client = createTaskListClient({ type: "linear" });
123
- ```
126
+ | Abstraction | Trello | Linear |
127
+ |---|---|---|
128
+ | **Project** | Board | Project |
129
+ | Status | List | WorkflowState |
130
+ | **Task** | Card | Issue |
131
+ | Label | Label | IssueLabel |
124
132
 
125
133
  ## Supported Providers
126
134
 
127
135
  - **Trello** — fully implemented
128
- - **Linear** — coming soon
136
+ - **Linear** — fully implemented
@@ -1,32 +1,31 @@
1
- import type { BoardState } from "./BoardState.js";
1
+ import type { Project } from "./Project.js";
2
2
  import type { Task } from "./Task.js";
3
3
  /**
4
- * Full state across all boards.
4
+ * Full state across all projects.
5
5
  * Provides chainable finder methods that throw on not found.
6
6
  *
7
7
  * @example
8
8
  * ```typescript
9
- * const state = await client.getBoards();
10
- * const list = state.findBoard("Alpha").findList("To Do");
11
- * const task = await list.createTask("New task");
9
+ * const state = await client.getProjects();
10
+ * const project = state.findProject("Alpha");
11
+ * const task = await project.createTask("New task");
12
12
  * ```
13
13
  */
14
14
  export declare class FullState {
15
- readonly boards: readonly BoardState[];
16
- constructor(boards: readonly BoardState[]);
15
+ readonly projects: readonly Project[];
16
+ constructor(projects: readonly Project[]);
17
17
  /**
18
- * Find a board by name (case-insensitive partial match).
19
- * Returns a BoardState, enabling chaining: `state.findBoard("X").findList("Y")`
20
- * @param name - Partial board name to search for
21
- * @returns The matching BoardState
22
- * @throws Error if no board matches
18
+ * Find a project by name (case-insensitive partial match).
19
+ * @param name - Partial project name to search for
20
+ * @returns The matching Project
21
+ * @throws Error if no project matches
23
22
  */
24
- findBoard(name: string): BoardState;
23
+ findProject(name: string): Project;
25
24
  /**
26
- * Find a task by ID across all boards
25
+ * Find a task by ID across all projects
27
26
  * @param taskId - Task ID to find
28
27
  * @returns The matching Task
29
- * @throws Error if no task matches on any board
28
+ * @throws Error if no task matches on any project
30
29
  */
31
30
  findTask(taskId: string): Task;
32
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FullState.d.ts","sourceRoot":"","sources":["../src/FullState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;gBAE3B,MAAM,EAAE,SAAS,UAAU,EAAE;IAIzC;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAWnC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAS/B"}
1
+ {"version":3,"file":"FullState.d.ts","sourceRoot":"","sources":["../src/FullState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;gBAE1B,QAAQ,EAAE,SAAS,OAAO,EAAE;IAIxC;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWlC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAS/B"}
package/dist/FullState.js CHANGED
@@ -2,50 +2,49 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FullState = void 0;
4
4
  /**
5
- * Full state across all boards.
5
+ * Full state across all projects.
6
6
  * Provides chainable finder methods that throw on not found.
7
7
  *
8
8
  * @example
9
9
  * ```typescript
10
- * const state = await client.getBoards();
11
- * const list = state.findBoard("Alpha").findList("To Do");
12
- * const task = await list.createTask("New task");
10
+ * const state = await client.getProjects();
11
+ * const project = state.findProject("Alpha");
12
+ * const task = await project.createTask("New task");
13
13
  * ```
14
14
  */
15
15
  class FullState {
16
- boards;
17
- constructor(boards) {
18
- this.boards = boards;
16
+ projects;
17
+ constructor(projects) {
18
+ this.projects = projects;
19
19
  }
20
20
  /**
21
- * Find a board by name (case-insensitive partial match).
22
- * Returns a BoardState, enabling chaining: `state.findBoard("X").findList("Y")`
23
- * @param name - Partial board name to search for
24
- * @returns The matching BoardState
25
- * @throws Error if no board matches
21
+ * Find a project by name (case-insensitive partial match).
22
+ * @param name - Partial project name to search for
23
+ * @returns The matching Project
24
+ * @throws Error if no project matches
26
25
  */
27
- findBoard(name) {
26
+ findProject(name) {
28
27
  const lower = name.toLowerCase();
29
- const board = this.boards.find((b) => b.board.name.toLowerCase().includes(lower));
30
- if (!board) {
31
- throw new Error(`Board "${name}" not found`);
28
+ const project = this.projects.find((p) => p.name.toLowerCase().includes(lower));
29
+ if (!project) {
30
+ throw new Error(`Project "${name}" not found`);
32
31
  }
33
- return board;
32
+ return project;
34
33
  }
35
34
  /**
36
- * Find a task by ID across all boards
35
+ * Find a task by ID across all projects
37
36
  * @param taskId - Task ID to find
38
37
  * @returns The matching Task
39
- * @throws Error if no task matches on any board
38
+ * @throws Error if no task matches on any project
40
39
  */
41
40
  findTask(taskId) {
42
- for (const boardState of this.boards) {
43
- const task = boardState.tasks.find((t) => t.id === taskId);
41
+ for (const project of this.projects) {
42
+ const task = project.tasks.find((t) => t.id === taskId);
44
43
  if (task) {
45
44
  return task;
46
45
  }
47
46
  }
48
- throw new Error(`Task "${taskId}" not found on any board`);
47
+ throw new Error(`Task "${taskId}" not found in any project`);
49
48
  }
50
49
  }
51
50
  exports.FullState = FullState;
@@ -1 +1 @@
1
- {"version":3,"file":"FullState.js","sourceRoot":"","sources":["../src/FullState.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;;;GAUG;AACH,MAAa,SAAS;IACX,MAAM,CAAwB;IAEvC,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,IAAY;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC3C,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,MAAc;QACrB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;YAC3D,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,0BAA0B,CAAC,CAAC;IAC7D,CAAC;CACF;AAxCD,8BAwCC"}
1
+ {"version":3,"file":"FullState.js","sourceRoot":"","sources":["../src/FullState.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;;;GAUG;AACH,MAAa,SAAS;IACX,QAAQ,CAAqB;IAEtC,YAAY,QAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAY;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACrC,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,MAAc;QACrB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;YACxD,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,4BAA4B,CAAC,CAAC;IAC/D,CAAC;CACF;AAvCD,8BAuCC"}
@@ -0,0 +1,42 @@
1
+ import { Task } from "./Task.js";
2
+ import type { CreateTaskOptions, TaskContext } from "./types.js";
3
+ /**
4
+ * A project (Trello Board, Linear Project) with task creation capability.
5
+ * Statuses and labels are exposed as human-readable name arrays.
6
+ */
7
+ export declare class Project {
8
+ readonly id: string;
9
+ readonly name: string;
10
+ readonly url: string;
11
+ readonly statuses: readonly string[];
12
+ readonly labels: readonly string[];
13
+ readonly tasks: readonly Task[];
14
+ private readonly context;
15
+ private readonly defaultStatusId;
16
+ constructor(info: {
17
+ id: string;
18
+ name: string;
19
+ url: string;
20
+ }, statusEntries: readonly {
21
+ id: string;
22
+ name: string;
23
+ }[], tasks: readonly Task[], labelEntries: readonly {
24
+ id: string;
25
+ name: string;
26
+ }[], context: TaskContext);
27
+ /**
28
+ * Create a new task in this project.
29
+ * @param name - Task name/title
30
+ * @param options - Optional description, labels (by name), and status (by name)
31
+ * @returns The created Task
32
+ */
33
+ createTask(name: string, options?: CreateTaskOptions): Promise<Task>;
34
+ /**
35
+ * Find a task by ID
36
+ * @param taskId - Task ID to find
37
+ * @returns The matching Task
38
+ * @throws Error if no task matches
39
+ */
40
+ findTask(taskId: string): Task;
41
+ }
42
+ //# sourceMappingURL=Project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../src/Project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEjE;;;GAGG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAGvC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAC/C,aAAa,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,EACtD,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,YAAY,EAAE,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,EACrD,OAAO,EAAE,WAAW;IAYtB;;;;;OAKG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1E;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAO/B"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Project = void 0;
4
+ const Task_js_1 = require("./Task.js");
5
+ /**
6
+ * A project (Trello Board, Linear Project) with task creation capability.
7
+ * Statuses and labels are exposed as human-readable name arrays.
8
+ */
9
+ class Project {
10
+ id;
11
+ name;
12
+ url;
13
+ statuses;
14
+ labels;
15
+ tasks;
16
+ context;
17
+ defaultStatusId;
18
+ constructor(info, statusEntries, tasks, labelEntries, context) {
19
+ this.id = info.id;
20
+ this.name = info.name;
21
+ this.url = info.url;
22
+ this.statuses = statusEntries.map((s) => s.name);
23
+ this.labels = labelEntries.map((l) => l.name);
24
+ this.tasks = tasks;
25
+ this.context = context;
26
+ this.defaultStatusId = statusEntries[0]?.id ?? "";
27
+ }
28
+ /**
29
+ * Create a new task in this project.
30
+ * @param name - Task name/title
31
+ * @param options - Optional description, labels (by name), and status (by name)
32
+ * @returns The created Task
33
+ */
34
+ async createTask(name, options) {
35
+ const statusId = options?.status !== undefined && options.status !== ""
36
+ ? this.context.resolveStatusId(options.status)
37
+ : this.defaultStatusId;
38
+ const labelIds = options?.labels
39
+ ? options.labels.map((n) => this.context.resolveLabelId(n))
40
+ : undefined;
41
+ const data = await this.context.createTask({
42
+ statusId,
43
+ projectId: this.id,
44
+ name,
45
+ description: options?.description,
46
+ labelIds,
47
+ });
48
+ return new Task_js_1.Task(data, this.context);
49
+ }
50
+ /**
51
+ * Find a task by ID
52
+ * @param taskId - Task ID to find
53
+ * @returns The matching Task
54
+ * @throws Error if no task matches
55
+ */
56
+ findTask(taskId) {
57
+ const task = this.tasks.find((t) => t.id === taskId);
58
+ if (!task) {
59
+ throw new Error(`Task "${taskId}" not found in project "${this.name}"`);
60
+ }
61
+ return task;
62
+ }
63
+ }
64
+ exports.Project = Project;
65
+ //# sourceMappingURL=Project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Project.js","sourceRoot":"","sources":["../src/Project.ts"],"names":[],"mappings":";;;AAAA,uCAAiC;AAGjC;;;GAGG;AACH,MAAa,OAAO;IACT,EAAE,CAAS;IACX,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,QAAQ,CAAoB;IAC5B,MAAM,CAAoB;IAC1B,KAAK,CAAkB;IAEf,OAAO,CAAc;IACrB,eAAe,CAAS;IAEzC,YACE,IAA+C,EAC/C,aAAsD,EACtD,KAAsB,EACtB,YAAqD,EACrD,OAAoB;QAEpB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAA2B;QACxD,MAAM,QAAQ,GACZ,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE;YACpD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QAE3B,MAAM,QAAQ,GAAG,OAAO,EAAE,MAAM;YAC9B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACzC,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,IAAI;YACJ,WAAW,EAAE,OAAO,EAAE,WAAW;YACjC,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,IAAI,cAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,MAAc;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,2BAA2B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAnED,0BAmEC"}
package/dist/Task.d.ts CHANGED
@@ -1,20 +1,21 @@
1
- import type { Label, TaskData, TaskOperations, UpdateTaskParams } from "./types.js";
1
+ import type { TaskContext, TaskData, UpdateTaskParams } from "./types.js";
2
2
  /**
3
- * A task (Trello Card, Linear Issue) with update capability
3
+ * A task (Trello Card, Linear Issue) with update capability.
4
+ * Status and labels are exposed as human-readable names.
4
5
  */
5
6
  export declare class Task {
6
7
  readonly id: string;
7
8
  readonly name: string;
8
9
  readonly description: string;
9
- readonly listId: string;
10
- readonly boardId: string;
11
- readonly labels: readonly Label[];
10
+ readonly status: string;
11
+ readonly projectId: string;
12
+ readonly labels: readonly string[];
12
13
  readonly url: string;
13
- private readonly operations;
14
- constructor(data: TaskData, operations: TaskOperations);
14
+ private readonly context;
15
+ constructor(data: TaskData, context: TaskContext);
15
16
  /**
16
17
  * Update this task. Returns a new Task with the updated data.
17
- * @param params - Fields to update
18
+ * @param params - Fields to update. Status and labels are referenced by name.
18
19
  * @returns New Task reflecting the server state after update
19
20
  */
20
21
  update(params: UpdateTaskParams): Promise<Task>;
@@ -1 +1 @@
1
- {"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../src/Task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,IAAI;IACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAEhC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc;IAWtD;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAUtD"}
1
+ {"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../src/Task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;GAGG;AACH,qBAAa,IAAI;IACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAE1B,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW;IAWhD;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAetD"}
package/dist/Task.js CHANGED
@@ -2,35 +2,46 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Task = void 0;
4
4
  /**
5
- * A task (Trello Card, Linear Issue) with update capability
5
+ * A task (Trello Card, Linear Issue) with update capability.
6
+ * Status and labels are exposed as human-readable names.
6
7
  */
7
8
  class Task {
8
9
  id;
9
10
  name;
10
11
  description;
11
- listId;
12
- boardId;
12
+ status;
13
+ projectId;
13
14
  labels;
14
15
  url;
15
- operations;
16
- constructor(data, operations) {
16
+ context;
17
+ constructor(data, context) {
17
18
  this.id = data.id;
18
19
  this.name = data.name;
19
20
  this.description = data.description;
20
- this.listId = data.listId;
21
- this.boardId = data.boardId;
22
- this.labels = data.labels;
21
+ this.status = context.resolveStatusName(data.statusId);
22
+ this.projectId = data.projectId;
23
+ this.labels = data.labels.map((l) => l.name);
23
24
  this.url = data.url;
24
- this.operations = operations;
25
+ this.context = context;
25
26
  }
26
27
  /**
27
28
  * Update this task. Returns a new Task with the updated data.
28
- * @param params - Fields to update
29
+ * @param params - Fields to update. Status and labels are referenced by name.
29
30
  * @returns New Task reflecting the server state after update
30
31
  */
31
32
  async update(params) {
32
- const data = await this.operations.updateTask(this.id, params.name, params.description, params.list?.id, params.labels?.map((l) => l.id));
33
- return new Task(data, this.operations);
33
+ const data = await this.context.updateTask({
34
+ taskId: this.id,
35
+ name: params.name,
36
+ description: params.description,
37
+ statusId: params.status !== undefined && params.status !== ""
38
+ ? this.context.resolveStatusId(params.status)
39
+ : undefined,
40
+ labelIds: params.labels
41
+ ? params.labels.map((n) => this.context.resolveLabelId(n))
42
+ : undefined,
43
+ });
44
+ return new Task(data, this.context);
34
45
  }
35
46
  }
36
47
  exports.Task = Task;
package/dist/Task.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Task.js","sourceRoot":"","sources":["../src/Task.ts"],"names":[],"mappings":";;;AAOA;;GAEG;AACH,MAAa,IAAI;IACN,EAAE,CAAS;IACX,IAAI,CAAS;IACb,WAAW,CAAS;IACpB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,MAAM,CAAmB;IACzB,GAAG,CAAS;IAEJ,UAAU,CAAiB;IAE5C,YAAY,IAAc,EAAE,UAA0B;QACpD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAwB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAC3C,IAAI,CAAC,EAAE,EACP,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,IAAI,EAAE,EAAE,EACf,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAChC,CAAC;QACF,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;CACF;AArCD,oBAqCC"}
1
+ {"version":3,"file":"Task.js","sourceRoot":"","sources":["../src/Task.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,IAAI;IACN,EAAE,CAAS;IACX,IAAI,CAAS;IACb,WAAW,CAAS;IACpB,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,MAAM,CAAoB;IAC1B,GAAG,CAAS;IAEJ,OAAO,CAAc;IAEtC,YAAY,IAAc,EAAE,OAAoB;QAC9C,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAwB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EACN,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE;gBACjD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7C,CAAC,CAAC,SAAS;YACf,QAAQ,EAAE,MAAM,CAAC,MAAM;gBACrB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;gBAC1D,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;CACF;AA1CD,oBA0CC"}
@@ -1,5 +1,5 @@
1
- import type { BoardState } from "./BoardState.js";
2
1
  import type { FullState } from "./FullState.js";
2
+ import type { Project } from "./Project.js";
3
3
  import type { Task } from "./Task.js";
4
4
  import type { TaskListConfig } from "./types.js";
5
5
  /**
@@ -10,21 +10,29 @@ export declare abstract class TaskListClient {
10
10
  protected readonly config: TaskListConfig;
11
11
  constructor(config: TaskListConfig);
12
12
  /**
13
- * Get full state for all boards (boards, lists, tasks, labels)
13
+ * Get all projects with full state (statuses, tasks, labels)
14
14
  * @returns FullState with chainable finders
15
15
  */
16
- abstract getBoards(): Promise<FullState>;
16
+ abstract getProjects(): Promise<FullState>;
17
17
  /**
18
- * Get full state for a single board (lists, tasks, labels)
19
- * @param boardId - Board identifier
20
- * @returns BoardState with chainable finders
18
+ * Get a single project with full state
19
+ * @param projectId - Project identifier
20
+ * @returns Project with task creation and lookup
21
21
  */
22
- abstract getBoard(boardId: string): Promise<BoardState>;
22
+ abstract getProject(projectId: string): Promise<Project>;
23
23
  /**
24
24
  * Get a single task by ID
25
25
  * @param taskId - Task identifier
26
26
  * @returns Task with update capability
27
27
  */
28
28
  abstract getTask(taskId: string): Promise<Task>;
29
+ /**
30
+ * Find a project by name (case-insensitive partial match).
31
+ * Convenience method that fetches all projects then finds by name.
32
+ * @param name - Partial project name to search for
33
+ * @returns The matching Project
34
+ * @throws Error if no project matches
35
+ */
36
+ findProject(name: string): Promise<Project>;
29
37
  }
30
38
  //# sourceMappingURL=TaskListClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskListClient.d.ts","sourceRoot":"","sources":["../src/TaskListClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,8BAAsB,cAAc;IACtB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc;gBAAtB,MAAM,EAAE,cAAc;IAErD;;;OAGG;IACH,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAExC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAEvD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAChD"}
1
+ {"version":3,"file":"TaskListClient.d.ts","sourceRoot":"","sources":["../src/TaskListClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,8BAAsB,cAAc;IACtB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc;gBAAtB,MAAM,EAAE,cAAc;IAErD;;;OAGG;IACH,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAExD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/C;;;;;;OAMG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIlD"}
@@ -10,6 +10,17 @@ class TaskListClient {
10
10
  constructor(config) {
11
11
  this.config = config;
12
12
  }
13
+ /**
14
+ * Find a project by name (case-insensitive partial match).
15
+ * Convenience method that fetches all projects then finds by name.
16
+ * @param name - Partial project name to search for
17
+ * @returns The matching Project
18
+ * @throws Error if no project matches
19
+ */
20
+ async findProject(name) {
21
+ const state = await this.getProjects();
22
+ return state.findProject(name);
23
+ }
13
24
  }
14
25
  exports.TaskListClient = TaskListClient;
15
26
  //# sourceMappingURL=TaskListClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskListClient.js","sourceRoot":"","sources":["../src/TaskListClient.ts"],"names":[],"mappings":";;;AAKA;;;GAGG;AACH,MAAsB,cAAc;IACH;IAA/B,YAA+B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;CAqB1D;AAtBD,wCAsBC"}
1
+ {"version":3,"file":"TaskListClient.js","sourceRoot":"","sources":["../src/TaskListClient.ts"],"names":[],"mappings":";;;AAKA;;;GAGG;AACH,MAAsB,cAAc;IACH;IAA/B,YAA+B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAsBzD;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF;AAlCD,wCAkCC"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export { type Board, type Label, type CreateTaskOptions, type UpdateTaskParams, type TrelloConfig, type LinearConfig, type TaskListConfig, type Provider, } from "./types.js";
1
+ export { type CreateTaskOptions, type UpdateTaskParams, type TrelloConfig, type LinearConfig, type TaskListConfig, type Provider, } from "./types.js";
2
2
  export { TaskListClient } from "./TaskListClient.js";
3
3
  export { Task } from "./Task.js";
4
- export { TaskList } from "./TaskList.js";
5
- export { BoardState } from "./BoardState.js";
4
+ export { Project } from "./Project.js";
6
5
  export { FullState } from "./FullState.js";
7
6
  export { TrelloTaskListClient } from "./trello";
7
+ export { LinearTaskListClient } from "./linear";
8
8
  import type { TaskListClient } from "./TaskListClient.js";
9
9
  import type { TaskListConfig } from "./types.js";
10
10
  /**
@@ -15,11 +15,13 @@ import type { TaskListConfig } from "./types.js";
15
15
  * // Trello (uses env vars by default)
16
16
  * const client = createTaskListClient({ type: 'trello' });
17
17
  *
18
+ * // Linear (team-scoped)
19
+ * const client = createTaskListClient({ type: 'linear', teamId: 'team-uuid' });
20
+ *
18
21
  * // Usage
19
- * const state = await client.getBoards();
20
- * const list = state.findBoard("My Board").findList("To Do");
21
- * const task = await list.createTask("New task");
22
- * await task.update({ name: "Updated task" });
22
+ * const project = await client.findProject("My Project");
23
+ * const task = await project.createTask("New task");
24
+ * await task.update({ status: "done" });
23
25
  * ```
24
26
  */
25
27
  export declare function createTaskListClient(config: TaskListConfig): TaskListClient;