@jamesaphoenix/tx-core 0.4.2 → 0.4.3
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.
- package/README.md +480 -0
- package/dist/db.d.ts +28 -14
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +102 -14
- package/dist/db.js.map +1 -1
- package/dist/errors.d.ts +178 -34
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +119 -26
- package/dist/errors.js.map +1 -1
- package/dist/id.d.ts +10 -0
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +17 -1
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +15 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +62 -8
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +23 -14
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +75 -76
- package/dist/layer.js.map +1 -1
- package/dist/mappers/anchor.d.ts +15 -1
- package/dist/mappers/anchor.d.ts.map +1 -1
- package/dist/mappers/anchor.js +95 -28
- package/dist/mappers/anchor.js.map +1 -1
- package/dist/mappers/attempt.d.ts +3 -1
- package/dist/mappers/attempt.d.ts.map +1 -1
- package/dist/mappers/attempt.js +23 -9
- package/dist/mappers/attempt.js.map +1 -1
- package/dist/mappers/candidate.d.ts +3 -1
- package/dist/mappers/candidate.d.ts.map +1 -1
- package/dist/mappers/candidate.js +46 -16
- package/dist/mappers/candidate.js.map +1 -1
- package/dist/mappers/claim.d.ts +1 -1
- package/dist/mappers/claim.d.ts.map +1 -1
- package/dist/mappers/claim.js +11 -4
- package/dist/mappers/claim.js.map +1 -1
- package/dist/mappers/deduplication.d.ts +13 -1
- package/dist/mappers/deduplication.d.ts.map +1 -1
- package/dist/mappers/deduplication.js +22 -3
- package/dist/mappers/deduplication.js.map +1 -1
- package/dist/mappers/doc.d.ts +24 -0
- package/dist/mappers/doc.d.ts.map +1 -0
- package/dist/mappers/doc.js +161 -0
- package/dist/mappers/doc.js.map +1 -0
- package/dist/mappers/edge.d.ts +10 -1
- package/dist/mappers/edge.d.ts.map +1 -1
- package/dist/mappers/edge.js +74 -12
- package/dist/mappers/edge.js.map +1 -1
- package/dist/mappers/file-learning.d.ts.map +1 -1
- package/dist/mappers/file-learning.js +2 -1
- package/dist/mappers/file-learning.js.map +1 -1
- package/dist/mappers/index.d.ts +6 -7
- package/dist/mappers/index.d.ts.map +1 -1
- package/dist/mappers/index.js +10 -12
- package/dist/mappers/index.js.map +1 -1
- package/dist/mappers/learning.d.ts +9 -1
- package/dist/mappers/learning.d.ts.map +1 -1
- package/dist/mappers/learning.js +94 -14
- package/dist/mappers/learning.js.map +1 -1
- package/dist/mappers/orchestrator-state.d.ts +1 -1
- package/dist/mappers/orchestrator-state.d.ts.map +1 -1
- package/dist/mappers/orchestrator-state.js +31 -5
- package/dist/mappers/orchestrator-state.js.map +1 -1
- package/dist/mappers/parse-date.d.ts +11 -0
- package/dist/mappers/parse-date.d.ts.map +1 -0
- package/dist/mappers/parse-date.js +18 -0
- package/dist/mappers/parse-date.js.map +1 -0
- package/dist/mappers/run.d.ts +14 -4
- package/dist/mappers/run.d.ts.map +1 -1
- package/dist/mappers/run.js +49 -18
- package/dist/mappers/run.js.map +1 -1
- package/dist/mappers/task.d.ts +5 -1
- package/dist/mappers/task.d.ts.map +1 -1
- package/dist/mappers/task.js +66 -16
- package/dist/mappers/task.js.map +1 -1
- package/dist/mappers/tracked-project.d.ts +3 -1
- package/dist/mappers/tracked-project.d.ts.map +1 -1
- package/dist/mappers/tracked-project.js +23 -9
- package/dist/mappers/tracked-project.js.map +1 -1
- package/dist/mappers/worker.d.ts +1 -1
- package/dist/mappers/worker.d.ts.map +1 -1
- package/dist/mappers/worker.js +44 -6
- package/dist/mappers/worker.js.map +1 -1
- package/dist/repo/anchor-repo.d.ts +2 -2
- package/dist/repo/anchor-repo.d.ts.map +1 -1
- package/dist/repo/anchor-repo.js +46 -5
- package/dist/repo/anchor-repo.js.map +1 -1
- package/dist/repo/attempt-repo.d.ts +2 -2
- package/dist/repo/attempt-repo.d.ts.map +1 -1
- package/dist/repo/attempt-repo.js +16 -6
- package/dist/repo/attempt-repo.js.map +1 -1
- package/dist/repo/candidate-repo.d.ts.map +1 -1
- package/dist/repo/candidate-repo.js +22 -1
- package/dist/repo/candidate-repo.js.map +1 -1
- package/dist/repo/claim-repo.d.ts +46 -2
- package/dist/repo/claim-repo.d.ts.map +1 -1
- package/dist/repo/claim-repo.js +113 -6
- package/dist/repo/claim-repo.js.map +1 -1
- package/dist/repo/compaction-repo.d.ts +41 -0
- package/dist/repo/compaction-repo.d.ts.map +1 -0
- package/dist/repo/compaction-repo.js +84 -0
- package/dist/repo/compaction-repo.js.map +1 -0
- package/dist/repo/deduplication-repo.d.ts +9 -1
- package/dist/repo/deduplication-repo.d.ts.map +1 -1
- package/dist/repo/deduplication-repo.js +46 -9
- package/dist/repo/deduplication-repo.js.map +1 -1
- package/dist/repo/dep-repo.d.ts +27 -3
- package/dist/repo/dep-repo.d.ts.map +1 -1
- package/dist/repo/dep-repo.js +166 -39
- package/dist/repo/dep-repo.js.map +1 -1
- package/dist/repo/doc-repo.d.ts +59 -0
- package/dist/repo/doc-repo.d.ts.map +1 -0
- package/dist/repo/doc-repo.js +276 -0
- package/dist/repo/doc-repo.js.map +1 -0
- package/dist/repo/edge-repo.d.ts +1 -1
- package/dist/repo/edge-repo.d.ts.map +1 -1
- package/dist/repo/edge-repo.js +65 -34
- package/dist/repo/edge-repo.js.map +1 -1
- package/dist/repo/file-learning-repo.d.ts +3 -3
- package/dist/repo/file-learning-repo.d.ts.map +1 -1
- package/dist/repo/file-learning-repo.js +19 -8
- package/dist/repo/file-learning-repo.js.map +1 -1
- package/dist/repo/index.d.ts +4 -6
- package/dist/repo/index.d.ts.map +1 -1
- package/dist/repo/index.js +3 -5
- package/dist/repo/index.js.map +1 -1
- package/dist/repo/learning-repo.d.ts +10 -3
- package/dist/repo/learning-repo.d.ts.map +1 -1
- package/dist/repo/learning-repo.js +68 -11
- package/dist/repo/learning-repo.js.map +1 -1
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
- package/dist/repo/orchestrator-state-repo.js +8 -1
- package/dist/repo/orchestrator-state-repo.js.map +1 -1
- package/dist/repo/run-repo.d.ts +3 -3
- package/dist/repo/run-repo.d.ts.map +1 -1
- package/dist/repo/run-repo.js +40 -19
- package/dist/repo/run-repo.js.map +1 -1
- package/dist/repo/task-repo.d.ts +14 -3
- package/dist/repo/task-repo.d.ts.map +1 -1
- package/dist/repo/task-repo.js +194 -20
- package/dist/repo/task-repo.js.map +1 -1
- package/dist/repo/tracked-project-repo.d.ts.map +1 -1
- package/dist/repo/tracked-project-repo.js +15 -1
- package/dist/repo/tracked-project-repo.js.map +1 -1
- package/dist/repo/worker-repo.d.ts +3 -2
- package/dist/repo/worker-repo.d.ts.map +1 -1
- package/dist/repo/worker-repo.js +54 -8
- package/dist/repo/worker-repo.js.map +1 -1
- package/dist/schemas/sync.js +2 -2
- package/dist/schemas/sync.js.map +1 -1
- package/dist/schemas/worker.d.ts +1 -0
- package/dist/schemas/worker.d.ts.map +1 -1
- package/dist/schemas/worker.js +1 -0
- package/dist/schemas/worker.js.map +1 -1
- package/dist/services/agent-service.d.ts +57 -0
- package/dist/services/agent-service.d.ts.map +1 -0
- package/dist/services/agent-service.js +81 -0
- package/dist/services/agent-service.js.map +1 -0
- package/dist/services/anchor-service.js +1 -1
- package/dist/services/anchor-service.js.map +1 -1
- package/dist/services/anchor-verification.d.ts +8 -0
- package/dist/services/anchor-verification.d.ts.map +1 -1
- package/dist/services/anchor-verification.js +237 -37
- package/dist/services/anchor-verification.js.map +1 -1
- package/dist/services/ast-grep-service.d.ts.map +1 -1
- package/dist/services/ast-grep-service.js +93 -22
- package/dist/services/ast-grep-service.js.map +1 -1
- package/dist/services/attempt-service.d.ts.map +1 -1
- package/dist/services/attempt-service.js +1 -4
- package/dist/services/attempt-service.js.map +1 -1
- package/dist/services/auto-sync-service.d.ts +1 -1
- package/dist/services/auto-sync-service.d.ts.map +1 -1
- package/dist/services/auto-sync-service.js +18 -10
- package/dist/services/auto-sync-service.js.map +1 -1
- package/dist/services/claim-service.d.ts +8 -2
- package/dist/services/claim-service.d.ts.map +1 -1
- package/dist/services/claim-service.js +37 -23
- package/dist/services/claim-service.js.map +1 -1
- package/dist/services/compaction-service.d.ts +105 -0
- package/dist/services/compaction-service.d.ts.map +1 -0
- package/dist/services/compaction-service.js +369 -0
- package/dist/services/compaction-service.js.map +1 -0
- package/dist/services/cycle-scan-service.d.ts +32 -0
- package/dist/services/cycle-scan-service.d.ts.map +1 -0
- package/dist/services/cycle-scan-service.js +542 -0
- package/dist/services/cycle-scan-service.js.map +1 -0
- package/dist/services/daemon-service.d.ts +40 -2
- package/dist/services/daemon-service.d.ts.map +1 -1
- package/dist/services/daemon-service.js +199 -52
- package/dist/services/daemon-service.js.map +1 -1
- package/dist/services/deduplication-service.d.ts +8 -4
- package/dist/services/deduplication-service.d.ts.map +1 -1
- package/dist/services/deduplication-service.js +79 -25
- package/dist/services/deduplication-service.js.map +1 -1
- package/dist/services/dep-service.d.ts +2 -2
- package/dist/services/dep-service.d.ts.map +1 -1
- package/dist/services/dep-service.js +9 -5
- package/dist/services/dep-service.js.map +1 -1
- package/dist/services/diversifier-service.d.ts +2 -1
- package/dist/services/diversifier-service.d.ts.map +1 -1
- package/dist/services/diversifier-service.js +37 -43
- package/dist/services/diversifier-service.js.map +1 -1
- package/dist/services/doc-service.d.ts +49 -0
- package/dist/services/doc-service.d.ts.map +1 -0
- package/dist/services/doc-service.js +605 -0
- package/dist/services/doc-service.js.map +1 -0
- package/dist/services/edge-service.js +2 -2
- package/dist/services/edge-service.js.map +1 -1
- package/dist/services/embedding-service.d.ts +66 -2
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +138 -24
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/file-learning-service.d.ts.map +1 -1
- package/dist/services/file-learning-service.js +8 -7
- package/dist/services/file-learning-service.js.map +1 -1
- package/dist/services/file-watcher-service.d.ts.map +1 -1
- package/dist/services/file-watcher-service.js +58 -11
- package/dist/services/file-watcher-service.js.map +1 -1
- package/dist/services/graph-expansion.d.ts +3 -0
- package/dist/services/graph-expansion.d.ts.map +1 -1
- package/dist/services/graph-expansion.js +28 -7
- package/dist/services/graph-expansion.js.map +1 -1
- package/dist/services/hierarchy-service.d.ts +1 -1
- package/dist/services/hierarchy-service.d.ts.map +1 -1
- package/dist/services/hierarchy-service.js +50 -32
- package/dist/services/hierarchy-service.js.map +1 -1
- package/dist/services/index.d.ts +13 -15
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +13 -15
- package/dist/services/index.js.map +1 -1
- package/dist/services/learning-service.d.ts +4 -4
- package/dist/services/learning-service.d.ts.map +1 -1
- package/dist/services/learning-service.js +75 -42
- package/dist/services/learning-service.js.map +1 -1
- package/dist/services/llm-service.d.ts +62 -0
- package/dist/services/llm-service.d.ts.map +1 -0
- package/dist/services/llm-service.js +172 -0
- package/dist/services/llm-service.js.map +1 -0
- package/dist/services/migration-service.d.ts +1 -1
- package/dist/services/migration-service.d.ts.map +1 -1
- package/dist/services/migration-service.js +18 -7
- package/dist/services/migration-service.js.map +1 -1
- package/dist/services/orchestrator-service.d.ts +4 -3
- package/dist/services/orchestrator-service.d.ts.map +1 -1
- package/dist/services/orchestrator-service.js +67 -29
- package/dist/services/orchestrator-service.js.map +1 -1
- package/dist/services/promotion-service.d.ts +1 -1
- package/dist/services/promotion-service.js +1 -1
- package/dist/services/promotion-service.js.map +1 -1
- package/dist/services/query-expansion-service.d.ts +30 -9
- package/dist/services/query-expansion-service.d.ts.map +1 -1
- package/dist/services/query-expansion-service.js +54 -63
- package/dist/services/query-expansion-service.js.map +1 -1
- package/dist/services/ready-service.d.ts +21 -1
- package/dist/services/ready-service.d.ts.map +1 -1
- package/dist/services/ready-service.js +44 -21
- package/dist/services/ready-service.js.map +1 -1
- package/dist/services/retriever-service.d.ts +10 -10
- package/dist/services/retriever-service.d.ts.map +1 -1
- package/dist/services/retriever-service.js +53 -161
- package/dist/services/retriever-service.js.map +1 -1
- package/dist/services/swarm-verification.d.ts +2 -2
- package/dist/services/swarm-verification.d.ts.map +1 -1
- package/dist/services/swarm-verification.js +12 -6
- package/dist/services/swarm-verification.js.map +1 -1
- package/dist/services/sync-service.d.ts +17 -4
- package/dist/services/sync-service.d.ts.map +1 -1
- package/dist/services/sync-service.js +378 -114
- package/dist/services/sync-service.js.map +1 -1
- package/dist/services/task-service.d.ts +6 -4
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +162 -33
- package/dist/services/task-service.js.map +1 -1
- package/dist/services/tracing-service.d.ts +55 -0
- package/dist/services/tracing-service.d.ts.map +1 -0
- package/dist/services/tracing-service.js +99 -0
- package/dist/services/tracing-service.js.map +1 -0
- package/dist/services/transcript-adapter.d.ts +99 -0
- package/dist/services/transcript-adapter.d.ts.map +1 -0
- package/dist/services/transcript-adapter.js +283 -0
- package/dist/services/transcript-adapter.js.map +1 -0
- package/dist/services/validation-service.d.ts +85 -0
- package/dist/services/validation-service.d.ts.map +1 -0
- package/dist/services/validation-service.js +289 -0
- package/dist/services/validation-service.js.map +1 -0
- package/dist/services/worker-process.d.ts +23 -4
- package/dist/services/worker-process.d.ts.map +1 -1
- package/dist/services/worker-process.js +159 -70
- package/dist/services/worker-process.js.map +1 -1
- package/dist/services/worker-service.d.ts.map +1 -1
- package/dist/services/worker-service.js +7 -12
- package/dist/services/worker-service.js.map +1 -1
- package/dist/sync/claude-task-writer.d.ts +49 -0
- package/dist/sync/claude-task-writer.d.ts.map +1 -0
- package/dist/sync/claude-task-writer.js +135 -0
- package/dist/sync/claude-task-writer.js.map +1 -0
- package/dist/utils/doc-hash.d.ts +10 -0
- package/dist/utils/doc-hash.d.ts.map +1 -0
- package/dist/utils/doc-hash.js +14 -0
- package/dist/utils/doc-hash.js.map +1 -0
- package/dist/utils/doc-renderer.d.ts +44 -0
- package/dist/utils/doc-renderer.d.ts.map +1 -0
- package/dist/utils/doc-renderer.js +202 -0
- package/dist/utils/doc-renderer.js.map +1 -0
- package/dist/utils/math.d.ts +5 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +12 -4
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/sql.d.ts +9 -0
- package/dist/utils/sql.d.ts.map +1 -0
- package/dist/utils/sql.js +9 -0
- package/dist/utils/sql.js.map +1 -0
- package/dist/utils/toml-config.d.ts +22 -0
- package/dist/utils/toml-config.d.ts.map +1 -0
- package/dist/utils/toml-config.js +75 -0
- package/dist/utils/toml-config.js.map +1 -0
- package/dist/worker/hooks.d.ts +102 -0
- package/dist/worker/hooks.d.ts.map +1 -0
- package/dist/worker/hooks.js +11 -0
- package/dist/worker/hooks.js.map +1 -0
- package/dist/worker/index.d.ts +9 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +8 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/run-worker.d.ts +33 -0
- package/dist/worker/run-worker.d.ts.map +1 -0
- package/dist/worker/run-worker.js +265 -0
- package/dist/worker/run-worker.js.map +1 -0
- package/package.json +14 -12
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code task directory writer.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions that transform TaskWithDeps[] into Claude Code's
|
|
5
|
+
* on-disk task format (individual JSON files per task).
|
|
6
|
+
*
|
|
7
|
+
* Claude Code stores team tasks at ~/.claude/tasks/{team-name}/
|
|
8
|
+
* with files: {id}.json, .highwatermark, .lock
|
|
9
|
+
*/
|
|
10
|
+
import { Schema } from "effect";
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Types
|
|
13
|
+
// =============================================================================
|
|
14
|
+
const ClaudeTaskStatusSchema = Schema.Literal("pending", "in_progress", "completed");
|
|
15
|
+
/** A single Claude Code task file (written as {id}.json) */
|
|
16
|
+
export const ClaudeTaskFileSchema = Schema.Struct({
|
|
17
|
+
id: Schema.String,
|
|
18
|
+
subject: Schema.String,
|
|
19
|
+
description: Schema.String,
|
|
20
|
+
activeForm: Schema.String,
|
|
21
|
+
status: ClaudeTaskStatusSchema,
|
|
22
|
+
blocks: Schema.Array(Schema.String),
|
|
23
|
+
blockedBy: Schema.Array(Schema.String),
|
|
24
|
+
});
|
|
25
|
+
/** Result of building Claude task files from tx tasks */
|
|
26
|
+
export const ClaudeSyncResultSchema = Schema.Struct({
|
|
27
|
+
files: Schema.Array(ClaudeTaskFileSchema),
|
|
28
|
+
highwatermark: Schema.Number,
|
|
29
|
+
});
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Status Mapping
|
|
32
|
+
// =============================================================================
|
|
33
|
+
function mapStatus(txStatus) {
|
|
34
|
+
switch (txStatus) {
|
|
35
|
+
case "active":
|
|
36
|
+
case "review":
|
|
37
|
+
case "human_needs_to_review":
|
|
38
|
+
return "in_progress";
|
|
39
|
+
default:
|
|
40
|
+
return "pending";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// Description Builder
|
|
45
|
+
// =============================================================================
|
|
46
|
+
function buildClaudeDescription(task, txIdMap) {
|
|
47
|
+
const lines = [];
|
|
48
|
+
if (task.description) {
|
|
49
|
+
lines.push(task.description);
|
|
50
|
+
lines.push("");
|
|
51
|
+
}
|
|
52
|
+
lines.push("---");
|
|
53
|
+
lines.push(`**tx ID**: ${task.id} | **Priority**: ${task.score} | **Status**: ${task.status}`);
|
|
54
|
+
if (task.blockedBy.length > 0) {
|
|
55
|
+
const refs = task.blockedBy.map((id) => {
|
|
56
|
+
const numId = txIdMap.get(id);
|
|
57
|
+
return numId ? `#${numId} (${id})` : `${id}`;
|
|
58
|
+
});
|
|
59
|
+
lines.push(`**Blocked by**: ${refs.join(", ")}`);
|
|
60
|
+
}
|
|
61
|
+
if (task.blocks.length > 0) {
|
|
62
|
+
const refs = task.blocks.map((id) => {
|
|
63
|
+
const numId = txIdMap.get(id);
|
|
64
|
+
return numId ? `#${numId} (${id})` : `${id}`;
|
|
65
|
+
});
|
|
66
|
+
lines.push(`**Blocks**: ${refs.join(", ")}`);
|
|
67
|
+
}
|
|
68
|
+
if (task.parentId) {
|
|
69
|
+
lines.push(`**Parent**: ${task.parentId}`);
|
|
70
|
+
}
|
|
71
|
+
if (task.children.length > 0) {
|
|
72
|
+
lines.push(`**Children**: ${task.children.join(", ")}`);
|
|
73
|
+
}
|
|
74
|
+
lines.push("");
|
|
75
|
+
lines.push(`Run \`tx context ${task.id}\` for relevant learnings before starting.`);
|
|
76
|
+
lines.push(`Run \`tx done ${task.id}\` when complete.`);
|
|
77
|
+
return lines.join("\n");
|
|
78
|
+
}
|
|
79
|
+
// =============================================================================
|
|
80
|
+
// Main Builder
|
|
81
|
+
// =============================================================================
|
|
82
|
+
/**
|
|
83
|
+
* Transform tx tasks into Claude Code task files.
|
|
84
|
+
*
|
|
85
|
+
* - Filters out done tasks
|
|
86
|
+
* - Sorts: ready tasks first (highest score first), then non-ready by score
|
|
87
|
+
* - Assigns sequential numeric IDs
|
|
88
|
+
* - Maps blockedBy/blocks references to numeric IDs
|
|
89
|
+
*/
|
|
90
|
+
export function buildClaudeTaskFiles(tasks) {
|
|
91
|
+
// Filter out done tasks
|
|
92
|
+
const nonDone = tasks.filter(t => t.status !== "done");
|
|
93
|
+
// Sort: ready first (highest score), then non-ready (highest score)
|
|
94
|
+
// Tie-break by tx ID for deterministic ordering across syncs
|
|
95
|
+
const sorted = [...nonDone].sort((a, b) => {
|
|
96
|
+
if (a.isReady !== b.isReady) {
|
|
97
|
+
return a.isReady ? -1 : 1;
|
|
98
|
+
}
|
|
99
|
+
if (a.score !== b.score) {
|
|
100
|
+
return b.score - a.score;
|
|
101
|
+
}
|
|
102
|
+
return a.id.localeCompare(b.id);
|
|
103
|
+
});
|
|
104
|
+
// Build tx ID -> numeric ID mapping
|
|
105
|
+
const txIdMap = new Map();
|
|
106
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
107
|
+
txIdMap.set(sorted[i].id, String(i + 1));
|
|
108
|
+
}
|
|
109
|
+
// Build task files
|
|
110
|
+
const files = sorted.map((task, i) => {
|
|
111
|
+
const numericId = String(i + 1);
|
|
112
|
+
// Map blockedBy/blocks to numeric IDs, filtering out done tasks
|
|
113
|
+
const blockedBy = task.blockedBy
|
|
114
|
+
.map((id) => txIdMap.get(id))
|
|
115
|
+
.filter((id) => id !== undefined);
|
|
116
|
+
const blocks = task.blocks
|
|
117
|
+
.map((id) => txIdMap.get(id))
|
|
118
|
+
.filter((id) => id !== undefined);
|
|
119
|
+
return {
|
|
120
|
+
id: numericId,
|
|
121
|
+
subject: task.title,
|
|
122
|
+
description: buildClaudeDescription(task, txIdMap),
|
|
123
|
+
activeForm: `Working on ${task.id}: ${task.title}`,
|
|
124
|
+
status: mapStatus(task.status),
|
|
125
|
+
blocks,
|
|
126
|
+
blockedBy,
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
files,
|
|
131
|
+
highwatermark: files.length + 1,
|
|
132
|
+
txIdMap,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=claude-task-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-task-writer.js","sourceRoot":"","sources":["../../src/sync/claude-task-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-addressed hashing for docs.
|
|
3
|
+
* SHA256 hex digest of normalized content.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Compute SHA256 hash of document content.
|
|
7
|
+
* Normalizes content by trimming whitespace and normalizing line endings.
|
|
8
|
+
*/
|
|
9
|
+
export declare const computeDocHash: (content: string) => string;
|
|
10
|
+
//# sourceMappingURL=doc-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-hash.d.ts","sourceRoot":"","sources":["../../src/utils/doc-hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAGhD,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-addressed hashing for docs.
|
|
3
|
+
* SHA256 hex digest of normalized content.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
/**
|
|
7
|
+
* Compute SHA256 hash of document content.
|
|
8
|
+
* Normalizes content by trimming whitespace and normalizing line endings.
|
|
9
|
+
*/
|
|
10
|
+
export const computeDocHash = (content) => {
|
|
11
|
+
const normalized = content.trim().replace(/\r\n/g, "\n");
|
|
12
|
+
return createHash("sha256").update(normalized, "utf8").digest("hex");
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=doc-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-hash.js","sourceRoot":"","sources":["../../src/utils/doc-hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACxD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure YML → MD renderer for tx docs.
|
|
3
|
+
*
|
|
4
|
+
* Deterministic output with stable section ordering per doc kind.
|
|
5
|
+
* Free-text sections pass through as-is (already markdown).
|
|
6
|
+
* Structured sections (invariants, failure_modes, edge_cases) render as tables.
|
|
7
|
+
*/
|
|
8
|
+
import type { DocKind } from "@jamesaphoenix/tx-types";
|
|
9
|
+
/** Parsed YAML doc content (loosely typed — sections may or may not exist). */
|
|
10
|
+
type ParsedYaml = Record<string, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* Render a parsed YAML doc to deterministic markdown.
|
|
13
|
+
* Section order is fixed per kind. Missing sections are skipped.
|
|
14
|
+
*/
|
|
15
|
+
export declare const renderDocToMarkdown: (parsed: ParsedYaml, kind: DocKind) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Render index data to markdown.
|
|
18
|
+
*/
|
|
19
|
+
export declare const renderIndexToMarkdown: (indexData: {
|
|
20
|
+
overview?: string;
|
|
21
|
+
prds: Array<{
|
|
22
|
+
name: string;
|
|
23
|
+
title: string;
|
|
24
|
+
status: string;
|
|
25
|
+
}>;
|
|
26
|
+
design_docs: Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
title: string;
|
|
29
|
+
status: string;
|
|
30
|
+
implements?: string;
|
|
31
|
+
}>;
|
|
32
|
+
links: Array<{
|
|
33
|
+
from: string;
|
|
34
|
+
to: string;
|
|
35
|
+
type: string;
|
|
36
|
+
}>;
|
|
37
|
+
invariant_summary?: {
|
|
38
|
+
total: number;
|
|
39
|
+
by_enforcement: Record<string, number>;
|
|
40
|
+
by_subsystem: Record<string, number>;
|
|
41
|
+
};
|
|
42
|
+
}) => string;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=doc-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/doc-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AA4BtD,+EAA+E;AAC/E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAG,MAwBvE,CAAA;AAgJD;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5D,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxF,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,iBAAiB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;CACpH,KAAG,MAgEH,CAAA"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure YML → MD renderer for tx docs.
|
|
3
|
+
*
|
|
4
|
+
* Deterministic output with stable section ordering per doc kind.
|
|
5
|
+
* Free-text sections pass through as-is (already markdown).
|
|
6
|
+
* Structured sections (invariants, failure_modes, edge_cases) render as tables.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Render a parsed YAML doc to deterministic markdown.
|
|
10
|
+
* Section order is fixed per kind. Missing sections are skipped.
|
|
11
|
+
*/
|
|
12
|
+
export const renderDocToMarkdown = (parsed, kind) => {
|
|
13
|
+
const title = parsed.title ?? parsed.name ?? "Untitled";
|
|
14
|
+
const lines = [`# ${title}`, ""];
|
|
15
|
+
// Metadata header
|
|
16
|
+
if (parsed.kind)
|
|
17
|
+
lines.push(`**Kind**: ${parsed.kind}`);
|
|
18
|
+
if (parsed.status)
|
|
19
|
+
lines.push(`**Status**: ${parsed.status}`);
|
|
20
|
+
if (parsed.version)
|
|
21
|
+
lines.push(`**Version**: ${parsed.version}`);
|
|
22
|
+
if (parsed.implements)
|
|
23
|
+
lines.push(`**Implements**: ${parsed.implements}`);
|
|
24
|
+
lines.push("");
|
|
25
|
+
switch (kind) {
|
|
26
|
+
case "overview":
|
|
27
|
+
renderOverview(parsed, lines);
|
|
28
|
+
break;
|
|
29
|
+
case "prd":
|
|
30
|
+
renderPrd(parsed, lines);
|
|
31
|
+
break;
|
|
32
|
+
case "design":
|
|
33
|
+
renderDesign(parsed, lines);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
return lines.join("\n");
|
|
37
|
+
};
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// KIND-SPECIFIC RENDERERS
|
|
40
|
+
// =============================================================================
|
|
41
|
+
const renderOverview = (parsed, lines) => {
|
|
42
|
+
renderFreeTextSection(parsed, lines, "problem_definition", "Problem Definition");
|
|
43
|
+
renderFreeTextSection(parsed, lines, "subsystems", "Subsystems");
|
|
44
|
+
renderFreeTextSection(parsed, lines, "object_model", "Object Model");
|
|
45
|
+
renderFreeTextSection(parsed, lines, "storage_schema", "Storage Schema");
|
|
46
|
+
renderInvariantsTable(parsed.invariants, lines);
|
|
47
|
+
renderFailureModesTable(parsed.failure_modes, lines);
|
|
48
|
+
renderEdgeCasesTable(parsed.edge_cases, lines);
|
|
49
|
+
renderConstraintsList(parsed.constraints, lines);
|
|
50
|
+
renderFreeTextSection(parsed, lines, "cross_cutting", "Cross-Cutting Concerns");
|
|
51
|
+
renderFreeTextSection(parsed, lines, "data_retention", "Data Retention");
|
|
52
|
+
};
|
|
53
|
+
const renderPrd = (parsed, lines) => {
|
|
54
|
+
renderFreeTextSection(parsed, lines, "problem", "Problem");
|
|
55
|
+
renderFreeTextSection(parsed, lines, "solution", "Solution");
|
|
56
|
+
renderStringList(parsed.requirements, lines, "Requirements");
|
|
57
|
+
renderStringList(parsed.acceptance_criteria, lines, "Acceptance Criteria");
|
|
58
|
+
renderStringList(parsed.out_of_scope, lines, "Out of Scope");
|
|
59
|
+
};
|
|
60
|
+
const renderDesign = (parsed, lines) => {
|
|
61
|
+
renderFreeTextSection(parsed, lines, "problem_definition", "Problem Definition");
|
|
62
|
+
renderStringList(parsed.goals, lines, "Goals");
|
|
63
|
+
renderFreeTextSection(parsed, lines, "architecture", "Architecture");
|
|
64
|
+
renderFreeTextSection(parsed, lines, "interfaces", "Interfaces");
|
|
65
|
+
renderFreeTextSection(parsed, lines, "implementation", "Implementation");
|
|
66
|
+
renderFreeTextSection(parsed, lines, "data_model", "Data Model");
|
|
67
|
+
renderInvariantsTable(parsed.invariants, lines);
|
|
68
|
+
renderFailureModesTable(parsed.failure_modes, lines);
|
|
69
|
+
renderEdgeCasesTable(parsed.edge_cases, lines);
|
|
70
|
+
renderWorkBreakdown(parsed.work_breakdown, lines);
|
|
71
|
+
renderFreeTextSection(parsed, lines, "retention", "Retention");
|
|
72
|
+
renderFreeTextSection(parsed, lines, "testing_strategy", "Testing Strategy");
|
|
73
|
+
renderFreeTextSection(parsed, lines, "open_questions", "Open Questions");
|
|
74
|
+
};
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// SECTION RENDERERS
|
|
77
|
+
// =============================================================================
|
|
78
|
+
const renderFreeTextSection = (parsed, lines, key, heading) => {
|
|
79
|
+
const content = parsed[key];
|
|
80
|
+
if (!content || (typeof content === "string" && !content.trim()))
|
|
81
|
+
return;
|
|
82
|
+
lines.push(`## ${heading}`, "");
|
|
83
|
+
lines.push(String(content).trim(), "");
|
|
84
|
+
};
|
|
85
|
+
const renderStringList = (items, lines, heading) => {
|
|
86
|
+
if (!Array.isArray(items) || items.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
lines.push(`## ${heading}`, "");
|
|
89
|
+
for (const item of items) {
|
|
90
|
+
lines.push(`- ${String(item)}`);
|
|
91
|
+
}
|
|
92
|
+
lines.push("");
|
|
93
|
+
};
|
|
94
|
+
const renderConstraintsList = (constraints, lines) => {
|
|
95
|
+
renderStringList(constraints, lines, "Constraints");
|
|
96
|
+
};
|
|
97
|
+
const renderInvariantsTable = (invariants, lines) => {
|
|
98
|
+
if (!Array.isArray(invariants) || invariants.length === 0)
|
|
99
|
+
return;
|
|
100
|
+
lines.push("## Invariants", "");
|
|
101
|
+
lines.push("| ID | Rule | Enforcement | Reference |");
|
|
102
|
+
lines.push("|-----|------|-------------|-----------|");
|
|
103
|
+
for (const inv of invariants) {
|
|
104
|
+
const ref = inv.test_ref ?? inv.lint_rule ?? inv.prompt_ref ?? "-";
|
|
105
|
+
const subsystem = inv.subsystem ? ` (${inv.subsystem})` : "";
|
|
106
|
+
lines.push(`| ${inv.id} | ${inv.rule}${subsystem} | ${inv.enforcement} | ${ref} |`);
|
|
107
|
+
}
|
|
108
|
+
lines.push("");
|
|
109
|
+
};
|
|
110
|
+
const renderFailureModesTable = (failureModes, lines) => {
|
|
111
|
+
if (!Array.isArray(failureModes) || failureModes.length === 0)
|
|
112
|
+
return;
|
|
113
|
+
lines.push("## Failure Modes", "");
|
|
114
|
+
lines.push("| ID | Description | Mitigation |");
|
|
115
|
+
lines.push("|-----|-------------|------------|");
|
|
116
|
+
for (const fm of failureModes) {
|
|
117
|
+
lines.push(`| ${fm.id} | ${fm.description} | ${fm.mitigation ?? "-"} |`);
|
|
118
|
+
}
|
|
119
|
+
lines.push("");
|
|
120
|
+
};
|
|
121
|
+
const renderEdgeCasesTable = (edgeCases, lines) => {
|
|
122
|
+
if (!Array.isArray(edgeCases) || edgeCases.length === 0)
|
|
123
|
+
return;
|
|
124
|
+
lines.push("## Edge Cases", "");
|
|
125
|
+
lines.push("| ID | Description |");
|
|
126
|
+
lines.push("|-----|-------------|");
|
|
127
|
+
for (const ec of edgeCases) {
|
|
128
|
+
lines.push(`| ${ec.id} | ${ec.description} |`);
|
|
129
|
+
}
|
|
130
|
+
lines.push("");
|
|
131
|
+
};
|
|
132
|
+
const renderWorkBreakdown = (items, lines) => {
|
|
133
|
+
if (!Array.isArray(items) || items.length === 0)
|
|
134
|
+
return;
|
|
135
|
+
lines.push("## Work Breakdown", "");
|
|
136
|
+
for (const item of items) {
|
|
137
|
+
const taskRef = item.task_id ? `\`${item.task_id}\` — ` : "";
|
|
138
|
+
lines.push(`- ${taskRef}${item.description}`);
|
|
139
|
+
}
|
|
140
|
+
lines.push("");
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Render index data to markdown.
|
|
144
|
+
*/
|
|
145
|
+
export const renderIndexToMarkdown = (indexData) => {
|
|
146
|
+
const lines = ["# Documentation Index", ""];
|
|
147
|
+
if (indexData.overview) {
|
|
148
|
+
lines.push(`**System Overview**: [${indexData.overview}](${indexData.overview}.md)`, "");
|
|
149
|
+
}
|
|
150
|
+
// PRDs table
|
|
151
|
+
if (indexData.prds.length > 0) {
|
|
152
|
+
lines.push("## Product Requirements Documents", "");
|
|
153
|
+
lines.push("| Name | Title | Status |");
|
|
154
|
+
lines.push("|------|-------|--------|");
|
|
155
|
+
for (const prd of indexData.prds) {
|
|
156
|
+
lines.push(`| [${prd.name}](prd/${prd.name}.md) | ${prd.title} | ${prd.status} |`);
|
|
157
|
+
}
|
|
158
|
+
lines.push("");
|
|
159
|
+
}
|
|
160
|
+
// Design docs table
|
|
161
|
+
if (indexData.design_docs.length > 0) {
|
|
162
|
+
lines.push("## Design Documents", "");
|
|
163
|
+
lines.push("| Name | Title | Implements | Status |");
|
|
164
|
+
lines.push("|------|-------|------------|--------|");
|
|
165
|
+
for (const dd of indexData.design_docs) {
|
|
166
|
+
lines.push(`| [${dd.name}](design/${dd.name}.md) | ${dd.title} | ${dd.implements ?? "-"} | ${dd.status} |`);
|
|
167
|
+
}
|
|
168
|
+
lines.push("");
|
|
169
|
+
}
|
|
170
|
+
// Invariant summary
|
|
171
|
+
if (indexData.invariant_summary && indexData.invariant_summary.total > 0) {
|
|
172
|
+
const s = indexData.invariant_summary;
|
|
173
|
+
lines.push("## Invariant Summary", "");
|
|
174
|
+
lines.push(`**Total invariants**: ${s.total}`, "");
|
|
175
|
+
if (Object.keys(s.by_enforcement).length > 0) {
|
|
176
|
+
lines.push("**By enforcement type**:", "");
|
|
177
|
+
for (const [type, count] of Object.entries(s.by_enforcement)) {
|
|
178
|
+
lines.push(`- ${type}: ${count}`);
|
|
179
|
+
}
|
|
180
|
+
lines.push("");
|
|
181
|
+
}
|
|
182
|
+
if (Object.keys(s.by_subsystem).length > 0) {
|
|
183
|
+
lines.push("**By subsystem**:", "");
|
|
184
|
+
for (const [subsystem, count] of Object.entries(s.by_subsystem)) {
|
|
185
|
+
lines.push(`- ${subsystem}: ${count}`);
|
|
186
|
+
}
|
|
187
|
+
lines.push("");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Links
|
|
191
|
+
if (indexData.links.length > 0) {
|
|
192
|
+
lines.push("## Document Links", "");
|
|
193
|
+
lines.push("| From | To | Type |");
|
|
194
|
+
lines.push("|------|-----|------|");
|
|
195
|
+
for (const link of indexData.links) {
|
|
196
|
+
lines.push(`| ${link.from} | ${link.to} | ${link.type} |`);
|
|
197
|
+
}
|
|
198
|
+
lines.push("");
|
|
199
|
+
}
|
|
200
|
+
return lines.join("\n");
|
|
201
|
+
};
|
|
202
|
+
//# sourceMappingURL=doc-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-renderer.js","sourceRoot":"","sources":["../../src/utils/doc-renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/math.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { EmbeddingDimensionMismatchError } from "../errors.js";
|
|
1
3
|
/**
|
|
2
4
|
* Calculate cosine similarity between two vectors.
|
|
3
5
|
* Returns a value between -1 and 1, where 1 means identical direction.
|
|
6
|
+
*
|
|
7
|
+
* @returns Effect that fails with EmbeddingDimensionMismatchError if vectors have different dimensions
|
|
4
8
|
*/
|
|
5
|
-
export declare const cosineSimilarity: (a: Float32Array, b: Float32Array) => number
|
|
9
|
+
export declare const cosineSimilarity: (a: Float32Array, b: Float32Array) => Effect.Effect<number, EmbeddingDimensionMismatchError>;
|
|
6
10
|
//# sourceMappingURL=math.d.ts.map
|
package/dist/utils/math.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAA;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAC3B,GAAG,YAAY,EACf,GAAG,YAAY,KACd,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAwBvD,CAAA"}
|
package/dist/utils/math.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { EmbeddingDimensionMismatchError } from "../errors.js";
|
|
1
3
|
/**
|
|
2
4
|
* Calculate cosine similarity between two vectors.
|
|
3
5
|
* Returns a value between -1 and 1, where 1 means identical direction.
|
|
6
|
+
*
|
|
7
|
+
* @returns Effect that fails with EmbeddingDimensionMismatchError if vectors have different dimensions
|
|
4
8
|
*/
|
|
5
9
|
export const cosineSimilarity = (a, b) => {
|
|
6
|
-
if (a.length !== b.length)
|
|
7
|
-
return
|
|
10
|
+
if (a.length !== b.length) {
|
|
11
|
+
return Effect.fail(new EmbeddingDimensionMismatchError({
|
|
12
|
+
queryDimensions: a.length,
|
|
13
|
+
documentDimensions: b.length
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
8
16
|
let dotProduct = 0;
|
|
9
17
|
let normA = 0;
|
|
10
18
|
let normB = 0;
|
|
@@ -15,7 +23,7 @@ export const cosineSimilarity = (a, b) => {
|
|
|
15
23
|
}
|
|
16
24
|
const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
|
|
17
25
|
if (magnitude === 0)
|
|
18
|
-
return 0;
|
|
19
|
-
return dotProduct / magnitude;
|
|
26
|
+
return Effect.succeed(0);
|
|
27
|
+
return Effect.succeed(dotProduct / magnitude);
|
|
20
28
|
};
|
|
21
29
|
//# sourceMappingURL=math.js.map
|
package/dist/utils/math.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAA;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,CAAe,EACf,CAAe,EACyC,EAAE;IAC1D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,+BAA+B,CAAC;YAClC,eAAe,EAAE,CAAC,CAAC,MAAM;YACzB,kBAAkB,EAAE,CAAC,CAAC,MAAM;SAC7B,CAAC,CACH,CAAA;IACH,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QAC3B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QACtB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAE7C,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;AAC/C,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Escape LIKE special characters so user input is treated as literal text. */
|
|
2
|
+
export declare const escapeLikePattern: (input: string) => string;
|
|
3
|
+
/**
|
|
4
|
+
* Default row limit for unbounded SELECT queries (findAll / getAll).
|
|
5
|
+
* Prevents accidental memory blowup when tables grow large.
|
|
6
|
+
* Callers that genuinely need more rows should pass an explicit limit.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_QUERY_LIMIT = 1000;
|
|
9
|
+
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/utils/sql.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MACsB,CAAA;AAExE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,OAAO,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Escape LIKE special characters so user input is treated as literal text. */
|
|
2
|
+
export const escapeLikePattern = (input) => input.replace(/\\/g, "\\\\").replace(/%/g, "\\%").replace(/_/g, "\\_");
|
|
3
|
+
/**
|
|
4
|
+
* Default row limit for unbounded SELECT queries (findAll / getAll).
|
|
5
|
+
* Prevents accidental memory blowup when tables grow large.
|
|
6
|
+
* Callers that genuinely need more rows should pass an explicit limit.
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_QUERY_LIMIT = 1000;
|
|
9
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/utils/sql.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAU,EAAE,CACzD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAExE;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read tx configuration from .tx/config.toml.
|
|
3
|
+
* Returns defaults if file doesn't exist.
|
|
4
|
+
*/
|
|
5
|
+
export type TxDocsConfig = {
|
|
6
|
+
readonly path: string;
|
|
7
|
+
};
|
|
8
|
+
export type TxCyclesConfig = {
|
|
9
|
+
readonly scanPrompt: string | null;
|
|
10
|
+
readonly agents: number;
|
|
11
|
+
readonly model: string;
|
|
12
|
+
};
|
|
13
|
+
export type TxConfig = {
|
|
14
|
+
readonly docs: TxDocsConfig;
|
|
15
|
+
readonly cycles: TxCyclesConfig;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Read .tx/config.toml and return parsed config.
|
|
19
|
+
* Falls back to defaults if file doesn't exist or is invalid.
|
|
20
|
+
*/
|
|
21
|
+
export declare const readTxConfig: (cwd?: string) => TxConfig;
|
|
22
|
+
//# sourceMappingURL=toml-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toml-config.d.ts","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAChC,CAAA;AAOD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,MAAK,MAAsB,KAAG,QA8B1D,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read tx configuration from .tx/config.toml.
|
|
3
|
+
* Returns defaults if file doesn't exist.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
docs: { path: ".tx/docs" },
|
|
9
|
+
cycles: { scanPrompt: null, agents: 3, model: "claude-opus-4-6" },
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Read .tx/config.toml and return parsed config.
|
|
13
|
+
* Falls back to defaults if file doesn't exist or is invalid.
|
|
14
|
+
*/
|
|
15
|
+
export const readTxConfig = (cwd = process.cwd()) => {
|
|
16
|
+
const configPath = resolve(cwd, ".tx", "config.toml");
|
|
17
|
+
if (!existsSync(configPath)) {
|
|
18
|
+
return DEFAULT_CONFIG;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const raw = readFileSync(configPath, "utf8");
|
|
22
|
+
// Lightweight TOML parsing for our simple config structure.
|
|
23
|
+
// We only support [docs] section with path key.
|
|
24
|
+
const docsPath = extractTomlValue(raw, "docs", "path");
|
|
25
|
+
const cyclesScanPrompt = extractTomlValue(raw, "cycles", "scan_prompt");
|
|
26
|
+
const cyclesAgents = extractTomlValue(raw, "cycles", "agents");
|
|
27
|
+
const cyclesModel = extractTomlValue(raw, "cycles", "model");
|
|
28
|
+
return {
|
|
29
|
+
docs: {
|
|
30
|
+
path: docsPath ?? DEFAULT_CONFIG.docs.path,
|
|
31
|
+
},
|
|
32
|
+
cycles: {
|
|
33
|
+
scanPrompt: cyclesScanPrompt ?? DEFAULT_CONFIG.cycles.scanPrompt,
|
|
34
|
+
agents: cyclesAgents ? parseInt(cyclesAgents, 10) : DEFAULT_CONFIG.cycles.agents,
|
|
35
|
+
model: cyclesModel ?? DEFAULT_CONFIG.cycles.model,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return DEFAULT_CONFIG;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Extract a value from a simple TOML file.
|
|
45
|
+
* Handles [section] + key = "value" patterns.
|
|
46
|
+
*/
|
|
47
|
+
const extractTomlValue = (toml, section, key) => {
|
|
48
|
+
const lines = toml.split("\n");
|
|
49
|
+
let inSection = false;
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
const trimmed = line.trim();
|
|
52
|
+
// Check for section header
|
|
53
|
+
if (trimmed === `[${section}]`) {
|
|
54
|
+
inSection = true;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// New section starts — stop looking
|
|
58
|
+
if (trimmed.startsWith("[") && inSection) {
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
// Look for key = "value", key = 'value', or key = unquoted
|
|
62
|
+
if (inSection) {
|
|
63
|
+
const quoted = trimmed.match(new RegExp(`^${key}\\s*=\\s*["'](.+?)["']$`));
|
|
64
|
+
if (quoted) {
|
|
65
|
+
return quoted[1];
|
|
66
|
+
}
|
|
67
|
+
const unquoted = trimmed.match(new RegExp(`^${key}\\s*=\\s*([^#\\s]+)`));
|
|
68
|
+
if (unquoted) {
|
|
69
|
+
return unquoted[1];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=toml-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toml-config.js","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"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"}
|