@planu/cli 0.28.0 → 0.29.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/config/model-routing-rules.json +98 -0
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
- package/dist/engine/ai-cost-estimator/core.js +2 -202
- package/dist/engine/ai-cost-estimator/core.js.map +1 -1
- package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
- package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/recommender.js +94 -0
- package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
- package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
- package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
- package/dist/engine/code-transforms/transform-engine.js +67 -0
- package/dist/engine/code-transforms/transform-engine.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.js +182 -0
- package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
- package/dist/engine/mermaid/core.d.ts +18 -0
- package/dist/engine/mermaid/core.d.ts.map +1 -0
- package/dist/engine/mermaid/core.js +88 -0
- package/dist/engine/mermaid/core.js.map +1 -0
- package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
- package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
- package/dist/engine/mermaid/diagram-generators.js +139 -0
- package/dist/engine/mermaid/diagram-generators.js.map +1 -0
- package/dist/engine/mermaid/helpers.d.ts +8 -0
- package/dist/engine/mermaid/helpers.d.ts.map +1 -0
- package/dist/engine/mermaid/helpers.js +61 -0
- package/dist/engine/mermaid/helpers.js.map +1 -0
- package/dist/engine/mermaid-generator.d.ts +2 -37
- package/dist/engine/mermaid-generator.d.ts.map +1 -1
- package/dist/engine/mermaid-generator.js +4 -276
- package/dist/engine/mermaid-generator.js.map +1 -1
- package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
- package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
- package/dist/engine/model-router/complexity-analyzer.js +182 -0
- package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
- package/dist/engine/model-router/cost-estimator.d.ts +6 -0
- package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
- package/dist/engine/model-router/cost-estimator.js +60 -0
- package/dist/engine/model-router/cost-estimator.js.map +1 -0
- package/dist/engine/model-router/historical-learner.d.ts +26 -0
- package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
- package/dist/engine/model-router/historical-learner.js +91 -0
- package/dist/engine/model-router/historical-learner.js.map +1 -0
- package/dist/engine/model-router/rules-engine.d.ts +13 -0
- package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
- package/dist/engine/model-router/rules-engine.js +142 -0
- package/dist/engine/model-router/rules-engine.js.map +1 -0
- package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
- package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
- package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
- package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
- package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
- package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
- package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
- package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.js +59 -0
- package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
- package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog-extra.js +8 -363
- package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
- package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog.js +10 -381
- package/dist/engine/spec-templates/catalog.js.map +1 -1
- package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
- package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-api-ui.js +188 -0
- package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.js +198 -0
- package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.js +172 -0
- package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.js +199 -0
- package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
- package/dist/engine/vector-store/hnsw.d.ts +37 -0
- package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
- package/dist/engine/vector-store/hnsw.js +294 -0
- package/dist/engine/vector-store/hnsw.js.map +1 -0
- package/dist/engine/vector-store/similarity.d.ts +21 -0
- package/dist/engine/vector-store/similarity.d.ts.map +1 -0
- package/dist/engine/vector-store/similarity.js +86 -0
- package/dist/engine/vector-store/similarity.js.map +1 -0
- package/dist/engine/vector-store/tfidf.d.ts +35 -0
- package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
- package/dist/engine/vector-store/tfidf.js +255 -0
- package/dist/engine/vector-store/tfidf.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/vector-store/backend-factory.d.ts +9 -0
- package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
- package/dist/storage/vector-store/backend-factory.js +33 -0
- package/dist/storage/vector-store/backend-factory.js.map +1 -0
- package/dist/storage/vector-store/json-fallback.d.ts +21 -0
- package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
- package/dist/storage/vector-store/json-fallback.js +85 -0
- package/dist/storage/vector-store/json-fallback.js.map +1 -0
- package/dist/storage/vector-store/migrator.d.ts +10 -0
- package/dist/storage/vector-store/migrator.d.ts.map +1 -0
- package/dist/storage/vector-store/migrator.js +139 -0
- package/dist/storage/vector-store/migrator.js.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.js +142 -0
- package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
- package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
- package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
- package/dist/tools/create-spec/constitution-validator.js +37 -0
- package/dist/tools/create-spec/constitution-validator.js.map +1 -0
- package/dist/tools/create-spec/post-creation.d.ts +11 -0
- package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
- package/dist/tools/create-spec/post-creation.js +48 -0
- package/dist/tools/create-spec/post-creation.js.map +1 -0
- package/dist/tools/create-spec/spec-builder.d.ts +14 -0
- package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
- package/dist/tools/create-spec/spec-builder.js +131 -0
- package/dist/tools/create-spec/spec-builder.js.map +1 -0
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +42 -172
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/recommend-model-handler.d.ts +8 -0
- package/dist/tools/recommend-model-handler.d.ts.map +1 -0
- package/dist/tools/recommend-model-handler.js +65 -0
- package/dist/tools/recommend-model-handler.js.map +1 -0
- package/dist/tools/register-model-tools.d.ts +3 -0
- package/dist/tools/register-model-tools.d.ts.map +1 -0
- package/dist/tools/register-model-tools.js +50 -0
- package/dist/tools/register-model-tools.js.map +1 -0
- package/dist/tools/register-search-tools.d.ts +7 -0
- package/dist/tools/register-search-tools.d.ts.map +1 -0
- package/dist/tools/register-search-tools.js +34 -0
- package/dist/tools/register-search-tools.js.map +1 -0
- package/dist/tools/register-transform-tools.d.ts +3 -0
- package/dist/tools/register-transform-tools.d.ts.map +1 -0
- package/dist/tools/register-transform-tools.js +29 -0
- package/dist/tools/register-transform-tools.js.map +1 -0
- package/dist/tools/semantic-search-handler.d.ts +7 -0
- package/dist/tools/semantic-search-handler.d.ts.map +1 -0
- package/dist/tools/semantic-search-handler.js +72 -0
- package/dist/tools/semantic-search-handler.js.map +1 -0
- package/dist/tools/transform-code-handler.d.ts +7 -0
- package/dist/tools/transform-code-handler.d.ts.map +1 -0
- package/dist/tools/transform-code-handler.js +58 -0
- package/dist/tools/transform-code-handler.js.map +1 -0
- package/dist/types/advanced-framework.d.ts +47 -0
- package/dist/types/advanced-framework.d.ts.map +1 -0
- package/dist/types/advanced-framework.js +3 -0
- package/dist/types/advanced-framework.js.map +1 -0
- package/dist/types/code-transforms.d.ts +114 -0
- package/dist/types/code-transforms.d.ts.map +1 -0
- package/dist/types/code-transforms.js +11 -0
- package/dist/types/code-transforms.js.map +1 -0
- package/dist/types/css-framework.d.ts +110 -0
- package/dist/types/css-framework.d.ts.map +1 -0
- package/dist/types/css-framework.js +3 -0
- package/dist/types/css-framework.js.map +1 -0
- package/dist/types/dashboard.d.ts +77 -0
- package/dist/types/dashboard.d.ts.map +1 -0
- package/dist/types/dashboard.js +2 -0
- package/dist/types/dashboard.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/model-routing.d.ts +127 -0
- package/dist/types/model-routing.d.ts.map +1 -0
- package/dist/types/model-routing.js +3 -0
- package/dist/types/model-routing.js.map +1 -0
- package/dist/types/spec/core.d.ts +28 -1
- package/dist/types/spec/core.d.ts.map +1 -1
- package/dist/types/spec/inputs.d.ts +1 -6
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/ui.d.ts +3 -231
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/ui.js +7 -1
- package/dist/types/ui.js.map +1 -1
- package/dist/types/vector-store.d.ts +137 -0
- package/dist/types/vector-store.d.ts.map +1 -0
- package/dist/types/vector-store.js +3 -0
- package/dist/types/vector-store.js.map +1 -0
- package/package.json +1 -1
- package/src/config/model-routing-rules.json +98 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StorageBackend, VectorEntry, VectorEntryType, VectorSearchResult, BetterSqlite3Database, BetterSqlite3Constructor } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Attempt to dynamically import better-sqlite3.
|
|
4
|
+
* Returns null if the package is not installed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function tryLoadSqlite(): Promise<BetterSqlite3Constructor | null>;
|
|
7
|
+
/**
|
|
8
|
+
* SQLite storage backend using better-sqlite3.
|
|
9
|
+
* WAL mode for concurrent reads. Embeddings stored as BLOB.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SqliteBackend implements StorageBackend {
|
|
12
|
+
private readonly db;
|
|
13
|
+
constructor(db: BetterSqlite3Database);
|
|
14
|
+
private initSchema;
|
|
15
|
+
insert(entry: VectorEntry): Promise<void>;
|
|
16
|
+
update(id: string, partial: Partial<VectorEntry>): Promise<void>;
|
|
17
|
+
delete(id: string): Promise<void>;
|
|
18
|
+
getById(id: string): Promise<VectorEntry | undefined>;
|
|
19
|
+
getAll(type?: VectorEntryType): Promise<VectorEntry[]>;
|
|
20
|
+
searchSimilar(embedding: number[], topK: number, threshold: number, type?: VectorEntryType): Promise<VectorSearchResult[]>;
|
|
21
|
+
close(): void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a SQLite backend for a project.
|
|
25
|
+
* Returns null if better-sqlite3 is not available.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSqliteBackend(projectId: string): Promise<SqliteBackend | null>;
|
|
28
|
+
//# sourceMappingURL=sqlite-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../../src/storage/vector-store/sqlite-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,kBAAkB,EAElB,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAM9B;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAa9E;AA2BD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAwB;gBAE/B,EAAE,EAAE,qBAAqB;IAKrC,OAAO,CAAC,UAAU;IAeZ,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQrD,MAAM,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAWtD,aAAa,CACjB,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAgBhC,KAAK,IAAI,IAAI;CAGd;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgB1F"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// storage/vector-store/sqlite-adapter.ts — SQLite storage backend using better-sqlite3.
|
|
2
|
+
// SPEC-075 AC-03: WAL mode, BLOB embeddings, optional native dependency.
|
|
3
|
+
import { cosineSimilarity } from '../../engine/vector-store/similarity.js';
|
|
4
|
+
import { projectDataDir } from '../base-store.js';
|
|
5
|
+
import { mkdirSync, existsSync } from 'node:fs';
|
|
6
|
+
import { dirname } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Attempt to dynamically import better-sqlite3.
|
|
9
|
+
* Returns null if the package is not installed.
|
|
10
|
+
*/
|
|
11
|
+
export async function tryLoadSqlite() {
|
|
12
|
+
try {
|
|
13
|
+
// Dynamic import with variable to avoid TypeScript module resolution
|
|
14
|
+
const moduleName = 'better-sqlite3';
|
|
15
|
+
const mod = (await import(/* webpackIgnore: true */ moduleName));
|
|
16
|
+
/* v8 ignore start -- better-sqlite3 not available in test env */
|
|
17
|
+
return mod.default;
|
|
18
|
+
/* v8 ignore stop */
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Serialize a number[] embedding to a Buffer (Float32Array). */
|
|
25
|
+
function serializeEmbedding(embedding) {
|
|
26
|
+
const float32 = new Float32Array(embedding);
|
|
27
|
+
return Buffer.from(float32.buffer);
|
|
28
|
+
}
|
|
29
|
+
/** Deserialize a Buffer back to number[]. */
|
|
30
|
+
function deserializeEmbedding(buf) {
|
|
31
|
+
const float32 = new Float32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);
|
|
32
|
+
return [...float32];
|
|
33
|
+
}
|
|
34
|
+
/** Convert a database row to a VectorEntry. */
|
|
35
|
+
function rowToEntry(row) {
|
|
36
|
+
return {
|
|
37
|
+
id: row.id,
|
|
38
|
+
type: row.type,
|
|
39
|
+
content: row.content,
|
|
40
|
+
embedding: deserializeEmbedding(row.embedding),
|
|
41
|
+
metadata: JSON.parse(row.metadata),
|
|
42
|
+
createdAt: row.createdAt,
|
|
43
|
+
updatedAt: row.updatedAt,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* SQLite storage backend using better-sqlite3.
|
|
48
|
+
* WAL mode for concurrent reads. Embeddings stored as BLOB.
|
|
49
|
+
*/
|
|
50
|
+
export class SqliteBackend {
|
|
51
|
+
db;
|
|
52
|
+
constructor(db) {
|
|
53
|
+
this.db = db;
|
|
54
|
+
this.initSchema();
|
|
55
|
+
}
|
|
56
|
+
initSchema() {
|
|
57
|
+
this.db.exec(`
|
|
58
|
+
CREATE TABLE IF NOT EXISTS vectors (
|
|
59
|
+
id TEXT PRIMARY KEY,
|
|
60
|
+
type TEXT NOT NULL,
|
|
61
|
+
content TEXT NOT NULL,
|
|
62
|
+
embedding BLOB NOT NULL,
|
|
63
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
64
|
+
createdAt TEXT NOT NULL,
|
|
65
|
+
updatedAt TEXT NOT NULL
|
|
66
|
+
);
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_vectors_type ON vectors(type);
|
|
68
|
+
`);
|
|
69
|
+
}
|
|
70
|
+
async insert(entry) {
|
|
71
|
+
this.db
|
|
72
|
+
.prepare(`INSERT OR REPLACE INTO vectors (id, type, content, embedding, metadata, createdAt, updatedAt)
|
|
73
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`)
|
|
74
|
+
.run(entry.id, entry.type, entry.content, serializeEmbedding(entry.embedding), JSON.stringify(entry.metadata), entry.createdAt, entry.updatedAt);
|
|
75
|
+
await Promise.resolve();
|
|
76
|
+
}
|
|
77
|
+
async update(id, partial) {
|
|
78
|
+
const existing = await this.getById(id);
|
|
79
|
+
if (!existing) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const merged = { ...existing, ...partial, id: existing.id };
|
|
83
|
+
await this.insert(merged);
|
|
84
|
+
}
|
|
85
|
+
async delete(id) {
|
|
86
|
+
this.db.prepare('DELETE FROM vectors WHERE id = ?').run(id);
|
|
87
|
+
await Promise.resolve();
|
|
88
|
+
}
|
|
89
|
+
async getById(id) {
|
|
90
|
+
const row = this.db.prepare('SELECT * FROM vectors WHERE id = ?').get(id);
|
|
91
|
+
await Promise.resolve();
|
|
92
|
+
return row ? rowToEntry(row) : undefined;
|
|
93
|
+
}
|
|
94
|
+
async getAll(type) {
|
|
95
|
+
let rows;
|
|
96
|
+
if (type) {
|
|
97
|
+
rows = this.db.prepare('SELECT * FROM vectors WHERE type = ?').all(type);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
rows = this.db.prepare('SELECT * FROM vectors').all();
|
|
101
|
+
}
|
|
102
|
+
await Promise.resolve();
|
|
103
|
+
return rows.map(rowToEntry);
|
|
104
|
+
}
|
|
105
|
+
async searchSimilar(embedding, topK, threshold, type) {
|
|
106
|
+
// Load all entries of the given type and compute similarity in JS.
|
|
107
|
+
const entries = await this.getAll(type);
|
|
108
|
+
const results = [];
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
const similarity = cosineSimilarity(embedding, entry.embedding);
|
|
111
|
+
if (similarity >= threshold) {
|
|
112
|
+
results.push({ entry, similarity });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
results.sort((a, b) => b.similarity - a.similarity);
|
|
116
|
+
return results.slice(0, topK);
|
|
117
|
+
}
|
|
118
|
+
close() {
|
|
119
|
+
this.db.close();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a SQLite backend for a project.
|
|
124
|
+
* Returns null if better-sqlite3 is not available.
|
|
125
|
+
*/
|
|
126
|
+
export async function createSqliteBackend(projectId) {
|
|
127
|
+
const SqliteConstructor = await tryLoadSqlite();
|
|
128
|
+
/* v8 ignore start -- entire path after this only reachable with better-sqlite3 */
|
|
129
|
+
if (!SqliteConstructor) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const dbPath = `${projectDataDir(projectId)}/vector-store.db`;
|
|
133
|
+
const dir = dirname(dbPath);
|
|
134
|
+
if (!existsSync(dir)) {
|
|
135
|
+
mkdirSync(dir, { recursive: true });
|
|
136
|
+
}
|
|
137
|
+
const db = SqliteConstructor(dbPath);
|
|
138
|
+
db.pragma('journal_mode = WAL');
|
|
139
|
+
return new SqliteBackend(db);
|
|
140
|
+
/* v8 ignore stop */
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=sqlite-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../../src/storage/vector-store/sqlite-adapter.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,yEAAyE;AAWzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,qEAAqE;QACrE,MAAM,UAAU,GAAG,gBAAgB,CAAC;QACpC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAE9D,CAAC;QACF,iEAAiE;QACjE,OAAO,GAAG,CAAC,OAAO,CAAC;QACnB,oBAAoB;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,SAAS,kBAAkB,CAAC,SAAmB;IAC7C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,6CAA6C;AAC7C,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED,+CAA+C;AAC/C,SAAS,UAAU,CAAC,GAAc;IAChC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAuB;QACjC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;QAC9C,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAA4B;QAC7D,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IACP,EAAE,CAAwB;IAE3C,YAAY,EAAyB;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;KAWZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;sCAC8B,CAC/B;aACA,GAAG,CACF,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,OAAO,EACb,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EACnC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAC9B,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,CAChB,CAAC;QACJ,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAA6B;QACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,EAAE,CAE3D,CAAC;QACd,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAsB;QACjC,IAAI,IAAiB,CAAC;QACtB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAgB,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAiB,CAAC;QACvE,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,SAAmB,EACnB,IAAY,EACZ,SAAiB,EACjB,IAAsB;QAEtB,mEAAmE;QACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAChE,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,MAAM,iBAAiB,GAAG,MAAM,aAAa,EAAE,CAAC;IAChD,kFAAkF;IAClF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,kBAAkB,CAAC;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACrC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;IAC7B,oBAAoB;AACtB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ConstitutionCheckResult } from '../../types/index.js';
|
|
2
|
+
/** Validates spec against Constitution principles. Returns block result or warnings. */
|
|
3
|
+
export declare function validateConstitution(projectId: string, title: string, tags: string[]): Promise<ConstitutionCheckResult>;
|
|
4
|
+
//# sourceMappingURL=constitution-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution-validator.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAIpE,wFAAwF;AACxF,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,uBAAuB,CAAC,CAqClC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// tools/create-spec/constitution-validator.ts — Constitution compliance validation.
|
|
2
|
+
// Extracted from create-spec.ts to keep file sizes within limits.
|
|
3
|
+
import { knowledgeStore } from '../../storage/index.js';
|
|
4
|
+
import { checkConstitutionCompliance } from '../create-spec-tech.js';
|
|
5
|
+
/** Validates spec against Constitution principles. Returns block result or warnings. */
|
|
6
|
+
export async function validateConstitution(projectId, title, tags) {
|
|
7
|
+
const constitution = await knowledgeStore.getConstitution(projectId);
|
|
8
|
+
if (!constitution || constitution.principles.length === 0) {
|
|
9
|
+
return { blocked: false, warnings: [] };
|
|
10
|
+
}
|
|
11
|
+
const violations = checkConstitutionCompliance(title, tags, constitution.principles);
|
|
12
|
+
const strictViolations = violations.filter((v) => v.severity === 'error');
|
|
13
|
+
if (strictViolations.length > 0) {
|
|
14
|
+
return {
|
|
15
|
+
blocked: true,
|
|
16
|
+
errorResult: {
|
|
17
|
+
content: [
|
|
18
|
+
{
|
|
19
|
+
type: 'text',
|
|
20
|
+
text: JSON.stringify({
|
|
21
|
+
error: 'Constitution violation',
|
|
22
|
+
strictViolations,
|
|
23
|
+
message: `Spec violates ${strictViolations.length} strict Constitution principle(s). Revise the spec or update the Constitution.`,
|
|
24
|
+
}, null, 2),
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
isError: true,
|
|
28
|
+
},
|
|
29
|
+
warnings: [],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
blocked: false,
|
|
34
|
+
warnings: violations.filter((v) => v.severity === 'warning'),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=constitution-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution-validator.js","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,kEAAkE;AAGlE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,KAAa,EACb,IAAc;IAEd,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAE1E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE;gBACX,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,KAAK,EAAE,wBAAwB;4BAC/B,gBAAgB;4BAChB,OAAO,EAAE,iBAAiB,gBAAgB,CAAC,MAAM,gFAAgF;yBAClI,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd;YACD,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC;KAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Spec } from '../../types/index.js';
|
|
2
|
+
/** Auto-setup git branch (non-blocking). Returns branch info or undefined. */
|
|
3
|
+
export declare function setupGitBranch(projectId: string, specId: string): Promise<{
|
|
4
|
+
branch: string;
|
|
5
|
+
data: unknown;
|
|
6
|
+
} | undefined>;
|
|
7
|
+
/** Brief contradiction check (non-blocking). Returns a warning hint or undefined. */
|
|
8
|
+
export declare function checkContradictions(projectId: string, specId: string, description: string): Promise<string | undefined>;
|
|
9
|
+
/** Dispatches the on_spec_created hook event (fire-and-forget). */
|
|
10
|
+
export declare function fireSpecCreatedHook(projectId: string, spec: Spec): void;
|
|
11
|
+
//# sourceMappingURL=post-creation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-creation.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/post-creation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,8EAA8E;AAC9E,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAQxD;AAED,qFAAqF;AACrF,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAUvE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// tools/create-spec/post-creation.ts — Git setup + contradiction detection after spec creation.
|
|
2
|
+
// Extracted from create-spec.ts to keep file sizes within limits.
|
|
3
|
+
import { specStore } from '../../storage/index.js';
|
|
4
|
+
import { detectContradictions } from '../../engine/contradiction-detector.js';
|
|
5
|
+
import { tryAutoSetupGit } from '../create-spec-helpers.js';
|
|
6
|
+
/** Auto-setup git branch (non-blocking). Returns branch info or undefined. */
|
|
7
|
+
export async function setupGitBranch(projectId, specId) {
|
|
8
|
+
const result = await tryAutoSetupGit(projectId, specId);
|
|
9
|
+
/* v8 ignore start -- requires real git repo */
|
|
10
|
+
if (result) {
|
|
11
|
+
return { branch: result.branch, data: result.data };
|
|
12
|
+
}
|
|
13
|
+
/* v8 ignore stop */
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
/** Brief contradiction check (non-blocking). Returns a warning hint or undefined. */
|
|
17
|
+
export async function checkContradictions(projectId, specId, description) {
|
|
18
|
+
try {
|
|
19
|
+
const allSpecs = await specStore.listSpecs(projectId);
|
|
20
|
+
const specInputs = allSpecs.map((s) => ({
|
|
21
|
+
id: s.id,
|
|
22
|
+
title: s.title,
|
|
23
|
+
content: s.title + ' ' + description,
|
|
24
|
+
}));
|
|
25
|
+
const contradictions = detectContradictions(specInputs);
|
|
26
|
+
const newSpecContradictions = contradictions.filter((c) => c.specA === specId || c.specB === specId);
|
|
27
|
+
if (newSpecContradictions.length === 0) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const blockers = newSpecContradictions.filter((c) => c.severity === 'blocker');
|
|
31
|
+
return blockers.length > 0
|
|
32
|
+
? `[CONFLICT] ${blockers.length} potential blocker contradiction(s) detected. Run detect_contradictions for details.`
|
|
33
|
+
: `[WARNING] ${newSpecContradictions.length} potential contradiction(s) detected. Run detect_contradictions for details.`;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Dispatches the on_spec_created hook event (fire-and-forget). */
|
|
40
|
+
export function fireSpecCreatedHook(projectId, spec) {
|
|
41
|
+
// Dynamic imports to avoid circular dependency issues
|
|
42
|
+
void (async () => {
|
|
43
|
+
const { dispatchHookEvent } = await import('../manage-hooks.js');
|
|
44
|
+
const { buildSpecCreatedPayload } = await import('../../engine/hooks/triggers.js');
|
|
45
|
+
void dispatchHookEvent(projectId, buildSpecCreatedPayload(projectId, spec.id, spec.title, spec.type));
|
|
46
|
+
})();
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=post-creation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-creation.js","sourceRoot":"","sources":["../../../src/tools/create-spec/post-creation.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,kEAAkE;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxD,+CAA+C;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,oBAAoB;IACpB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,MAAc,EACd,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,WAAW;SACrC,CAAC,CAAC,CAAC;QACJ,MAAM,cAAc,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,qBAAqB,GAAG,cAAc,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAChD,CAAC;QACF,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAC/E,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,cAAc,QAAQ,CAAC,MAAM,sFAAsF;YACrH,CAAC,CAAC,aAAa,qBAAqB,CAAC,MAAM,8EAA8E,CAAC;IAC9H,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,IAAU;IAC/D,sDAAsD;IACtD,KAAK,CAAC,KAAK,IAAmB,EAAE;QAC9B,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACjE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACnF,KAAK,iBAAiB,CACpB,SAAS,EACT,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CACnE,CAAC;IACJ,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CreateSpecInput, SpecBuildContext } from '../../types/index.js';
|
|
2
|
+
import { analyzeSplit } from '../../engine/spec-splitter.js';
|
|
3
|
+
export type { SpecBuildContext };
|
|
4
|
+
/** Builds the Spec object, calculates estimation, generates diagrams, and scope filters. */
|
|
5
|
+
export declare function buildSpecContext(params: CreateSpecInput): Promise<{
|
|
6
|
+
ok: true;
|
|
7
|
+
context: SpecBuildContext;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
errorMessage: string;
|
|
11
|
+
}>;
|
|
12
|
+
/** Builds the split suggestion result object if applicable. */
|
|
13
|
+
export declare function buildSplitResult(splitSuggestion: ReturnType<typeof analyzeSplit>, experienceLevel: string | undefined): Record<string, unknown> | undefined;
|
|
14
|
+
//# sourceMappingURL=spec-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-builder.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/spec-builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EAIf,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,YAAY,EAAyB,MAAM,+BAA+B,CAAC;AAMpF,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,4FAA4F;AAC5F,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAkIxF;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EAChD,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAWrC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// tools/create-spec/spec-builder.ts — Builds the Spec object, diagrams, and scope filters.
|
|
2
|
+
// Extracted from create-spec.ts to keep file sizes within limits.
|
|
3
|
+
import { hashProjectPath, knowledgeStore, specStore, globalStore } from '../../storage/index.js';
|
|
4
|
+
import { getCurrentTier } from '../license-gate.js';
|
|
5
|
+
import { checkLimits } from '../../engine/license-validator.js';
|
|
6
|
+
import { inferDifficulty, calculateEstimation } from '../../engine/estimator.js';
|
|
7
|
+
import { generateDiagrams } from '../../engine/mermaid-generator.js';
|
|
8
|
+
import { analyzeSplit, formatSplitSuggestion } from '../../engine/spec-splitter.js';
|
|
9
|
+
import { getScopeFilters } from '../../engine/scope-filter.js';
|
|
10
|
+
import { isLegacyLocation, getSpecFileNames } from '../../engine/planu-config-writer.js';
|
|
11
|
+
import { slugify, generateSpecId, generateBranchName } from '../create-spec-helpers.js';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
/** Builds the Spec object, calculates estimation, generates diagrams, and scope filters. */
|
|
14
|
+
export async function buildSpecContext(params) {
|
|
15
|
+
const { title, description, projectPath, type = 'feature', scope = 'feature', target = 'fullstack', tags = [], feature, } = params;
|
|
16
|
+
const projectId = hashProjectPath(projectPath);
|
|
17
|
+
const knowledge = await knowledgeStore.getKnowledge(projectId);
|
|
18
|
+
const existingSpecs = await specStore.listSpecs(projectId);
|
|
19
|
+
// License: check active spec limit (exclude completed specs)
|
|
20
|
+
const activeSpecs = existingSpecs.filter((s) => s.status !== 'done');
|
|
21
|
+
const tier = await getCurrentTier();
|
|
22
|
+
const specLimit = checkLimits(tier, activeSpecs.length, 'maxActiveSpecs');
|
|
23
|
+
/* v8 ignore start -- license limit requires paid tier test env */
|
|
24
|
+
if (!specLimit.allowed) {
|
|
25
|
+
return { ok: false, errorMessage: specLimit.message };
|
|
26
|
+
}
|
|
27
|
+
/* v8 ignore stop */
|
|
28
|
+
// Generate spec ID and slug
|
|
29
|
+
const specId = generateSpecId(existingSpecs.length);
|
|
30
|
+
const slug = slugify(title);
|
|
31
|
+
// Check for duplicate title
|
|
32
|
+
const duplicate = existingSpecs.find((s) => slugify(s.title) === slug);
|
|
33
|
+
// Infer difficulty and calculate estimation
|
|
34
|
+
const difficulty = inferDifficulty(type, scope);
|
|
35
|
+
const globalConfig = await globalStore.getGlobalConfig();
|
|
36
|
+
const estimation = calculateEstimation(type, scope, difficulty, globalConfig);
|
|
37
|
+
// Determine risk level from difficulty and scope
|
|
38
|
+
const risk = difficulty >= 4 || scope === 'architectural'
|
|
39
|
+
? 'high'
|
|
40
|
+
: difficulty >= 3 || scope === 'cross-module'
|
|
41
|
+
? 'medium'
|
|
42
|
+
: 'low';
|
|
43
|
+
// Build spec location with naming convention detection
|
|
44
|
+
const specLocation = knowledge?.specLocation ?? 'planu/specs';
|
|
45
|
+
const naming = isLegacyLocation(specLocation) ? 'legacy' : 'modern';
|
|
46
|
+
const fileNames = getSpecFileNames(naming);
|
|
47
|
+
const featureSlug = feature ? slugify(feature) : '_general';
|
|
48
|
+
const specDir = join(projectPath, specLocation, featureSlug, slug);
|
|
49
|
+
const specPath = join(specDir, fileNames.spec);
|
|
50
|
+
const technicalPath = join(specDir, fileNames.technical);
|
|
51
|
+
const progressPath = join(specDir, fileNames.progress);
|
|
52
|
+
// Generate git branch name
|
|
53
|
+
const gitBranch = generateBranchName(specId, slug, type);
|
|
54
|
+
// Build the Spec object
|
|
55
|
+
const now = new Date().toISOString();
|
|
56
|
+
const spec = {
|
|
57
|
+
id: specId,
|
|
58
|
+
title,
|
|
59
|
+
slug,
|
|
60
|
+
feature: featureSlug,
|
|
61
|
+
type,
|
|
62
|
+
scope,
|
|
63
|
+
status: 'draft',
|
|
64
|
+
difficulty,
|
|
65
|
+
risk,
|
|
66
|
+
projectId,
|
|
67
|
+
createdAt: now,
|
|
68
|
+
updatedAt: now,
|
|
69
|
+
specPath,
|
|
70
|
+
technicalPath,
|
|
71
|
+
progressPath,
|
|
72
|
+
estimation,
|
|
73
|
+
actuals: null,
|
|
74
|
+
target,
|
|
75
|
+
tags,
|
|
76
|
+
dependencies: [],
|
|
77
|
+
blockedBy: [],
|
|
78
|
+
gitBranch,
|
|
79
|
+
impactAnalysis: null,
|
|
80
|
+
};
|
|
81
|
+
// Detect context flags for diagrams and filters
|
|
82
|
+
const { detectContextFlags } = await import('../create-spec-tech.js');
|
|
83
|
+
const contextFlags = detectContextFlags(spec, knowledge);
|
|
84
|
+
// Generate Mermaid diagrams
|
|
85
|
+
const diagrams = generateDiagrams(spec, knowledge, contextFlags);
|
|
86
|
+
// Analyze if spec should be split
|
|
87
|
+
const splitSuggestion = analyzeSplit({
|
|
88
|
+
criteriaCount: 4,
|
|
89
|
+
moduleCount: scope === 'cross-module' ? 5 : scope === 'architectural' ? 6 : 2,
|
|
90
|
+
estimatedHours: estimation.devHours,
|
|
91
|
+
description,
|
|
92
|
+
type,
|
|
93
|
+
scope,
|
|
94
|
+
target,
|
|
95
|
+
}, specId);
|
|
96
|
+
// Get scope filter configuration
|
|
97
|
+
const scopeFilters = getScopeFilters(scope, {
|
|
98
|
+
hasDatabase: contextFlags.hasDatabase,
|
|
99
|
+
hasUi: contextFlags.hasUi,
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
ok: true,
|
|
103
|
+
context: {
|
|
104
|
+
spec,
|
|
105
|
+
specDir,
|
|
106
|
+
specPath,
|
|
107
|
+
technicalPath,
|
|
108
|
+
progressPath,
|
|
109
|
+
diagrams,
|
|
110
|
+
estimation,
|
|
111
|
+
splitSuggestion,
|
|
112
|
+
scopeFilters,
|
|
113
|
+
duplicate,
|
|
114
|
+
projectId,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/** Builds the split suggestion result object if applicable. */
|
|
119
|
+
export function buildSplitResult(splitSuggestion, experienceLevel) {
|
|
120
|
+
if (!splitSuggestion) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
const level = experienceLevel ?? 'intermediate';
|
|
124
|
+
return {
|
|
125
|
+
shouldSplit: true,
|
|
126
|
+
reason: splitSuggestion.reason,
|
|
127
|
+
subSpecs: splitSuggestion.suggestedSpecs,
|
|
128
|
+
formatted: formatSplitSuggestion(splitSuggestion, level === 'beginner' ? 'beginner' : 'expert'),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=spec-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-builder.js","sourceRoot":"","sources":["../../../src/tools/create-spec/spec-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-spec.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"create-spec.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAyBrE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CA8KnF"}
|