@rryando/arcs 3.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.
- package/README.md +448 -0
- package/dist/cli/arcs-orchestrate-caveman.d.ts +16 -0
- package/dist/cli/arcs-orchestrate-caveman.d.ts.map +1 -0
- package/dist/cli/arcs-orchestrate-caveman.js +109 -0
- package/dist/cli/arcs-orchestrate-caveman.js.map +1 -0
- package/dist/cli/arcs-orchestrate.d.ts +2 -0
- package/dist/cli/arcs-orchestrate.d.ts.map +1 -0
- package/dist/cli/arcs-orchestrate.js +431 -0
- package/dist/cli/arcs-orchestrate.js.map +1 -0
- package/dist/cli/arg-parser.d.ts +20 -0
- package/dist/cli/arg-parser.d.ts.map +1 -0
- package/dist/cli/arg-parser.js +216 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/brief-renderer.d.ts +32 -0
- package/dist/cli/brief-renderer.d.ts.map +1 -0
- package/dist/cli/brief-renderer.js +67 -0
- package/dist/cli/brief-renderer.js.map +1 -0
- package/dist/cli/bundle-installer.d.ts +77 -0
- package/dist/cli/bundle-installer.d.ts.map +1 -0
- package/dist/cli/bundle-installer.js +328 -0
- package/dist/cli/bundle-installer.js.map +1 -0
- package/dist/cli/command-registry.d.ts +52 -0
- package/dist/cli/command-registry.d.ts.map +1 -0
- package/dist/cli/command-registry.js +68 -0
- package/dist/cli/command-registry.js.map +1 -0
- package/dist/cli/commands/batch.d.ts +2 -0
- package/dist/cli/commands/batch.d.ts.map +1 -0
- package/dist/cli/commands/batch.js +307 -0
- package/dist/cli/commands/batch.js.map +1 -0
- package/dist/cli/commands/brief.d.ts +2 -0
- package/dist/cli/commands/brief.d.ts.map +1 -0
- package/dist/cli/commands/brief.js +146 -0
- package/dist/cli/commands/brief.js.map +1 -0
- package/dist/cli/commands/bundle.d.ts +2 -0
- package/dist/cli/commands/bundle.d.ts.map +1 -0
- package/dist/cli/commands/bundle.js +90 -0
- package/dist/cli/commands/bundle.js.map +1 -0
- package/dist/cli/commands/dependency.d.ts +2 -0
- package/dist/cli/commands/dependency.d.ts.map +1 -0
- package/dist/cli/commands/dependency.js +260 -0
- package/dist/cli/commands/dependency.js.map +1 -0
- package/dist/cli/commands/diagnostics.d.ts +2 -0
- package/dist/cli/commands/diagnostics.d.ts.map +1 -0
- package/dist/cli/commands/diagnostics.js +91 -0
- package/dist/cli/commands/diagnostics.js.map +1 -0
- package/dist/cli/commands/diagram.d.ts +2 -0
- package/dist/cli/commands/diagram.d.ts.map +1 -0
- package/dist/cli/commands/diagram.js +305 -0
- package/dist/cli/commands/diagram.js.map +1 -0
- package/dist/cli/commands/done.d.ts +2 -0
- package/dist/cli/commands/done.d.ts.map +1 -0
- package/dist/cli/commands/done.js +140 -0
- package/dist/cli/commands/done.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +2 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +105 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/index.d.ts +21 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +22 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/knowledge-search.d.ts +2 -0
- package/dist/cli/commands/knowledge-search.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-search.js +43 -0
- package/dist/cli/commands/knowledge-search.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +2 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +416 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/loop.d.ts +2 -0
- package/dist/cli/commands/loop.d.ts.map +1 -0
- package/dist/cli/commands/loop.js +192 -0
- package/dist/cli/commands/loop.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +2 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +231 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/next.d.ts +2 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +116 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +340 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/project-updates.d.ts +2 -0
- package/dist/cli/commands/project-updates.d.ts.map +1 -0
- package/dist/cli/commands/project-updates.js +243 -0
- package/dist/cli/commands/project-updates.js.map +1 -0
- package/dist/cli/commands/project.d.ts +2 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +362 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/remember.d.ts +2 -0
- package/dist/cli/commands/remember.d.ts.map +1 -0
- package/dist/cli/commands/remember.js +70 -0
- package/dist/cli/commands/remember.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +104 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/task.d.ts +6 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +361 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/utility.d.ts +9 -0
- package/dist/cli/commands/utility.d.ts.map +1 -0
- package/dist/cli/commands/utility.js +302 -0
- package/dist/cli/commands/utility.js.map +1 -0
- package/dist/cli/config.d.ts +42 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +134 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dag-commands.d.ts +7 -0
- package/dist/cli/dag-commands.d.ts.map +1 -0
- package/dist/cli/dag-commands.js +152 -0
- package/dist/cli/dag-commands.js.map +1 -0
- package/dist/cli/diagram-renderer.d.ts +26 -0
- package/dist/cli/diagram-renderer.d.ts.map +1 -0
- package/dist/cli/diagram-renderer.js +118 -0
- package/dist/cli/diagram-renderer.js.map +1 -0
- package/dist/cli/help-generator.d.ts +21 -0
- package/dist/cli/help-generator.d.ts.map +1 -0
- package/dist/cli/help-generator.js +100 -0
- package/dist/cli/help-generator.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +95 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/instructions.d.ts +53 -0
- package/dist/cli/instructions.d.ts.map +1 -0
- package/dist/cli/instructions.js +219 -0
- package/dist/cli/instructions.js.map +1 -0
- package/dist/cli/lean-output.d.ts +15 -0
- package/dist/cli/lean-output.d.ts.map +1 -0
- package/dist/cli/lean-output.js +66 -0
- package/dist/cli/lean-output.js.map +1 -0
- package/dist/cli/md-renderer.d.ts +6 -0
- package/dist/cli/md-renderer.d.ts.map +1 -0
- package/dist/cli/md-renderer.js +396 -0
- package/dist/cli/md-renderer.js.map +1 -0
- package/dist/cli/output-envelope.d.ts +15 -0
- package/dist/cli/output-envelope.d.ts.map +1 -0
- package/dist/cli/output-envelope.js +61 -0
- package/dist/cli/output-envelope.js.map +1 -0
- package/dist/cli/setup.d.ts +11 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +415 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/status-dashboard.d.ts +5 -0
- package/dist/cli/status-dashboard.d.ts.map +1 -0
- package/dist/cli/status-dashboard.js +248 -0
- package/dist/cli/status-dashboard.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/retrieval/bm25.d.ts +23 -0
- package/dist/retrieval/bm25.d.ts.map +1 -0
- package/dist/retrieval/bm25.js +92 -0
- package/dist/retrieval/bm25.js.map +1 -0
- package/dist/retrieval/cross-project-search.d.ts +30 -0
- package/dist/retrieval/cross-project-search.d.ts.map +1 -0
- package/dist/retrieval/cross-project-search.js +109 -0
- package/dist/retrieval/cross-project-search.js.map +1 -0
- package/dist/retrieval/graph-builder.d.ts +6 -0
- package/dist/retrieval/graph-builder.d.ts.map +1 -0
- package/dist/retrieval/graph-builder.js +196 -0
- package/dist/retrieval/graph-builder.js.map +1 -0
- package/dist/retrieval/graph-cache.d.ts +15 -0
- package/dist/retrieval/graph-cache.d.ts.map +1 -0
- package/dist/retrieval/graph-cache.js +66 -0
- package/dist/retrieval/graph-cache.js.map +1 -0
- package/dist/retrieval/graph-invalidate.d.ts +18 -0
- package/dist/retrieval/graph-invalidate.d.ts.map +1 -0
- package/dist/retrieval/graph-invalidate.js +23 -0
- package/dist/retrieval/graph-invalidate.js.map +1 -0
- package/dist/retrieval/graph-retrieval.d.ts +24 -0
- package/dist/retrieval/graph-retrieval.d.ts.map +1 -0
- package/dist/retrieval/graph-retrieval.js +165 -0
- package/dist/retrieval/graph-retrieval.js.map +1 -0
- package/dist/retrieval/graph-traverse.d.ts +3 -0
- package/dist/retrieval/graph-traverse.d.ts.map +1 -0
- package/dist/retrieval/graph-traverse.js +53 -0
- package/dist/retrieval/graph-traverse.js.map +1 -0
- package/dist/retrieval/graph-types.d.ts +37 -0
- package/dist/retrieval/graph-types.d.ts.map +1 -0
- package/dist/retrieval/graph-types.js +12 -0
- package/dist/retrieval/graph-types.js.map +1 -0
- package/dist/retrieval/index-builder.d.ts +21 -0
- package/dist/retrieval/index-builder.d.ts.map +1 -0
- package/dist/retrieval/index-builder.js +94 -0
- package/dist/retrieval/index-builder.js.map +1 -0
- package/dist/retrieval/knowledge-selection.d.ts +7 -0
- package/dist/retrieval/knowledge-selection.d.ts.map +1 -0
- package/dist/retrieval/knowledge-selection.js +80 -0
- package/dist/retrieval/knowledge-selection.js.map +1 -0
- package/dist/retrieval/task-scoped.d.ts +23 -0
- package/dist/retrieval/task-scoped.d.ts.map +1 -0
- package/dist/retrieval/task-scoped.js +51 -0
- package/dist/retrieval/task-scoped.js.map +1 -0
- package/dist/utils/content-assembly.d.ts +44 -0
- package/dist/utils/content-assembly.d.ts.map +1 -0
- package/dist/utils/content-assembly.js +101 -0
- package/dist/utils/content-assembly.js.map +1 -0
- package/dist/utils/dag.d.ts +28 -0
- package/dist/utils/dag.d.ts.map +1 -0
- package/dist/utils/dag.js +68 -0
- package/dist/utils/dag.js.map +1 -0
- package/dist/utils/diagram-generator.d.ts +17 -0
- package/dist/utils/diagram-generator.d.ts.map +1 -0
- package/dist/utils/diagram-generator.js +38 -0
- package/dist/utils/diagram-generator.js.map +1 -0
- package/dist/utils/errors.d.ts +40 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +83 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/file-lock.d.ts +13 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +80 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/git.d.ts +14 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +56 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/graphify-knowledge.d.ts +6 -0
- package/dist/utils/graphify-knowledge.d.ts.map +1 -0
- package/dist/utils/graphify-knowledge.js +60 -0
- package/dist/utils/graphify-knowledge.js.map +1 -0
- package/dist/utils/graphify.d.ts +49 -0
- package/dist/utils/graphify.d.ts.map +1 -0
- package/dist/utils/graphify.js +306 -0
- package/dist/utils/graphify.js.map +1 -0
- package/dist/utils/json-schemas.d.ts +723 -0
- package/dist/utils/json-schemas.d.ts.map +1 -0
- package/dist/utils/json-schemas.js +147 -0
- package/dist/utils/json-schemas.js.map +1 -0
- package/dist/utils/json.d.ts +15 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +39 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/knowledge-store.d.ts +49 -0
- package/dist/utils/knowledge-store.d.ts.map +1 -0
- package/dist/utils/knowledge-store.js +191 -0
- package/dist/utils/knowledge-store.js.map +1 -0
- package/dist/utils/loop-state.d.ts +51 -0
- package/dist/utils/loop-state.d.ts.map +1 -0
- package/dist/utils/loop-state.js +123 -0
- package/dist/utils/loop-state.js.map +1 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +66 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/plan-store.d.ts +46 -0
- package/dist/utils/plan-store.d.ts.map +1 -0
- package/dist/utils/plan-store.js +184 -0
- package/dist/utils/plan-store.js.map +1 -0
- package/dist/utils/project-documents.d.ts +20 -0
- package/dist/utils/project-documents.d.ts.map +1 -0
- package/dist/utils/project-documents.js +10 -0
- package/dist/utils/project-documents.js.map +1 -0
- package/dist/utils/project-memory.d.ts +16 -0
- package/dist/utils/project-memory.d.ts.map +1 -0
- package/dist/utils/project-memory.js +16 -0
- package/dist/utils/project-memory.js.map +1 -0
- package/dist/utils/project-resolver.d.ts +28 -0
- package/dist/utils/project-resolver.d.ts.map +1 -0
- package/dist/utils/project-resolver.js +119 -0
- package/dist/utils/project-resolver.js.map +1 -0
- package/dist/utils/quick-scan.d.ts +13 -0
- package/dist/utils/quick-scan.d.ts.map +1 -0
- package/dist/utils/quick-scan.js +156 -0
- package/dist/utils/quick-scan.js.map +1 -0
- package/dist/utils/schemas.d.ts +13 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +6 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/slug.d.ts +10 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +18 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/stdin.d.ts +6 -0
- package/dist/utils/stdin.d.ts.map +1 -0
- package/dist/utils/stdin.js +25 -0
- package/dist/utils/stdin.js.map +1 -0
- package/dist/utils/storage-utils.d.ts +48 -0
- package/dist/utils/storage-utils.d.ts.map +1 -0
- package/dist/utils/storage-utils.js +175 -0
- package/dist/utils/storage-utils.js.map +1 -0
- package/dist/utils/task-store.d.ts +49 -0
- package/dist/utils/task-store.d.ts.map +1 -0
- package/dist/utils/task-store.js +178 -0
- package/dist/utils/task-store.js.map +1 -0
- package/dist/utils/template.d.ts +15 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +27 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/tool-response.d.ts +37 -0
- package/dist/utils/tool-response.d.ts.map +1 -0
- package/dist/utils/tool-response.js +44 -0
- package/dist/utils/tool-response.js.map +1 -0
- package/dist/utils/workflow-policy.d.ts +50 -0
- package/dist/utils/workflow-policy.d.ts.map +1 -0
- package/dist/utils/workflow-policy.js +111 -0
- package/dist/utils/workflow-policy.js.map +1 -0
- package/dist/utils/workspace-match.d.ts +35 -0
- package/dist/utils/workspace-match.d.ts.map +1 -0
- package/dist/utils/workspace-match.js +58 -0
- package/dist/utils/workspace-match.js.map +1 -0
- package/opencode/arcs/.opencode/plugins/arcs.js +348 -0
- package/opencode/arcs/bundle-runtime.json +68 -0
- package/opencode/arcs/manifest.json +279 -0
- package/opencode/arcs/prompts/arcs-docs.txt +124 -0
- package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +529 -0
- package/opencode/arcs/prompts/arcs-orchestrate.txt +437 -0
- package/opencode/arcs/prompts/code-reviewer.txt +55 -0
- package/opencode/arcs/prompts/devil-advocate.txt +121 -0
- package/opencode/arcs/prompts/docs-researcher.txt +54 -0
- package/opencode/arcs/prompts/oncall-ops.txt +54 -0
- package/opencode/arcs/prompts/qa-analyst.txt +54 -0
- package/opencode/arcs/prompts/software-engineer.txt +48 -0
- package/opencode/arcs/prompts/system-architect.txt +60 -0
- package/opencode/arcs/prompts/tech-architect.txt +54 -0
- package/opencode/arcs/skills/brainstorming/SKILL.md +144 -0
- package/opencode/arcs/skills/brainstorming/scripts/frame-template.html +214 -0
- package/opencode/arcs/skills/brainstorming/scripts/helper.js +88 -0
- package/opencode/arcs/skills/brainstorming/scripts/server.js +338 -0
- package/opencode/arcs/skills/brainstorming/scripts/start-server.sh +137 -0
- package/opencode/arcs/skills/brainstorming/scripts/stop-server.sh +31 -0
- package/opencode/arcs/skills/brainstorming/spec-document-reviewer-prompt.md +50 -0
- package/opencode/arcs/skills/brainstorming/visual-companion.md +277 -0
- package/opencode/arcs/skills/caveman-commit/SKILL.md +51 -0
- package/opencode/arcs/skills/code-agent/SKILL.md +58 -0
- package/opencode/arcs/skills/deep-pr-review/SKILL.md +191 -0
- package/opencode/arcs/skills/deep-pr-review/graphify-diff.md +102 -0
- package/opencode/arcs/skills/deep-pr-review/review-template.md +69 -0
- package/opencode/arcs/skills/executing-plans/SKILL.md +91 -0
- package/opencode/arcs/skills/init-project/SKILL.md +150 -0
- package/opencode/arcs/skills/quick-dev/SKILL.md +47 -0
- package/opencode/arcs/skills/requesting-code-review/SKILL.md +47 -0
- package/opencode/arcs/skills/requesting-code-review/code-reviewer.md +179 -0
- package/opencode/arcs/skills/subagent-driven-development/SKILL.md +162 -0
- package/opencode/arcs/skills/subagent-driven-development/code-quality-reviewer-prompt.md +53 -0
- package/opencode/arcs/skills/subagent-driven-development/implementer-prompt.md +148 -0
- package/opencode/arcs/skills/subagent-driven-development/spec-reviewer-prompt.md +85 -0
- package/opencode/arcs/skills/systematic-debugging/SKILL.md +174 -0
- package/opencode/arcs/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/opencode/arcs/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/opencode/arcs/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/opencode/arcs/skills/systematic-debugging/find-polluter.sh +63 -0
- package/opencode/arcs/skills/systematic-debugging/phases-reference.md +168 -0
- package/opencode/arcs/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/opencode/arcs/skills/test-driven-development/SKILL.md +72 -0
- package/opencode/arcs/skills/test-driven-development/tdd-rationalizations-and-examples.md +157 -0
- package/opencode/arcs/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/opencode/arcs/skills/to-diagram/SKILL.md +235 -0
- package/opencode/arcs/skills/to-diagram/scripts/manage-diagram.mjs +963 -0
- package/opencode/arcs/skills/writing-plans/SKILL.md +179 -0
- package/opencode/arcs/skills/writing-plans/plan-document-reviewer-prompt.md +52 -0
- package/package.json +60 -0
- package/scripts/arcs-cli.mjs +45 -0
- package/skills/explore-dag.md +57 -0
- package/skills/init-project.md +105 -0
- package/skills/orchestrate.md +94 -0
- package/skills/update-docs.md +72 -0
- package/templates/dependency.md.tmpl +9 -0
- package/templates/knowledge.md.tmpl +15 -0
- package/templates/project-meta.json.tmpl +13 -0
- package/templates/project.md.tmpl +11 -0
- package/templates/task.md.tmpl +9 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for JSON file shapes used at file-read boundaries.
|
|
3
|
+
* Kept separate from schemas.ts (which holds tool-input schemas).
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// package.json (only fields ARCS reads)
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export const packageJsonSchema = z.object({
|
|
10
|
+
name: z.string().optional(),
|
|
11
|
+
version: z.string(),
|
|
12
|
+
});
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// ~/.arcs/config.json
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
export const cliConfigSchema = z.object({
|
|
17
|
+
version: z.literal("1"),
|
|
18
|
+
ides: z.array(z.string()),
|
|
19
|
+
});
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// DAG root meta.json
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
export const dagNodeSchema = z.object({
|
|
24
|
+
id: z.string(),
|
|
25
|
+
name: z.string(),
|
|
26
|
+
status: z.string(),
|
|
27
|
+
dependsOn: z.array(z.string()),
|
|
28
|
+
});
|
|
29
|
+
export const rootMetaSchema = z.object({
|
|
30
|
+
version: z.string(),
|
|
31
|
+
projects: z.array(dagNodeSchema),
|
|
32
|
+
});
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Per-project meta.json
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
export const syncStatsSchema = z.object({
|
|
37
|
+
docsUpdated: z.number().int().min(0),
|
|
38
|
+
knowledgeEntriesCreated: z.number().int().min(0),
|
|
39
|
+
knowledgeEntriesUpdated: z.number().int().min(0),
|
|
40
|
+
tasksTransitioned: z.number().int().min(0),
|
|
41
|
+
plansUpdated: z.number().int().min(0),
|
|
42
|
+
diagramsDrifted: z.number().int().min(0),
|
|
43
|
+
});
|
|
44
|
+
export const projectMetaSchema = z
|
|
45
|
+
.object({
|
|
46
|
+
id: z.string(),
|
|
47
|
+
name: z.string(),
|
|
48
|
+
description: z.string(),
|
|
49
|
+
status: z.string().optional(),
|
|
50
|
+
repoUrl: z.string().optional(),
|
|
51
|
+
createdAt: z.string(),
|
|
52
|
+
workspacePaths: z.array(z.string()).optional().default([]),
|
|
53
|
+
lastSyncedAt: z.string().datetime().optional(),
|
|
54
|
+
lastSyncGitCommit: z.string().optional(),
|
|
55
|
+
lastSyncStats: syncStatsSchema.optional(),
|
|
56
|
+
})
|
|
57
|
+
.passthrough();
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// plans/index.json, knowledge/index.json, tasks/index.json
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
const fileRefSchemaLocal = z.object({
|
|
62
|
+
path: z.string(),
|
|
63
|
+
anchor: z.string().optional(),
|
|
64
|
+
});
|
|
65
|
+
export const planMetaSchema = z.object({
|
|
66
|
+
id: z.string(),
|
|
67
|
+
normalizedId: z.string(),
|
|
68
|
+
title: z.string(),
|
|
69
|
+
status: z.string(),
|
|
70
|
+
keywords: z.array(z.string()),
|
|
71
|
+
summary: z.string(),
|
|
72
|
+
sourceFiles: z.array(fileRefSchemaLocal).optional(),
|
|
73
|
+
file: z.string(),
|
|
74
|
+
createdAt: z.string(),
|
|
75
|
+
updatedAt: z.string(),
|
|
76
|
+
});
|
|
77
|
+
export const planIndexSchema = z.object({
|
|
78
|
+
plans: z.array(planMetaSchema),
|
|
79
|
+
});
|
|
80
|
+
export const knowledgeMetaSchema = z.object({
|
|
81
|
+
id: z.string(),
|
|
82
|
+
normalizedId: z.string(),
|
|
83
|
+
title: z.string(),
|
|
84
|
+
kind: z.string(),
|
|
85
|
+
audience: z.string().optional(),
|
|
86
|
+
keywords: z.array(z.string()),
|
|
87
|
+
summary: z.string(),
|
|
88
|
+
sourceFiles: z.array(fileRefSchemaLocal).optional(),
|
|
89
|
+
file: z.string(),
|
|
90
|
+
createdAt: z.string(),
|
|
91
|
+
updatedAt: z.string(),
|
|
92
|
+
});
|
|
93
|
+
export const knowledgeIndexSchema = z.object({
|
|
94
|
+
entries: z.array(knowledgeMetaSchema),
|
|
95
|
+
});
|
|
96
|
+
export const taskMetaSchema = z.object({
|
|
97
|
+
id: z.string(),
|
|
98
|
+
normalizedId: z.string(),
|
|
99
|
+
title: z.string(),
|
|
100
|
+
status: z.string(),
|
|
101
|
+
priority: z.string(),
|
|
102
|
+
sourceFiles: z.array(fileRefSchemaLocal).optional(),
|
|
103
|
+
createdAt: z.string(),
|
|
104
|
+
updatedAt: z.string(),
|
|
105
|
+
});
|
|
106
|
+
export const taskIndexSchema = z.object({
|
|
107
|
+
tasks: z.array(taskMetaSchema),
|
|
108
|
+
});
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// OpenCode ARCS bundle manifest (source bundle)
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
const configMergeSchema = z.object({
|
|
113
|
+
path: z.array(z.string()),
|
|
114
|
+
value: z.unknown().transform((v) => v),
|
|
115
|
+
});
|
|
116
|
+
export const opencodeSourceManifestSchema = z.object({
|
|
117
|
+
bundleId: z.string(),
|
|
118
|
+
installMode: z.string(),
|
|
119
|
+
bundleVersionSource: z.string(),
|
|
120
|
+
sourceRoot: z.string(),
|
|
121
|
+
skills: z.object({
|
|
122
|
+
source: z.string(),
|
|
123
|
+
destination: z.string(),
|
|
124
|
+
}),
|
|
125
|
+
agents: z.array(z.object({
|
|
126
|
+
source: z.string(),
|
|
127
|
+
destination: z.string(),
|
|
128
|
+
})),
|
|
129
|
+
ownedPaths: z.array(z.string()),
|
|
130
|
+
plugin: z.object({
|
|
131
|
+
required: z.boolean(),
|
|
132
|
+
source: z.string(),
|
|
133
|
+
destination: z.string(),
|
|
134
|
+
}),
|
|
135
|
+
config: z.object({
|
|
136
|
+
requiredMerges: z.array(configMergeSchema),
|
|
137
|
+
}),
|
|
138
|
+
});
|
|
139
|
+
export const opencodeInstalledManifestSchema = z.object({
|
|
140
|
+
bundleId: z.string(),
|
|
141
|
+
installMode: z.string(),
|
|
142
|
+
sourceBundleVersion: z.string(),
|
|
143
|
+
sourceBundleHash: z.string(),
|
|
144
|
+
installedAt: z.string(),
|
|
145
|
+
ownedPaths: z.array(z.string()),
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=json-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schemas.js","sourceRoot":"","sources":["../../src/utils/json-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ZodType } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Async: read & parse a JSON file. Returns undefined on missing/parse-error.
|
|
4
|
+
*/
|
|
5
|
+
export declare function readJsonSafe<T>(filePath: string): Promise<T | undefined>;
|
|
6
|
+
/**
|
|
7
|
+
* Sync: read & parse a JSON file. Returns undefined on missing/parse-error.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readJsonSafeSync<T>(filePath: string): T | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Validate a parsed value against a Zod schema.
|
|
12
|
+
* Returns the typed value on success; throws with file path context on failure.
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateJson<T>(data: unknown, schema: ZodType<T>, filePath: string): T;
|
|
15
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAM9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAMnE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAStF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
/**
|
|
4
|
+
* Async: read & parse a JSON file. Returns undefined on missing/parse-error.
|
|
5
|
+
*/
|
|
6
|
+
export async function readJsonSafe(filePath) {
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(await readFile(filePath, "utf-8"));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Sync: read & parse a JSON file. Returns undefined on missing/parse-error.
|
|
16
|
+
*/
|
|
17
|
+
export function readJsonSafeSync(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(readFileSync(filePath, "utf-8"));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate a parsed value against a Zod schema.
|
|
27
|
+
* Returns the typed value on success; throws with file path context on failure.
|
|
28
|
+
*/
|
|
29
|
+
export function validateJson(data, schema, filePath) {
|
|
30
|
+
const result = schema.safeParse(data);
|
|
31
|
+
if (!result.success) {
|
|
32
|
+
const issues = result.error.issues
|
|
33
|
+
.map((i) => ` - ${i.path.join(".")}: ${i.message}`)
|
|
34
|
+
.join("\n");
|
|
35
|
+
throw new Error(`Invalid JSON in ${filePath}:\n${issues}`);
|
|
36
|
+
}
|
|
37
|
+
return result.data;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAM,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAI,QAAgB;IAClD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAM,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAI,IAAa,EAAE,MAAkB,EAAE,QAAgB;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACnD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,MAAM,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge entry CRUD storage for ARCS projects.
|
|
3
|
+
*
|
|
4
|
+
* Provides create, update, delete, and index-read operations for knowledge
|
|
5
|
+
* entries, with automatic index maintenance and rebuild-on-read resilience.
|
|
6
|
+
*/
|
|
7
|
+
export type { FileRef, KnowledgeAudience, KnowledgeKind } from "./storage-utils.js";
|
|
8
|
+
export { KNOWLEDGE_AUDIENCES, KNOWLEDGE_KINDS } from "./storage-utils.js";
|
|
9
|
+
export interface KnowledgeMeta {
|
|
10
|
+
id: string;
|
|
11
|
+
normalizedId: string;
|
|
12
|
+
title: string;
|
|
13
|
+
kind: import("./storage-utils.js").KnowledgeKind;
|
|
14
|
+
audience?: import("./storage-utils.js").KnowledgeAudience;
|
|
15
|
+
keywords: string[];
|
|
16
|
+
summary: string;
|
|
17
|
+
sourceFiles?: import("./storage-utils.js").FileRef[];
|
|
18
|
+
file: string;
|
|
19
|
+
createdAt: string;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
}
|
|
22
|
+
export interface CreateKnowledgeInput {
|
|
23
|
+
id: string;
|
|
24
|
+
title: string;
|
|
25
|
+
kind: import("./storage-utils.js").KnowledgeKind;
|
|
26
|
+
audience?: import("./storage-utils.js").KnowledgeAudience;
|
|
27
|
+
keywords: string[];
|
|
28
|
+
summary?: string;
|
|
29
|
+
content?: string;
|
|
30
|
+
sourceFiles?: import("./storage-utils.js").FileRef[];
|
|
31
|
+
now?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface UpdateKnowledgeInput {
|
|
34
|
+
id: string;
|
|
35
|
+
title?: string;
|
|
36
|
+
kind?: import("./storage-utils.js").KnowledgeKind;
|
|
37
|
+
audience?: import("./storage-utils.js").KnowledgeAudience;
|
|
38
|
+
summary?: string;
|
|
39
|
+
keywords?: string[];
|
|
40
|
+
sourceFiles?: import("./storage-utils.js").FileRef[];
|
|
41
|
+
now?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function createKnowledgeEntry(projectDir: string, input: CreateKnowledgeInput): Promise<KnowledgeMeta>;
|
|
44
|
+
export declare function updateKnowledgeEntry(projectDir: string, input: UpdateKnowledgeInput): Promise<KnowledgeMeta>;
|
|
45
|
+
export declare function deleteKnowledgeEntry(projectDir: string, id: string): Promise<void>;
|
|
46
|
+
export declare function readKnowledgeIndex(projectDir: string): Promise<{
|
|
47
|
+
entries: KnowledgeMeta[];
|
|
48
|
+
}>;
|
|
49
|
+
//# sourceMappingURL=knowledge-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-store.d.ts","sourceRoot":"","sources":["../../src/utils/knowledge-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAM1E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,oBAAoB,EAAE,aAAa,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,CAAC;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,oBAAoB,EAAE,OAAO,EAAE,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,oBAAoB,EAAE,aAAa,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,CAAC;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,oBAAoB,EAAE,OAAO,EAAE,CAAC;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,oBAAoB,EAAE,aAAa,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,CAAC;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,oBAAoB,EAAE,OAAO,EAAE,CAAC;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAsED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA+CxB;AAED,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxF;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAmBvC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge entry CRUD storage for ARCS projects.
|
|
3
|
+
*
|
|
4
|
+
* Provides create, update, delete, and index-read operations for knowledge
|
|
5
|
+
* entries, with automatic index maintenance and rebuild-on-read resilience.
|
|
6
|
+
*/
|
|
7
|
+
import { readdir, unlink, writeFile } from "node:fs/promises";
|
|
8
|
+
import { basename, join } from "node:path";
|
|
9
|
+
import { invalidateGraphCache } from "../retrieval/graph-invalidate.js";
|
|
10
|
+
import { indexRebuildFailed, invalidFileFormat, itemNotFound, normalizedIdCollision, } from "./errors.js";
|
|
11
|
+
import { withLock } from "./file-lock.js";
|
|
12
|
+
import { readJsonSafe } from "./json.js";
|
|
13
|
+
import { knowledgeMetaSchema } from "./json-schemas.js";
|
|
14
|
+
import { normalizeIdentifier } from "./slug.js";
|
|
15
|
+
import { buildBody, ensureDir, fileExists, nowISO, rewriteH1, sanitizeFileRefs, sanitizeKeywords, validateKnowledgeKind, writeJson, } from "./storage-utils.js";
|
|
16
|
+
export { KNOWLEDGE_AUDIENCES, KNOWLEDGE_KINDS } from "./storage-utils.js";
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Index helpers
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
async function rebuildKnowledgeIndex(knowledgeDir) {
|
|
21
|
+
const files = (await readdir(knowledgeDir)).filter((f) => f.endsWith(".meta.json"));
|
|
22
|
+
const entries = [];
|
|
23
|
+
const errors = [];
|
|
24
|
+
for (const file of files) {
|
|
25
|
+
try {
|
|
26
|
+
const filePath = join(knowledgeDir, file);
|
|
27
|
+
const raw = await readJsonSafe(filePath);
|
|
28
|
+
if (raw === undefined) {
|
|
29
|
+
errors.push(file);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const result = knowledgeMetaSchema.safeParse(raw);
|
|
33
|
+
if (!result.success) {
|
|
34
|
+
throw invalidFileFormat(filePath, result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", "));
|
|
35
|
+
}
|
|
36
|
+
entries.push(result.data);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
if (e instanceof Error && e.name === "DagError")
|
|
40
|
+
throw e;
|
|
41
|
+
errors.push(file);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (errors.length > 0) {
|
|
45
|
+
throw indexRebuildFailed("knowledge", `corrupt meta files: ${errors.join(", ")}`);
|
|
46
|
+
}
|
|
47
|
+
const index = { entries };
|
|
48
|
+
await writeJson(join(knowledgeDir, "index.json"), index);
|
|
49
|
+
return index;
|
|
50
|
+
}
|
|
51
|
+
async function isKnowledgeIndexStale(knowledgeDir, index) {
|
|
52
|
+
const metaFiles = (await readdir(knowledgeDir)).filter((f) => f.endsWith(".meta.json"));
|
|
53
|
+
if (metaFiles.length !== index.entries.length)
|
|
54
|
+
return true;
|
|
55
|
+
for (const entry of index.entries) {
|
|
56
|
+
const metaPath = join(knowledgeDir, `${entry.normalizedId}.meta.json`);
|
|
57
|
+
const diskMeta = await readJsonSafe(metaPath);
|
|
58
|
+
if (!diskMeta || diskMeta.updatedAt !== entry.updatedAt) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
async function writeKnowledgeIndex(knowledgeDir, index) {
|
|
65
|
+
const indexPath = join(knowledgeDir, "index.json");
|
|
66
|
+
await withLock(indexPath, async () => {
|
|
67
|
+
await writeJson(indexPath, index);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// Public API
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
export async function createKnowledgeEntry(projectDir, input) {
|
|
74
|
+
validateKnowledgeKind(input.kind);
|
|
75
|
+
const keywords = sanitizeKeywords(input.keywords);
|
|
76
|
+
const sourceFiles = input.sourceFiles ? sanitizeFileRefs(input.sourceFiles) : undefined;
|
|
77
|
+
const normalizedId = normalizeIdentifier(input.id);
|
|
78
|
+
const knowledgeDir = join(projectDir, "knowledge");
|
|
79
|
+
await ensureDir(knowledgeDir);
|
|
80
|
+
const metaPath = join(knowledgeDir, `${normalizedId}.meta.json`);
|
|
81
|
+
if (await fileExists(metaPath)) {
|
|
82
|
+
throw normalizedIdCollision("knowledge entry", input.id, normalizedId);
|
|
83
|
+
}
|
|
84
|
+
const ts = nowISO(input.now);
|
|
85
|
+
const bodyFile = join("knowledge", `${normalizedId}.md`);
|
|
86
|
+
const meta = {
|
|
87
|
+
id: normalizedId,
|
|
88
|
+
normalizedId,
|
|
89
|
+
title: input.title,
|
|
90
|
+
kind: input.kind,
|
|
91
|
+
...(input.audience && { audience: input.audience }),
|
|
92
|
+
keywords,
|
|
93
|
+
summary: input.summary ?? "",
|
|
94
|
+
...(sourceFiles && { sourceFiles }),
|
|
95
|
+
file: bodyFile,
|
|
96
|
+
createdAt: ts,
|
|
97
|
+
updatedAt: ts,
|
|
98
|
+
};
|
|
99
|
+
await writeJson(metaPath, meta);
|
|
100
|
+
await writeFile(join(projectDir, bodyFile), buildBody(input.title, input.content), "utf-8");
|
|
101
|
+
const index = (await readJsonSafe(join(knowledgeDir, "index.json"))) ?? {
|
|
102
|
+
entries: [],
|
|
103
|
+
};
|
|
104
|
+
index.entries.push(meta);
|
|
105
|
+
await writeKnowledgeIndex(knowledgeDir, index);
|
|
106
|
+
invalidateGraphCache(basename(projectDir));
|
|
107
|
+
return meta;
|
|
108
|
+
}
|
|
109
|
+
export async function updateKnowledgeEntry(projectDir, input) {
|
|
110
|
+
if (input.kind !== undefined) {
|
|
111
|
+
validateKnowledgeKind(input.kind);
|
|
112
|
+
}
|
|
113
|
+
const normalizedId = normalizeIdentifier(input.id);
|
|
114
|
+
const knowledgeDir = join(projectDir, "knowledge");
|
|
115
|
+
const metaPath = join(knowledgeDir, `${normalizedId}.meta.json`);
|
|
116
|
+
const meta = await readJsonSafe(metaPath);
|
|
117
|
+
if (!meta) {
|
|
118
|
+
throw itemNotFound("knowledge entry", input.id);
|
|
119
|
+
}
|
|
120
|
+
if (input.kind !== undefined)
|
|
121
|
+
meta.kind = input.kind;
|
|
122
|
+
if (input.audience !== undefined)
|
|
123
|
+
meta.audience = input.audience;
|
|
124
|
+
if (input.title !== undefined && input.title !== meta.title) {
|
|
125
|
+
const bodyPath = join(projectDir, meta.file);
|
|
126
|
+
await rewriteH1(bodyPath, input.title);
|
|
127
|
+
meta.title = input.title;
|
|
128
|
+
}
|
|
129
|
+
if (input.summary !== undefined)
|
|
130
|
+
meta.summary = input.summary;
|
|
131
|
+
if (input.keywords !== undefined)
|
|
132
|
+
meta.keywords = sanitizeKeywords(input.keywords);
|
|
133
|
+
if (input.sourceFiles !== undefined) {
|
|
134
|
+
if (input.sourceFiles.length === 0) {
|
|
135
|
+
delete meta.sourceFiles;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
meta.sourceFiles = sanitizeFileRefs(input.sourceFiles);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
meta.updatedAt = nowISO(input.now);
|
|
142
|
+
await writeJson(metaPath, meta);
|
|
143
|
+
const index = (await readJsonSafe(join(knowledgeDir, "index.json"))) ?? {
|
|
144
|
+
entries: [],
|
|
145
|
+
};
|
|
146
|
+
const idx = index.entries.findIndex((e) => e.normalizedId === normalizedId);
|
|
147
|
+
if (idx >= 0) {
|
|
148
|
+
index.entries[idx] = meta;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
index.entries.push(meta);
|
|
152
|
+
}
|
|
153
|
+
await writeKnowledgeIndex(knowledgeDir, index);
|
|
154
|
+
invalidateGraphCache(basename(projectDir));
|
|
155
|
+
return meta;
|
|
156
|
+
}
|
|
157
|
+
export async function deleteKnowledgeEntry(projectDir, id) {
|
|
158
|
+
const normalizedId = normalizeIdentifier(id);
|
|
159
|
+
const knowledgeDir = join(projectDir, "knowledge");
|
|
160
|
+
const metaPath = join(knowledgeDir, `${normalizedId}.meta.json`);
|
|
161
|
+
const meta = await readJsonSafe(metaPath);
|
|
162
|
+
if (!meta) {
|
|
163
|
+
throw itemNotFound("knowledge entry", id);
|
|
164
|
+
}
|
|
165
|
+
const bodyPath = join(projectDir, meta.file);
|
|
166
|
+
await unlink(metaPath);
|
|
167
|
+
if (await fileExists(bodyPath)) {
|
|
168
|
+
await unlink(bodyPath);
|
|
169
|
+
}
|
|
170
|
+
const index = (await readJsonSafe(join(knowledgeDir, "index.json"))) ?? {
|
|
171
|
+
entries: [],
|
|
172
|
+
};
|
|
173
|
+
index.entries = index.entries.filter((e) => e.normalizedId !== normalizedId);
|
|
174
|
+
await writeKnowledgeIndex(knowledgeDir, index);
|
|
175
|
+
}
|
|
176
|
+
export async function readKnowledgeIndex(projectDir) {
|
|
177
|
+
const knowledgeDir = join(projectDir, "knowledge");
|
|
178
|
+
if (!(await fileExists(knowledgeDir))) {
|
|
179
|
+
return { entries: [] };
|
|
180
|
+
}
|
|
181
|
+
const indexPath = join(knowledgeDir, "index.json");
|
|
182
|
+
const index = await readJsonSafe(indexPath);
|
|
183
|
+
if (!index || !Array.isArray(index.entries)) {
|
|
184
|
+
return rebuildKnowledgeIndex(knowledgeDir);
|
|
185
|
+
}
|
|
186
|
+
if (await isKnowledgeIndexStale(knowledgeDir, index)) {
|
|
187
|
+
return rebuildKnowledgeIndex(knowledgeDir);
|
|
188
|
+
}
|
|
189
|
+
return index;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=knowledge-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-store.js","sourceRoot":"","sources":["../../src/utils/knowledge-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop state management for ARCS projects.
|
|
3
|
+
*
|
|
4
|
+
* Stores active loop state as loop-state.json in each project directory.
|
|
5
|
+
* Used by CLI commands (start/cancel/get) and the OpenCode plugin hook
|
|
6
|
+
* (which reads state directly from disk to drive iteration).
|
|
7
|
+
*/
|
|
8
|
+
export interface LoopState {
|
|
9
|
+
active: boolean;
|
|
10
|
+
iteration: number;
|
|
11
|
+
maxIterations: number;
|
|
12
|
+
completionPromise: string;
|
|
13
|
+
startedAt: string;
|
|
14
|
+
prompt: string;
|
|
15
|
+
sessionId: string;
|
|
16
|
+
strategy: "continue" | "reset";
|
|
17
|
+
projectSlug: string;
|
|
18
|
+
messageCountAtStart?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface StartLoopInput {
|
|
21
|
+
sessionId: string;
|
|
22
|
+
prompt: string;
|
|
23
|
+
maxIterations?: number;
|
|
24
|
+
completionPromise?: string;
|
|
25
|
+
strategy?: "continue" | "reset";
|
|
26
|
+
projectSlug: string;
|
|
27
|
+
messageCountAtStart?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare const LOOP_STATE_FILE = "loop-state.json";
|
|
30
|
+
export declare const DEFAULT_MAX_ITERATIONS = 100;
|
|
31
|
+
export declare const DEFAULT_COMPLETION_PROMISE = "DONE";
|
|
32
|
+
export declare const COMPLETION_TAG_PATTERN: RegExp;
|
|
33
|
+
/** Read loop-state.json from a project directory. Returns null if missing or corrupt. */
|
|
34
|
+
export declare function readLoopState(projectDir: string): Promise<LoopState | null>;
|
|
35
|
+
/** Write loop-state.json to a project directory. */
|
|
36
|
+
export declare function writeLoopState(projectDir: string, state: LoopState): Promise<void>;
|
|
37
|
+
/** Delete loop-state.json from a project directory. Returns true if the file was removed. */
|
|
38
|
+
export declare function clearLoopState(projectDir: string): Promise<boolean>;
|
|
39
|
+
/** Read loop state, bump iteration count, write back, and return the updated state. */
|
|
40
|
+
export declare function incrementLoopIteration(projectDir: string): Promise<LoopState | null>;
|
|
41
|
+
/** Create initial loop state for a project. Throws if a loop is already active. */
|
|
42
|
+
export declare function startLoop(projectDir: string, input: StartLoopInput): Promise<LoopState>;
|
|
43
|
+
/** Cancel an active loop if the session ID matches. Returns true if cleared. */
|
|
44
|
+
export declare function cancelLoop(projectDir: string, sessionId: string): Promise<boolean>;
|
|
45
|
+
/** Scan all projects for an active loop-state.json. Returns the first match or null. */
|
|
46
|
+
export declare function findActiveLoop(): Promise<{
|
|
47
|
+
slug: string;
|
|
48
|
+
projectDir: string;
|
|
49
|
+
state: LoopState;
|
|
50
|
+
} | null>;
|
|
51
|
+
//# sourceMappingURL=loop-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-state.d.ts","sourceRoot":"","sources":["../../src/utils/loop-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD,eAAO,MAAM,eAAe,oBAAoB,CAAC;AACjD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,0BAA0B,SAAS,CAAC;AACjD,eAAO,MAAM,sBAAsB,QAAgC,CAAC;AA+BpE,yFAAyF;AACzF,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAGjF;AAED,oDAAoD;AACpD,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;AAED,6FAA6F;AAC7F,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzE;AAED,uFAAuF;AACvF,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAQ1F;AAED,mFAAmF;AACnF,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA0B7F;AAED,gFAAgF;AAChF,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMxF;AAED,wFAAwF;AACxF,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CAClB,GAAG,IAAI,CAAC,CAkBR"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop state management for ARCS projects.
|
|
3
|
+
*
|
|
4
|
+
* Stores active loop state as loop-state.json in each project directory.
|
|
5
|
+
* Used by CLI commands (start/cancel/get) and the OpenCode plugin hook
|
|
6
|
+
* (which reads state directly from disk to drive iteration).
|
|
7
|
+
*/
|
|
8
|
+
import { constants } from "node:fs";
|
|
9
|
+
import { access, readFile, unlink, writeFile } from "node:fs/promises";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { DagError } from "./errors.js";
|
|
12
|
+
import { getDataDir } from "./paths.js";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Constants
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
export const LOOP_STATE_FILE = "loop-state.json";
|
|
17
|
+
export const DEFAULT_MAX_ITERATIONS = 100;
|
|
18
|
+
export const DEFAULT_COMPLETION_PROMISE = "DONE";
|
|
19
|
+
export const COMPLETION_TAG_PATTERN = /<promise>(.*?)<\/promise>/is;
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Filesystem helpers
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
async function fileExists(path) {
|
|
24
|
+
try {
|
|
25
|
+
await access(path, constants.F_OK);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function readJsonSafe(filePath) {
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(await readFile(filePath, "utf-8"));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function writeJson(filePath, data) {
|
|
41
|
+
await writeFile(filePath, `${JSON.stringify(data, null, 2)}\n`, "utf-8");
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Public API
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/** Read loop-state.json from a project directory. Returns null if missing or corrupt. */
|
|
47
|
+
export async function readLoopState(projectDir) {
|
|
48
|
+
const filePath = join(projectDir, LOOP_STATE_FILE);
|
|
49
|
+
return readJsonSafe(filePath);
|
|
50
|
+
}
|
|
51
|
+
/** Write loop-state.json to a project directory. */
|
|
52
|
+
export async function writeLoopState(projectDir, state) {
|
|
53
|
+
const filePath = join(projectDir, LOOP_STATE_FILE);
|
|
54
|
+
await writeJson(filePath, state);
|
|
55
|
+
}
|
|
56
|
+
/** Delete loop-state.json from a project directory. Returns true if the file was removed. */
|
|
57
|
+
export async function clearLoopState(projectDir) {
|
|
58
|
+
const filePath = join(projectDir, LOOP_STATE_FILE);
|
|
59
|
+
if (!(await fileExists(filePath))) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
await unlink(filePath);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
/** Read loop state, bump iteration count, write back, and return the updated state. */
|
|
66
|
+
export async function incrementLoopIteration(projectDir) {
|
|
67
|
+
const state = await readLoopState(projectDir);
|
|
68
|
+
if (!state) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
state.iteration += 1;
|
|
72
|
+
await writeLoopState(projectDir, state);
|
|
73
|
+
return state;
|
|
74
|
+
}
|
|
75
|
+
/** Create initial loop state for a project. Throws if a loop is already active. */
|
|
76
|
+
export async function startLoop(projectDir, input) {
|
|
77
|
+
const existing = await readLoopState(projectDir);
|
|
78
|
+
if (existing?.active) {
|
|
79
|
+
throw new DagError("LOOP_ALREADY_ACTIVE", `A loop is already active for project "${input.projectSlug}" (session ${existing.sessionId}).`);
|
|
80
|
+
}
|
|
81
|
+
const state = {
|
|
82
|
+
active: true,
|
|
83
|
+
iteration: 0,
|
|
84
|
+
maxIterations: input.maxIterations ?? DEFAULT_MAX_ITERATIONS,
|
|
85
|
+
completionPromise: input.completionPromise ?? DEFAULT_COMPLETION_PROMISE,
|
|
86
|
+
startedAt: new Date().toISOString(),
|
|
87
|
+
prompt: input.prompt,
|
|
88
|
+
sessionId: input.sessionId,
|
|
89
|
+
strategy: input.strategy ?? "continue",
|
|
90
|
+
projectSlug: input.projectSlug,
|
|
91
|
+
...(input.messageCountAtStart !== undefined && {
|
|
92
|
+
messageCountAtStart: input.messageCountAtStart,
|
|
93
|
+
}),
|
|
94
|
+
};
|
|
95
|
+
await writeLoopState(projectDir, state);
|
|
96
|
+
return state;
|
|
97
|
+
}
|
|
98
|
+
/** Cancel an active loop if the session ID matches. Returns true if cleared. */
|
|
99
|
+
export async function cancelLoop(projectDir, sessionId) {
|
|
100
|
+
const state = await readLoopState(projectDir);
|
|
101
|
+
if (!state?.active || state.sessionId !== sessionId) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return clearLoopState(projectDir);
|
|
105
|
+
}
|
|
106
|
+
/** Scan all projects for an active loop-state.json. Returns the first match or null. */
|
|
107
|
+
export async function findActiveLoop() {
|
|
108
|
+
const dataDir = getDataDir();
|
|
109
|
+
const metaPath = join(dataDir, "meta.json");
|
|
110
|
+
const rootMeta = await readJsonSafe(metaPath);
|
|
111
|
+
if (!rootMeta?.projects) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
for (const node of rootMeta.projects) {
|
|
115
|
+
const projectDir = join(dataDir, "projects", node.id);
|
|
116
|
+
const state = await readLoopState(projectDir);
|
|
117
|
+
if (state?.active) {
|
|
118
|
+
return { slug: node.id, projectDir, state };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=loop-state.js.map
|