@soleri/core 2.4.0 → 2.6.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 +7 -0
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +56 -9
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/intelligence.d.ts +1 -0
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +164 -148
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +2 -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 +3 -1
- package/dist/control/identity-manager.d.ts.map +1 -1
- package/dist/control/identity-manager.js +49 -51
- package/dist/control/identity-manager.js.map +1 -1
- package/dist/control/intent-router.d.ts +1 -0
- package/dist/control/intent-router.d.ts.map +1 -1
- package/dist/control/intent-router.js +32 -32
- package/dist/control/intent-router.js.map +1 -1
- package/dist/curator/curator.d.ts +9 -1
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +104 -92
- 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/governance/governance.d.ts +1 -0
- package/dist/governance/governance.d.ts.map +1 -1
- package/dist/governance/governance.js +51 -68
- package/dist/governance/governance.js.map +1 -1
- package/dist/index.d.ts +26 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -3
- 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/loop/loop-manager.d.ts +58 -7
- package/dist/loop/loop-manager.d.ts.map +1 -1
- package/dist/loop/loop-manager.js +280 -6
- package/dist/loop/loop-manager.js.map +1 -1
- package/dist/loop/types.d.ts +69 -1
- package/dist/loop/types.d.ts.map +1 -1
- package/dist/loop/types.js +4 -1
- package/dist/loop/types.js.map +1 -1
- package/dist/persistence/index.d.ts +4 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +3 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/postgres-provider.d.ts +46 -0
- package/dist/persistence/postgres-provider.d.ts.map +1 -0
- package/dist/persistence/postgres-provider.js +115 -0
- package/dist/persistence/postgres-provider.js.map +1 -0
- package/dist/persistence/sqlite-provider.d.ts +28 -0
- package/dist/persistence/sqlite-provider.d.ts.map +1 -0
- package/dist/persistence/sqlite-provider.js +97 -0
- package/dist/persistence/sqlite-provider.js.map +1 -0
- package/dist/persistence/types.d.ts +58 -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 +47 -4
- package/dist/planning/gap-analysis.d.ts.map +1 -1
- package/dist/planning/gap-analysis.js +190 -13
- package/dist/planning/gap-analysis.js.map +1 -1
- package/dist/planning/gap-types.d.ts +1 -1
- package/dist/planning/gap-types.d.ts.map +1 -1
- package/dist/planning/gap-types.js.map +1 -1
- package/dist/planning/planner.d.ts +277 -9
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +611 -46
- 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 +4 -4
- package/dist/project/project-registry.d.ts.map +1 -1
- package/dist/project/project-registry.js +30 -57
- package/dist/project/project-registry.js.map +1 -1
- 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 +5 -3
- package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
- package/dist/runtime/admin-extra-ops.js +348 -11
- package/dist/runtime/admin-extra-ops.js.map +1 -1
- package/dist/runtime/admin-ops.d.ts.map +1 -1
- package/dist/runtime/admin-ops.js +10 -3
- package/dist/runtime/admin-ops.js.map +1 -1
- package/dist/runtime/capture-ops.d.ts.map +1 -1
- package/dist/runtime/capture-ops.js +20 -2
- package/dist/runtime/capture-ops.js.map +1 -1
- 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 +8 -6
- package/dist/runtime/core-ops.d.ts.map +1 -1
- package/dist/runtime/core-ops.js +226 -9
- package/dist/runtime/core-ops.js.map +1 -1
- package/dist/runtime/curator-extra-ops.d.ts +2 -2
- package/dist/runtime/curator-extra-ops.d.ts.map +1 -1
- package/dist/runtime/curator-extra-ops.js +15 -3
- package/dist/runtime/curator-extra-ops.js.map +1 -1
- package/dist/runtime/domain-ops.js +2 -2
- package/dist/runtime/domain-ops.js.map +1 -1
- package/dist/runtime/grading-ops.d.ts.map +1 -1
- package/dist/runtime/grading-ops.js.map +1 -1
- 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 +5 -4
- package/dist/runtime/loop-ops.d.ts.map +1 -1
- package/dist/runtime/loop-ops.js +84 -12
- package/dist/runtime/loop-ops.js.map +1 -1
- package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -1
- package/dist/runtime/memory-cross-project-ops.js.map +1 -1
- package/dist/runtime/memory-extra-ops.js +5 -5
- package/dist/runtime/memory-extra-ops.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +8 -2
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts +13 -5
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js +381 -18
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- 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.map +1 -1
- package/dist/runtime/project-ops.js +7 -2
- package/dist/runtime/project-ops.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +28 -9
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +8 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.d.ts +4 -2
- package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.js +383 -4
- package/dist/runtime/vault-extra-ops.js.map +1 -1
- 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 +52 -32
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +300 -181
- package/dist/vault/vault.js.map +1 -1
- package/package.json +9 -3
- package/src/__tests__/admin-extra-ops.test.ts +62 -15
- package/src/__tests__/admin-ops.test.ts +2 -2
- package/src/__tests__/brain.test.ts +3 -3
- 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 +36 -4
- package/src/__tests__/curator-extra-ops.test.ts +24 -2
- package/src/__tests__/errors.test.ts +388 -0
- package/src/__tests__/grading-ops.test.ts +28 -7
- package/src/__tests__/intake-pipeline.test.ts +162 -0
- package/src/__tests__/loop-ops.test.ts +74 -3
- package/src/__tests__/memory-cross-project-ops.test.ts +3 -1
- package/src/__tests__/orchestrate-ops.test.ts +8 -3
- package/src/__tests__/persistence.test.ts +291 -0
- package/src/__tests__/planner.test.ts +99 -21
- package/src/__tests__/planning-extra-ops.test.ts +168 -10
- 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__/postgres-provider.test.ts +58 -0
- package/src/__tests__/project-ops.test.ts +18 -4
- package/src/__tests__/template-manager.test.ts +222 -0
- package/src/__tests__/vault-extra-ops.test.ts +82 -7
- package/src/__tests__/vault.test.ts +184 -0
- package/src/brain/brain.ts +71 -9
- package/src/brain/intelligence.ts +258 -307
- package/src/brain/types.ts +2 -2
- package/src/cognee/client.ts +18 -0
- package/src/cognee/sync-manager.ts +389 -0
- package/src/control/identity-manager.ts +77 -75
- package/src/control/intent-router.ts +55 -57
- package/src/curator/curator.ts +199 -139
- 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 +90 -107
- package/src/index.ts +116 -3
- 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/loop/loop-manager.ts +325 -7
- package/src/loop/types.ts +72 -1
- package/src/persistence/index.ts +9 -0
- package/src/persistence/postgres-provider.ts +157 -0
- package/src/persistence/sqlite-provider.ts +115 -0
- package/src/persistence/types.ts +74 -0
- package/src/planning/gap-analysis.ts +286 -17
- package/src/planning/gap-types.ts +4 -1
- package/src/planning/planner.ts +828 -55
- 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 +81 -74
- 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 +391 -13
- package/src/runtime/admin-ops.ts +17 -6
- package/src/runtime/capture-ops.ts +25 -6
- package/src/runtime/cognee-sync-ops.ts +63 -0
- package/src/runtime/core-ops.ts +258 -8
- package/src/runtime/curator-extra-ops.ts +17 -3
- package/src/runtime/domain-ops.ts +2 -2
- package/src/runtime/grading-ops.ts +11 -2
- package/src/runtime/intake-ops.ts +126 -0
- package/src/runtime/loop-ops.ts +96 -13
- package/src/runtime/memory-cross-project-ops.ts +1 -2
- package/src/runtime/memory-extra-ops.ts +5 -5
- package/src/runtime/orchestrate-ops.ts +8 -2
- package/src/runtime/planning-extra-ops.ts +414 -23
- package/src/runtime/playbook-ops.ts +169 -0
- package/src/runtime/project-ops.ts +9 -3
- package/src/runtime/runtime.ts +36 -10
- package/src/runtime/types.ts +8 -0
- package/src/runtime/vault-extra-ops.ts +425 -4
- package/src/vault/playbook.ts +87 -0
- package/src/vault/vault.ts +419 -235
|
@@ -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"}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
* Project Registry — SQLite-backed registry for tracking projects,
|
|
3
3
|
* rules, and cross-project links.
|
|
4
4
|
*
|
|
5
|
-
* Uses the Vault's underlying
|
|
5
|
+
* Uses the Vault's underlying database via PersistenceProvider.
|
|
6
6
|
* Tables are created lazily on first access.
|
|
7
7
|
*/
|
|
8
|
-
import type
|
|
8
|
+
import type { PersistenceProvider } from '../persistence/types.js';
|
|
9
9
|
import type { RegisteredProject, ProjectRule, ProjectLink, LinkType } from './types.js';
|
|
10
10
|
export declare class ProjectRegistry {
|
|
11
|
-
private
|
|
12
|
-
constructor(
|
|
11
|
+
private provider;
|
|
12
|
+
constructor(provider: PersistenceProvider);
|
|
13
13
|
private initTables;
|
|
14
14
|
/**
|
|
15
15
|
* Register (upsert) a project. Updates lastAccessedAt on re-register.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-registry.d.ts","sourceRoot":"","sources":["../../src/project/project-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"project-registry.d.ts","sourceRoot":"","sources":["../../src/project/project-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0ExF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAsB;gBAE1B,QAAQ,EAAE,mBAAmB;IAKzC,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;IAyC5F;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAQhD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAQjD;;OAEG;IACH,IAAI,IAAI,iBAAiB,EAAE;IAO3B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAWtC;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAS9B;;OAEG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACxD,WAAW;IAkBd;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAQ1C;;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;IAyBzE;;;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;IAQ1C;;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"}
|
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
* Project Registry — SQLite-backed registry for tracking projects,
|
|
3
3
|
* rules, and cross-project links.
|
|
4
4
|
*
|
|
5
|
-
* Uses the Vault's underlying
|
|
5
|
+
* Uses the Vault's underlying database via PersistenceProvider.
|
|
6
6
|
* Tables are created lazily on first access.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
9
|
* Generate a deterministic project ID from a filesystem path.
|
|
10
10
|
*/
|
|
11
11
|
function pathToId(path) {
|
|
12
|
-
return path
|
|
12
|
+
return path
|
|
13
|
+
.replace(/[^a-z0-9]/gi, '-')
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.replace(/-+/g, '-')
|
|
16
|
+
.replace(/^-|-$/g, '');
|
|
13
17
|
}
|
|
14
18
|
function rowToProject(row) {
|
|
15
19
|
return {
|
|
@@ -41,13 +45,13 @@ function rowToLink(row) {
|
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
47
|
export class ProjectRegistry {
|
|
44
|
-
|
|
45
|
-
constructor(
|
|
46
|
-
this.
|
|
48
|
+
provider;
|
|
49
|
+
constructor(provider) {
|
|
50
|
+
this.provider = provider;
|
|
47
51
|
this.initTables();
|
|
48
52
|
}
|
|
49
53
|
initTables() {
|
|
50
|
-
this.
|
|
54
|
+
this.provider.execSql(`
|
|
51
55
|
CREATE TABLE IF NOT EXISTS registered_projects (
|
|
52
56
|
id TEXT PRIMARY KEY,
|
|
53
57
|
path TEXT UNIQUE NOT NULL,
|
|
@@ -83,16 +87,12 @@ export class ProjectRegistry {
|
|
|
83
87
|
register(path, name, metadata) {
|
|
84
88
|
const id = pathToId(path);
|
|
85
89
|
const now = Date.now();
|
|
86
|
-
const existing = this.
|
|
87
|
-
.prepare('SELECT * FROM registered_projects WHERE id = ?')
|
|
88
|
-
.get(id);
|
|
90
|
+
const existing = this.provider.get('SELECT * FROM registered_projects WHERE id = ?', [id]);
|
|
89
91
|
if (existing) {
|
|
90
92
|
// Update lastAccessedAt, and optionally name/metadata if provided
|
|
91
93
|
const newName = name ?? existing.name;
|
|
92
94
|
const newMetadata = metadata ? JSON.stringify(metadata) : existing.metadata;
|
|
93
|
-
this.
|
|
94
|
-
.prepare('UPDATE registered_projects SET last_accessed_at = ?, name = ?, metadata = ? WHERE id = ?')
|
|
95
|
-
.run(now, newName, newMetadata, id);
|
|
95
|
+
this.provider.run('UPDATE registered_projects SET last_accessed_at = ?, name = ?, metadata = ? WHERE id = ?', [now, newName, newMetadata, id]);
|
|
96
96
|
return rowToProject({
|
|
97
97
|
...existing,
|
|
98
98
|
last_accessed_at: now,
|
|
@@ -108,58 +108,45 @@ export class ProjectRegistry {
|
|
|
108
108
|
last_accessed_at: now,
|
|
109
109
|
metadata: JSON.stringify(metadata ?? {}),
|
|
110
110
|
};
|
|
111
|
-
this.
|
|
112
|
-
.prepare('INSERT INTO registered_projects (id, path, name, registered_at, last_accessed_at, metadata) VALUES (?, ?, ?, ?, ?, ?)')
|
|
113
|
-
.run(row.id, row.path, row.name, row.registered_at, row.last_accessed_at, row.metadata);
|
|
111
|
+
this.provider.run('INSERT INTO registered_projects (id, path, name, registered_at, last_accessed_at, metadata) VALUES (?, ?, ?, ?, ?, ?)', [row.id, row.path, row.name, row.registered_at, row.last_accessed_at, row.metadata]);
|
|
114
112
|
return rowToProject(row);
|
|
115
113
|
}
|
|
116
114
|
/**
|
|
117
115
|
* Get a project by ID.
|
|
118
116
|
*/
|
|
119
117
|
get(projectId) {
|
|
120
|
-
const row = this.
|
|
121
|
-
.prepare('SELECT * FROM registered_projects WHERE id = ?')
|
|
122
|
-
.get(projectId);
|
|
118
|
+
const row = this.provider.get('SELECT * FROM registered_projects WHERE id = ?', [projectId]);
|
|
123
119
|
return row ? rowToProject(row) : null;
|
|
124
120
|
}
|
|
125
121
|
/**
|
|
126
122
|
* Get a project by its filesystem path.
|
|
127
123
|
*/
|
|
128
124
|
getByPath(path) {
|
|
129
|
-
const row = this.
|
|
130
|
-
.prepare('SELECT * FROM registered_projects WHERE path = ?')
|
|
131
|
-
.get(path);
|
|
125
|
+
const row = this.provider.get('SELECT * FROM registered_projects WHERE path = ?', [path]);
|
|
132
126
|
return row ? rowToProject(row) : null;
|
|
133
127
|
}
|
|
134
128
|
/**
|
|
135
129
|
* List all registered projects.
|
|
136
130
|
*/
|
|
137
131
|
list() {
|
|
138
|
-
const rows = this.
|
|
139
|
-
.prepare('SELECT * FROM registered_projects ORDER BY last_accessed_at DESC')
|
|
140
|
-
.all();
|
|
132
|
+
const rows = this.provider.all('SELECT * FROM registered_projects ORDER BY last_accessed_at DESC');
|
|
141
133
|
return rows.map(rowToProject);
|
|
142
134
|
}
|
|
143
135
|
/**
|
|
144
136
|
* Unregister a project by ID. Also removes associated rules and links.
|
|
145
137
|
*/
|
|
146
138
|
unregister(projectId) {
|
|
147
|
-
|
|
148
|
-
this.
|
|
149
|
-
this.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
return this.db.prepare('DELETE FROM registered_projects WHERE id = ?').run(projectId).changes > 0;
|
|
153
|
-
})();
|
|
154
|
-
return result;
|
|
139
|
+
return this.provider.transaction(() => {
|
|
140
|
+
this.provider.run('DELETE FROM project_rules WHERE project_id = ?', [projectId]);
|
|
141
|
+
this.provider.run('DELETE FROM project_links WHERE source_project_id = ? OR target_project_id = ?', [projectId, projectId]);
|
|
142
|
+
return this.provider.run('DELETE FROM registered_projects WHERE id = ?', [projectId]).changes > 0;
|
|
143
|
+
});
|
|
155
144
|
}
|
|
156
145
|
/**
|
|
157
146
|
* Update the lastAccessedAt timestamp for a project.
|
|
158
147
|
*/
|
|
159
148
|
touch(projectId) {
|
|
160
|
-
this.
|
|
161
|
-
.prepare('UPDATE registered_projects SET last_accessed_at = ? WHERE id = ?')
|
|
162
|
-
.run(Date.now(), projectId);
|
|
149
|
+
this.provider.run('UPDATE registered_projects SET last_accessed_at = ? WHERE id = ?', [Date.now(), projectId]);
|
|
163
150
|
}
|
|
164
151
|
// ─── Rules ──────────────────────────────────────────────────────────
|
|
165
152
|
/**
|
|
@@ -168,9 +155,7 @@ export class ProjectRegistry {
|
|
|
168
155
|
addRule(projectId, rule) {
|
|
169
156
|
const id = `rule-${projectId}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
170
157
|
const now = Date.now();
|
|
171
|
-
this.
|
|
172
|
-
.prepare('INSERT INTO project_rules (id, project_id, category, text, priority, created_at) VALUES (?, ?, ?, ?, ?, ?)')
|
|
173
|
-
.run(id, projectId, rule.category, rule.text, rule.priority, now);
|
|
158
|
+
this.provider.run('INSERT INTO project_rules (id, project_id, category, text, priority, created_at) VALUES (?, ?, ?, ?, ?, ?)', [id, projectId, rule.category, rule.text, rule.priority, now]);
|
|
174
159
|
return {
|
|
175
160
|
id,
|
|
176
161
|
projectId,
|
|
@@ -184,16 +169,14 @@ export class ProjectRegistry {
|
|
|
184
169
|
* Get all rules for a project.
|
|
185
170
|
*/
|
|
186
171
|
getRules(projectId) {
|
|
187
|
-
const rows = this.
|
|
188
|
-
.prepare('SELECT * FROM project_rules WHERE project_id = ? ORDER BY priority DESC, created_at ASC')
|
|
189
|
-
.all(projectId);
|
|
172
|
+
const rows = this.provider.all('SELECT * FROM project_rules WHERE project_id = ? ORDER BY priority DESC, created_at ASC', [projectId]);
|
|
190
173
|
return rows.map(rowToRule);
|
|
191
174
|
}
|
|
192
175
|
/**
|
|
193
176
|
* Remove a rule by ID.
|
|
194
177
|
*/
|
|
195
178
|
removeRule(ruleId) {
|
|
196
|
-
return this.
|
|
179
|
+
return this.provider.run('DELETE FROM project_rules WHERE id = ?', [ruleId]).changes > 0;
|
|
197
180
|
}
|
|
198
181
|
/**
|
|
199
182
|
* List all projects with their rules.
|
|
@@ -211,14 +194,10 @@ export class ProjectRegistry {
|
|
|
211
194
|
*/
|
|
212
195
|
link(sourceId, targetId, linkType) {
|
|
213
196
|
const now = Date.now();
|
|
214
|
-
const info = this.
|
|
215
|
-
.prepare('INSERT OR IGNORE INTO project_links (source_project_id, target_project_id, link_type, created_at) VALUES (?, ?, ?, ?)')
|
|
216
|
-
.run(sourceId, targetId, linkType, now);
|
|
197
|
+
const info = this.provider.run('INSERT OR IGNORE INTO project_links (source_project_id, target_project_id, link_type, created_at) VALUES (?, ?, ?, ?)', [sourceId, targetId, linkType, now]);
|
|
217
198
|
// If insert was ignored (duplicate), fetch existing
|
|
218
199
|
if (info.changes === 0) {
|
|
219
|
-
const existing = this.
|
|
220
|
-
.prepare('SELECT * FROM project_links WHERE source_project_id = ? AND target_project_id = ? AND link_type = ?')
|
|
221
|
-
.get(sourceId, targetId, linkType);
|
|
200
|
+
const existing = this.provider.get('SELECT * FROM project_links WHERE source_project_id = ? AND target_project_id = ? AND link_type = ?', [sourceId, targetId, linkType]);
|
|
222
201
|
return rowToLink(existing);
|
|
223
202
|
}
|
|
224
203
|
return {
|
|
@@ -235,21 +214,15 @@ export class ProjectRegistry {
|
|
|
235
214
|
*/
|
|
236
215
|
unlink(sourceId, targetId, linkType) {
|
|
237
216
|
if (linkType) {
|
|
238
|
-
return this.
|
|
239
|
-
.prepare('DELETE FROM project_links WHERE source_project_id = ? AND target_project_id = ? AND link_type = ?')
|
|
240
|
-
.run(sourceId, targetId, linkType).changes;
|
|
217
|
+
return this.provider.run('DELETE FROM project_links WHERE source_project_id = ? AND target_project_id = ? AND link_type = ?', [sourceId, targetId, linkType]).changes;
|
|
241
218
|
}
|
|
242
|
-
return this.
|
|
243
|
-
.prepare('DELETE FROM project_links WHERE source_project_id = ? AND target_project_id = ?')
|
|
244
|
-
.run(sourceId, targetId).changes;
|
|
219
|
+
return this.provider.run('DELETE FROM project_links WHERE source_project_id = ? AND target_project_id = ?', [sourceId, targetId]).changes;
|
|
245
220
|
}
|
|
246
221
|
/**
|
|
247
222
|
* Get all links for a project (both outgoing and incoming).
|
|
248
223
|
*/
|
|
249
224
|
getLinks(projectId) {
|
|
250
|
-
const rows = this.
|
|
251
|
-
.prepare('SELECT * FROM project_links WHERE source_project_id = ? OR target_project_id = ? ORDER BY created_at DESC')
|
|
252
|
-
.all(projectId, projectId);
|
|
225
|
+
const rows = this.provider.all('SELECT * FROM project_links WHERE source_project_id = ? OR target_project_id = ? ORDER BY created_at DESC', [projectId, projectId]);
|
|
253
226
|
return rows.map(rowToLink);
|
|
254
227
|
}
|
|
255
228
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../../src/project/project-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../../src/project/project-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template manager — load, render, and list .prompt templates.
|
|
3
|
+
*/
|
|
4
|
+
import type { PromptTemplate, RenderOptions } from './types.js';
|
|
5
|
+
export declare class TemplateManager {
|
|
6
|
+
private templates;
|
|
7
|
+
private templatesDir;
|
|
8
|
+
constructor(templatesDir: string);
|
|
9
|
+
/** Load all .prompt files from templatesDir. */
|
|
10
|
+
load(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Render a template by name with variable substitution.
|
|
13
|
+
*
|
|
14
|
+
* @param name - Template name (without .prompt extension)
|
|
15
|
+
* @param vars - Variable values to substitute
|
|
16
|
+
* @param options - Render options (strict mode)
|
|
17
|
+
* @throws If template not found, or strict mode and required variable missing
|
|
18
|
+
*/
|
|
19
|
+
render(name: string, vars?: Record<string, string>, options?: RenderOptions): string;
|
|
20
|
+
/** List all loaded template names. */
|
|
21
|
+
listTemplates(): string[];
|
|
22
|
+
/** Get a template by name (raw, unrendered). */
|
|
23
|
+
getTemplate(name: string): PromptTemplate | null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=template-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../src/prompts/template-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhE,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM;IAIhC,gDAAgD;IAChD,IAAI,IAAI,IAAI;IAiBZ;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;IAsBxF,sCAAsC;IACtC,aAAa,IAAI,MAAM,EAAE;IAIzB,gDAAgD;IAChD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;CAGjD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template manager — load, render, and list .prompt templates.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
5
|
+
import { join, basename } from 'node:path';
|
|
6
|
+
import { parseVariables, resolveIncludes } from './parser.js';
|
|
7
|
+
const VAR_REGEX = /\{\{(\w+)(?::([^}]*))?\}\}/g;
|
|
8
|
+
export class TemplateManager {
|
|
9
|
+
templates = new Map();
|
|
10
|
+
templatesDir;
|
|
11
|
+
constructor(templatesDir) {
|
|
12
|
+
this.templatesDir = templatesDir;
|
|
13
|
+
}
|
|
14
|
+
/** Load all .prompt files from templatesDir. */
|
|
15
|
+
load() {
|
|
16
|
+
if (!existsSync(this.templatesDir))
|
|
17
|
+
return;
|
|
18
|
+
const files = readdirSync(this.templatesDir).filter((f) => f.endsWith('.prompt'));
|
|
19
|
+
for (const file of files) {
|
|
20
|
+
const fullPath = join(this.templatesDir, file);
|
|
21
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
22
|
+
const name = basename(file, '.prompt');
|
|
23
|
+
this.templates.set(name, {
|
|
24
|
+
name,
|
|
25
|
+
content,
|
|
26
|
+
variables: parseVariables(content),
|
|
27
|
+
path: fullPath,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Render a template by name with variable substitution.
|
|
33
|
+
*
|
|
34
|
+
* @param name - Template name (without .prompt extension)
|
|
35
|
+
* @param vars - Variable values to substitute
|
|
36
|
+
* @param options - Render options (strict mode)
|
|
37
|
+
* @throws If template not found, or strict mode and required variable missing
|
|
38
|
+
*/
|
|
39
|
+
render(name, vars = {}, options) {
|
|
40
|
+
const template = this.templates.get(name);
|
|
41
|
+
if (!template)
|
|
42
|
+
throw new Error(`Template not found: ${name}`);
|
|
43
|
+
const strict = options?.strict ?? true;
|
|
44
|
+
// Resolve @include() directives
|
|
45
|
+
const resolved = resolveIncludes(template.content, (partialName) => {
|
|
46
|
+
const partial = this.templates.get(partialName);
|
|
47
|
+
if (!partial)
|
|
48
|
+
throw new Error(`Include not found: ${partialName} (in template: ${name})`);
|
|
49
|
+
return partial.content;
|
|
50
|
+
});
|
|
51
|
+
// Replace {{var}} and {{var:default}}
|
|
52
|
+
return resolved.replace(VAR_REGEX, (_match, varName, defaultValue) => {
|
|
53
|
+
if (vars[varName] !== undefined)
|
|
54
|
+
return vars[varName];
|
|
55
|
+
if (defaultValue !== undefined)
|
|
56
|
+
return defaultValue;
|
|
57
|
+
if (strict)
|
|
58
|
+
throw new Error(`Missing required variable: ${varName} (in template: ${name})`);
|
|
59
|
+
return _match; // Leave placeholder as-is in non-strict mode
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** List all loaded template names. */
|
|
63
|
+
listTemplates() {
|
|
64
|
+
return Array.from(this.templates.keys());
|
|
65
|
+
}
|
|
66
|
+
/** Get a template by name (raw, unrendered). */
|
|
67
|
+
getTemplate(name) {
|
|
68
|
+
return this.templates.get(name) ?? null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=template-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-manager.js","sourceRoot":"","sources":["../../src/prompts/template-manager.ts"],"names":[],"mappings":"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"}
|