@soleri/core 2.1.0 → 2.5.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/dist/brain/brain.d.ts +10 -1
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +116 -13
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/intelligence.d.ts +36 -1
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +119 -14
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +34 -2
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/cognee/client.d.ts +3 -0
- package/dist/cognee/client.d.ts.map +1 -1
- package/dist/cognee/client.js +17 -0
- package/dist/cognee/client.js.map +1 -1
- package/dist/cognee/sync-manager.d.ts +94 -0
- package/dist/cognee/sync-manager.d.ts.map +1 -0
- package/dist/cognee/sync-manager.js +293 -0
- package/dist/cognee/sync-manager.js.map +1 -0
- package/dist/control/identity-manager.d.ts +22 -0
- package/dist/control/identity-manager.d.ts.map +1 -0
- package/dist/control/identity-manager.js +233 -0
- package/dist/control/identity-manager.js.map +1 -0
- package/dist/control/intent-router.d.ts +32 -0
- package/dist/control/intent-router.d.ts.map +1 -0
- package/dist/control/intent-router.js +242 -0
- package/dist/control/intent-router.js.map +1 -0
- package/dist/control/types.d.ts +68 -0
- package/dist/control/types.d.ts.map +1 -0
- package/dist/control/types.js +9 -0
- package/dist/control/types.js.map +1 -0
- package/dist/curator/curator.d.ts +37 -1
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +199 -1
- package/dist/curator/curator.js.map +1 -1
- package/dist/errors/classify.d.ts +13 -0
- package/dist/errors/classify.d.ts.map +1 -0
- package/dist/errors/classify.js +97 -0
- package/dist/errors/classify.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/retry.d.ts +40 -0
- package/dist/errors/retry.d.ts.map +1 -0
- package/dist/errors/retry.js +97 -0
- package/dist/errors/retry.js.map +1 -0
- package/dist/errors/types.d.ts +48 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/errors/types.js +59 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/facades/types.d.ts +1 -1
- package/dist/governance/governance.d.ts +42 -0
- package/dist/governance/governance.d.ts.map +1 -0
- package/dist/governance/governance.js +488 -0
- package/dist/governance/governance.js.map +1 -0
- package/dist/governance/index.d.ts +3 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +2 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/types.d.ts +102 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/governance/types.js +3 -0
- package/dist/governance/types.js.map +1 -0
- package/dist/index.d.ts +52 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -1
- package/dist/index.js.map +1 -1
- package/dist/intake/content-classifier.d.ts +14 -0
- package/dist/intake/content-classifier.d.ts.map +1 -0
- package/dist/intake/content-classifier.js +125 -0
- package/dist/intake/content-classifier.js.map +1 -0
- package/dist/intake/dedup-gate.d.ts +17 -0
- package/dist/intake/dedup-gate.d.ts.map +1 -0
- package/dist/intake/dedup-gate.js +66 -0
- package/dist/intake/dedup-gate.js.map +1 -0
- package/dist/intake/intake-pipeline.d.ts +63 -0
- package/dist/intake/intake-pipeline.d.ts.map +1 -0
- package/dist/intake/intake-pipeline.js +373 -0
- package/dist/intake/intake-pipeline.js.map +1 -0
- package/dist/intake/types.d.ts +65 -0
- package/dist/intake/types.d.ts.map +1 -0
- package/dist/intake/types.js +3 -0
- package/dist/intake/types.js.map +1 -0
- package/dist/intelligence/loader.js +1 -1
- package/dist/intelligence/loader.js.map +1 -1
- package/dist/intelligence/types.d.ts +3 -1
- package/dist/intelligence/types.d.ts.map +1 -1
- package/dist/logging/logger.d.ts +37 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +145 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/types.d.ts +19 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +2 -0
- package/dist/logging/types.js.map +1 -0
- package/dist/loop/loop-manager.d.ts +100 -0
- package/dist/loop/loop-manager.d.ts.map +1 -0
- package/dist/loop/loop-manager.js +379 -0
- package/dist/loop/loop-manager.js.map +1 -0
- package/dist/loop/types.d.ts +103 -0
- package/dist/loop/types.d.ts.map +1 -0
- package/dist/loop/types.js +11 -0
- package/dist/loop/types.js.map +1 -0
- package/dist/persistence/index.d.ts +3 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +2 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/sqlite-provider.d.ts +25 -0
- package/dist/persistence/sqlite-provider.d.ts.map +1 -0
- package/dist/persistence/sqlite-provider.js +59 -0
- package/dist/persistence/sqlite-provider.js.map +1 -0
- package/dist/persistence/types.d.ts +36 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +8 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/planning/gap-analysis.d.ts +72 -0
- package/dist/planning/gap-analysis.d.ts.map +1 -0
- package/dist/planning/gap-analysis.js +442 -0
- package/dist/planning/gap-analysis.js.map +1 -0
- package/dist/planning/gap-types.d.ts +29 -0
- package/dist/planning/gap-types.d.ts.map +1 -0
- package/dist/planning/gap-types.js +28 -0
- package/dist/planning/gap-types.js.map +1 -0
- package/dist/planning/planner.d.ts +421 -4
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +949 -21
- package/dist/planning/planner.js.map +1 -1
- package/dist/playbooks/generic/brainstorming.d.ts +9 -0
- package/dist/playbooks/generic/brainstorming.d.ts.map +1 -0
- package/dist/playbooks/generic/brainstorming.js +105 -0
- package/dist/playbooks/generic/brainstorming.js.map +1 -0
- package/dist/playbooks/generic/code-review.d.ts +11 -0
- package/dist/playbooks/generic/code-review.d.ts.map +1 -0
- package/dist/playbooks/generic/code-review.js +176 -0
- package/dist/playbooks/generic/code-review.js.map +1 -0
- package/dist/playbooks/generic/subagent-execution.d.ts +9 -0
- package/dist/playbooks/generic/subagent-execution.d.ts.map +1 -0
- package/dist/playbooks/generic/subagent-execution.js +68 -0
- package/dist/playbooks/generic/subagent-execution.js.map +1 -0
- package/dist/playbooks/generic/systematic-debugging.d.ts +9 -0
- package/dist/playbooks/generic/systematic-debugging.d.ts.map +1 -0
- package/dist/playbooks/generic/systematic-debugging.js +87 -0
- package/dist/playbooks/generic/systematic-debugging.js.map +1 -0
- package/dist/playbooks/generic/tdd.d.ts +9 -0
- package/dist/playbooks/generic/tdd.d.ts.map +1 -0
- package/dist/playbooks/generic/tdd.js +70 -0
- package/dist/playbooks/generic/tdd.js.map +1 -0
- package/dist/playbooks/generic/verification.d.ts +9 -0
- package/dist/playbooks/generic/verification.d.ts.map +1 -0
- package/dist/playbooks/generic/verification.js +74 -0
- package/dist/playbooks/generic/verification.js.map +1 -0
- package/dist/playbooks/index.d.ts +4 -0
- package/dist/playbooks/index.d.ts.map +1 -0
- package/dist/playbooks/index.js +5 -0
- package/dist/playbooks/index.js.map +1 -0
- package/dist/playbooks/playbook-registry.d.ts +42 -0
- package/dist/playbooks/playbook-registry.d.ts.map +1 -0
- package/dist/playbooks/playbook-registry.js +227 -0
- package/dist/playbooks/playbook-registry.js.map +1 -0
- package/dist/playbooks/playbook-seeder.d.ts +47 -0
- package/dist/playbooks/playbook-seeder.d.ts.map +1 -0
- package/dist/playbooks/playbook-seeder.js +104 -0
- package/dist/playbooks/playbook-seeder.js.map +1 -0
- package/dist/playbooks/playbook-types.d.ts +132 -0
- package/dist/playbooks/playbook-types.d.ts.map +1 -0
- package/dist/playbooks/playbook-types.js +12 -0
- package/dist/playbooks/playbook-types.js.map +1 -0
- package/dist/project/project-registry.d.ts +79 -0
- package/dist/project/project-registry.d.ts.map +1 -0
- package/dist/project/project-registry.js +274 -0
- package/dist/project/project-registry.js.map +1 -0
- package/dist/project/types.d.ts +28 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +5 -0
- package/dist/project/types.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +3 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/parser.d.ts +17 -0
- package/dist/prompts/parser.d.ts.map +1 -0
- package/dist/prompts/parser.js +47 -0
- package/dist/prompts/parser.js.map +1 -0
- package/dist/prompts/template-manager.d.ts +25 -0
- package/dist/prompts/template-manager.d.ts.map +1 -0
- package/dist/prompts/template-manager.js +71 -0
- package/dist/prompts/template-manager.js.map +1 -0
- package/dist/prompts/types.d.ts +26 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +5 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/runtime/admin-extra-ops.d.ts +15 -0
- package/dist/runtime/admin-extra-ops.d.ts.map +1 -0
- package/dist/runtime/admin-extra-ops.js +595 -0
- package/dist/runtime/admin-extra-ops.js.map +1 -0
- package/dist/runtime/admin-ops.d.ts +15 -0
- package/dist/runtime/admin-ops.d.ts.map +1 -0
- package/dist/runtime/admin-ops.js +329 -0
- package/dist/runtime/admin-ops.js.map +1 -0
- package/dist/runtime/capture-ops.d.ts +15 -0
- package/dist/runtime/capture-ops.d.ts.map +1 -0
- package/dist/runtime/capture-ops.js +363 -0
- package/dist/runtime/capture-ops.js.map +1 -0
- package/dist/runtime/cognee-sync-ops.d.ts +12 -0
- package/dist/runtime/cognee-sync-ops.d.ts.map +1 -0
- package/dist/runtime/cognee-sync-ops.js +55 -0
- package/dist/runtime/cognee-sync-ops.js.map +1 -0
- package/dist/runtime/core-ops.d.ts +9 -3
- package/dist/runtime/core-ops.d.ts.map +1 -1
- package/dist/runtime/core-ops.js +693 -10
- package/dist/runtime/core-ops.js.map +1 -1
- package/dist/runtime/curator-extra-ops.d.ts +9 -0
- package/dist/runtime/curator-extra-ops.d.ts.map +1 -0
- package/dist/runtime/curator-extra-ops.js +71 -0
- package/dist/runtime/curator-extra-ops.js.map +1 -0
- package/dist/runtime/domain-ops.d.ts.map +1 -1
- package/dist/runtime/domain-ops.js +61 -15
- package/dist/runtime/domain-ops.js.map +1 -1
- package/dist/runtime/grading-ops.d.ts +14 -0
- package/dist/runtime/grading-ops.d.ts.map +1 -0
- package/dist/runtime/grading-ops.js +105 -0
- package/dist/runtime/grading-ops.js.map +1 -0
- package/dist/runtime/intake-ops.d.ts +14 -0
- package/dist/runtime/intake-ops.d.ts.map +1 -0
- package/dist/runtime/intake-ops.js +110 -0
- package/dist/runtime/intake-ops.js.map +1 -0
- package/dist/runtime/loop-ops.d.ts +14 -0
- package/dist/runtime/loop-ops.d.ts.map +1 -0
- package/dist/runtime/loop-ops.js +251 -0
- package/dist/runtime/loop-ops.js.map +1 -0
- package/dist/runtime/memory-cross-project-ops.d.ts +12 -0
- package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -0
- package/dist/runtime/memory-cross-project-ops.js +165 -0
- package/dist/runtime/memory-cross-project-ops.js.map +1 -0
- package/dist/runtime/memory-extra-ops.d.ts +13 -0
- package/dist/runtime/memory-extra-ops.d.ts.map +1 -0
- package/dist/runtime/memory-extra-ops.js +173 -0
- package/dist/runtime/memory-extra-ops.js.map +1 -0
- package/dist/runtime/orchestrate-ops.d.ts +17 -0
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -0
- package/dist/runtime/orchestrate-ops.js +246 -0
- package/dist/runtime/orchestrate-ops.js.map +1 -0
- package/dist/runtime/planning-extra-ops.d.ts +25 -0
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -0
- package/dist/runtime/planning-extra-ops.js +663 -0
- package/dist/runtime/planning-extra-ops.js.map +1 -0
- package/dist/runtime/playbook-ops.d.ts +14 -0
- package/dist/runtime/playbook-ops.d.ts.map +1 -0
- package/dist/runtime/playbook-ops.js +141 -0
- package/dist/runtime/playbook-ops.js.map +1 -0
- package/dist/runtime/project-ops.d.ts +15 -0
- package/dist/runtime/project-ops.d.ts.map +1 -0
- package/dist/runtime/project-ops.js +186 -0
- package/dist/runtime/project-ops.js.map +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +65 -3
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +29 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.d.ts +10 -0
- package/dist/runtime/vault-extra-ops.d.ts.map +1 -0
- package/dist/runtime/vault-extra-ops.js +536 -0
- package/dist/runtime/vault-extra-ops.js.map +1 -0
- package/dist/telemetry/telemetry.d.ts +48 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -0
- package/dist/telemetry/telemetry.js +87 -0
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/vault/playbook.d.ts +34 -0
- package/dist/vault/playbook.d.ts.map +1 -0
- package/dist/vault/playbook.js +60 -0
- package/dist/vault/playbook.js.map +1 -0
- package/dist/vault/vault.d.ts +97 -4
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +424 -65
- package/dist/vault/vault.js.map +1 -1
- package/package.json +7 -3
- package/src/__tests__/admin-extra-ops.test.ts +467 -0
- package/src/__tests__/admin-ops.test.ts +271 -0
- package/src/__tests__/brain-intelligence.test.ts +205 -0
- package/src/__tests__/brain.test.ts +134 -3
- package/src/__tests__/capture-ops.test.ts +509 -0
- package/src/__tests__/cognee-integration.test.ts +80 -0
- package/src/__tests__/cognee-sync-manager.test.ts +103 -0
- package/src/__tests__/core-ops.test.ts +292 -2
- package/src/__tests__/curator-extra-ops.test.ts +381 -0
- package/src/__tests__/domain-ops.test.ts +66 -0
- package/src/__tests__/errors.test.ts +388 -0
- package/src/__tests__/governance.test.ts +522 -0
- package/src/__tests__/grading-ops.test.ts +361 -0
- package/src/__tests__/identity-manager.test.ts +243 -0
- package/src/__tests__/intake-pipeline.test.ts +162 -0
- package/src/__tests__/intent-router.test.ts +222 -0
- package/src/__tests__/logger.test.ts +200 -0
- package/src/__tests__/loop-ops.test.ts +469 -0
- package/src/__tests__/memory-cross-project-ops.test.ts +248 -0
- package/src/__tests__/memory-extra-ops.test.ts +352 -0
- package/src/__tests__/orchestrate-ops.test.ts +289 -0
- package/src/__tests__/persistence.test.ts +225 -0
- package/src/__tests__/planner.test.ts +416 -7
- package/src/__tests__/planning-extra-ops.test.ts +706 -0
- package/src/__tests__/playbook-registry.test.ts +326 -0
- package/src/__tests__/playbook-seeder.test.ts +163 -0
- package/src/__tests__/playbook.test.ts +389 -0
- package/src/__tests__/project-ops.test.ts +381 -0
- package/src/__tests__/template-manager.test.ts +222 -0
- package/src/__tests__/vault-extra-ops.test.ts +482 -0
- package/src/brain/brain.ts +185 -16
- package/src/brain/intelligence.ts +179 -10
- package/src/brain/types.ts +40 -2
- package/src/cognee/client.ts +18 -0
- package/src/cognee/sync-manager.ts +389 -0
- package/src/control/identity-manager.ts +354 -0
- package/src/control/intent-router.ts +326 -0
- package/src/control/types.ts +102 -0
- package/src/curator/curator.ts +295 -1
- package/src/errors/classify.ts +102 -0
- package/src/errors/index.ts +5 -0
- package/src/errors/retry.ts +132 -0
- package/src/errors/types.ts +81 -0
- package/src/governance/governance.ts +698 -0
- package/src/governance/index.ts +18 -0
- package/src/governance/types.ts +111 -0
- package/src/index.ts +213 -2
- package/src/intake/content-classifier.ts +146 -0
- package/src/intake/dedup-gate.ts +92 -0
- package/src/intake/intake-pipeline.ts +503 -0
- package/src/intake/types.ts +69 -0
- package/src/intelligence/loader.ts +1 -1
- package/src/intelligence/types.ts +3 -1
- package/src/logging/logger.ts +154 -0
- package/src/logging/types.ts +21 -0
- package/src/loop/loop-manager.ts +448 -0
- package/src/loop/types.ts +115 -0
- package/src/persistence/index.ts +7 -0
- package/src/persistence/sqlite-provider.ts +62 -0
- package/src/persistence/types.ts +44 -0
- package/src/planning/gap-analysis.ts +775 -0
- package/src/planning/gap-types.ts +61 -0
- package/src/planning/planner.ts +1273 -24
- package/src/playbooks/generic/brainstorming.ts +110 -0
- package/src/playbooks/generic/code-review.ts +181 -0
- package/src/playbooks/generic/subagent-execution.ts +74 -0
- package/src/playbooks/generic/systematic-debugging.ts +92 -0
- package/src/playbooks/generic/tdd.ts +75 -0
- package/src/playbooks/generic/verification.ts +79 -0
- package/src/playbooks/index.ts +27 -0
- package/src/playbooks/playbook-registry.ts +284 -0
- package/src/playbooks/playbook-seeder.ts +119 -0
- package/src/playbooks/playbook-types.ts +162 -0
- package/src/project/project-registry.ts +370 -0
- package/src/project/types.ts +31 -0
- package/src/prompts/index.ts +3 -0
- package/src/prompts/parser.ts +59 -0
- package/src/prompts/template-manager.ts +77 -0
- package/src/prompts/types.ts +28 -0
- package/src/runtime/admin-extra-ops.ts +652 -0
- package/src/runtime/admin-ops.ts +340 -0
- package/src/runtime/capture-ops.ts +404 -0
- package/src/runtime/cognee-sync-ops.ts +63 -0
- package/src/runtime/core-ops.ts +787 -9
- package/src/runtime/curator-extra-ops.ts +85 -0
- package/src/runtime/domain-ops.ts +67 -15
- package/src/runtime/grading-ops.ts +130 -0
- package/src/runtime/intake-ops.ts +126 -0
- package/src/runtime/loop-ops.ts +277 -0
- package/src/runtime/memory-cross-project-ops.ts +191 -0
- package/src/runtime/memory-extra-ops.ts +186 -0
- package/src/runtime/orchestrate-ops.ts +278 -0
- package/src/runtime/planning-extra-ops.ts +718 -0
- package/src/runtime/playbook-ops.ts +169 -0
- package/src/runtime/project-ops.ts +202 -0
- package/src/runtime/runtime.ts +77 -3
- package/src/runtime/types.ts +29 -0
- package/src/runtime/vault-extra-ops.ts +606 -0
- package/src/telemetry/telemetry.ts +118 -0
- package/src/vault/playbook.ts +87 -0
- package/src/vault/vault.ts +575 -98
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbook Type System
|
|
3
|
+
*
|
|
4
|
+
* Two-tier playbook architecture ported from Salvador:
|
|
5
|
+
* - Generic playbooks: process discipline (TDD, brainstorming, debugging, etc.)
|
|
6
|
+
* - Domain playbooks: agent-specific workflows that extend generics
|
|
7
|
+
*
|
|
8
|
+
* Playbooks compose at plan creation time via the `extends` relationship.
|
|
9
|
+
* Generic provides the rhythm, domain fills in domain-specific beats.
|
|
10
|
+
*/
|
|
11
|
+
export type PlaybookTier = 'generic' | 'domain';
|
|
12
|
+
export type PlaybookIntent = 'BUILD' | 'FIX' | 'REVIEW' | 'PLAN' | 'IMPROVE' | 'DELIVER';
|
|
13
|
+
/**
|
|
14
|
+
* A structured brainstorming section returned by the brainstorm op.
|
|
15
|
+
* The LLM uses these to guide design conversation with the user.
|
|
16
|
+
*/
|
|
17
|
+
export interface BrainstormSection {
|
|
18
|
+
/** Section title (e.g., "Component API", "Color Requirements") */
|
|
19
|
+
title: string;
|
|
20
|
+
/** What this section covers */
|
|
21
|
+
description: string;
|
|
22
|
+
/** Guiding questions for the user */
|
|
23
|
+
questions: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A gate that must be satisfied at a given lifecycle phase.
|
|
27
|
+
* Gates inject checkId requirements into the planning lifecycle.
|
|
28
|
+
*/
|
|
29
|
+
export interface PlaybookGate {
|
|
30
|
+
/** Which lifecycle phase this gate applies to */
|
|
31
|
+
phase: 'brainstorming' | 'pre-execution' | 'post-task' | 'completion';
|
|
32
|
+
/** Human-readable requirement description */
|
|
33
|
+
requirement: string;
|
|
34
|
+
/** Check type to create/validate */
|
|
35
|
+
checkType: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A task template that the playbook injects into generated plans.
|
|
39
|
+
* These become PlanTask entries during task splitting.
|
|
40
|
+
*/
|
|
41
|
+
export interface PlaybookTaskTemplate {
|
|
42
|
+
/** Task type for the generated task */
|
|
43
|
+
taskType: 'implementation' | 'test' | 'story' | 'documentation' | 'verification';
|
|
44
|
+
/** Title template — may contain {objective} placeholder */
|
|
45
|
+
titleTemplate: string;
|
|
46
|
+
/** Acceptance criteria injected into the task */
|
|
47
|
+
acceptanceCriteria: string[];
|
|
48
|
+
/** Tools relevant to this task */
|
|
49
|
+
tools: string[];
|
|
50
|
+
/** When this task should execute relative to implementation */
|
|
51
|
+
order: 'before-implementation' | 'after-implementation' | 'parallel';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Complete playbook definition — the core data type.
|
|
55
|
+
* Playbooks are pure data objects with no logic.
|
|
56
|
+
*/
|
|
57
|
+
export interface PlaybookDefinition {
|
|
58
|
+
/** Unique identifier (e.g., 'generic-tdd', 'domain-component-build') */
|
|
59
|
+
id: string;
|
|
60
|
+
/** Which tier this playbook belongs to */
|
|
61
|
+
tier: PlaybookTier;
|
|
62
|
+
/** Human-readable title */
|
|
63
|
+
title: string;
|
|
64
|
+
/** When to activate — maps to vault entry 'context' field */
|
|
65
|
+
trigger: string;
|
|
66
|
+
/** Overview of what this playbook does — maps to vault 'description' field */
|
|
67
|
+
description: string;
|
|
68
|
+
/** Step-by-step process — maps to vault 'example' field */
|
|
69
|
+
steps: string;
|
|
70
|
+
/** What success looks like — maps to vault 'why' field */
|
|
71
|
+
expectedOutcome: string;
|
|
72
|
+
/** ID of generic playbook this extends (domain playbooks only) */
|
|
73
|
+
extends?: string;
|
|
74
|
+
/** Free string category (agents define their own domains) */
|
|
75
|
+
category: string;
|
|
76
|
+
/** Searchable tags */
|
|
77
|
+
tags: string[];
|
|
78
|
+
/** Intents that trigger this playbook */
|
|
79
|
+
matchIntents: PlaybookIntent[];
|
|
80
|
+
/** Keywords in plan objective/scope that trigger this playbook */
|
|
81
|
+
matchKeywords: string[];
|
|
82
|
+
/** Brainstorming sections for design exploration (used by brainstorm op) */
|
|
83
|
+
brainstormSections?: BrainstormSection[];
|
|
84
|
+
/** Lifecycle gates to enforce */
|
|
85
|
+
gates: PlaybookGate[];
|
|
86
|
+
/** Task templates to inject during task generation */
|
|
87
|
+
taskTemplates: PlaybookTaskTemplate[];
|
|
88
|
+
/** Generic op names to auto-inject into tool chain (not agent-prefixed) */
|
|
89
|
+
toolInjections: string[];
|
|
90
|
+
/** Verification criteria for completion gate */
|
|
91
|
+
verificationCriteria: string[];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Result of matching and merging a generic + domain playbook pair.
|
|
95
|
+
* This is the shape that plan-handler receives after playbook resolution.
|
|
96
|
+
*/
|
|
97
|
+
export interface MergedPlaybook {
|
|
98
|
+
/** The generic playbook (if matched) */
|
|
99
|
+
generic?: PlaybookDefinition;
|
|
100
|
+
/** The domain playbook (if matched) */
|
|
101
|
+
domain?: PlaybookDefinition;
|
|
102
|
+
/** Combined gates from both tiers (generic first, then domain) */
|
|
103
|
+
mergedGates: PlaybookGate[];
|
|
104
|
+
/** Combined task templates (domain overrides generic where order conflicts) */
|
|
105
|
+
mergedTasks: PlaybookTaskTemplate[];
|
|
106
|
+
/** Combined tool injections (deduplicated) */
|
|
107
|
+
mergedTools: string[];
|
|
108
|
+
/** Combined verification criteria */
|
|
109
|
+
mergedVerification: string[];
|
|
110
|
+
/** Human-readable label for the matched playbook(s) */
|
|
111
|
+
label: string;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Result of playbook matching — includes the source of each match.
|
|
115
|
+
*/
|
|
116
|
+
export interface PlaybookMatchResult {
|
|
117
|
+
/** The merged playbook (null if no match) */
|
|
118
|
+
playbook: MergedPlaybook | null;
|
|
119
|
+
/** Which generic matched and why */
|
|
120
|
+
genericMatch?: {
|
|
121
|
+
id: string;
|
|
122
|
+
source: 'vault' | 'builtin';
|
|
123
|
+
score: number;
|
|
124
|
+
};
|
|
125
|
+
/** Which domain matched and why */
|
|
126
|
+
domainMatch?: {
|
|
127
|
+
id: string;
|
|
128
|
+
source: 'vault' | 'builtin';
|
|
129
|
+
score: number;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=playbook-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-types.d.ts","sourceRoot":"","sources":["../../src/playbooks/playbook-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbook Type System
|
|
3
|
+
*
|
|
4
|
+
* Two-tier playbook architecture ported from Salvador:
|
|
5
|
+
* - Generic playbooks: process discipline (TDD, brainstorming, debugging, etc.)
|
|
6
|
+
* - Domain playbooks: agent-specific workflows that extend generics
|
|
7
|
+
*
|
|
8
|
+
* Playbooks compose at plan creation time via the `extends` relationship.
|
|
9
|
+
* Generic provides the rhythm, domain fills in domain-specific beats.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=playbook-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-types.js","sourceRoot":"","sources":["../../src/playbooks/playbook-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Registry — SQLite-backed registry for tracking projects,
|
|
3
|
+
* rules, and cross-project links.
|
|
4
|
+
*
|
|
5
|
+
* Uses the Vault's underlying SQLite database via `vault.getDb()`.
|
|
6
|
+
* Tables are created lazily on first access.
|
|
7
|
+
*/
|
|
8
|
+
import type Database from 'better-sqlite3';
|
|
9
|
+
import type { RegisteredProject, ProjectRule, ProjectLink, LinkType } from './types.js';
|
|
10
|
+
export declare class ProjectRegistry {
|
|
11
|
+
private db;
|
|
12
|
+
constructor(db: Database.Database);
|
|
13
|
+
private initTables;
|
|
14
|
+
/**
|
|
15
|
+
* Register (upsert) a project. Updates lastAccessedAt on re-register.
|
|
16
|
+
*/
|
|
17
|
+
register(path: string, name?: string, metadata?: Record<string, unknown>): RegisteredProject;
|
|
18
|
+
/**
|
|
19
|
+
* Get a project by ID.
|
|
20
|
+
*/
|
|
21
|
+
get(projectId: string): RegisteredProject | null;
|
|
22
|
+
/**
|
|
23
|
+
* Get a project by its filesystem path.
|
|
24
|
+
*/
|
|
25
|
+
getByPath(path: string): RegisteredProject | null;
|
|
26
|
+
/**
|
|
27
|
+
* List all registered projects.
|
|
28
|
+
*/
|
|
29
|
+
list(): RegisteredProject[];
|
|
30
|
+
/**
|
|
31
|
+
* Unregister a project by ID. Also removes associated rules and links.
|
|
32
|
+
*/
|
|
33
|
+
unregister(projectId: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Update the lastAccessedAt timestamp for a project.
|
|
36
|
+
*/
|
|
37
|
+
touch(projectId: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Add a rule to a project.
|
|
40
|
+
*/
|
|
41
|
+
addRule(projectId: string, rule: Omit<ProjectRule, 'id' | 'projectId' | 'createdAt'>): ProjectRule;
|
|
42
|
+
/**
|
|
43
|
+
* Get all rules for a project.
|
|
44
|
+
*/
|
|
45
|
+
getRules(projectId: string): ProjectRule[];
|
|
46
|
+
/**
|
|
47
|
+
* Remove a rule by ID.
|
|
48
|
+
*/
|
|
49
|
+
removeRule(ruleId: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* List all projects with their rules.
|
|
52
|
+
*/
|
|
53
|
+
listRulesAll(): Array<{
|
|
54
|
+
project: RegisteredProject;
|
|
55
|
+
rules: ProjectRule[];
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* Link two projects.
|
|
59
|
+
*/
|
|
60
|
+
link(sourceId: string, targetId: string, linkType: LinkType): ProjectLink;
|
|
61
|
+
/**
|
|
62
|
+
* Unlink two projects. If linkType is omitted, removes all links between them.
|
|
63
|
+
* Returns count of links removed.
|
|
64
|
+
*/
|
|
65
|
+
unlink(sourceId: string, targetId: string, linkType?: LinkType): number;
|
|
66
|
+
/**
|
|
67
|
+
* Get all links for a project (both outgoing and incoming).
|
|
68
|
+
*/
|
|
69
|
+
getLinks(projectId: string): ProjectLink[];
|
|
70
|
+
/**
|
|
71
|
+
* Get linked projects with details — returns project info, link type, and direction.
|
|
72
|
+
*/
|
|
73
|
+
getLinkedProjects(projectId: string): Array<{
|
|
74
|
+
project: RegisteredProject;
|
|
75
|
+
linkType: LinkType;
|
|
76
|
+
direction: 'outgoing' | 'incoming';
|
|
77
|
+
}>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=project-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-registry.d.ts","sourceRoot":"","sources":["../../src/project/project-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0ExF,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAKjC,OAAO,CAAC,UAAU;IAgClB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB;IA0C5F;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAOhD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAOjD;;OAEG;IACH,IAAI,IAAI,iBAAiB,EAAE;IAO3B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAatC;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACxD,WAAW;IAmBd;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAS1C;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAInC;;OAEG;IACH,YAAY,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAU3E;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW;IA2BzE;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM;IAavE;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAS1C;;OAEG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,GAChB,KAAK,CAAC;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAC;QAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAAA;KAAE,CAAC;CAuBjG"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Registry — SQLite-backed registry for tracking projects,
|
|
3
|
+
* rules, and cross-project links.
|
|
4
|
+
*
|
|
5
|
+
* Uses the Vault's underlying SQLite database via `vault.getDb()`.
|
|
6
|
+
* Tables are created lazily on first access.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Generate a deterministic project ID from a filesystem path.
|
|
10
|
+
*/
|
|
11
|
+
function pathToId(path) {
|
|
12
|
+
return path
|
|
13
|
+
.replace(/[^a-z0-9]/gi, '-')
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/-+/g, '-')
|
|
16
|
+
.replace(/^-|-$/g, '');
|
|
17
|
+
}
|
|
18
|
+
function rowToProject(row) {
|
|
19
|
+
return {
|
|
20
|
+
id: row.id,
|
|
21
|
+
path: row.path,
|
|
22
|
+
name: row.name ?? undefined,
|
|
23
|
+
registeredAt: row.registered_at,
|
|
24
|
+
lastAccessedAt: row.last_accessed_at,
|
|
25
|
+
metadata: JSON.parse(row.metadata || '{}'),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function rowToRule(row) {
|
|
29
|
+
return {
|
|
30
|
+
id: row.id,
|
|
31
|
+
projectId: row.project_id,
|
|
32
|
+
category: row.category,
|
|
33
|
+
text: row.text,
|
|
34
|
+
priority: row.priority,
|
|
35
|
+
createdAt: row.created_at,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function rowToLink(row) {
|
|
39
|
+
return {
|
|
40
|
+
id: row.id,
|
|
41
|
+
sourceProjectId: row.source_project_id,
|
|
42
|
+
targetProjectId: row.target_project_id,
|
|
43
|
+
linkType: row.link_type,
|
|
44
|
+
createdAt: row.created_at,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export class ProjectRegistry {
|
|
48
|
+
db;
|
|
49
|
+
constructor(db) {
|
|
50
|
+
this.db = db;
|
|
51
|
+
this.initTables();
|
|
52
|
+
}
|
|
53
|
+
initTables() {
|
|
54
|
+
this.db.exec(`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS registered_projects (
|
|
56
|
+
id TEXT PRIMARY KEY,
|
|
57
|
+
path TEXT UNIQUE NOT NULL,
|
|
58
|
+
name TEXT,
|
|
59
|
+
registered_at INTEGER NOT NULL,
|
|
60
|
+
last_accessed_at INTEGER NOT NULL,
|
|
61
|
+
metadata TEXT DEFAULT '{}'
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE TABLE IF NOT EXISTS project_rules (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
project_id TEXT NOT NULL,
|
|
67
|
+
category TEXT NOT NULL,
|
|
68
|
+
text TEXT NOT NULL,
|
|
69
|
+
priority INTEGER DEFAULT 0,
|
|
70
|
+
created_at INTEGER NOT NULL,
|
|
71
|
+
FOREIGN KEY (project_id) REFERENCES registered_projects(id)
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
CREATE TABLE IF NOT EXISTS project_links (
|
|
75
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
76
|
+
source_project_id TEXT NOT NULL,
|
|
77
|
+
target_project_id TEXT NOT NULL,
|
|
78
|
+
link_type TEXT NOT NULL,
|
|
79
|
+
created_at INTEGER NOT NULL,
|
|
80
|
+
UNIQUE(source_project_id, target_project_id, link_type)
|
|
81
|
+
);
|
|
82
|
+
`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Register (upsert) a project. Updates lastAccessedAt on re-register.
|
|
86
|
+
*/
|
|
87
|
+
register(path, name, metadata) {
|
|
88
|
+
const id = pathToId(path);
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
const existing = this.db.prepare('SELECT * FROM registered_projects WHERE id = ?').get(id);
|
|
91
|
+
if (existing) {
|
|
92
|
+
// Update lastAccessedAt, and optionally name/metadata if provided
|
|
93
|
+
const newName = name ?? existing.name;
|
|
94
|
+
const newMetadata = metadata ? JSON.stringify(metadata) : existing.metadata;
|
|
95
|
+
this.db
|
|
96
|
+
.prepare('UPDATE registered_projects SET last_accessed_at = ?, name = ?, metadata = ? WHERE id = ?')
|
|
97
|
+
.run(now, newName, newMetadata, id);
|
|
98
|
+
return rowToProject({
|
|
99
|
+
...existing,
|
|
100
|
+
last_accessed_at: now,
|
|
101
|
+
name: newName,
|
|
102
|
+
metadata: newMetadata,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const row = {
|
|
106
|
+
id,
|
|
107
|
+
path,
|
|
108
|
+
name: name ?? null,
|
|
109
|
+
registered_at: now,
|
|
110
|
+
last_accessed_at: now,
|
|
111
|
+
metadata: JSON.stringify(metadata ?? {}),
|
|
112
|
+
};
|
|
113
|
+
this.db
|
|
114
|
+
.prepare('INSERT INTO registered_projects (id, path, name, registered_at, last_accessed_at, metadata) VALUES (?, ?, ?, ?, ?, ?)')
|
|
115
|
+
.run(row.id, row.path, row.name, row.registered_at, row.last_accessed_at, row.metadata);
|
|
116
|
+
return rowToProject(row);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get a project by ID.
|
|
120
|
+
*/
|
|
121
|
+
get(projectId) {
|
|
122
|
+
const row = this.db.prepare('SELECT * FROM registered_projects WHERE id = ?').get(projectId);
|
|
123
|
+
return row ? rowToProject(row) : null;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get a project by its filesystem path.
|
|
127
|
+
*/
|
|
128
|
+
getByPath(path) {
|
|
129
|
+
const row = this.db.prepare('SELECT * FROM registered_projects WHERE path = ?').get(path);
|
|
130
|
+
return row ? rowToProject(row) : null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* List all registered projects.
|
|
134
|
+
*/
|
|
135
|
+
list() {
|
|
136
|
+
const rows = this.db
|
|
137
|
+
.prepare('SELECT * FROM registered_projects ORDER BY last_accessed_at DESC')
|
|
138
|
+
.all();
|
|
139
|
+
return rows.map(rowToProject);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Unregister a project by ID. Also removes associated rules and links.
|
|
143
|
+
*/
|
|
144
|
+
unregister(projectId) {
|
|
145
|
+
const result = this.db.transaction(() => {
|
|
146
|
+
this.db.prepare('DELETE FROM project_rules WHERE project_id = ?').run(projectId);
|
|
147
|
+
this.db
|
|
148
|
+
.prepare('DELETE FROM project_links WHERE source_project_id = ? OR target_project_id = ?')
|
|
149
|
+
.run(projectId, projectId);
|
|
150
|
+
return (this.db.prepare('DELETE FROM registered_projects WHERE id = ?').run(projectId).changes > 0);
|
|
151
|
+
})();
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Update the lastAccessedAt timestamp for a project.
|
|
156
|
+
*/
|
|
157
|
+
touch(projectId) {
|
|
158
|
+
this.db
|
|
159
|
+
.prepare('UPDATE registered_projects SET last_accessed_at = ? WHERE id = ?')
|
|
160
|
+
.run(Date.now(), projectId);
|
|
161
|
+
}
|
|
162
|
+
// ─── Rules ──────────────────────────────────────────────────────────
|
|
163
|
+
/**
|
|
164
|
+
* Add a rule to a project.
|
|
165
|
+
*/
|
|
166
|
+
addRule(projectId, rule) {
|
|
167
|
+
const id = `rule-${projectId}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
168
|
+
const now = Date.now();
|
|
169
|
+
this.db
|
|
170
|
+
.prepare('INSERT INTO project_rules (id, project_id, category, text, priority, created_at) VALUES (?, ?, ?, ?, ?, ?)')
|
|
171
|
+
.run(id, projectId, rule.category, rule.text, rule.priority, now);
|
|
172
|
+
return {
|
|
173
|
+
id,
|
|
174
|
+
projectId,
|
|
175
|
+
category: rule.category,
|
|
176
|
+
text: rule.text,
|
|
177
|
+
priority: rule.priority,
|
|
178
|
+
createdAt: now,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get all rules for a project.
|
|
183
|
+
*/
|
|
184
|
+
getRules(projectId) {
|
|
185
|
+
const rows = this.db
|
|
186
|
+
.prepare('SELECT * FROM project_rules WHERE project_id = ? ORDER BY priority DESC, created_at ASC')
|
|
187
|
+
.all(projectId);
|
|
188
|
+
return rows.map(rowToRule);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Remove a rule by ID.
|
|
192
|
+
*/
|
|
193
|
+
removeRule(ruleId) {
|
|
194
|
+
return this.db.prepare('DELETE FROM project_rules WHERE id = ?').run(ruleId).changes > 0;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* List all projects with their rules.
|
|
198
|
+
*/
|
|
199
|
+
listRulesAll() {
|
|
200
|
+
const projects = this.list();
|
|
201
|
+
return projects.map((project) => ({
|
|
202
|
+
project,
|
|
203
|
+
rules: this.getRules(project.id),
|
|
204
|
+
}));
|
|
205
|
+
}
|
|
206
|
+
// ─── Links ──────────────────────────────────────────────────────────
|
|
207
|
+
/**
|
|
208
|
+
* Link two projects.
|
|
209
|
+
*/
|
|
210
|
+
link(sourceId, targetId, linkType) {
|
|
211
|
+
const now = Date.now();
|
|
212
|
+
const info = this.db
|
|
213
|
+
.prepare('INSERT OR IGNORE INTO project_links (source_project_id, target_project_id, link_type, created_at) VALUES (?, ?, ?, ?)')
|
|
214
|
+
.run(sourceId, targetId, linkType, now);
|
|
215
|
+
// If insert was ignored (duplicate), fetch existing
|
|
216
|
+
if (info.changes === 0) {
|
|
217
|
+
const existing = this.db
|
|
218
|
+
.prepare('SELECT * FROM project_links WHERE source_project_id = ? AND target_project_id = ? AND link_type = ?')
|
|
219
|
+
.get(sourceId, targetId, linkType);
|
|
220
|
+
return rowToLink(existing);
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
id: Number(info.lastInsertRowid),
|
|
224
|
+
sourceProjectId: sourceId,
|
|
225
|
+
targetProjectId: targetId,
|
|
226
|
+
linkType,
|
|
227
|
+
createdAt: now,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Unlink two projects. If linkType is omitted, removes all links between them.
|
|
232
|
+
* Returns count of links removed.
|
|
233
|
+
*/
|
|
234
|
+
unlink(sourceId, targetId, linkType) {
|
|
235
|
+
if (linkType) {
|
|
236
|
+
return this.db
|
|
237
|
+
.prepare('DELETE FROM project_links WHERE source_project_id = ? AND target_project_id = ? AND link_type = ?')
|
|
238
|
+
.run(sourceId, targetId, linkType).changes;
|
|
239
|
+
}
|
|
240
|
+
return this.db
|
|
241
|
+
.prepare('DELETE FROM project_links WHERE source_project_id = ? AND target_project_id = ?')
|
|
242
|
+
.run(sourceId, targetId).changes;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get all links for a project (both outgoing and incoming).
|
|
246
|
+
*/
|
|
247
|
+
getLinks(projectId) {
|
|
248
|
+
const rows = this.db
|
|
249
|
+
.prepare('SELECT * FROM project_links WHERE source_project_id = ? OR target_project_id = ? ORDER BY created_at DESC')
|
|
250
|
+
.all(projectId, projectId);
|
|
251
|
+
return rows.map(rowToLink);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get linked projects with details — returns project info, link type, and direction.
|
|
255
|
+
*/
|
|
256
|
+
getLinkedProjects(projectId) {
|
|
257
|
+
const links = this.getLinks(projectId);
|
|
258
|
+
const results = [];
|
|
259
|
+
for (const link of links) {
|
|
260
|
+
const isOutgoing = link.sourceProjectId === projectId;
|
|
261
|
+
const otherProjectId = isOutgoing ? link.targetProjectId : link.sourceProjectId;
|
|
262
|
+
const project = this.get(otherProjectId);
|
|
263
|
+
if (project) {
|
|
264
|
+
results.push({
|
|
265
|
+
project,
|
|
266
|
+
linkType: link.linkType,
|
|
267
|
+
direction: isOutgoing ? 'outgoing' : 'incoming',
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return results;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=project-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../../src/project/project-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project registry types — tracks projects, rules, and cross-project links.
|
|
3
|
+
*/
|
|
4
|
+
export interface RegisteredProject {
|
|
5
|
+
id: string;
|
|
6
|
+
path: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
registeredAt: number;
|
|
9
|
+
lastAccessedAt: number;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface ProjectRule {
|
|
13
|
+
id: string;
|
|
14
|
+
projectId: string;
|
|
15
|
+
category: 'behavior' | 'preference' | 'restriction' | 'convention';
|
|
16
|
+
text: string;
|
|
17
|
+
priority: number;
|
|
18
|
+
createdAt: number;
|
|
19
|
+
}
|
|
20
|
+
export type LinkType = 'related' | 'parent' | 'child' | 'fork';
|
|
21
|
+
export interface ProjectLink {
|
|
22
|
+
id: number;
|
|
23
|
+
sourceProjectId: string;
|
|
24
|
+
targetProjectId: string;
|
|
25
|
+
linkType: LinkType;
|
|
26
|
+
createdAt: number;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/project/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,CAAC;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/project/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template parser — extract variables and resolve includes.
|
|
3
|
+
*/
|
|
4
|
+
import type { TemplateVariable } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Extract unique variables from template content.
|
|
7
|
+
* Supports {{name}} (required) and {{name:default}} (optional with default).
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseVariables(content: string): TemplateVariable[];
|
|
10
|
+
/**
|
|
11
|
+
* Resolve @include(partial-name) directives.
|
|
12
|
+
*
|
|
13
|
+
* The loader function receives the partial name and returns its content.
|
|
14
|
+
* Cycle detection prevents infinite recursion.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveIncludes(content: string, loader: (name: string) => string, _stack?: Set<string>, _depth?: number): string;
|
|
17
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/prompts/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMnD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAgBlE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAChC,MAAM,GAAE,GAAG,CAAC,MAAM,CAAa,EAC/B,MAAM,GAAE,MAAU,GACjB,MAAM,CAeR"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template parser — extract variables and resolve includes.
|
|
3
|
+
*/
|
|
4
|
+
const VAR_PATTERN = /\{\{(\w+)(?::([^}]*))?\}\}/g;
|
|
5
|
+
const INCLUDE_PATTERN = /@include\(([^)]+)\)/g;
|
|
6
|
+
const MAX_INCLUDE_DEPTH = 10;
|
|
7
|
+
/**
|
|
8
|
+
* Extract unique variables from template content.
|
|
9
|
+
* Supports {{name}} (required) and {{name:default}} (optional with default).
|
|
10
|
+
*/
|
|
11
|
+
export function parseVariables(content) {
|
|
12
|
+
const seen = new Map();
|
|
13
|
+
for (const match of content.matchAll(VAR_PATTERN)) {
|
|
14
|
+
const name = match[1];
|
|
15
|
+
const defaultValue = match[2];
|
|
16
|
+
if (!seen.has(name)) {
|
|
17
|
+
seen.set(name, {
|
|
18
|
+
name,
|
|
19
|
+
required: defaultValue === undefined,
|
|
20
|
+
defaultValue,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return Array.from(seen.values());
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve @include(partial-name) directives.
|
|
28
|
+
*
|
|
29
|
+
* The loader function receives the partial name and returns its content.
|
|
30
|
+
* Cycle detection prevents infinite recursion.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveIncludes(content, loader, _stack = new Set(), _depth = 0) {
|
|
33
|
+
if (_depth > MAX_INCLUDE_DEPTH) {
|
|
34
|
+
throw new Error(`Include depth exceeded ${MAX_INCLUDE_DEPTH}. Possible circular include.`);
|
|
35
|
+
}
|
|
36
|
+
return content.replace(INCLUDE_PATTERN, (_match, partialName) => {
|
|
37
|
+
const trimmed = partialName.trim();
|
|
38
|
+
if (_stack.has(trimmed)) {
|
|
39
|
+
throw new Error(`Circular include detected: ${trimmed} (stack: ${[..._stack].join(' → ')})`);
|
|
40
|
+
}
|
|
41
|
+
const newStack = new Set(_stack);
|
|
42
|
+
newStack.add(trimmed);
|
|
43
|
+
const partialContent = loader(trimmed);
|
|
44
|
+
return resolveIncludes(partialContent, loader, newStack, _depth + 1);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/prompts/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAClD,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;gBACb,IAAI;gBACJ,QAAQ,EAAE,YAAY,KAAK,SAAS;gBACpC,YAAY;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,MAAgC,EAChC,SAAsB,IAAI,GAAG,EAAE,EAC/B,SAAiB,CAAC;IAElB,IAAI,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,iBAAiB,8BAA8B,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,WAAmB,EAAE,EAAE;QACtE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC"}
|