@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,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task CRUD storage for ARCS projects.
|
|
3
|
+
*
|
|
4
|
+
* Provides create, list, get, update, delete operations for tasks,
|
|
5
|
+
* with a flat JSON index and markdown render for human-readable output.
|
|
6
|
+
*/
|
|
7
|
+
import { writeFile } from "node:fs/promises";
|
|
8
|
+
import { basename, join } from "node:path";
|
|
9
|
+
import { invalidateGraphCache } from "../retrieval/graph-invalidate.js";
|
|
10
|
+
import { itemNotFound, normalizedIdCollision } from "./errors.js";
|
|
11
|
+
import { withLock } from "./file-lock.js";
|
|
12
|
+
import { readJsonSafe } from "./json.js";
|
|
13
|
+
import { normalizeIdentifier } from "./slug.js";
|
|
14
|
+
import { ensureDir, fileExists, nowISO, sanitizeFileRefs, validateTaskPriority, validateTaskStatus, writeJson, } from "./storage-utils.js";
|
|
15
|
+
export { TASK_PRIORITIES, TASK_STATUSES } from "./storage-utils.js";
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Index helpers
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
async function readTaskIndex(projectDir) {
|
|
20
|
+
const tasksDir = join(projectDir, "tasks");
|
|
21
|
+
if (!(await fileExists(tasksDir))) {
|
|
22
|
+
return { tasks: [] };
|
|
23
|
+
}
|
|
24
|
+
const indexPath = join(tasksDir, "index.json");
|
|
25
|
+
const index = await readJsonSafe(indexPath);
|
|
26
|
+
if (!index || !Array.isArray(index.tasks)) {
|
|
27
|
+
return { tasks: [] };
|
|
28
|
+
}
|
|
29
|
+
return index;
|
|
30
|
+
}
|
|
31
|
+
async function writeTaskIndex(projectDir, index) {
|
|
32
|
+
const tasksDir = join(projectDir, "tasks");
|
|
33
|
+
await ensureDir(tasksDir);
|
|
34
|
+
const indexPath = join(tasksDir, "index.json");
|
|
35
|
+
await withLock(indexPath, async () => {
|
|
36
|
+
await writeJson(indexPath, index);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Render
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
const PRIORITY_ORDER = {
|
|
43
|
+
high: 0,
|
|
44
|
+
medium: 1,
|
|
45
|
+
low: 2,
|
|
46
|
+
};
|
|
47
|
+
function sortByPriority(tasks) {
|
|
48
|
+
return [...tasks].sort((a, b) => PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority]);
|
|
49
|
+
}
|
|
50
|
+
export async function renderTasksMd(projectDir, index) {
|
|
51
|
+
const metaPath = join(projectDir, "meta.json");
|
|
52
|
+
const meta = await readJsonSafe(metaPath);
|
|
53
|
+
const name = meta?.name ?? "Unknown";
|
|
54
|
+
const sections = [`# Tasks — ${name}\n`];
|
|
55
|
+
const statusConfig = [
|
|
56
|
+
{ status: "in_progress", heading: "In Progress", marker: "[/]", showPriority: true },
|
|
57
|
+
{ status: "backlog", heading: "Backlog", marker: "[ ]", showPriority: true },
|
|
58
|
+
{ status: "done", heading: "Done", marker: "[x]", showPriority: false },
|
|
59
|
+
{ status: "cancelled", heading: "Cancelled", marker: "[~]", showPriority: false },
|
|
60
|
+
];
|
|
61
|
+
for (const { status, heading, marker, showPriority } of statusConfig) {
|
|
62
|
+
const tasks = sortByPriority(index.tasks.filter((t) => t.status === status));
|
|
63
|
+
if (tasks.length === 0)
|
|
64
|
+
continue;
|
|
65
|
+
sections.push(`## ${heading}`);
|
|
66
|
+
for (const task of tasks) {
|
|
67
|
+
const priorityTag = showPriority ? ` **[${task.priority}]**` : "";
|
|
68
|
+
sections.push(`- ${marker}${priorityTag} ${task.title}`);
|
|
69
|
+
}
|
|
70
|
+
sections.push("");
|
|
71
|
+
}
|
|
72
|
+
await writeFile(join(projectDir, "tasks.md"), sections.join("\n"), "utf-8");
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Public API
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
export async function createTask(projectDir, input) {
|
|
78
|
+
const status = input.status ?? "backlog";
|
|
79
|
+
const priority = input.priority ?? "medium";
|
|
80
|
+
validateTaskStatus(status);
|
|
81
|
+
validateTaskPriority(priority);
|
|
82
|
+
const sourceFiles = input.sourceFiles ? sanitizeFileRefs(input.sourceFiles) : undefined;
|
|
83
|
+
const normalizedId = normalizeIdentifier(input.title);
|
|
84
|
+
const index = await readTaskIndex(projectDir);
|
|
85
|
+
if (index.tasks.some((t) => t.normalizedId === normalizedId)) {
|
|
86
|
+
throw normalizedIdCollision("task", input.title, normalizedId);
|
|
87
|
+
}
|
|
88
|
+
const ts = nowISO(input.now);
|
|
89
|
+
const meta = {
|
|
90
|
+
id: normalizedId,
|
|
91
|
+
normalizedId,
|
|
92
|
+
title: input.title,
|
|
93
|
+
status,
|
|
94
|
+
priority,
|
|
95
|
+
...(input.planId && { planId: input.planId }),
|
|
96
|
+
...(sourceFiles && { sourceFiles }),
|
|
97
|
+
createdAt: ts,
|
|
98
|
+
updatedAt: ts,
|
|
99
|
+
};
|
|
100
|
+
index.tasks.push(meta);
|
|
101
|
+
await writeTaskIndex(projectDir, index);
|
|
102
|
+
await renderTasksMd(projectDir, index);
|
|
103
|
+
invalidateGraphCache(basename(projectDir));
|
|
104
|
+
return meta;
|
|
105
|
+
}
|
|
106
|
+
export async function listTasks(projectDir, filters) {
|
|
107
|
+
const index = await readTaskIndex(projectDir);
|
|
108
|
+
let tasks = index.tasks;
|
|
109
|
+
if (filters?.status) {
|
|
110
|
+
tasks = tasks.filter((t) => t.status === filters.status);
|
|
111
|
+
}
|
|
112
|
+
if (filters?.priority) {
|
|
113
|
+
tasks = tasks.filter((t) => t.priority === filters.priority);
|
|
114
|
+
}
|
|
115
|
+
return tasks;
|
|
116
|
+
}
|
|
117
|
+
export async function getTask(projectDir, taskId) {
|
|
118
|
+
const normalizedId = normalizeIdentifier(taskId);
|
|
119
|
+
const index = await readTaskIndex(projectDir);
|
|
120
|
+
const task = index.tasks.find((t) => t.normalizedId === normalizedId);
|
|
121
|
+
if (!task) {
|
|
122
|
+
throw itemNotFound("task", taskId);
|
|
123
|
+
}
|
|
124
|
+
return task;
|
|
125
|
+
}
|
|
126
|
+
export async function updateTask(projectDir, input) {
|
|
127
|
+
if (input.status !== undefined) {
|
|
128
|
+
validateTaskStatus(input.status);
|
|
129
|
+
}
|
|
130
|
+
if (input.priority !== undefined) {
|
|
131
|
+
validateTaskPriority(input.priority);
|
|
132
|
+
}
|
|
133
|
+
const normalizedId = normalizeIdentifier(input.id);
|
|
134
|
+
const index = await readTaskIndex(projectDir);
|
|
135
|
+
const task = index.tasks.find((t) => t.normalizedId === normalizedId);
|
|
136
|
+
if (!task) {
|
|
137
|
+
throw itemNotFound("task", input.id);
|
|
138
|
+
}
|
|
139
|
+
if (input.title !== undefined)
|
|
140
|
+
task.title = input.title;
|
|
141
|
+
if (input.status !== undefined)
|
|
142
|
+
task.status = input.status;
|
|
143
|
+
if (input.priority !== undefined)
|
|
144
|
+
task.priority = input.priority;
|
|
145
|
+
if (input.planId !== undefined) {
|
|
146
|
+
if (input.planId === null) {
|
|
147
|
+
delete task.planId;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
task.planId = input.planId;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (input.sourceFiles !== undefined) {
|
|
154
|
+
if (input.sourceFiles.length === 0) {
|
|
155
|
+
delete task.sourceFiles;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
task.sourceFiles = sanitizeFileRefs(input.sourceFiles);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
task.updatedAt = nowISO(input.now);
|
|
162
|
+
await writeTaskIndex(projectDir, index);
|
|
163
|
+
await renderTasksMd(projectDir, index);
|
|
164
|
+
invalidateGraphCache(basename(projectDir));
|
|
165
|
+
return task;
|
|
166
|
+
}
|
|
167
|
+
export async function deleteTask(projectDir, taskId) {
|
|
168
|
+
const normalizedId = normalizeIdentifier(taskId);
|
|
169
|
+
const index = await readTaskIndex(projectDir);
|
|
170
|
+
const task = index.tasks.find((t) => t.normalizedId === normalizedId);
|
|
171
|
+
if (!task) {
|
|
172
|
+
throw itemNotFound("task", taskId);
|
|
173
|
+
}
|
|
174
|
+
index.tasks = index.tasks.filter((t) => t.normalizedId !== normalizedId);
|
|
175
|
+
await writeTaskIndex(projectDir, index);
|
|
176
|
+
await renderTasksMd(projectDir, index);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=task-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.js","sourceRoot":"","sources":["../../src/utils/task-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders a mustache-style template by replacing {{variable}} placeholders.
|
|
3
|
+
* NOTE: Template reading remains synchronous — templates are local package
|
|
4
|
+
* assets read once during `arcs project init`, not on the hot path.
|
|
5
|
+
*/
|
|
6
|
+
export declare function renderTemplate(templatePath: string, variables: Record<string, string>): string;
|
|
7
|
+
/**
|
|
8
|
+
* Renders a template string with {{variable}} substitution.
|
|
9
|
+
*/
|
|
10
|
+
export declare function renderString(template: string, variables: Record<string, string>): string;
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a template path relative to the package's templates/ dir.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getTemplatePath(templateName: string): string;
|
|
15
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAG9F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIxF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { PACKAGE_ROOT } from "./paths.js";
|
|
4
|
+
/**
|
|
5
|
+
* Renders a mustache-style template by replacing {{variable}} placeholders.
|
|
6
|
+
* NOTE: Template reading remains synchronous — templates are local package
|
|
7
|
+
* assets read once during `arcs project init`, not on the hot path.
|
|
8
|
+
*/
|
|
9
|
+
export function renderTemplate(templatePath, variables) {
|
|
10
|
+
const template = readFileSync(templatePath, "utf-8");
|
|
11
|
+
return renderString(template, variables);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Renders a template string with {{variable}} substitution.
|
|
15
|
+
*/
|
|
16
|
+
export function renderString(template, variables) {
|
|
17
|
+
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
18
|
+
return variables[key] ?? match;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolves a template path relative to the package's templates/ dir.
|
|
23
|
+
*/
|
|
24
|
+
export function getTemplatePath(templateName) {
|
|
25
|
+
return resolve(PACKAGE_ROOT, "templates", templateName);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,YAAoB,EAAE,SAAiC;IACpF,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,SAAiC;IAC9E,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC/D,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,OAAO,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard CLI tool response helpers.
|
|
3
|
+
*/
|
|
4
|
+
type ToolErrorResponse = {
|
|
5
|
+
content: [{
|
|
6
|
+
type: "text";
|
|
7
|
+
text: string;
|
|
8
|
+
}];
|
|
9
|
+
isError: true;
|
|
10
|
+
};
|
|
11
|
+
export declare function jsonResult(data: unknown): {
|
|
12
|
+
content: {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
}[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Build a code-tagged CLI command error response.
|
|
19
|
+
*
|
|
20
|
+
* Every error surfaced to the caller carries a stable `[CODE]` prefix so
|
|
21
|
+
* clients can programmatically distinguish error classes.
|
|
22
|
+
*
|
|
23
|
+
* @param code Stable upper-case error code (e.g. `"NOT_FOUND"`, `"INVALID_INPUT"`).
|
|
24
|
+
* @param message Human-readable description.
|
|
25
|
+
* @param cause Optional underlying error — appended as `" — <detail>"` when present.
|
|
26
|
+
*/
|
|
27
|
+
export declare function toolError(code: string, message: string, cause?: unknown): ToolErrorResponse;
|
|
28
|
+
/**
|
|
29
|
+
* Fallback error helper for truly unknown exceptions caught at the top-level.
|
|
30
|
+
*
|
|
31
|
+
* Prefer `toolError(code, ...)` for known error conditions, or
|
|
32
|
+
* `formatError(DagError)` for typed DAG errors. Use `errorResult` only
|
|
33
|
+
* in generic `catch (err)` blocks where the error type is not known.
|
|
34
|
+
*/
|
|
35
|
+
export declare function errorResult(err: unknown): ToolErrorResponse;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=tool-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-response.d.ts","sourceRoot":"","sources":["../../src/utils/tool-response.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,KAAK,iBAAiB,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC;AAEtF,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO;;;;;EASvC;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAS3F;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAE3D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard CLI tool response helpers.
|
|
3
|
+
*/
|
|
4
|
+
export function jsonResult(data) {
|
|
5
|
+
return {
|
|
6
|
+
content: [
|
|
7
|
+
{
|
|
8
|
+
type: "text",
|
|
9
|
+
text: JSON.stringify(data, null, 2),
|
|
10
|
+
},
|
|
11
|
+
],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build a code-tagged CLI command error response.
|
|
16
|
+
*
|
|
17
|
+
* Every error surfaced to the caller carries a stable `[CODE]` prefix so
|
|
18
|
+
* clients can programmatically distinguish error classes.
|
|
19
|
+
*
|
|
20
|
+
* @param code Stable upper-case error code (e.g. `"NOT_FOUND"`, `"INVALID_INPUT"`).
|
|
21
|
+
* @param message Human-readable description.
|
|
22
|
+
* @param cause Optional underlying error — appended as `" — <detail>"` when present.
|
|
23
|
+
*/
|
|
24
|
+
export function toolError(code, message, cause) {
|
|
25
|
+
let text = `[${code}] ${message}`;
|
|
26
|
+
if (cause !== undefined && cause !== null) {
|
|
27
|
+
const detail = cause instanceof Error ? cause.message : String(cause);
|
|
28
|
+
if (detail && detail !== message) {
|
|
29
|
+
text += ` — ${detail}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Fallback error helper for truly unknown exceptions caught at the top-level.
|
|
36
|
+
*
|
|
37
|
+
* Prefer `toolError(code, ...)` for known error conditions, or
|
|
38
|
+
* `formatError(DagError)` for typed DAG errors. Use `errorResult` only
|
|
39
|
+
* in generic `catch (err)` blocks where the error type is not known.
|
|
40
|
+
*/
|
|
41
|
+
export function errorResult(err) {
|
|
42
|
+
return toolError("INTERNAL_ERROR", err instanceof Error ? err.message : String(err));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=tool-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-response.js","sourceRoot":"","sources":["../../src/utils/tool-response.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAe,EAAE,KAAe;IACtE,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,IAAI,MAAM,MAAM,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;AAChF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,SAAS,CAAC,gBAAgB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type WorkflowSurface = "queue" | "plan" | "memory";
|
|
2
|
+
export interface WorkflowPlanCandidate {
|
|
3
|
+
title: string;
|
|
4
|
+
status: string;
|
|
5
|
+
updatedAt?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CurrentFocus {
|
|
8
|
+
kind: "plan" | "task" | "none";
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
export interface OperatingBrief {
|
|
12
|
+
currentFocus: string;
|
|
13
|
+
recommendedSurface: "QUEUE" | "PLAN" | "MEMORY";
|
|
14
|
+
why: string;
|
|
15
|
+
nextAction: string;
|
|
16
|
+
}
|
|
17
|
+
export interface StructuredTask {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
status: "backlog" | "in_progress" | "done" | "cancelled";
|
|
21
|
+
planId?: string;
|
|
22
|
+
priority?: "low" | "medium" | "high";
|
|
23
|
+
}
|
|
24
|
+
export interface StructuredPlan {
|
|
25
|
+
id: string;
|
|
26
|
+
title: string;
|
|
27
|
+
status: "proposed" | "planned" | "in_progress" | "blocked" | "done" | "archived";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Derive an operating brief from structured task and plan data.
|
|
31
|
+
*/
|
|
32
|
+
export declare function deriveOperatingBrief(input: {
|
|
33
|
+
tasks: StructuredTask[];
|
|
34
|
+
plans: StructuredPlan[];
|
|
35
|
+
}): OperatingBrief;
|
|
36
|
+
export declare function chooseCurrentFocus(input: {
|
|
37
|
+
plans: WorkflowPlanCandidate[];
|
|
38
|
+
inProgressTasks: string[];
|
|
39
|
+
backlogTasks: string[];
|
|
40
|
+
}): CurrentFocus;
|
|
41
|
+
export declare function recommendSurface(input: {
|
|
42
|
+
hasPlanSignals: boolean;
|
|
43
|
+
hasDurableKnowledgeSignal: boolean;
|
|
44
|
+
itemLabel?: string;
|
|
45
|
+
}): {
|
|
46
|
+
surface: WorkflowSurface;
|
|
47
|
+
why: string;
|
|
48
|
+
};
|
|
49
|
+
export declare function safeTime(value?: string): number;
|
|
50
|
+
//# sourceMappingURL=workflow-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-policy.d.ts","sourceRoot":"","sources":["../../src/utils/workflow-policy.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;CAClF;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,GAAG,cAAc,CAgEjB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GAAG,YAAY,CA4Bf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,cAAc,EAAE,OAAO,CAAC;IACxB,yBAAyB,EAAE,OAAO,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAmB5C;AAED,wBAAgB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/C"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { stripTaskCheckbox } from "./content-assembly.js";
|
|
2
|
+
const PRIORITY_ORDER = { high: 0, medium: 1, low: 2 };
|
|
3
|
+
/**
|
|
4
|
+
* Derive an operating brief from structured task and plan data.
|
|
5
|
+
*/
|
|
6
|
+
export function deriveOperatingBrief(input) {
|
|
7
|
+
const { tasks, plans } = input;
|
|
8
|
+
// 1. Any task in_progress → QUEUE
|
|
9
|
+
const inProgress = tasks.filter((t) => t.status === "in_progress");
|
|
10
|
+
if (inProgress.length > 0) {
|
|
11
|
+
const task = inProgress[0];
|
|
12
|
+
return {
|
|
13
|
+
currentFocus: task.title,
|
|
14
|
+
recommendedSurface: "QUEUE",
|
|
15
|
+
why: `Task in progress: ${task.title}`,
|
|
16
|
+
nextAction: `Continue task ${task.id}`,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// 2. Any plan in_progress with a backlog task → QUEUE
|
|
20
|
+
const inProgressPlans = plans.filter((p) => p.status === "in_progress");
|
|
21
|
+
for (const plan of inProgressPlans) {
|
|
22
|
+
const readyTask = tasks.find((t) => t.status === "backlog" && t.planId === plan.id);
|
|
23
|
+
if (readyTask) {
|
|
24
|
+
return {
|
|
25
|
+
currentFocus: plan.title,
|
|
26
|
+
recommendedSurface: "QUEUE",
|
|
27
|
+
why: `Plan ${plan.title} has ready tasks`,
|
|
28
|
+
nextAction: `Start task ${readyTask.id}`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// 3. Any plan proposed or planned → PLAN
|
|
33
|
+
const needsPlanning = plans.find((p) => p.status === "proposed" || p.status === "planned");
|
|
34
|
+
if (needsPlanning) {
|
|
35
|
+
return {
|
|
36
|
+
currentFocus: needsPlanning.title,
|
|
37
|
+
recommendedSurface: "PLAN",
|
|
38
|
+
why: `Plan "${needsPlanning.title}" needs attention (status: ${needsPlanning.status})`,
|
|
39
|
+
nextAction: `Advance plan ${needsPlanning.id}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// 4. Any backlog task (no in-progress plan) → QUEUE, highest priority
|
|
43
|
+
const backlog = tasks.filter((t) => t.status === "backlog");
|
|
44
|
+
if (backlog.length > 0) {
|
|
45
|
+
const sorted = [...backlog].sort((a, b) => (PRIORITY_ORDER[a.priority ?? "medium"] ?? 1) -
|
|
46
|
+
(PRIORITY_ORDER[b.priority ?? "medium"] ?? 1));
|
|
47
|
+
const task = sorted[0];
|
|
48
|
+
return {
|
|
49
|
+
currentFocus: task.title,
|
|
50
|
+
recommendedSurface: "QUEUE",
|
|
51
|
+
why: `Backlog task ready: ${task.title}`,
|
|
52
|
+
nextAction: `Start task ${task.id}`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// 5. Nothing active
|
|
56
|
+
return {
|
|
57
|
+
currentFocus: "No active work",
|
|
58
|
+
recommendedSurface: "MEMORY",
|
|
59
|
+
why: "All plans/tasks complete",
|
|
60
|
+
nextAction: "Review knowledge or start a new plan",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function chooseCurrentFocus(input) {
|
|
64
|
+
const inProgressPlans = input.plans.filter((plan) => plan.status === "in_progress");
|
|
65
|
+
if (inProgressPlans.length > 0) {
|
|
66
|
+
const sorted = [...inProgressPlans].sort((a, b) => {
|
|
67
|
+
const aTime = safeTime(a.updatedAt);
|
|
68
|
+
const bTime = safeTime(b.updatedAt);
|
|
69
|
+
return bTime - aTime;
|
|
70
|
+
});
|
|
71
|
+
return { kind: "plan", label: sorted[0]?.title ?? "Unknown plan" };
|
|
72
|
+
}
|
|
73
|
+
if (input.inProgressTasks.length > 0) {
|
|
74
|
+
return {
|
|
75
|
+
kind: "task",
|
|
76
|
+
label: stripTaskCheckbox(input.inProgressTasks[0] ?? ""),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (input.backlogTasks.length > 0) {
|
|
80
|
+
return {
|
|
81
|
+
kind: "task",
|
|
82
|
+
label: stripTaskCheckbox(input.backlogTasks[0] ?? ""),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return { kind: "none", label: "None" };
|
|
86
|
+
}
|
|
87
|
+
export function recommendSurface(input) {
|
|
88
|
+
if (input.hasDurableKnowledgeSignal) {
|
|
89
|
+
return {
|
|
90
|
+
surface: "memory",
|
|
91
|
+
why: "This should outlive the current task and be reusable later.",
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (input.hasPlanSignals) {
|
|
95
|
+
return {
|
|
96
|
+
surface: "plan",
|
|
97
|
+
why: "This work spans multiple steps and needs durable planning context.",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
surface: "queue",
|
|
102
|
+
why: "This is best tracked as immediate execution state.",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function safeTime(value) {
|
|
106
|
+
if (!value)
|
|
107
|
+
return Number.NEGATIVE_INFINITY;
|
|
108
|
+
const parsed = new Date(value).getTime();
|
|
109
|
+
return Number.isFinite(parsed) ? parsed : Number.NEGATIVE_INFINITY;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=workflow-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-policy.js","sourceRoot":"","sources":["../../src/utils/workflow-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path-segment-aware workspace matching for project context resolution.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalize a workspace path: strip trailing slashes (preserving root "/").
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeWorkspacePath(p: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Check if `queryPath` is inside (or equal to) `storedPath`.
|
|
10
|
+
* Uses path-segment-aware comparison to prevent "/Users/ryan" matching "/Users/ryan.ryn".
|
|
11
|
+
*/
|
|
12
|
+
export declare function matchWorkspace(queryPath: string, storedPath: string): boolean;
|
|
13
|
+
export interface WorkspaceProject {
|
|
14
|
+
slug: string;
|
|
15
|
+
workspacePaths: string[];
|
|
16
|
+
}
|
|
17
|
+
/** Discriminated union result for findBestMatch. */
|
|
18
|
+
export type FindMatchResult = {
|
|
19
|
+
kind: "match";
|
|
20
|
+
slug: string;
|
|
21
|
+
matchedPath: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "none";
|
|
24
|
+
} | {
|
|
25
|
+
kind: "ambiguous";
|
|
26
|
+
slugs: string[];
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Find the best matching project for a query path.
|
|
30
|
+
* Returns the project with the longest matching workspace path (most specific).
|
|
31
|
+
* Returns { kind: "none" } if no match, { kind: "ambiguous", slugs } if multiple
|
|
32
|
+
* projects match at the same prefix length.
|
|
33
|
+
*/
|
|
34
|
+
export declare function findBestMatch(queryPath: string, projects: WorkspaceProject[]): FindMatchResult;
|
|
35
|
+
//# sourceMappingURL=workspace-match.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-match.d.ts","sourceRoot":"","sources":["../../src/utils/workspace-match.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAI7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,oDAAoD;AACpD,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,eAAe,CAiC9F"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path-segment-aware workspace matching for project context resolution.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalize a workspace path: strip trailing slashes (preserving root "/").
|
|
6
|
+
*/
|
|
7
|
+
export function normalizeWorkspacePath(p) {
|
|
8
|
+
if (p === "/")
|
|
9
|
+
return p;
|
|
10
|
+
return p.replace(/\/+$/, "");
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if `queryPath` is inside (or equal to) `storedPath`.
|
|
14
|
+
* Uses path-segment-aware comparison to prevent "/Users/ryan" matching "/Users/ryan.ryn".
|
|
15
|
+
*/
|
|
16
|
+
export function matchWorkspace(queryPath, storedPath) {
|
|
17
|
+
const q = normalizeWorkspacePath(queryPath);
|
|
18
|
+
const s = normalizeWorkspacePath(storedPath);
|
|
19
|
+
return q === s || q.startsWith(`${s}/`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Find the best matching project for a query path.
|
|
23
|
+
* Returns the project with the longest matching workspace path (most specific).
|
|
24
|
+
* Returns { kind: "none" } if no match, { kind: "ambiguous", slugs } if multiple
|
|
25
|
+
* projects match at the same prefix length.
|
|
26
|
+
*/
|
|
27
|
+
export function findBestMatch(queryPath, projects) {
|
|
28
|
+
let bestLength = -1;
|
|
29
|
+
let bestSlug = null;
|
|
30
|
+
let bestPath = null;
|
|
31
|
+
let ambiguousSlugs = [];
|
|
32
|
+
for (const project of projects) {
|
|
33
|
+
for (const wp of project.workspacePaths) {
|
|
34
|
+
if (matchWorkspace(queryPath, wp)) {
|
|
35
|
+
const normalized = normalizeWorkspacePath(wp);
|
|
36
|
+
if (normalized.length > bestLength) {
|
|
37
|
+
bestLength = normalized.length;
|
|
38
|
+
bestSlug = project.slug;
|
|
39
|
+
bestPath = normalized;
|
|
40
|
+
ambiguousSlugs = [project.slug];
|
|
41
|
+
}
|
|
42
|
+
else if (normalized.length === bestLength && project.slug !== bestSlug) {
|
|
43
|
+
if (!ambiguousSlugs.includes(project.slug)) {
|
|
44
|
+
ambiguousSlugs.push(project.slug);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (bestSlug === null || bestPath === null) {
|
|
51
|
+
return { kind: "none" };
|
|
52
|
+
}
|
|
53
|
+
if (ambiguousSlugs.length > 1) {
|
|
54
|
+
return { kind: "ambiguous", slugs: ambiguousSlugs };
|
|
55
|
+
}
|
|
56
|
+
return { kind: "match", slug: bestSlug, matchedPath: bestPath };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=workspace-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-match.js","sourceRoot":"","sources":["../../src/utils/workspace-match.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,CAAS;IAC9C,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,MAAM,CAAC,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,QAA4B;IAC3E,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IACpB,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,cAAc,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACxC,IAAI,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBAC9C,IAAI,UAAU,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;oBACnC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;oBAC/B,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;oBACxB,QAAQ,GAAG,UAAU,CAAC;oBACtB,cAAc,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;qBAAM,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACzE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3C,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAClE,CAAC"}
|