@veewo/claw-core 0.1.12

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 (56) hide show
  1. package/README.md +7 -0
  2. package/dist/src/completion-hooks.d.ts +6 -0
  3. package/dist/src/completion-hooks.js +64 -0
  4. package/dist/src/completion-hooks.js.map +1 -0
  5. package/dist/src/context.d.ts +7 -0
  6. package/dist/src/context.js +171 -0
  7. package/dist/src/context.js.map +1 -0
  8. package/dist/src/errors.d.ts +6 -0
  9. package/dist/src/errors.js +11 -0
  10. package/dist/src/errors.js.map +1 -0
  11. package/dist/src/index.d.ts +15 -0
  12. package/dist/src/index.js +16 -0
  13. package/dist/src/index.js.map +1 -0
  14. package/dist/src/init.d.ts +22 -0
  15. package/dist/src/init.js +91 -0
  16. package/dist/src/init.js.map +1 -0
  17. package/dist/src/io.d.ts +6 -0
  18. package/dist/src/io.js +47 -0
  19. package/dist/src/io.js.map +1 -0
  20. package/dist/src/memory.d.ts +4 -0
  21. package/dist/src/memory.js +240 -0
  22. package/dist/src/memory.js.map +1 -0
  23. package/dist/src/paths.d.ts +6 -0
  24. package/dist/src/paths.js +73 -0
  25. package/dist/src/paths.js.map +1 -0
  26. package/dist/src/plan-events.d.ts +12 -0
  27. package/dist/src/plan-events.js +8 -0
  28. package/dist/src/plan-events.js.map +1 -0
  29. package/dist/src/plan-view.d.ts +6 -0
  30. package/dist/src/plan-view.js +69 -0
  31. package/dist/src/plan-view.js.map +1 -0
  32. package/dist/src/plan.d.ts +10 -0
  33. package/dist/src/plan.js +510 -0
  34. package/dist/src/plan.js.map +1 -0
  35. package/dist/src/project-check.d.ts +3 -0
  36. package/dist/src/project-check.js +238 -0
  37. package/dist/src/project-check.js.map +1 -0
  38. package/dist/src/requirements-gate.d.ts +23 -0
  39. package/dist/src/requirements-gate.js +49 -0
  40. package/dist/src/requirements-gate.js.map +1 -0
  41. package/dist/src/switch-task.d.ts +2 -0
  42. package/dist/src/switch-task.js +60 -0
  43. package/dist/src/switch-task.js.map +1 -0
  44. package/dist/src/task-retention.d.ts +2 -0
  45. package/dist/src/task-retention.js +126 -0
  46. package/dist/src/task-retention.js.map +1 -0
  47. package/dist/src/truth.d.ts +2 -0
  48. package/dist/src/truth.js +33 -0
  49. package/dist/src/truth.js.map +1 -0
  50. package/dist/src/types.d.ts +476 -0
  51. package/dist/src/types.js +2 -0
  52. package/dist/src/types.js.map +1 -0
  53. package/dist/src/workflow-guidance.d.ts +10 -0
  54. package/dist/src/workflow-guidance.js +233 -0
  55. package/dist/src/workflow-guidance.js.map +1 -0
  56. package/package.json +32 -0
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @veewo/claw-core
2
+
3
+ Core library for `.claw` project context, plan lifecycle, search, truth ingestion, and task retention.
4
+
5
+ Repository:
6
+
7
+ - [claw-kit](https://github.com/chanyuenpang/claw-kit)
@@ -0,0 +1,6 @@
1
+ import type { PlanCompletionHooks, PlanDocument, TaskContext } from "./types.js";
2
+ export declare function buildCompletionHooks(params: {
3
+ task: TaskContext;
4
+ planPath: string;
5
+ plan: PlanDocument;
6
+ }): PlanCompletionHooks;
@@ -0,0 +1,64 @@
1
+ import path from "node:path";
2
+ export function buildCompletionHooks(params) {
3
+ const { task, planPath, plan } = params;
4
+ const truthCandidate = {
5
+ projectId: task.project.projectId,
6
+ taskName: task.taskName,
7
+ planPath,
8
+ planTitle: plan.title,
9
+ goalText: plan.goal.text,
10
+ planStatus: plan.status,
11
+ ...(plan.summary ? { summary: plan.summary } : {}),
12
+ ...(plan.rules ? { rules: plan.rules } : {}),
13
+ ...(plan.references ? { references: plan.references } : {}),
14
+ ...(plan.retrospective ? { retrospective: plan.retrospective } : {}),
15
+ ...(plan.keyDecisions ? { keyDecisions: plan.keyDecisions } : {}),
16
+ suggestedTruthPaths: buildSuggestedTruthPaths(planPath, plan),
17
+ };
18
+ const adrCandidate = {
19
+ projectId: task.project.projectId,
20
+ taskName: task.taskName,
21
+ planPath,
22
+ planTitle: plan.title,
23
+ planStatus: plan.status,
24
+ keyDecisions: plan.keyDecisions ?? [],
25
+ shouldWriteAdr: (plan.keyDecisions?.length ?? 0) > 0,
26
+ reason: (plan.keyDecisions?.length ?? 0) > 0
27
+ ? "Plan completed with keyDecisions that may represent durable architecture or workflow decisions."
28
+ : "No explicit keyDecisions were present on the completed plan.",
29
+ };
30
+ return {
31
+ truthCandidate,
32
+ adrCandidate,
33
+ ...(plan.parentPlan && plan.parentTaskId !== undefined
34
+ ? {
35
+ subplanClosureCandidate: {
36
+ taskName: task.taskName,
37
+ parentPlan: plan.parentPlan,
38
+ parentTaskId: plan.parentTaskId,
39
+ },
40
+ }
41
+ : {}),
42
+ };
43
+ }
44
+ function buildSuggestedTruthPaths(planPath, plan) {
45
+ const suggestions = new Set(["SUMMARY.md"]);
46
+ if (plan.taskType?.trim()) {
47
+ suggestions.add(`features/${slugify(plan.taskType)}.md`);
48
+ }
49
+ else {
50
+ suggestions.add(`features/${slugify(plan.title)}.md`);
51
+ }
52
+ const planFileName = path.basename(planPath, path.extname(planPath));
53
+ suggestions.add(`plans/${slugify(planFileName)}.md`);
54
+ return [...suggestions];
55
+ }
56
+ function slugify(input) {
57
+ return input
58
+ .trim()
59
+ .toLowerCase()
60
+ .replace(/[^a-z0-9._-]+/g, "-")
61
+ .replace(/-+/g, "-")
62
+ .replace(/^[.-]+|[.-]+$/g, "");
63
+ }
64
+ //# sourceMappingURL=completion-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-hooks.js","sourceRoot":"","sources":["../../src/completion-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ProjectContext, ResolvedContext, TaskContext } from "./types.js";
2
+ export declare function resolveProjectContext(cwd: string): ProjectContext;
3
+ export declare function resolveTaskContext(project: ProjectContext, taskName: string): TaskContext;
4
+ export declare function resolveContext(cwd: string, taskName?: string): ResolvedContext;
5
+ export declare function ensureTaskMeta(project: ProjectContext, taskName: string, description?: string): TaskContext;
6
+ export declare function saveTaskMeta(task: TaskContext): void;
7
+ export declare function resolveTaskName(taskName: string): string;
@@ -0,0 +1,171 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ClawError } from "./errors.js";
4
+ import { readJsonFile, withFileLock } from "./io.js";
5
+ import { ensureInsideDir, findProjectRoot, isValidTaskName, normalizePlanFile, normalizeTaskName } from "./paths.js";
6
+ export function resolveProjectContext(cwd) {
7
+ const projectRoot = findProjectRoot(cwd);
8
+ if (!projectRoot) {
9
+ throw new ClawError("CLAW_DIR_NOT_FOUND", `No .claw directory was found from ${cwd}.`, { cwd });
10
+ }
11
+ const clawDir = path.join(projectRoot, ".claw");
12
+ const projectJsonPath = path.join(clawDir, "project.json");
13
+ const projectConfig = fs.existsSync(projectJsonPath) ? readProjectConfig(projectJsonPath) : null;
14
+ const projectId = deriveProjectId(projectRoot, projectConfig);
15
+ return {
16
+ projectRoot,
17
+ clawDir,
18
+ projectJsonPath,
19
+ truthDir: path.join(clawDir, "truth"),
20
+ tasksDir: path.join(clawDir, "tasks"),
21
+ projectId,
22
+ ...(projectConfig?.name ? { projectName: projectConfig.name } : {}),
23
+ projectConfig,
24
+ };
25
+ }
26
+ export function resolveTaskContext(project, taskName) {
27
+ const resolvedTaskName = resolveTaskName(taskName);
28
+ const taskDir = path.join(project.tasksDir, resolvedTaskName);
29
+ const metaPath = path.join(taskDir, "meta.json");
30
+ if (!fs.existsSync(metaPath)) {
31
+ throw new ClawError("TASK_NOT_FOUND", `Task "${resolvedTaskName}" does not exist.`, { taskName: resolvedTaskName });
32
+ }
33
+ const meta = readJsonFile(metaPath);
34
+ const activePlan = normalizePlanFile(typeof meta.activePlan === "string" ? meta.activePlan : "plan.json");
35
+ const activePlanPath = ensureInsideDir(taskDir, activePlan);
36
+ if (!activePlanPath) {
37
+ throw new ClawError("ACTIVE_PLAN_INVALID", `Task "${resolvedTaskName}" has an invalid activePlan.`, {
38
+ taskName: resolvedTaskName,
39
+ activePlan,
40
+ });
41
+ }
42
+ if (!fs.existsSync(activePlanPath)) {
43
+ throw new ClawError("ACTIVE_PLAN_MISSING", `Task "${resolvedTaskName}" points to a missing active plan file.`, {
44
+ taskName: resolvedTaskName,
45
+ activePlan,
46
+ });
47
+ }
48
+ return {
49
+ project,
50
+ taskName: resolvedTaskName,
51
+ taskDir,
52
+ metaPath,
53
+ meta,
54
+ activePlan,
55
+ activePlanPath,
56
+ };
57
+ }
58
+ export function resolveContext(cwd, taskName) {
59
+ const project = resolveProjectContext(cwd);
60
+ return {
61
+ project,
62
+ ...(taskName ? { task: resolveTaskContext(project, taskName) } : {}),
63
+ };
64
+ }
65
+ export function ensureTaskMeta(project, taskName, description) {
66
+ const resolvedTaskName = resolveTaskName(taskName);
67
+ const taskDir = path.join(project.tasksDir, resolvedTaskName);
68
+ const metaPath = path.join(taskDir, "meta.json");
69
+ const now = new Date().toISOString();
70
+ let meta;
71
+ const createdTask = !fs.existsSync(metaPath);
72
+ if (!createdTask) {
73
+ meta = readJsonFile(metaPath);
74
+ meta.updatedAt = now;
75
+ if (description && !meta.description) {
76
+ meta.description = description;
77
+ }
78
+ }
79
+ else {
80
+ meta = {
81
+ name: resolvedTaskName,
82
+ description: description ?? "",
83
+ projectId: project.projectId,
84
+ createdAt: now,
85
+ updatedAt: now,
86
+ subagents: [],
87
+ status: "active",
88
+ activePlan: "plan.json",
89
+ };
90
+ }
91
+ fs.mkdirSync(taskDir, { recursive: true });
92
+ withFileLock(metaPath, () => {
93
+ fs.writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\n`, "utf-8");
94
+ });
95
+ const task = {
96
+ project,
97
+ taskName: resolvedTaskName,
98
+ taskDir,
99
+ metaPath,
100
+ meta,
101
+ activePlan: normalizePlanFile(meta.activePlan),
102
+ activePlanPath: path.join(taskDir, normalizePlanFile(meta.activePlan)),
103
+ };
104
+ if (createdTask) {
105
+ task.meta.createdAt = now;
106
+ }
107
+ return task;
108
+ }
109
+ export function saveTaskMeta(task) {
110
+ task.meta.updatedAt = new Date().toISOString();
111
+ withFileLock(task.metaPath, () => {
112
+ fs.writeFileSync(task.metaPath, `${JSON.stringify(task.meta, null, 2)}\n`, "utf-8");
113
+ });
114
+ }
115
+ export function resolveTaskName(taskName) {
116
+ const normalized = normalizeTaskName(taskName);
117
+ if (!normalized || !isValidTaskName(normalized)) {
118
+ throw new ClawError("TASK_NAME_INVALID", `Invalid task name "${taskName}".`, { taskName });
119
+ }
120
+ return normalized;
121
+ }
122
+ function readProjectConfig(projectJsonPath) {
123
+ try {
124
+ return normalizeProjectConfig(readJsonFile(projectJsonPath));
125
+ }
126
+ catch (error) {
127
+ throw new ClawError("PROJECT_CONFIG_INVALID", "Failed to parse .claw/project.json.", {
128
+ path: projectJsonPath,
129
+ cause: error instanceof Error ? error.message : String(error),
130
+ });
131
+ }
132
+ }
133
+ function normalizeProjectConfig(projectConfig) {
134
+ const { autoAchieveTask: _autoAchieveTask, ...rest } = projectConfig;
135
+ return {
136
+ ...rest,
137
+ maxTasksToKeep: Number.isInteger(projectConfig.maxTasksToKeep) && projectConfig.maxTasksToKeep >= 1
138
+ ? projectConfig.maxTasksToKeep
139
+ : 99,
140
+ externalTruthSkill: normalizeOptionalSkill(projectConfig.externalTruthSkill),
141
+ externalAdrSkill: normalizeOptionalSkill(projectConfig.externalAdrSkill),
142
+ contextPaths: [...(projectConfig.contextPaths ?? [])],
143
+ memory: {
144
+ externalDocPaths: [...(projectConfig.memory?.externalDocPaths ?? [])],
145
+ },
146
+ gitnexus: {
147
+ enabled: projectConfig.gitnexus?.enabled ?? false,
148
+ },
149
+ };
150
+ }
151
+ function deriveProjectId(projectRoot, projectConfig) {
152
+ const candidates = [projectConfig?.id, projectConfig?.name, path.basename(projectRoot)];
153
+ for (const candidate of candidates) {
154
+ if (!candidate) {
155
+ continue;
156
+ }
157
+ const normalized = normalizeTaskName(candidate);
158
+ if (normalized) {
159
+ return normalized;
160
+ }
161
+ }
162
+ throw new ClawError("PROJECT_ROOT_NOT_FOUND", "Unable to derive a project id.", { projectRoot });
163
+ }
164
+ function normalizeOptionalSkill(value) {
165
+ if (typeof value !== "string") {
166
+ return null;
167
+ }
168
+ const trimmed = value.trim();
169
+ return trimmed ? trimmed : null;
170
+ }
171
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type ClawErrorCode = "PROJECT_ROOT_NOT_FOUND" | "CLAW_DIR_NOT_FOUND" | "PROJECT_ALREADY_INITIALIZED" | "PROJECT_CONFIG_INVALID" | "TASK_NOT_FOUND" | "TASK_NAME_INVALID" | "ACTIVE_PLAN_INVALID" | "ACTIVE_PLAN_MISSING" | "PLAN_NOT_FOUND" | "PLAN_STATUS_INVALID" | "PLAN_STATUS_NOT_SETTABLE" | "PLAN_STATUS_TRANSITION_FORBIDDEN" | "PLAN_STATUS_REOPEN_REQUIRED" | "TASK_STATUS_FORBIDDEN_IN_NON_ACTIVE_PLAN" | "PLAN_WRITE_CONFLICT" | "RETROSPECTIVE_REQUIRED" | "MEMORY_QUERY_REQUIRED" | "GITNEXUS_REFRESH_FAILED" | "TRUTH_TARGET_INVALID" | "INPUT_REQUIRED";
2
+ export declare class ClawError extends Error {
3
+ readonly code: ClawErrorCode;
4
+ readonly details: Record<string, unknown> | undefined;
5
+ constructor(code: ClawErrorCode, message: string, details?: Record<string, unknown>);
6
+ }
@@ -0,0 +1,11 @@
1
+ export class ClawError extends Error {
2
+ code;
3
+ details;
4
+ constructor(code, message, details) {
5
+ super(message);
6
+ this.name = "ClawError";
7
+ this.code = code;
8
+ this.details = details;
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAgB;IACpB,OAAO,CAAsC;IAEtD,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAiC;QACjF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ export * from "./context.js";
2
+ export * from "./completion-hooks.js";
3
+ export * from "./errors.js";
4
+ export * from "./init.js";
5
+ export * from "./memory.js";
6
+ export * from "./plan-events.js";
7
+ export * from "./project-check.js";
8
+ export * from "./requirements-gate.js";
9
+ export * from "./plan.js";
10
+ export * from "./plan-view.js";
11
+ export * from "./switch-task.js";
12
+ export * from "./task-retention.js";
13
+ export * from "./truth.js";
14
+ export * from "./types.js";
15
+ export * from "./workflow-guidance.js";
@@ -0,0 +1,16 @@
1
+ export * from "./context.js";
2
+ export * from "./completion-hooks.js";
3
+ export * from "./errors.js";
4
+ export * from "./init.js";
5
+ export * from "./memory.js";
6
+ export * from "./plan-events.js";
7
+ export * from "./project-check.js";
8
+ export * from "./requirements-gate.js";
9
+ export * from "./plan.js";
10
+ export * from "./plan-view.js";
11
+ export * from "./switch-task.js";
12
+ export * from "./task-retention.js";
13
+ export * from "./truth.js";
14
+ export * from "./types.js";
15
+ export * from "./workflow-guidance.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type InitProjectInput = {
2
+ cwd: string;
3
+ projectId?: string;
4
+ projectName?: string;
5
+ maxTasksToKeep?: number;
6
+ externalTruthSkill?: string | null;
7
+ externalAdrSkill?: string | null;
8
+ contextPaths?: string[];
9
+ externalDocPaths?: string[];
10
+ gitnexusEnabled?: boolean;
11
+ force?: boolean;
12
+ };
13
+ export type InitProjectResult = {
14
+ projectRoot: string;
15
+ clawDir: string;
16
+ projectJsonPath: string;
17
+ created: boolean;
18
+ projectId: string;
19
+ projectName: string;
20
+ createdPaths: string[];
21
+ };
22
+ export declare function initProject(input: InitProjectInput): InitProjectResult;
@@ -0,0 +1,91 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ClawError } from "./errors.js";
4
+ import { normalizeTaskName } from "./paths.js";
5
+ export function initProject(input) {
6
+ const projectRoot = path.resolve(input.cwd);
7
+ const clawDir = path.join(projectRoot, ".claw");
8
+ const projectJsonPath = path.join(clawDir, "project.json");
9
+ const memoryPath = path.join(clawDir, "memory.md");
10
+ const truthSummaryPath = path.join(clawDir, "truth", "SUMMARY.md");
11
+ const tasksDir = path.join(clawDir, "tasks");
12
+ const knowledgeDir = path.join(clawDir, ".knowledge");
13
+ const createdPaths = [];
14
+ const exists = fs.existsSync(clawDir);
15
+ if (exists && !input.force) {
16
+ throw new ClawError("PROJECT_ALREADY_INITIALIZED", `Project already contains .claw at ${clawDir}.`, {
17
+ clawDir,
18
+ });
19
+ }
20
+ const projectName = input.projectName?.trim() || path.basename(projectRoot);
21
+ const projectId = normalizeProjectId(input.projectId ?? projectName, projectRoot);
22
+ const maxTasksToKeep = input.maxTasksToKeep ?? 99;
23
+ validateMaxTasksToKeep(maxTasksToKeep, projectRoot);
24
+ const projectConfig = {
25
+ id: projectId,
26
+ name: projectName,
27
+ maxTasksToKeep,
28
+ externalTruthSkill: normalizeOptionalSkill(input.externalTruthSkill),
29
+ externalAdrSkill: normalizeOptionalSkill(input.externalAdrSkill),
30
+ contextPaths: [...(input.contextPaths ?? [])],
31
+ memory: {
32
+ externalDocPaths: [...(input.externalDocPaths ?? [])],
33
+ },
34
+ gitnexus: {
35
+ enabled: input.gitnexusEnabled ?? false,
36
+ },
37
+ };
38
+ ensureDir(clawDir, createdPaths);
39
+ ensureDir(path.dirname(truthSummaryPath), createdPaths);
40
+ ensureDir(tasksDir, createdPaths);
41
+ ensureDir(knowledgeDir, createdPaths);
42
+ writeFile(projectJsonPath, `${JSON.stringify(projectConfig, null, 2)}\n`, createdPaths);
43
+ writeFile(memoryPath, `# Project Memory\n\n- Project initialized for claw-kit.\n- Use \`claw plan write\` to establish the first task scope.\n`, createdPaths);
44
+ writeFile(truthSummaryPath, `# ${projectName} Truth Summary\n\n- Project initialized for claw-kit.\n- No durable truth has been recorded yet.\n`, createdPaths);
45
+ return {
46
+ projectRoot,
47
+ clawDir,
48
+ projectJsonPath,
49
+ created: !exists,
50
+ projectId,
51
+ projectName,
52
+ createdPaths,
53
+ };
54
+ }
55
+ function normalizeProjectId(candidate, projectRoot) {
56
+ const normalized = normalizeTaskName(candidate).toLowerCase();
57
+ if (!normalized) {
58
+ throw new ClawError("PROJECT_ROOT_NOT_FOUND", "Unable to derive a project id for claw init.", {
59
+ projectRoot,
60
+ candidate,
61
+ });
62
+ }
63
+ return normalized;
64
+ }
65
+ function validateMaxTasksToKeep(value, projectRoot) {
66
+ if (!Number.isInteger(value) || value < 1) {
67
+ throw new ClawError("PROJECT_CONFIG_INVALID", "maxTasksToKeep must be an integer greater than or equal to 1.", {
68
+ projectRoot,
69
+ value,
70
+ });
71
+ }
72
+ }
73
+ function normalizeOptionalSkill(value) {
74
+ if (typeof value !== "string") {
75
+ return null;
76
+ }
77
+ const trimmed = value.trim();
78
+ return trimmed ? trimmed : null;
79
+ }
80
+ function ensureDir(dirPath, createdPaths) {
81
+ if (fs.existsSync(dirPath)) {
82
+ return;
83
+ }
84
+ fs.mkdirSync(dirPath, { recursive: true });
85
+ createdPaths.push(dirPath);
86
+ }
87
+ function writeFile(filePath, content, createdPaths) {
88
+ fs.writeFileSync(filePath, content, "utf-8");
89
+ createdPaths.push(filePath);
90
+ }
91
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function readJsonFile<T>(filePath: string): T;
2
+ export declare function writeJsonFile(filePath: string, value: unknown): void;
3
+ export declare function readTextFile(filePath: string): string;
4
+ export declare function writeTextFile(filePath: string, content: string): void;
5
+ export declare function stripBom(content: string): string;
6
+ export declare function withFileLock<T>(targetPath: string, action: () => T): T;
package/dist/src/io.js ADDED
@@ -0,0 +1,47 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { ClawError } from "./errors.js";
4
+ export function readJsonFile(filePath) {
5
+ return JSON.parse(stripBom(fs.readFileSync(filePath, "utf-8")));
6
+ }
7
+ export function writeJsonFile(filePath, value) {
8
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
9
+ fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf-8");
10
+ }
11
+ export function readTextFile(filePath) {
12
+ return stripBom(fs.readFileSync(filePath, "utf-8"));
13
+ }
14
+ export function writeTextFile(filePath, content) {
15
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
16
+ fs.writeFileSync(filePath, content, "utf-8");
17
+ }
18
+ export function stripBom(content) {
19
+ return content.charCodeAt(0) === 0xfeff ? content.slice(1) : content;
20
+ }
21
+ export function withFileLock(targetPath, action) {
22
+ const lockPath = `${targetPath}.lock`;
23
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
24
+ let lockFd;
25
+ try {
26
+ lockFd = fs.openSync(lockPath, "wx");
27
+ }
28
+ catch (error) {
29
+ const code = error && typeof error === "object" && "code" in error ? String(error.code) : "";
30
+ if (code === "EEXIST") {
31
+ throw new ClawError("PLAN_WRITE_CONFLICT", `Concurrent write detected for "${targetPath}". Retry after the other plan operation completes.`, { targetPath, lockPath });
32
+ }
33
+ throw error;
34
+ }
35
+ try {
36
+ return action();
37
+ }
38
+ finally {
39
+ if (lockFd !== undefined) {
40
+ fs.closeSync(lockFd);
41
+ }
42
+ if (fs.existsSync(lockPath)) {
43
+ fs.unlinkSync(lockPath);
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,YAAY,CAAI,QAAgB;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAM,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAc;IAC5D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC7D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,UAAkB,EAAE,MAAe;IACjE,MAAM,QAAQ,GAAG,GAAG,UAAU,OAAO,CAAC;IACtC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrH,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CACjB,qBAAqB,EACrB,kCAAkC,UAAU,oDAAoD,EAChG,EAAE,UAAU,EAAE,QAAQ,EAAE,CACzB,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MemoryGetInput, MemoryGetResult, MemoryIndexInput, MemoryIndexResult, MemorySearchInput, MemorySearchResult } from "./types.js";
2
+ export declare function buildMemoryIndex(input: MemoryIndexInput): MemoryIndexResult;
3
+ export declare function searchMemory(input: MemorySearchInput): MemorySearchResult;
4
+ export declare function getMemory(input: MemoryGetInput): MemoryGetResult;