@compilr-dev/sdk 0.2.6 → 0.2.8
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/index.d.ts
CHANGED
|
@@ -56,7 +56,8 @@ export type { SystemPromptContext, BuildResult, SystemPromptModule, ModuleCondit
|
|
|
56
56
|
export type { ProjectType, ProjectStatus, RepoPattern, WorkflowMode, LifecycleState, WorkItemType, WorkItemStatus, WorkItemPriority, GuidedStep, DocumentType, PlanStatus, Project, WorkItem, ProjectDocument, Plan, PlanSummary, PlanWithWorkItem, HistoryEntry, CreateProjectInput, UpdateProjectInput, ProjectListOptions, CreateWorkItemInput, UpdateWorkItemInput, QueryWorkItemsInput, CreateDocumentInput, UpdateDocumentInput, CreatePlanInput, UpdatePlanInput, ListPlansOptions, WorkItemQueryResult, ProjectListResult, BulkCreateItem, IProjectRepository, IWorkItemRepository, IDocumentRepository, IPlanRepository, IAnchorService, IArtifactService, IEpisodeService, AnchorData, ArtifactType, ArtifactData, ArtifactSummaryData, WorkEpisode, ProjectWorkSummary, PlatformContext, PlatformToolsConfig, PlatformHooks, StepCriteria, } from './platform/index.js';
|
|
57
57
|
export { createSQLiteRepositories, SQLiteProjectRepository, SQLiteWorkItemRepository, SQLiteDocumentRepository, SQLitePlanRepository, getDatabase, closeDatabase, closeAllDatabases, databaseExists, SCHEMA_VERSION, SCHEMA_SQL, } from './platform/index.js';
|
|
58
58
|
export type { SQLiteRepositories, CreateSQLiteRepositoriesOptions, ProjectDeleteHooks, ProjectRecord, WorkItemRecord, ProjectDocumentRecord, } from './platform/index.js';
|
|
59
|
-
export { createPlatformTools, createProjectTools, createWorkItemTools, createDocumentTools, createPlanTools, createBacklogTools, createAnchorTools, createArtifactTools, createEpisodeTools, } from './platform/index.js';
|
|
59
|
+
export { createPlatformTools, createProjectTools, createWorkItemTools, createDocumentTools, createPlanTools, createBacklogTools, createAnchorTools, createArtifactTools, createEpisodeTools, ProjectAnchorStore, } from './platform/index.js';
|
|
60
|
+
export type { ProjectAnchorStoreConfig } from './platform/index.js';
|
|
60
61
|
export { STEP_ORDER, GUIDED_STEP_CRITERIA, getNextStep, isValidTransition, getStepCriteria, formatStepDisplay, getStepNumber, } from './platform/index.js';
|
|
61
62
|
export { platformSkills, designSkill, sketchSkill, prdSkill, refineSkill, refineItemSkill, architectureSkill, sessionNotesSkill, buildSkill, scaffoldSkill, } from './skills/index.js';
|
|
62
63
|
export { defineTool, createSuccessResult, createErrorResult, mergeHooks, createLoggingHooks, createClaudeProvider, createOpenAIProvider, createGeminiNativeProvider, createOllamaProvider, createTogetherProvider, createGroqProvider, createFireworksProvider, createPerplexityProvider, createOpenRouterProvider, createMockProvider, MockProvider, Agent, ContextManager, DEFAULT_CONTEXT_CONFIG, createTaskTool, createSuggestTool, defaultAgentTypes, TOOL_SETS, BUILTIN_GUARDRAILS, TOOL_NAMES, getDefaultShellManager, builtinSkills, AnchorManager, MCPManager, AgentError, ProviderError, ToolError, ToolTimeoutError, MaxIterationsError, AbortError, } from '@compilr-dev/agents';
|
package/dist/index.js
CHANGED
|
@@ -119,7 +119,7 @@ export { createSQLiteRepositories, SQLiteProjectRepository, SQLiteWorkItemReposi
|
|
|
119
119
|
// =============================================================================
|
|
120
120
|
// Platform Tools (runtime — createPlatformTools factory + individual factories)
|
|
121
121
|
// =============================================================================
|
|
122
|
-
export { createPlatformTools, createProjectTools, createWorkItemTools, createDocumentTools, createPlanTools, createBacklogTools, createAnchorTools, createArtifactTools, createEpisodeTools, } from './platform/index.js';
|
|
122
|
+
export { createPlatformTools, createProjectTools, createWorkItemTools, createDocumentTools, createPlanTools, createBacklogTools, createAnchorTools, createArtifactTools, createEpisodeTools, ProjectAnchorStore, } from './platform/index.js';
|
|
123
123
|
// =============================================================================
|
|
124
124
|
// Platform Workflow (pure step-criteria logic)
|
|
125
125
|
// =============================================================================
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectAnchorStore — File-based anchor management with dual-scope routing.
|
|
3
|
+
*
|
|
4
|
+
* Manages per-project and global anchors using @compilr-dev/agents AnchorManager
|
|
5
|
+
* with JSON file persistence. Used by both CLI and Desktop app.
|
|
6
|
+
*
|
|
7
|
+
* Storage structure:
|
|
8
|
+
* {anchorsDir}/
|
|
9
|
+
* ├── global.json # Non-project anchors (includes safety defaults)
|
|
10
|
+
* └── project-{id}.json # Per-project anchors
|
|
11
|
+
*/
|
|
12
|
+
import { AnchorManager } from '@compilr-dev/agents';
|
|
13
|
+
import type { Anchor, AnchorInput, AnchorQueryOptions } from '@compilr-dev/agents';
|
|
14
|
+
import type { IAnchorService } from './services.js';
|
|
15
|
+
export interface ProjectAnchorStoreConfig {
|
|
16
|
+
/** Directory for anchor JSON files (e.g. ~/.compilr-dev/anchors/) */
|
|
17
|
+
anchorsDir: string;
|
|
18
|
+
/** Returns the currently active project ID, or undefined if none */
|
|
19
|
+
getCurrentProjectId: () => number | undefined;
|
|
20
|
+
/** Returns display name for a project ID (used in list results) */
|
|
21
|
+
getProjectName?: (id: number) => string | null | Promise<string | null>;
|
|
22
|
+
/** Max anchors per manager (default: 50) */
|
|
23
|
+
maxAnchors?: number;
|
|
24
|
+
/** Max tokens per manager (default: 4000) */
|
|
25
|
+
maxTokens?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class ProjectAnchorStore {
|
|
28
|
+
private readonly managers;
|
|
29
|
+
private readonly config;
|
|
30
|
+
constructor(config: ProjectAnchorStoreConfig);
|
|
31
|
+
/** Get anchor manager for a project (or global if projectId is null). */
|
|
32
|
+
getManager(projectId: string | null): AnchorManager;
|
|
33
|
+
/** Get the global anchor manager (shorthand for getManager(null)). */
|
|
34
|
+
getGlobalManager(): AnchorManager;
|
|
35
|
+
/** Add an anchor, routing to the appropriate manager. */
|
|
36
|
+
addAnchor(input: AnchorInput & {
|
|
37
|
+
projectId?: string;
|
|
38
|
+
}): Anchor;
|
|
39
|
+
/** Get all anchors across all cached managers. */
|
|
40
|
+
getAllAnchors(options?: AnchorQueryOptions): Anchor[];
|
|
41
|
+
/** Clear all anchors for a project and delete the persistence file. */
|
|
42
|
+
clearProjectAnchors(projectId: string): number;
|
|
43
|
+
/**
|
|
44
|
+
* Get formatted anchor content for system prompt injection.
|
|
45
|
+
* Combines global anchors with project-specific anchors.
|
|
46
|
+
*/
|
|
47
|
+
getFormattedAnchors(projectId?: string): string;
|
|
48
|
+
/** Get list of project IDs that have anchor files. */
|
|
49
|
+
getProjectsWithAnchors(): string[];
|
|
50
|
+
/** Get anchor statistics. */
|
|
51
|
+
getAnchorStats(): {
|
|
52
|
+
globalCount: number;
|
|
53
|
+
projectCounts: Map<string, number>;
|
|
54
|
+
totalTokens: number;
|
|
55
|
+
};
|
|
56
|
+
/** Clear all cached managers (useful for testing or refresh). */
|
|
57
|
+
clearCache(): void;
|
|
58
|
+
/** Create an IAnchorService implementation for use with createPlatformTools(). */
|
|
59
|
+
toService(): IAnchorService;
|
|
60
|
+
private getPersistPath;
|
|
61
|
+
private ensureDir;
|
|
62
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectAnchorStore — File-based anchor management with dual-scope routing.
|
|
3
|
+
*
|
|
4
|
+
* Manages per-project and global anchors using @compilr-dev/agents AnchorManager
|
|
5
|
+
* with JSON file persistence. Used by both CLI and Desktop app.
|
|
6
|
+
*
|
|
7
|
+
* Storage structure:
|
|
8
|
+
* {anchorsDir}/
|
|
9
|
+
* ├── global.json # Non-project anchors (includes safety defaults)
|
|
10
|
+
* └── project-{id}.json # Per-project anchors
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, mkdirSync, readdirSync, unlinkSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import { AnchorManager } from '@compilr-dev/agents';
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// ProjectAnchorStore
|
|
17
|
+
// =============================================================================
|
|
18
|
+
export class ProjectAnchorStore {
|
|
19
|
+
managers = new Map();
|
|
20
|
+
config;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Manager Access
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/** Get anchor manager for a project (or global if projectId is null). */
|
|
28
|
+
getManager(projectId) {
|
|
29
|
+
const existing = this.managers.get(projectId);
|
|
30
|
+
if (existing) {
|
|
31
|
+
return existing;
|
|
32
|
+
}
|
|
33
|
+
this.ensureDir();
|
|
34
|
+
const manager = new AnchorManager({
|
|
35
|
+
persistPath: this.getPersistPath(projectId),
|
|
36
|
+
includeDefaults: projectId === null,
|
|
37
|
+
maxAnchors: this.config.maxAnchors ?? 50,
|
|
38
|
+
maxTokens: this.config.maxTokens ?? 4000,
|
|
39
|
+
});
|
|
40
|
+
this.managers.set(projectId, manager);
|
|
41
|
+
return manager;
|
|
42
|
+
}
|
|
43
|
+
/** Get the global anchor manager (shorthand for getManager(null)). */
|
|
44
|
+
getGlobalManager() {
|
|
45
|
+
return this.getManager(null);
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Convenience Methods
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/** Add an anchor, routing to the appropriate manager. */
|
|
51
|
+
addAnchor(input) {
|
|
52
|
+
const manager = this.getManager(input.projectId ?? null);
|
|
53
|
+
return manager.add(input);
|
|
54
|
+
}
|
|
55
|
+
/** Get all anchors across all cached managers. */
|
|
56
|
+
getAllAnchors(options) {
|
|
57
|
+
const all = [];
|
|
58
|
+
for (const manager of this.managers.values()) {
|
|
59
|
+
all.push(...manager.getAll(options));
|
|
60
|
+
}
|
|
61
|
+
return all;
|
|
62
|
+
}
|
|
63
|
+
/** Clear all anchors for a project and delete the persistence file. */
|
|
64
|
+
clearProjectAnchors(projectId) {
|
|
65
|
+
const manager = this.managers.get(projectId);
|
|
66
|
+
let removed = 0;
|
|
67
|
+
if (manager) {
|
|
68
|
+
removed = manager.clear();
|
|
69
|
+
this.managers.delete(projectId);
|
|
70
|
+
}
|
|
71
|
+
const filePath = this.getPersistPath(projectId);
|
|
72
|
+
if (existsSync(filePath)) {
|
|
73
|
+
unlinkSync(filePath);
|
|
74
|
+
}
|
|
75
|
+
return removed;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get formatted anchor content for system prompt injection.
|
|
79
|
+
* Combines global anchors with project-specific anchors.
|
|
80
|
+
*/
|
|
81
|
+
getFormattedAnchors(projectId) {
|
|
82
|
+
const parts = [];
|
|
83
|
+
const globalFormatted = this.getGlobalManager().format();
|
|
84
|
+
if (globalFormatted) {
|
|
85
|
+
parts.push(globalFormatted);
|
|
86
|
+
}
|
|
87
|
+
if (projectId) {
|
|
88
|
+
const projectFormatted = this.getManager(projectId).format();
|
|
89
|
+
if (projectFormatted) {
|
|
90
|
+
if (parts.length > 0) {
|
|
91
|
+
parts.push('');
|
|
92
|
+
parts.push(`### Project Anchors (${projectId})`);
|
|
93
|
+
}
|
|
94
|
+
parts.push(projectFormatted);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return parts.join('\n');
|
|
98
|
+
}
|
|
99
|
+
/** Get list of project IDs that have anchor files. */
|
|
100
|
+
getProjectsWithAnchors() {
|
|
101
|
+
if (!existsSync(this.config.anchorsDir)) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const files = readdirSync(this.config.anchorsDir);
|
|
105
|
+
const projectIds = [];
|
|
106
|
+
for (const file of files) {
|
|
107
|
+
const match = /^project-(.+)\.json$/.exec(file);
|
|
108
|
+
if (match?.[1]) {
|
|
109
|
+
projectIds.push(match[1]);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return projectIds;
|
|
113
|
+
}
|
|
114
|
+
/** Get anchor statistics. */
|
|
115
|
+
getAnchorStats() {
|
|
116
|
+
const globalManager = this.getGlobalManager();
|
|
117
|
+
const projectCounts = new Map();
|
|
118
|
+
let totalTokens = globalManager.getTotalTokens();
|
|
119
|
+
for (const projectId of this.getProjectsWithAnchors()) {
|
|
120
|
+
const manager = this.getManager(projectId);
|
|
121
|
+
projectCounts.set(projectId, manager.size);
|
|
122
|
+
totalTokens += manager.getTotalTokens();
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
globalCount: globalManager.size,
|
|
126
|
+
projectCounts,
|
|
127
|
+
totalTokens,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** Clear all cached managers (useful for testing or refresh). */
|
|
131
|
+
clearCache() {
|
|
132
|
+
this.managers.clear();
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// IAnchorService — for platform tools
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
/** Create an IAnchorService implementation for use with createPlatformTools(). */
|
|
138
|
+
toService() {
|
|
139
|
+
return {
|
|
140
|
+
add: (input) => {
|
|
141
|
+
const priority = input.priority ?? 'info';
|
|
142
|
+
const projId = this.config.getCurrentProjectId();
|
|
143
|
+
let scope = input.scope;
|
|
144
|
+
if (!scope) {
|
|
145
|
+
scope = projId ? 'project' : 'global';
|
|
146
|
+
}
|
|
147
|
+
if (scope === 'project' && !projId) {
|
|
148
|
+
throw new Error('Cannot add project-scoped anchor: no active project. Use scope: "global" instead.');
|
|
149
|
+
}
|
|
150
|
+
const projectKey = scope === 'project' && projId ? String(projId) : null;
|
|
151
|
+
const manager = this.getManager(projectKey);
|
|
152
|
+
const anchor = manager.add({
|
|
153
|
+
content: input.content,
|
|
154
|
+
priority,
|
|
155
|
+
scope: 'persistent',
|
|
156
|
+
tags: input.tags,
|
|
157
|
+
projectId: projectKey ?? undefined,
|
|
158
|
+
});
|
|
159
|
+
return Promise.resolve({
|
|
160
|
+
id: anchor.id,
|
|
161
|
+
content: anchor.content,
|
|
162
|
+
priority: anchor.priority,
|
|
163
|
+
scope,
|
|
164
|
+
tags: anchor.tags,
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
remove: (id) => {
|
|
168
|
+
let removed = false;
|
|
169
|
+
let scope;
|
|
170
|
+
const projId = this.config.getCurrentProjectId();
|
|
171
|
+
if (projId) {
|
|
172
|
+
const projectManager = this.getManager(String(projId));
|
|
173
|
+
if (projectManager.has(id)) {
|
|
174
|
+
removed = projectManager.remove(id);
|
|
175
|
+
scope = 'project';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!removed) {
|
|
179
|
+
const globalManager = this.getGlobalManager();
|
|
180
|
+
if (globalManager.has(id)) {
|
|
181
|
+
removed = globalManager.remove(id);
|
|
182
|
+
scope = 'global';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return Promise.resolve({ removed, scope });
|
|
186
|
+
},
|
|
187
|
+
list: async (options) => {
|
|
188
|
+
const projId = this.config.getCurrentProjectId();
|
|
189
|
+
const scope = options?.scope ?? 'all';
|
|
190
|
+
const anchors = [];
|
|
191
|
+
if (scope === 'global' || scope === 'all') {
|
|
192
|
+
for (const anchor of this.getGlobalManager().getAll({ priority: options?.priority })) {
|
|
193
|
+
anchors.push({
|
|
194
|
+
id: anchor.id,
|
|
195
|
+
content: anchor.content,
|
|
196
|
+
priority: anchor.priority,
|
|
197
|
+
scope: 'global',
|
|
198
|
+
tags: anchor.tags,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if ((scope === 'project' || scope === 'all') && projId) {
|
|
203
|
+
const projectManager = this.getManager(String(projId));
|
|
204
|
+
for (const anchor of projectManager.getAll({ priority: options?.priority })) {
|
|
205
|
+
anchors.push({
|
|
206
|
+
id: anchor.id,
|
|
207
|
+
content: anchor.content,
|
|
208
|
+
priority: anchor.priority,
|
|
209
|
+
scope: 'project',
|
|
210
|
+
tags: anchor.tags,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Sort by priority (critical first)
|
|
215
|
+
const priorityOrder = { critical: 0, safety: 1, info: 2 };
|
|
216
|
+
anchors.sort((a, b) => {
|
|
217
|
+
const pa = priorityOrder[a.priority] ?? 2;
|
|
218
|
+
const pb = priorityOrder[b.priority] ?? 2;
|
|
219
|
+
return pa - pb;
|
|
220
|
+
});
|
|
221
|
+
let activeProjectName = null;
|
|
222
|
+
if (projId && this.config.getProjectName) {
|
|
223
|
+
activeProjectName = await Promise.resolve(this.config.getProjectName(projId));
|
|
224
|
+
}
|
|
225
|
+
return { count: anchors.length, activeProjectName, anchors };
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
// Private Helpers
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
getPersistPath(projectId) {
|
|
233
|
+
const filename = projectId ? `project-${projectId}.json` : 'global.json';
|
|
234
|
+
return join(this.config.anchorsDir, filename);
|
|
235
|
+
}
|
|
236
|
+
ensureDir() {
|
|
237
|
+
if (!existsSync(this.config.anchorsDir)) {
|
|
238
|
+
mkdirSync(this.config.anchorsDir, { recursive: true });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
package/dist/platform/index.d.ts
CHANGED
|
@@ -8,5 +8,7 @@ export type { PlatformContext, PlatformToolsConfig, PlatformHooks } from './cont
|
|
|
8
8
|
export { createPlatformTools, createProjectTools, createWorkItemTools, createDocumentTools, createPlanTools, createBacklogTools, createAnchorTools, createArtifactTools, createEpisodeTools, } from './tools/index.js';
|
|
9
9
|
export { createSQLiteRepositories, SQLiteProjectRepository, SQLiteWorkItemRepository, SQLiteDocumentRepository, SQLitePlanRepository, getDatabase, closeDatabase, closeAllDatabases, databaseExists, SCHEMA_VERSION, SCHEMA_SQL, } from './sqlite/index.js';
|
|
10
10
|
export type { SQLiteRepositories, CreateSQLiteRepositoriesOptions, ProjectDeleteHooks, ProjectRecord, WorkItemRecord, ProjectDocumentRecord, } from './sqlite/index.js';
|
|
11
|
+
export { ProjectAnchorStore } from './file-anchor-service.js';
|
|
12
|
+
export type { ProjectAnchorStoreConfig } from './file-anchor-service.js';
|
|
11
13
|
export { STEP_ORDER, GUIDED_STEP_CRITERIA, getNextStep, isValidTransition, getStepCriteria, formatStepDisplay, getStepNumber, } from './workflow.js';
|
|
12
14
|
export type { StepCriteria } from './workflow.js';
|
package/dist/platform/index.js
CHANGED
|
@@ -5,5 +5,7 @@
|
|
|
5
5
|
export { createPlatformTools, createProjectTools, createWorkItemTools, createDocumentTools, createPlanTools, createBacklogTools, createAnchorTools, createArtifactTools, createEpisodeTools, } from './tools/index.js';
|
|
6
6
|
// SQLite implementations (concrete repositories)
|
|
7
7
|
export { createSQLiteRepositories, SQLiteProjectRepository, SQLiteWorkItemRepository, SQLiteDocumentRepository, SQLitePlanRepository, getDatabase, closeDatabase, closeAllDatabases, databaseExists, SCHEMA_VERSION, SCHEMA_SQL, } from './sqlite/index.js';
|
|
8
|
+
// File-based anchor service (shared by CLI and Desktop)
|
|
9
|
+
export { ProjectAnchorStore } from './file-anchor-service.js';
|
|
8
10
|
// Workflow (pure step-criteria logic)
|
|
9
11
|
export { STEP_ORDER, GUIDED_STEP_CRITERIA, getNextStep, isValidTransition, getStepCriteria, formatStepDisplay, getStepNumber, } from './workflow.js';
|