@zenarc/core 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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/bin/migrate.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { migrateProject } from "../migrate.js";
3
+ async function main() {
4
+ const args = process.argv.slice(2);
5
+ if (args.length < 2) {
6
+ console.error("Usage: zenarc-migrate <project-name> <project-path> [todo-filename]");
7
+ process.exit(1);
8
+ }
9
+ const [projectName, projectPath, todoFilename] = args;
10
+ console.log(`Migrating ${projectName} at ${projectPath}...`);
11
+ const result = await migrateProject(projectName, projectPath, todoFilename || "TODO.md");
12
+ if (result.tasks > 0) {
13
+ console.log(`✅ Migrated ${result.tasks} tasks`);
14
+ console.log(`📦 Archived original to TODO.md.archive`);
15
+ }
16
+ else {
17
+ console.log("⚠️ No TODO.md found or no tasks extracted");
18
+ }
19
+ }
20
+ main().catch((err) => {
21
+ console.error(err);
22
+ process.exit(1);
23
+ });
24
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/bin/migrate.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,OAAO,WAAW,KAAK,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,IAAI,SAAS,CAAC,CAAC;IAEzF,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { TaskSchema, TaskStatus, TaskPriority, TaskContext, generateTaskId, validateTask, safeValidateTask, } from "./schema.js";
2
+ export type { Task } from "./schema.js";
3
+ export { YamlTaskStore, setDefaultStore, getDefaultStore, getRegistry, saveRegistry, addProject, removeProject, listProjectTasks, readTask, writeTask, deleteTask, searchTasks, scanForProjects, getRecentParents, addRecentParent, } from "./store/index.js";
4
+ export type { TaskStore, ProjectConfig } from "./store/index.js";
5
+ export { parseTodoMarkdown, migrateProject } from "./migrate.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,UAAU,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { TaskSchema, TaskStatus, TaskPriority, TaskContext, generateTaskId, validateTask, safeValidateTask, } from "./schema.js";
2
+ export { YamlTaskStore, setDefaultStore, getDefaultStore, getRegistry, saveRegistry, addProject, removeProject, listProjectTasks, readTask, writeTask, deleteTask, searchTasks, scanForProjects, getRecentParents, addRecentParent, } from "./store/index.js";
3
+ export { parseTodoMarkdown, migrateProject } from "./migrate.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,UAAU,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type Task } from "./schema.js";
2
+ /**
3
+ * Parse a single TODO.md file into structured tasks.
4
+ */
5
+ export declare function parseTodoMarkdown(content: string, projectName: string): Promise<Task[]>;
6
+ /**
7
+ * Migrate a single project's TODO.md into structured task files.
8
+ */
9
+ export declare function migrateProject(projectName: string, projectPath: string, todoFilename?: string): Promise<{
10
+ tasks: number;
11
+ archived: boolean;
12
+ }>;
13
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,EAAE,CAAC,CA0IjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,SAAY,GACvB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CA0B/C"}
@@ -0,0 +1,154 @@
1
+ import { readFile, rename } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { generateTaskId } from "./schema.js";
4
+ import { writeTask, addProject, getRegistry } from "./store/index.js";
5
+ /**
6
+ * Parse a single TODO.md file into structured tasks.
7
+ */
8
+ export async function parseTodoMarkdown(content, projectName) {
9
+ const tasks = [];
10
+ const lines = content.split("\n");
11
+ let currentSection = "backlog";
12
+ let i = 0;
13
+ const sectionToStatus = {
14
+ active: "in_progress",
15
+ critical: "in_progress",
16
+ "do next": "in_progress",
17
+ backlog: "todo",
18
+ todo: "todo",
19
+ done: "done",
20
+ archive: "done",
21
+ "quick wins": "todo",
22
+ };
23
+ const priorityMap = {
24
+ critical: "critical",
25
+ active: "high",
26
+ "do next": "high",
27
+ backlog: "medium",
28
+ todo: "medium",
29
+ done: "low",
30
+ archive: "low",
31
+ "quick wins": "low",
32
+ };
33
+ while (i < lines.length) {
34
+ const line = lines[i];
35
+ // Detect sections via headings
36
+ const headingMatch = line.match(/^##\s+([🔴🟡🟢⚪🔵🟣🟠⚫\s]*)(.+)/i);
37
+ if (headingMatch) {
38
+ const sectionName = headingMatch[2].toLowerCase().trim();
39
+ for (const key of Object.keys(sectionToStatus)) {
40
+ if (sectionName.includes(key)) {
41
+ currentSection = key;
42
+ break;
43
+ }
44
+ }
45
+ i++;
46
+ continue;
47
+ }
48
+ // Detect checklist items
49
+ const checkMatch = line.match(/^\s*-\s*\[([xX\s])\]\s*(.+)/);
50
+ if (checkMatch) {
51
+ const isDone = checkMatch[1].toLowerCase() === "x";
52
+ let title = checkMatch[2].trim();
53
+ // Extract bold title if present: **Fix something** — description
54
+ const boldMatch = title.match(/^\*\*(.+?)\*\*\s*[—\-:]?\s*(.*)/);
55
+ let description = "";
56
+ if (boldMatch) {
57
+ title = boldMatch[1].trim();
58
+ description = boldMatch[2].trim();
59
+ }
60
+ // Collect indented description lines that follow
61
+ const notesLines = description ? [description] : [];
62
+ let j = i + 1;
63
+ while (j < lines.length) {
64
+ const nextLine = lines[j];
65
+ // Stop at next checklist, heading, or horizontal rule
66
+ if (nextLine.match(/^\s*-\s*\[/) ||
67
+ nextLine.match(/^#{1,3}\s/) ||
68
+ nextLine.match(/^\s*---\s*$/)) {
69
+ break;
70
+ }
71
+ // Include indented lines or continuation paragraphs
72
+ if (nextLine.match(/^\s{2,}/) || nextLine.match(/^\s*\>/)) {
73
+ notesLines.push(nextLine.trim());
74
+ j++;
75
+ }
76
+ else if (nextLine.trim() === "") {
77
+ notesLines.push("");
78
+ j++;
79
+ }
80
+ else {
81
+ break;
82
+ }
83
+ }
84
+ // Extract file paths from backticks and code blocks in notes
85
+ const files = [];
86
+ const urls = [];
87
+ const allText = [title, ...notesLines].join(" ");
88
+ // Match backtick file paths
89
+ const backtickMatches = allText.matchAll(/`([^`]+\.(?:js|ts|tsx|jsx|py|java|kt|swift|go|rs|yaml|json|md|css|html))`/g);
90
+ for (const m of backtickMatches) {
91
+ files.push(m[1]);
92
+ }
93
+ // Match URLs
94
+ const urlMatches = allText.matchAll(/https?:\/\/[^\s\)\]\>]+/g);
95
+ for (const m of urlMatches) {
96
+ urls.push(m[0]);
97
+ }
98
+ const status = isDone
99
+ ? "done"
100
+ : sectionToStatus[currentSection] || "todo";
101
+ const priority = priorityMap[currentSection] || "medium";
102
+ const now = new Date().toISOString();
103
+ const task = {
104
+ id: generateTaskId(),
105
+ title,
106
+ status: status,
107
+ priority: priority,
108
+ project: projectName,
109
+ tags: [],
110
+ created_at: now,
111
+ updated_at: now,
112
+ created_by: "human",
113
+ assigned_to: undefined,
114
+ context: {
115
+ files: [...new Set(files)],
116
+ urls: [...new Set(urls)],
117
+ notes: notesLines.join("\n").trim(),
118
+ },
119
+ dependencies: [],
120
+ };
121
+ tasks.push(task);
122
+ i = j;
123
+ continue;
124
+ }
125
+ i++;
126
+ }
127
+ return tasks;
128
+ }
129
+ /**
130
+ * Migrate a single project's TODO.md into structured task files.
131
+ */
132
+ export async function migrateProject(projectName, projectPath, todoFilename = "TODO.md") {
133
+ const todoPath = join(projectPath, todoFilename);
134
+ let content;
135
+ try {
136
+ content = await readFile(todoPath, "utf-8");
137
+ }
138
+ catch {
139
+ return { tasks: 0, archived: false };
140
+ }
141
+ // Add to registry if not present
142
+ const registry = await getRegistry();
143
+ if (!registry.find((p) => p.name === projectName)) {
144
+ await addProject({ name: projectName, path: projectPath, format: "yaml" });
145
+ }
146
+ const tasks = await parseTodoMarkdown(content, projectName);
147
+ for (const task of tasks) {
148
+ await writeTask(projectPath, task);
149
+ }
150
+ // Archive original
151
+ await rename(todoPath, `${todoPath}.archive`);
152
+ return { tasks: tasks.length, archived: true };
153
+ }
154
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { z } from "zod";
2
+ export declare const TaskStatus: z.ZodEnum<["todo", "in_progress", "done", "blocked", "deferred"]>;
3
+ export declare const TaskPriority: z.ZodEnum<["critical", "high", "medium", "low"]>;
4
+ export declare const TaskContext: z.ZodObject<{
5
+ files: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
6
+ urls: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
7
+ notes: z.ZodDefault<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ files: string[];
10
+ urls: string[];
11
+ notes: string;
12
+ }, {
13
+ files?: string[] | undefined;
14
+ urls?: string[] | undefined;
15
+ notes?: string | undefined;
16
+ }>;
17
+ export declare const TaskSchema: z.ZodObject<{
18
+ id: z.ZodString;
19
+ title: z.ZodString;
20
+ status: z.ZodEnum<["todo", "in_progress", "done", "blocked", "deferred"]>;
21
+ priority: z.ZodEnum<["critical", "high", "medium", "low"]>;
22
+ project: z.ZodString;
23
+ tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
24
+ created_at: z.ZodString;
25
+ updated_at: z.ZodString;
26
+ created_by: z.ZodDefault<z.ZodEnum<["human", "claude", "other-agent"]>>;
27
+ assigned_to: z.ZodOptional<z.ZodString>;
28
+ context: z.ZodDefault<z.ZodObject<{
29
+ files: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
30
+ urls: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
31
+ notes: z.ZodDefault<z.ZodString>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ files: string[];
34
+ urls: string[];
35
+ notes: string;
36
+ }, {
37
+ files?: string[] | undefined;
38
+ urls?: string[] | undefined;
39
+ notes?: string | undefined;
40
+ }>>;
41
+ dependencies: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ status: "todo" | "in_progress" | "done" | "blocked" | "deferred";
44
+ id: string;
45
+ title: string;
46
+ priority: "critical" | "high" | "medium" | "low";
47
+ project: string;
48
+ tags: string[];
49
+ created_at: string;
50
+ updated_at: string;
51
+ created_by: "human" | "claude" | "other-agent";
52
+ context: {
53
+ files: string[];
54
+ urls: string[];
55
+ notes: string;
56
+ };
57
+ dependencies: string[];
58
+ assigned_to?: string | undefined;
59
+ }, {
60
+ status: "todo" | "in_progress" | "done" | "blocked" | "deferred";
61
+ id: string;
62
+ title: string;
63
+ priority: "critical" | "high" | "medium" | "low";
64
+ project: string;
65
+ created_at: string;
66
+ updated_at: string;
67
+ tags?: string[] | undefined;
68
+ created_by?: "human" | "claude" | "other-agent" | undefined;
69
+ assigned_to?: string | undefined;
70
+ context?: {
71
+ files?: string[] | undefined;
72
+ urls?: string[] | undefined;
73
+ notes?: string | undefined;
74
+ } | undefined;
75
+ dependencies?: string[] | undefined;
76
+ }>;
77
+ export type Task = z.infer<typeof TaskSchema>;
78
+ export type TaskStatus = z.infer<typeof TaskStatus>;
79
+ export type TaskPriority = z.infer<typeof TaskPriority>;
80
+ export declare function generateTaskId(): string;
81
+ export declare function validateTask(data: unknown): Task;
82
+ export declare function safeValidateTask(data: unknown): {
83
+ success: true;
84
+ data: Task;
85
+ } | {
86
+ success: false;
87
+ error: z.ZodError;
88
+ };
89
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,mEAMrB,CAAC;AAEH,eAAO,MAAM,YAAY,kDAKvB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;EAItB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAarB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC9C,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAC1C;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC7B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAA;CAAE,CAMxC"}
package/dist/schema.js ADDED
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ export const TaskStatus = z.enum([
3
+ "todo",
4
+ "in_progress",
5
+ "done",
6
+ "blocked",
7
+ "deferred",
8
+ ]);
9
+ export const TaskPriority = z.enum([
10
+ "critical",
11
+ "high",
12
+ "medium",
13
+ "low",
14
+ ]);
15
+ export const TaskContext = z.object({
16
+ files: z.array(z.string()).default([]),
17
+ urls: z.array(z.string().url()).default([]),
18
+ notes: z.string().default(""),
19
+ });
20
+ export const TaskSchema = z.object({
21
+ id: z.string().regex(/^tm-\d{8}-[a-z0-9]{8}$/),
22
+ title: z.string().min(1),
23
+ status: TaskStatus,
24
+ priority: TaskPriority,
25
+ project: z.string().min(1),
26
+ tags: z.array(z.string()).default([]),
27
+ created_at: z.string().datetime(),
28
+ updated_at: z.string().datetime(),
29
+ created_by: z.enum(["human", "claude", "other-agent"]).default("human"),
30
+ assigned_to: z.string().optional(),
31
+ context: TaskContext.default({ files: [], urls: [], notes: "" }),
32
+ dependencies: z.array(z.string()).default([]),
33
+ });
34
+ export function generateTaskId() {
35
+ const date = new Date().toISOString().slice(0, 10).replace(/-/g, "");
36
+ const rand = Math.random().toString(36).slice(2, 10);
37
+ return `tm-${date}-${rand}`;
38
+ }
39
+ export function validateTask(data) {
40
+ return TaskSchema.parse(data);
41
+ }
42
+ export function safeValidateTask(data) {
43
+ const result = TaskSchema.safeParse(data);
44
+ if (result.success) {
45
+ return { success: true, data: result.data };
46
+ }
47
+ return { success: false, error: result.error };
48
+ }
49
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export type { TaskStore, ProjectConfig } from "./types.js";
2
+ export { YamlTaskStore, getRecentParents, addRecentParent } from "./yaml-store.js";
3
+ import type { TaskStore } from "./types.js";
4
+ export declare function setDefaultStore(store: TaskStore): void;
5
+ export declare function getDefaultStore(): TaskStore;
6
+ export declare const getRegistry: () => Promise<import("./types.js").ProjectConfig[]>;
7
+ export declare const saveRegistry: (projects: Parameters<TaskStore["saveRegistry"]>[0]) => Promise<void>;
8
+ export declare const addProject: (config: Parameters<TaskStore["addProject"]>[0]) => Promise<void>;
9
+ export declare const removeProject: (name: string) => Promise<void>;
10
+ export declare const listProjectTasks: (path: string) => Promise<{
11
+ id: string;
12
+ title: string;
13
+ status: "todo" | "in_progress" | "done" | "blocked" | "deferred";
14
+ priority: "critical" | "high" | "medium" | "low";
15
+ project: string;
16
+ tags: string[];
17
+ created_at: string;
18
+ updated_at: string;
19
+ created_by: "human" | "claude" | "other-agent";
20
+ context: {
21
+ files: string[];
22
+ urls: string[];
23
+ notes: string;
24
+ };
25
+ dependencies: string[];
26
+ assigned_to?: string | undefined;
27
+ }[]>;
28
+ export declare const readTask: (path: string, id: string) => Promise<{
29
+ id: string;
30
+ title: string;
31
+ status: "todo" | "in_progress" | "done" | "blocked" | "deferred";
32
+ priority: "critical" | "high" | "medium" | "low";
33
+ project: string;
34
+ tags: string[];
35
+ created_at: string;
36
+ updated_at: string;
37
+ created_by: "human" | "claude" | "other-agent";
38
+ context: {
39
+ files: string[];
40
+ urls: string[];
41
+ notes: string;
42
+ };
43
+ dependencies: string[];
44
+ assigned_to?: string | undefined;
45
+ } | null>;
46
+ export declare const writeTask: (path: string, task: Parameters<TaskStore["writeTask"]>[1]) => Promise<void>;
47
+ export declare const deleteTask: (path: string, id: string) => Promise<boolean>;
48
+ export declare const searchTasks: (query: string, options?: Parameters<TaskStore["searchTasks"]>[1]) => Promise<{
49
+ id: string;
50
+ title: string;
51
+ status: "todo" | "in_progress" | "done" | "blocked" | "deferred";
52
+ priority: "critical" | "high" | "medium" | "low";
53
+ project: string;
54
+ tags: string[];
55
+ created_at: string;
56
+ updated_at: string;
57
+ created_by: "human" | "claude" | "other-agent";
58
+ context: {
59
+ files: string[];
60
+ urls: string[];
61
+ notes: string;
62
+ };
63
+ dependencies: string[];
64
+ assigned_to?: string | undefined;
65
+ }[]>;
66
+ export declare const scanForProjects: (paths: string[]) => Promise<import("./types.js").ProjectConfig[]>;
67
+ export declare const getProjectTasksDir: (path: string) => string;
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAEtD;AAED,wBAAgB,eAAe,IAAI,SAAS,CAE3C;AAGD,eAAO,MAAM,WAAW,qDAAmC,CAAC;AAC5D,eAAO,MAAM,YAAY,GAAI,UAAU,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,kBAC1C,CAAC;AACtC,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,kBACxC,CAAC;AAClC,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,kBAAqC,CAAC;AAChF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM;;;;;;;;;;;;;;;;;IAAwC,CAAC;AACtF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,IAAI,MAAM;;;;;;;;;;;;;;;;;SAAoC,CAAC;AACtF,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,MAAM,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,kBAC/C,CAAC;AACrC,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,IAAI,MAAM,qBAAsC,CAAC;AAC1F,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,UAAU,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;IAClD,CAAC;AAC3C,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,kDAAwC,CAAC;AACxF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,WAA0C,CAAC"}
@@ -0,0 +1,23 @@
1
+ export { YamlTaskStore, getRecentParents, addRecentParent } from "./yaml-store.js";
2
+ import { YamlTaskStore } from "./yaml-store.js";
3
+ // Global default store instance for backward-compatible function exports
4
+ let defaultStore = new YamlTaskStore();
5
+ export function setDefaultStore(store) {
6
+ defaultStore = store;
7
+ }
8
+ export function getDefaultStore() {
9
+ return defaultStore;
10
+ }
11
+ // Backward-compatible function exports that delegate to defaultStore
12
+ export const getRegistry = () => defaultStore.getRegistry();
13
+ export const saveRegistry = (projects) => defaultStore.saveRegistry(projects);
14
+ export const addProject = (config) => defaultStore.addProject(config);
15
+ export const removeProject = (name) => defaultStore.removeProject(name);
16
+ export const listProjectTasks = (path) => defaultStore.listProjectTasks(path);
17
+ export const readTask = (path, id) => defaultStore.readTask(path, id);
18
+ export const writeTask = (path, task) => defaultStore.writeTask(path, task);
19
+ export const deleteTask = (path, id) => defaultStore.deleteTask(path, id);
20
+ export const searchTasks = (query, options) => defaultStore.searchTasks(query, options);
21
+ export const scanForProjects = (paths) => defaultStore.scanForProjects(paths);
22
+ export const getProjectTasksDir = (path) => defaultStore.getProjectTasksDir(path);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,yEAAyE;AACzE,IAAI,YAAY,GAAc,IAAI,aAAa,EAAE,CAAC;AAElD,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;AAC5D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAkD,EAAE,EAAE,CACjF,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAA8C,EAAE,EAAE,CAC3E,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,IAA2C,EAAE,EAAE,CACrF,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,OAAiD,EAAE,EAAE,CAC9F,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AACxF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Task } from "../schema.js";
2
+ export type ProjectConfig = {
3
+ name: string;
4
+ path: string;
5
+ format: "yaml" | "json";
6
+ sync?: {
7
+ enabled: boolean;
8
+ firebaseProject?: string;
9
+ };
10
+ };
11
+ export interface TaskStore {
12
+ getRegistry(): Promise<ProjectConfig[]>;
13
+ saveRegistry(projects: ProjectConfig[]): Promise<void>;
14
+ addProject(config: ProjectConfig): Promise<void>;
15
+ removeProject(name: string): Promise<void>;
16
+ getProjectTasksDir(projectPath: string): string;
17
+ listProjectTasks(projectPath: string): Promise<Task[]>;
18
+ readTask(projectPath: string, taskId: string): Promise<Task | null>;
19
+ writeTask(projectPath: string, task: Task): Promise<void>;
20
+ deleteTask(projectPath: string, taskId: string): Promise<boolean>;
21
+ searchTasks(query: string, options?: {
22
+ project?: string;
23
+ status?: string;
24
+ priority?: string;
25
+ tag?: string;
26
+ assigned_to?: string;
27
+ }): Promise<Task[]>;
28
+ scanForProjects(rootPaths: string[]): Promise<ProjectConfig[]>;
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACxC,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,WAAW,CACT,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAEnB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAChE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { type Task } from "../schema.js";
2
+ import type { TaskStore, ProjectConfig } from "./types.js";
3
+ export declare function getRecentParents(): Promise<string[]>;
4
+ export declare function addRecentParent(dir: string): Promise<void>;
5
+ export declare class YamlTaskStore implements TaskStore {
6
+ getProjectTasksDir(projectPath: string): string;
7
+ private ensureZenarcStructure;
8
+ getRegistry(): Promise<ProjectConfig[]>;
9
+ saveRegistry(projects: ProjectConfig[]): Promise<void>;
10
+ addProject(config: ProjectConfig): Promise<void>;
11
+ removeProject(name: string): Promise<void>;
12
+ private writeProjectConfig;
13
+ listProjectTasks(projectPath: string): Promise<Task[]>;
14
+ readTask(projectPath: string, taskId: string): Promise<Task | null>;
15
+ writeTask(projectPath: string, task: Task): Promise<void>;
16
+ deleteTask(projectPath: string, taskId: string): Promise<boolean>;
17
+ searchTasks(query: string, options?: {
18
+ project?: string;
19
+ status?: string;
20
+ priority?: string;
21
+ tag?: string;
22
+ assigned_to?: string;
23
+ }): Promise<Task[]>;
24
+ scanForProjects(rootPaths: string[]): Promise<ProjectConfig[]>;
25
+ }
26
+ //# sourceMappingURL=yaml-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-store.d.ts","sourceRoot":"","sources":["../../src/store/yaml-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAoD3D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAW1D;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAchE;AAqBD,qBAAa,aAAc,YAAW,SAAS;IAC7C,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;YAIjC,qBAAqB;IAgB7B,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IASvC,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YASlC,kBAAkB;IAuB1B,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAgDtD,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA+CnE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAqEzD,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2DjE,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,EAAE,CAAC;IAuCZ,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CA4ErE"}
@@ -0,0 +1,482 @@
1
+ import { readFile, writeFile, readdir, mkdir, access, unlink } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { parse, stringify } from "yaml";
5
+ import { validateTask } from "../schema.js";
6
+ const ZENARC_DIR = join(homedir(), ".zenarc");
7
+ const REGISTRY_PATH = join(ZENARC_DIR, "projects.json");
8
+ const RECENT_PARENTS_PATH = join(ZENARC_DIR, "recent-parents.json");
9
+ const MAX_RECENT_PARENTS = 20;
10
+ const AGENT_MD = `# ZenArc Project Structure
11
+
12
+ This folder (\`.zenarc/\`) is managed by **ZenArc** — a task manager that stores tasks as YAML files.
13
+
14
+ ## Folder Structure
15
+
16
+ \`\`\`
17
+ .zenarc/
18
+ ├── AGENT.md # This file — structure documentation
19
+ ├── overview.yml # Auto-generated project summary (task counts, last updated)
20
+ └── tasks/ # Individual task YAML files
21
+ ├── {slug}.yaml
22
+ └── ...
23
+ \`\`\`
24
+
25
+ ## Rules
26
+
27
+ - **All task files MUST be stored in \`.zenarc/tasks/\`** — never in the project root.
28
+ - **Task filenames are \`{slug}.yaml\`** where slug comes from the task title.
29
+ - **Never rename task files manually** — ZenArc tracks tasks by ID inside the YAML, not by filename.
30
+ - **\`overview.yml\` is auto-generated** — do not edit it manually. It gets refreshed on every task change.
31
+ - **\`config.yml\` is reserved** for user-configurable project settings. Do not create it unless asked.
32
+
33
+ ## Backward Compatibility
34
+
35
+ Old ZenArc projects may have task files directly in the project root (e.g., \`zenarc-*.yaml\` or \`tm-*.yaml\`). These are still read for backward compatibility, but all new tasks are written to \`.zenarc/tasks/\`.
36
+
37
+ ## Task YAML Format
38
+
39
+ Each task file contains:
40
+ - \`id\`: Unique task ID (e.g., \`tm-20260604-abc12345\`)
41
+ - \`title\`, \`status\`, \`priority\`, \`project\`, \`tags\`
42
+ - \`created_at\`, \`updated_at\`, \`created_by\`, \`assigned_to\`
43
+ - \`context\`: \`{ files, urls, notes }\`
44
+ - \`dependencies\`: Array of task IDs
45
+ `;
46
+ async function ensureDir(path) {
47
+ await mkdir(path, { recursive: true });
48
+ }
49
+ /* ------------------------------------------------------------------ */
50
+ /* Recent parent directories — improves project path auto-detection */
51
+ /* ------------------------------------------------------------------ */
52
+ export async function getRecentParents() {
53
+ try {
54
+ const raw = await readFile(RECENT_PARENTS_PATH, "utf-8");
55
+ const parsed = JSON.parse(raw);
56
+ if (Array.isArray(parsed) && parsed.every((p) => typeof p === "string")) {
57
+ return parsed;
58
+ }
59
+ }
60
+ catch {
61
+ // File doesn't exist or is invalid
62
+ }
63
+ return [];
64
+ }
65
+ export async function addRecentParent(dir) {
66
+ const recent = await getRecentParents();
67
+ const normalized = dir.trim();
68
+ if (!normalized)
69
+ return;
70
+ // Move to front if already exists, otherwise prepend
71
+ const filtered = recent.filter((p) => p !== normalized);
72
+ filtered.unshift(normalized);
73
+ // Limit size
74
+ const trimmed = filtered.slice(0, MAX_RECENT_PARENTS);
75
+ await ensureDir(ZENARC_DIR);
76
+ await writeFile(RECENT_PARENTS_PATH, JSON.stringify(trimmed, null, 2), "utf-8");
77
+ }
78
+ function isPotentialTaskFile(name) {
79
+ return name.endsWith(".yaml") || name.endsWith(".yml");
80
+ }
81
+ function isLegacyTaskFilename(name) {
82
+ return (isPotentialTaskFile(name) &&
83
+ (name.startsWith("zenarc-") || name.startsWith("tm-")));
84
+ }
85
+ function getZenarcDir(projectPath) {
86
+ return join(projectPath, ".zenarc");
87
+ }
88
+ function getProjectOverviewPath(projectPath) {
89
+ return join(getZenarcDir(projectPath), "overview.yml");
90
+ }
91
+ export class YamlTaskStore {
92
+ getProjectTasksDir(projectPath) {
93
+ return join(projectPath, ".zenarc", "tasks");
94
+ }
95
+ async ensureZenarcStructure(projectPath) {
96
+ const zenarcDir = getZenarcDir(projectPath);
97
+ const tasksDir = this.getProjectTasksDir(projectPath);
98
+ await ensureDir(tasksDir);
99
+ // Write AGENT.md on first creation
100
+ const agentPath = join(zenarcDir, "AGENT.md");
101
+ try {
102
+ await access(agentPath);
103
+ }
104
+ catch {
105
+ await writeFile(agentPath, AGENT_MD, "utf-8");
106
+ }
107
+ return tasksDir;
108
+ }
109
+ async getRegistry() {
110
+ try {
111
+ const raw = await readFile(REGISTRY_PATH, "utf-8");
112
+ return JSON.parse(raw);
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ }
118
+ async saveRegistry(projects) {
119
+ await ensureDir(ZENARC_DIR);
120
+ await writeFile(REGISTRY_PATH, JSON.stringify(projects, null, 2), "utf-8");
121
+ }
122
+ async addProject(config) {
123
+ const registry = await this.getRegistry();
124
+ const filtered = registry.filter((p) => p.name !== config.name);
125
+ filtered.push(config);
126
+ await this.saveRegistry(filtered);
127
+ }
128
+ async removeProject(name) {
129
+ const registry = await this.getRegistry();
130
+ await this.saveRegistry(registry.filter((p) => p.name !== name));
131
+ }
132
+ /* ------------------------------------------------------------------ */
133
+ /* Config / summary file */
134
+ /* ------------------------------------------------------------------ */
135
+ async writeProjectConfig(projectPath, tasks) {
136
+ const overviewPath = getProjectOverviewPath(projectPath);
137
+ const counts = {};
138
+ for (const task of tasks) {
139
+ counts[task.status] = (counts[task.status] || 0) + 1;
140
+ }
141
+ const config = {
142
+ name: tasks[0]?.project || "",
143
+ summary: {
144
+ total: tasks.length,
145
+ by_status: counts,
146
+ },
147
+ last_updated: new Date().toISOString(),
148
+ };
149
+ await writeFile(overviewPath, stringify(config, { indent: 2 }), "utf-8");
150
+ }
151
+ /* ------------------------------------------------------------------ */
152
+ /* Task reading — prefers .zenarc/tasks/, falls back to root */
153
+ /* ------------------------------------------------------------------ */
154
+ async listProjectTasks(projectPath) {
155
+ const tasks = new Map();
156
+ // Read from .zenarc/tasks/ (new location)
157
+ try {
158
+ const tasksDir = this.getProjectTasksDir(projectPath);
159
+ const entries = await readdir(tasksDir);
160
+ for (const entry of entries) {
161
+ if (!isPotentialTaskFile(entry))
162
+ continue;
163
+ try {
164
+ const raw = await readFile(join(tasksDir, entry), "utf-8");
165
+ const data = parse(raw);
166
+ const task = validateTask(data);
167
+ tasks.set(task.id, task);
168
+ }
169
+ catch {
170
+ // Skip invalid task files
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ // .zenarc/tasks/ doesn't exist yet
176
+ }
177
+ // Backward compatibility: read from project root
178
+ try {
179
+ const entries = await readdir(projectPath);
180
+ for (const entry of entries) {
181
+ if (!isPotentialTaskFile(entry))
182
+ continue;
183
+ try {
184
+ const raw = await readFile(join(projectPath, entry), "utf-8");
185
+ const data = parse(raw);
186
+ const task = validateTask(data);
187
+ if (!tasks.has(task.id)) {
188
+ tasks.set(task.id, task);
189
+ }
190
+ }
191
+ catch {
192
+ // Skip invalid task files
193
+ }
194
+ }
195
+ }
196
+ catch {
197
+ // Project path doesn't exist
198
+ }
199
+ return Array.from(tasks.values()).sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime());
200
+ }
201
+ async readTask(projectPath, taskId) {
202
+ // Search .zenarc/tasks/ first
203
+ try {
204
+ const tasksDir = this.getProjectTasksDir(projectPath);
205
+ const entries = await readdir(tasksDir);
206
+ for (const entry of entries) {
207
+ if (!isPotentialTaskFile(entry))
208
+ continue;
209
+ try {
210
+ const raw = await readFile(join(tasksDir, entry), "utf-8");
211
+ const data = parse(raw);
212
+ if (data.id === taskId) {
213
+ return validateTask(data);
214
+ }
215
+ }
216
+ catch {
217
+ // Continue searching
218
+ }
219
+ }
220
+ }
221
+ catch {
222
+ // .zenarc/tasks/ doesn't exist
223
+ }
224
+ // Backward compatibility: search project root
225
+ try {
226
+ const entries = await readdir(projectPath);
227
+ for (const entry of entries) {
228
+ if (!isPotentialTaskFile(entry))
229
+ continue;
230
+ try {
231
+ const raw = await readFile(join(projectPath, entry), "utf-8");
232
+ const data = parse(raw);
233
+ if (data.id === taskId) {
234
+ return validateTask(data);
235
+ }
236
+ }
237
+ catch {
238
+ // Continue searching
239
+ }
240
+ }
241
+ }
242
+ catch {
243
+ // Project path doesn't exist
244
+ }
245
+ return null;
246
+ }
247
+ /* ------------------------------------------------------------------ */
248
+ /* Task writing — always writes to .zenarc/tasks/ */
249
+ /* ------------------------------------------------------------------ */
250
+ async writeTask(projectPath, task) {
251
+ const tasksDir = await this.ensureZenarcStructure(projectPath);
252
+ const validated = validateTask(task);
253
+ const yaml = stringify(validated, {
254
+ indent: 2,
255
+ sortMapEntries: false,
256
+ });
257
+ // Try to find existing file by task ID and overwrite it
258
+ try {
259
+ const entries = await readdir(tasksDir);
260
+ for (const entry of entries) {
261
+ if (!isPotentialTaskFile(entry))
262
+ continue;
263
+ try {
264
+ const raw = await readFile(join(tasksDir, entry), "utf-8");
265
+ const data = parse(raw);
266
+ if (data.id === task.id) {
267
+ await writeFile(join(tasksDir, entry), yaml, "utf-8");
268
+ await this.writeProjectConfig(projectPath, [
269
+ ...Array.from((await this.listProjectTasks(projectPath)).filter((t) => t.id !== task.id)),
270
+ validated,
271
+ ]);
272
+ return;
273
+ }
274
+ }
275
+ catch {
276
+ // Continue searching
277
+ }
278
+ }
279
+ }
280
+ catch {
281
+ // Directory empty or unreadable
282
+ }
283
+ // No existing file — create new slug-based filename
284
+ const slug = task.title
285
+ .toLowerCase()
286
+ .replace(/[^a-z0-9]+/g, "-")
287
+ .replace(/^-+|-+$/g, "")
288
+ .slice(0, 50);
289
+ let filename = `${slug}.yaml`;
290
+ let filepath = join(tasksDir, filename);
291
+ // Handle collision by appending counter
292
+ let counter = 1;
293
+ while (true) {
294
+ try {
295
+ await access(filepath);
296
+ counter++;
297
+ filename = `${slug}-${counter}.yaml`;
298
+ filepath = join(tasksDir, filename);
299
+ }
300
+ catch {
301
+ break;
302
+ }
303
+ }
304
+ await writeFile(filepath, yaml, "utf-8");
305
+ // Update config summary
306
+ const existingTasks = await this.listProjectTasks(projectPath);
307
+ await this.writeProjectConfig(projectPath, [...existingTasks, validated]);
308
+ }
309
+ /* ------------------------------------------------------------------ */
310
+ /* Task deletion — prefers .zenarc/tasks/, falls back to root */
311
+ /* ------------------------------------------------------------------ */
312
+ async deleteTask(projectPath, taskId) {
313
+ let deletedTask = null;
314
+ // Search .zenarc/tasks/ first
315
+ try {
316
+ const tasksDir = this.getProjectTasksDir(projectPath);
317
+ const entries = await readdir(tasksDir);
318
+ for (const entry of entries) {
319
+ if (!isPotentialTaskFile(entry))
320
+ continue;
321
+ try {
322
+ const raw = await readFile(join(tasksDir, entry), "utf-8");
323
+ const data = parse(raw);
324
+ if (data.id === taskId) {
325
+ await unlink(join(tasksDir, entry));
326
+ deletedTask = validateTask(data);
327
+ break;
328
+ }
329
+ }
330
+ catch {
331
+ // Continue searching
332
+ }
333
+ }
334
+ }
335
+ catch {
336
+ // .zenarc/tasks/ doesn't exist
337
+ }
338
+ // Backward compatibility: search project root
339
+ if (!deletedTask) {
340
+ try {
341
+ const entries = await readdir(projectPath);
342
+ for (const entry of entries) {
343
+ if (!isPotentialTaskFile(entry))
344
+ continue;
345
+ try {
346
+ const raw = await readFile(join(projectPath, entry), "utf-8");
347
+ const data = parse(raw);
348
+ if (data.id === taskId) {
349
+ await unlink(join(projectPath, entry));
350
+ deletedTask = validateTask(data);
351
+ break;
352
+ }
353
+ }
354
+ catch {
355
+ // Continue searching
356
+ }
357
+ }
358
+ }
359
+ catch {
360
+ // Project path doesn't exist
361
+ }
362
+ }
363
+ if (deletedTask) {
364
+ const remaining = (await this.listProjectTasks(projectPath)).filter((t) => t.id !== taskId);
365
+ await this.writeProjectConfig(projectPath, remaining);
366
+ return true;
367
+ }
368
+ return false;
369
+ }
370
+ async searchTasks(query, options) {
371
+ const registry = await this.getRegistry();
372
+ let projects = registry;
373
+ if (options?.project) {
374
+ projects = projects.filter((p) => p.name === options.project);
375
+ }
376
+ const allTasks = [];
377
+ for (const project of projects) {
378
+ const tasks = await this.listProjectTasks(project.path);
379
+ allTasks.push(...tasks);
380
+ }
381
+ const q = query.toLowerCase();
382
+ return allTasks.filter((task) => {
383
+ if (options?.status && task.status !== options.status)
384
+ return false;
385
+ if (options?.priority && task.priority !== options.priority)
386
+ return false;
387
+ if (options?.tag && !task.tags.includes(options.tag))
388
+ return false;
389
+ if (options?.assigned_to && task.assigned_to !== options.assigned_to)
390
+ return false;
391
+ if (!q)
392
+ return true;
393
+ const text = [
394
+ task.title,
395
+ task.context.notes,
396
+ ...task.tags,
397
+ task.project,
398
+ task.assigned_to || "",
399
+ ]
400
+ .join(" ")
401
+ .toLowerCase();
402
+ return text.includes(q);
403
+ });
404
+ }
405
+ async scanForProjects(rootPaths) {
406
+ const { readdir } = await import("node:fs/promises");
407
+ const found = [];
408
+ for (const root of rootPaths) {
409
+ try {
410
+ const entries = await readdir(root, { withFileTypes: true });
411
+ for (const entry of entries) {
412
+ if (!entry.isDirectory())
413
+ continue;
414
+ const projectPath = join(root, entry.name);
415
+ // Check for .zenarc/tasks/ directory (new format)
416
+ try {
417
+ const tasksDir = this.getProjectTasksDir(projectPath);
418
+ await access(tasksDir);
419
+ const files = await readdir(tasksDir);
420
+ if (files.some(isPotentialTaskFile)) {
421
+ found.push({
422
+ name: entry.name,
423
+ path: projectPath,
424
+ format: "yaml",
425
+ });
426
+ continue;
427
+ }
428
+ }
429
+ catch {
430
+ // No .zenarc/tasks/ directory
431
+ }
432
+ // Check for .zenarc/overview.yml
433
+ try {
434
+ await access(getProjectOverviewPath(projectPath));
435
+ found.push({
436
+ name: entry.name,
437
+ path: projectPath,
438
+ format: "yaml",
439
+ });
440
+ continue;
441
+ }
442
+ catch {
443
+ // No .zenarc/overview.yml
444
+ }
445
+ // Check for .zenarc.yml config file (legacy)
446
+ try {
447
+ await access(join(projectPath, ".zenarc.yml"));
448
+ found.push({
449
+ name: entry.name,
450
+ path: projectPath,
451
+ format: "yaml",
452
+ });
453
+ continue;
454
+ }
455
+ catch {
456
+ // No .zenarc.yml
457
+ }
458
+ // Backward compatibility: check for legacy task files in root
459
+ try {
460
+ const files = await readdir(projectPath);
461
+ const hasTaskFiles = files.some((f) => isLegacyTaskFilename(f));
462
+ if (hasTaskFiles) {
463
+ found.push({
464
+ name: entry.name,
465
+ path: projectPath,
466
+ format: "yaml",
467
+ });
468
+ }
469
+ }
470
+ catch {
471
+ // Can't read directory
472
+ }
473
+ }
474
+ }
475
+ catch {
476
+ // Root path doesn't exist or isn't readable
477
+ }
478
+ }
479
+ return found;
480
+ }
481
+ }
482
+ //# sourceMappingURL=yaml-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-store.js","sourceRoot":"","sources":["../../src/store/yaml-store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@zenarc/core",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./schema": {
13
+ "types": "./dist/schema.d.ts",
14
+ "default": "./dist/schema.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "package.json",
20
+ "README.md"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "scripts": {
26
+ "build": "tsc",
27
+ "dev": "tsc --watch",
28
+ "migrate": "node dist/bin/migrate.js",
29
+ "test": "node --test dist/**/*.test.js"
30
+ },
31
+ "dependencies": {
32
+ "yaml": "^2.7.0",
33
+ "zod": "^3.24.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.0.0",
37
+ "typescript": "^5.6.0"
38
+ }
39
+ }