@thebackstoryis/engineering-with-ai 0.2.9
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/Docs/README.md +50 -0
- package/Docs/adoption/consultancy-and-multi-project-rollout.md +135 -0
- package/Docs/adoption/non-technical-team-guide.md +126 -0
- package/Docs/archaeology-technology-and-hosting-discovery.md +212 -0
- package/Docs/blast-radius-and-impact-routing-guide.md +325 -0
- package/Docs/blueprints/internal-blueprint-catalogue.md +146 -0
- package/Docs/blueprints/maintaining-organisation-blueprints.md +154 -0
- package/Docs/blueprints/validation-and-troubleshooting.md +168 -0
- package/Docs/cli-reference.md +113 -0
- package/Docs/completed-phase-evidence-amendments.md +74 -0
- package/Docs/consultancy-network-rollout-control-plane-guide.md +202 -0
- package/Docs/context-aware-delivery-companion-guide.md +198 -0
- package/Docs/context-aware-delivery-companion-user-guide.md +184 -0
- package/Docs/context-management-and-token-efficiency.md +113 -0
- package/Docs/design-systems/design-system-implementation-guide.md +85 -0
- package/Docs/design-systems/design-system-pack-authoring-guide.md +95 -0
- package/Docs/design-systems/design-system-review-guide.md +51 -0
- package/Docs/design-systems/design-system-user-guide.md +96 -0
- package/Docs/design-systems/product-owner-guide.md +49 -0
- package/Docs/designing-organisation-blueprint-packs.md +384 -0
- package/Docs/developer-delivery-guide.md +224 -0
- package/Docs/error-reporting-guide.md +110 -0
- package/Docs/error-reporting-provider-guide.md +49 -0
- package/Docs/examples/error-report-adapter.md +70 -0
- package/Docs/examples/meeting-review.md +76 -0
- package/Docs/examples/minimal-design-system.md +67 -0
- package/Docs/examples/prototype-review-inputs.md +175 -0
- package/Docs/examples/reproducible-archaeology-depth-example.md +144 -0
- package/Docs/examples/test-scenario-input.md +68 -0
- package/Docs/examples/worked-examples.md +147 -0
- package/Docs/existing-project-onboarding-guide.md +214 -0
- package/Docs/explanation/core-concepts.md +26 -0
- package/Docs/explanation/delivery-workflow.md +48 -0
- package/Docs/governance/governance-team-guide.md +139 -0
- package/Docs/governed-starter-project-materialisation-guide.md +284 -0
- package/Docs/guide-catalogue.md +117 -0
- package/Docs/guided-discovery-facilitator-guide.md +172 -0
- package/Docs/guided-intent-workspace-guide.md +109 -0
- package/Docs/guided-phase-evidence-drafting-guide.md +119 -0
- package/Docs/human-approval-and-assurance-guide.md +146 -0
- package/Docs/knowledge-proposals-implementer-guide.md +106 -0
- package/Docs/knowledge-proposals-user-guide.md +247 -0
- package/Docs/maintainers/context-benchmarks.md +29 -0
- package/Docs/maintainers/contributing.md +58 -0
- package/Docs/maintainers/evidence-depth-acceptance.md +72 -0
- package/Docs/maintainers/verification-walkthroughs.md +104 -0
- package/Docs/meeting-evidence-implementer-guide.md +132 -0
- package/Docs/meeting-evidence-user-guide.md +200 -0
- package/Docs/operations/dashboard-and-delivery-state.md +153 -0
- package/Docs/operations/dashboard-configuration.md +87 -0
- package/Docs/operations/installation-updating-and-entitlements.md +135 -0
- package/Docs/operations/premium-personas-setup.md +76 -0
- package/Docs/operations/troubleshooting-and-recovery.md +205 -0
- package/Docs/organisation-rollout-guide.md +142 -0
- package/Docs/persona-entitlement-provider-guide.md +199 -0
- package/Docs/persona-guided-prototype-iteration.md +129 -0
- package/Docs/personas/organisation-specific-personas.md +103 -0
- package/Docs/personas/persona-authoring-cookbook.md +176 -0
- package/Docs/personas/persona-engagement-ui.md +133 -0
- package/Docs/personas/persona-governance.md +118 -0
- package/Docs/platform-export-analysis-guide.md +336 -0
- package/Docs/policies/governance-owner-guide.md +36 -0
- package/Docs/policies/implementation-guide.md +42 -0
- package/Docs/policies/organisation-policy-design-gates.md +58 -0
- package/Docs/policies/policy-pack-authoring-guide.md +108 -0
- package/Docs/policies/product-owner-guide.md +43 -0
- package/Docs/policies/technical-owner-guide.md +37 -0
- package/Docs/product-owner-guide.md +327 -0
- package/Docs/project-portfolio-orchestration-guide.md +199 -0
- package/Docs/quality/manual-qa-and-acceptance.md +162 -0
- package/Docs/quality/persona-driven-test-scenarios.md +172 -0
- package/Docs/quality/reproducible-archaeology-depth-review-checklist.md +89 -0
- package/Docs/reference/capabilities-and-project-layout.md +678 -0
- package/Docs/reference/cli-and-configuration.md +398 -0
- package/Docs/reference/contributions-api.md +23 -0
- package/Docs/reference/security-adapter-authoring.md +81 -0
- package/Docs/reference/starter-adapter-authoring.md +74 -0
- package/Docs/repository-source-map-guide.md +381 -0
- package/Docs/reproducible-archaeology-and-discovery-depth.md +292 -0
- package/Docs/screen-prototype-creation-guide.md +324 -0
- package/Docs/security-validation-guide.md +353 -0
- package/Docs/solution-readiness-review-guide.md +123 -0
- package/Docs/standards/project-standards-authoring.md +157 -0
- package/Docs/team-hub-guide.md +162 -0
- package/Docs/team-hub-resource-registry-guide.md +167 -0
- package/Docs/tutorials/first-delivery.md +83 -0
- package/Docs/tutorials/first-session.md +62 -0
- package/Docs/using-lifecycle-hooks.md +381 -0
- package/Docs/working-with-personas.md +274 -0
- package/LICENSE +165 -0
- package/README.md +96 -0
- package/agents-src/claude/ewai-security-reviewer.md +15 -0
- package/bin/ewai +5 -0
- package/config/archaeology-record-families.yaml +59 -0
- package/config/delivery-artifacts.yaml +121 -0
- package/config/delivery-stages.yaml +77 -0
- package/config/design-system.schema.json +46 -0
- package/config/error-reporting.schema.json +79 -0
- package/config/evidence-depth.schema.json +53 -0
- package/config/intent.schema.json +90 -0
- package/config/knowledge-proposals-proposal.schema.json +34 -0
- package/config/lifecycle-event.schema.json +68 -0
- package/config/lifecycle-handler.schema.json +45 -0
- package/config/lifecycle-hook-ack.schema.json +19 -0
- package/config/meeting-evidence-candidate.schema.json +102 -0
- package/config/organisation-policy.schema.json +137 -0
- package/config/pack.schema.json +250 -0
- package/config/persona-pack.schema.json +21 -0
- package/config/persona.schema.json +17 -0
- package/config/policy-evaluation.schema.json +77 -0
- package/config/policy-facts.schema.json +140 -0
- package/config/portfolio.schema.json +68 -0
- package/config/project.schema.json +313 -0
- package/config/prototype-iteration.schema.json +128 -0
- package/config/rollout.schema.json +87 -0
- package/config/security-adapter.schema.json +31 -0
- package/config/security-scan-request.schema.json +64 -0
- package/config/security-scan-response.schema.json +52 -0
- package/config/security-validation-policy.schema.json +74 -0
- package/config/starter-source-acknowledgement.schema.json +13 -0
- package/config/starter-source-adapter.schema.json +38 -0
- package/config/starter-source-request.schema.json +61 -0
- package/package.json +77 -0
- package/packs/core/pack.yaml +7 -0
- package/packs/design-systems/default/experience-promise.md +9 -0
- package/packs/design-systems/default/intentional-review.md +10 -0
- package/packs/design-systems/default/interaction-and-entry.md +9 -0
- package/packs/design-systems/default/meaningful-content-and-states.md +9 -0
- package/packs/design-systems/default/pack.yaml +44 -0
- package/packs/design-systems/default/principles.md +10 -0
- package/packs/personas/core/pack.yaml +7 -0
- package/packs/personas/core/personas/archaeologist.md +37 -0
- package/packs/personas/core/personas/end-user.md +17 -0
- package/packs/personas/core/personas/maintainer.md +17 -0
- package/packs/personas/core/personas/operator.md +17 -0
- package/packs/personas/core/personas/specs-knowledge-curator.md +35 -0
- package/packs/technologies/laravel/pack.yaml +30 -0
- package/packs/technologies/laravel-nuxt/pack.yaml +30 -0
- package/packs/technologies/nuxt/pack.yaml +30 -0
- package/packs/technologies/power-platform/pack.yaml +31 -0
- package/packs/technologies/salesforce/pack.yaml +25 -0
- package/public/app.js +4896 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/backstory-icon.png +0 -0
- package/public/dashboard-navigation.js +98 -0
- package/public/favicon-16.png +0 -0
- package/public/favicon-32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/index.html +789 -0
- package/public/styles.css +2693 -0
- package/public/team-hub/app.js +202 -0
- package/public/team-hub/index.html +79 -0
- package/public/team-hub/styles.css +90 -0
- package/scripts/publication-check.mjs +140 -0
- package/scripts/setup.mjs +21 -0
- package/skills-src/ewai-archaeology/SKILL.md +334 -0
- package/skills-src/ewai-archaeology/agents/openai.yaml +4 -0
- package/skills-src/ewai-archaeology/references/archaeology-contract.md +201 -0
- package/skills-src/ewai-archaeology/references/lifecycle-reconstruction.md +177 -0
- package/skills-src/ewai-archaeology/references/maximum-detail-reconstruction.md +97 -0
- package/skills-src/ewai-archaeology/references/model-routing.md +26 -0
- package/skills-src/ewai-architecture/SKILL.md +108 -0
- package/skills-src/ewai-architecture/agents/openai.yaml +4 -0
- package/skills-src/ewai-architecture/references/architecture-contract.md +176 -0
- package/skills-src/ewai-context/SKILL.md +68 -0
- package/skills-src/ewai-context/agents/openai.yaml +4 -0
- package/skills-src/ewai-context-import/SKILL.md +118 -0
- package/skills-src/ewai-context-import/agents/openai.yaml +4 -0
- package/skills-src/ewai-context-import/references/context-import-contract.md +106 -0
- package/skills-src/ewai-dashboard-configuration/SKILL.md +20 -0
- package/skills-src/ewai-deliver/SKILL.md +122 -0
- package/skills-src/ewai-deliver/references/delivery-evidence.md +92 -0
- package/skills-src/ewai-deliver/references/phase-routing.md +31 -0
- package/skills-src/ewai-design-system-apply/SKILL.md +27 -0
- package/skills-src/ewai-design-system-apply/agents/openai.yaml +4 -0
- package/skills-src/ewai-design-system-apply/references/application-contract.md +36 -0
- package/skills-src/ewai-design-system-author/SKILL.md +28 -0
- package/skills-src/ewai-design-system-author/agents/openai.yaml +4 -0
- package/skills-src/ewai-design-system-author/references/authoring-contract.md +38 -0
- package/skills-src/ewai-design-system-review/SKILL.md +26 -0
- package/skills-src/ewai-design-system-review/agents/openai.yaml +4 -0
- package/skills-src/ewai-design-system-review/references/review-contract.md +40 -0
- package/skills-src/ewai-error-reporting/SKILL.md +46 -0
- package/skills-src/ewai-error-reporting/agents/openai.yaml +4 -0
- package/skills-src/ewai-error-reporting/references/provider-contract.md +74 -0
- package/skills-src/ewai-evidence-depth/SKILL.md +72 -0
- package/skills-src/ewai-evidence-depth/agents/openai.yaml +4 -0
- package/skills-src/ewai-evidence-depth/references/evidence-depth-contract.md +127 -0
- package/skills-src/ewai-intent/SKILL.md +68 -0
- package/skills-src/ewai-intent/agents/openai.yaml +4 -0
- package/skills-src/ewai-intent/references/intent-contract.md +42 -0
- package/skills-src/ewai-knowledge-proposals/SKILL.md +105 -0
- package/skills-src/ewai-knowledge-proposals/agents/openai.yaml +4 -0
- package/skills-src/ewai-knowledge-proposals/references/proposal-contract.md +59 -0
- package/skills-src/ewai-meeting-evidence/SKILL.md +106 -0
- package/skills-src/ewai-meeting-evidence/agents/openai.yaml +4 -0
- package/skills-src/ewai-meeting-evidence/references/candidate-contract.md +64 -0
- package/skills-src/ewai-organisation-policy/SKILL.md +62 -0
- package/skills-src/ewai-organisation-policy/agents/openai.yaml +4 -0
- package/skills-src/ewai-organisation-policy/references/policy-contract.md +94 -0
- package/skills-src/ewai-palace-housekeeping/SKILL.md +55 -0
- package/skills-src/ewai-palace-housekeeping/agents/openai.yaml +4 -0
- package/skills-src/ewai-persona-entitlement/SKILL.md +60 -0
- package/skills-src/ewai-persona-entitlement/agents/openai.yaml +4 -0
- package/skills-src/ewai-phase-evidence/SKILL.md +79 -0
- package/skills-src/ewai-phase-evidence/agents/openai.yaml +4 -0
- package/skills-src/ewai-pipeline/SKILL.md +130 -0
- package/skills-src/ewai-pipeline/agents/openai.yaml +4 -0
- package/skills-src/ewai-pipeline/references/cli.md +86 -0
- package/skills-src/ewai-pipeline/references/specs-contract.md +16 -0
- package/skills-src/ewai-portfolio/SKILL.md +70 -0
- package/skills-src/ewai-portfolio/agents/openai.yaml +4 -0
- package/skills-src/ewai-portfolio/references/portfolio-contract.md +67 -0
- package/skills-src/ewai-project-discovery/SKILL.md +95 -0
- package/skills-src/ewai-project-discovery/agents/openai.yaml +4 -0
- package/skills-src/ewai-project-discovery/references/discovery-contract.md +34 -0
- package/skills-src/ewai-prototype-iteration/SKILL.md +30 -0
- package/skills-src/ewai-prototype-iteration/agents/openai.yaml +4 -0
- package/skills-src/ewai-prototype-iteration/references/review-contract.md +49 -0
- package/skills-src/ewai-retro/SKILL.md +48 -0
- package/skills-src/ewai-retro/agents/openai.yaml +4 -0
- package/skills-src/ewai-retro/references/asset-routing.md +14 -0
- package/skills-src/ewai-rollout/SKILL.md +74 -0
- package/skills-src/ewai-rollout/agents/openai.yaml +4 -0
- package/skills-src/ewai-rollout/references/rollout-contract.md +74 -0
- package/skills-src/ewai-shape-intents/SKILL.md +84 -0
- package/skills-src/ewai-shape-intents/agents/openai.yaml +4 -0
- package/skills-src/ewai-shape-intents/references/intent-mapping-contract.md +109 -0
- package/skills-src/ewai-solution-readiness/SKILL.md +55 -0
- package/skills-src/ewai-solution-readiness/agents/openai.yaml +4 -0
- package/skills-src/ewai-standards-check/SKILL.md +93 -0
- package/skills-src/ewai-standards-check/agents/openai.yaml +4 -0
- package/skills-src/ewai-standards-check/references/report-contract.md +116 -0
- package/skills-src/ewai-test-scenarios/SKILL.md +94 -0
- package/skills-src/ewai-test-scenarios/agents/openai.yaml +4 -0
- package/skills-src/ewai-test-scenarios/references/scenario-contract.md +88 -0
- package/src/afk-worker.mjs +16 -0
- package/src/archaeology.mjs +1333 -0
- package/src/checkin.mjs +261 -0
- package/src/cli.mjs +2427 -0
- package/src/companion-guidance.mjs +257 -0
- package/src/companion-opening.mjs +62 -0
- package/src/companion.mjs +256 -0
- package/src/context.mjs +210 -0
- package/src/dashboard-preferences.mjs +80 -0
- package/src/delivery-artifacts.mjs +204 -0
- package/src/delivery-documents.mjs +248 -0
- package/src/delivery-gates.mjs +317 -0
- package/src/delivery.mjs +1433 -0
- package/src/design-system-application.mjs +291 -0
- package/src/design-system-authoring.mjs +101 -0
- package/src/design-systems.mjs +466 -0
- package/src/discovery.mjs +1314 -0
- package/src/error-reporting.mjs +323 -0
- package/src/evidence-depth.mjs +543 -0
- package/src/execution-state.mjs +243 -0
- package/src/install.mjs +166 -0
- package/src/intent-dependencies.mjs +117 -0
- package/src/intent-maps.mjs +402 -0
- package/src/intents.mjs +747 -0
- package/src/knowledge-proposals.mjs +717 -0
- package/src/launcher.mjs +51 -0
- package/src/meeting-evidence.mjs +703 -0
- package/src/network-rollout.mjs +386 -0
- package/src/organisation-blueprints.mjs +438 -0
- package/src/organisation-policies.mjs +448 -0
- package/src/packs.mjs +44 -0
- package/src/paths.mjs +62 -0
- package/src/persona-entitlements.mjs +438 -0
- package/src/persona-licence-config.mjs +98 -0
- package/src/persona-website-provider.mjs +134 -0
- package/src/persona-zip.mjs +87 -0
- package/src/personas.mjs +159 -0
- package/src/platform-metadata-analysis.mjs +314 -0
- package/src/policy-design-gates.mjs +623 -0
- package/src/policy-gate-integration.mjs +318 -0
- package/src/portfolio.mjs +509 -0
- package/src/power-platform-source-map.mjs +190 -0
- package/src/project.mjs +449 -0
- package/src/prototype-iterations.mjs +730 -0
- package/src/repository-source-map.mjs +603 -0
- package/src/runtime/afk-conductor.mjs +973 -0
- package/src/runtime/context-assembly.mjs +457 -0
- package/src/runtime/context-benchmarks.mjs +115 -0
- package/src/runtime/dashboard-actions.mjs +109 -0
- package/src/runtime/dashboard-handoffs.mjs +149 -0
- package/src/runtime/dashboard-server.mjs +1272 -0
- package/src/runtime/dashboard.mjs +197 -0
- package/src/runtime/database.mjs +789 -0
- package/src/runtime/error-reporting.mjs +581 -0
- package/src/runtime/evidence-depth-workspace.mjs +412 -0
- package/src/runtime/execution-leases.mjs +299 -0
- package/src/runtime/guided-discovery.mjs +350 -0
- package/src/runtime/guided-intents.mjs +517 -0
- package/src/runtime/impact-analysis.mjs +535 -0
- package/src/runtime/intents.mjs +222 -0
- package/src/runtime/knowledge.mjs +86 -0
- package/src/runtime/lifecycle-hooks.mjs +1239 -0
- package/src/runtime/mcp-config.mjs +110 -0
- package/src/runtime/mcp-server.mjs +1885 -0
- package/src/runtime/palace.mjs +362 -0
- package/src/runtime/paths.mjs +58 -0
- package/src/runtime/persona-engagement.mjs +255 -0
- package/src/runtime/phase-contributions.mjs +594 -0
- package/src/runtime/policy-workspace.mjs +170 -0
- package/src/runtime/prototype-iterations.mjs +235 -0
- package/src/runtime/provider-adapters.mjs +163 -0
- package/src/runtime/repository-index.mjs +838 -0
- package/src/runtime/runs.mjs +185 -0
- package/src/runtime/security-validation.mjs +1230 -0
- package/src/runtime/starter-materialisation.mjs +1155 -0
- package/src/runtime/team-hub-client.mjs +479 -0
- package/src/runtime/team-hub-database.mjs +288 -0
- package/src/runtime/team-hub-server.mjs +191 -0
- package/src/runtime/team-hub.mjs +110 -0
- package/src/runtime/tree-sitter-index.mjs +390 -0
- package/src/runtime/version.mjs +1 -0
- package/src/runtime/work.mjs +633 -0
- package/src/salesforce-source-map.mjs +212 -0
- package/src/security-validation-config.mjs +224 -0
- package/src/solution-readiness.mjs +620 -0
- package/src/starter-materialisation-contract.mjs +407 -0
- package/src/task-graph.mjs +544 -0
- package/src/team-hub-resources.mjs +239 -0
- package/src/team-hub.mjs +242 -0
- package/src/test-scenarios.mjs +622 -0
- package/src/validation-config.mjs +289 -0
- package/templates/SPECS/1.Scope/personas/registry.yaml +12 -0
- package/templates/SPECS/5.Strategy/patterns/context-packet.md +119 -0
- package/templates/SPECS/6.Build/_tracker-template.md +16 -0
- package/templates/SPECS/pipeline.yaml +62 -0
- package/templates/discovery-answers.yaml +86 -0
- package/templates/intent-body.md +21 -0
- package/tests/fixtures/context-benchmarks.json +9 -0
|
@@ -0,0 +1,789 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
4
|
+
import { runtimePaths } from './paths.mjs';
|
|
5
|
+
|
|
6
|
+
export function openRuntimeDatabase(projectRoot) {
|
|
7
|
+
const { databasePath } = runtimePaths(projectRoot);
|
|
8
|
+
mkdirSync(dirname(databasePath), { recursive: true });
|
|
9
|
+
const database = new DatabaseSync(databasePath);
|
|
10
|
+
database.exec('PRAGMA foreign_keys = ON;');
|
|
11
|
+
database.exec('PRAGMA busy_timeout = 5000;');
|
|
12
|
+
database.exec('PRAGMA journal_mode = WAL;');
|
|
13
|
+
migrateRuntimeDatabase(database);
|
|
14
|
+
return database;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function migrateRuntimeDatabase(database) {
|
|
18
|
+
database.exec(`
|
|
19
|
+
CREATE TABLE IF NOT EXISTS runtime_meta (
|
|
20
|
+
key TEXT PRIMARY KEY,
|
|
21
|
+
value TEXT NOT NULL,
|
|
22
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE TABLE IF NOT EXISTS intents (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
slug TEXT NOT NULL,
|
|
28
|
+
domain TEXT NOT NULL DEFAULT 'general',
|
|
29
|
+
title TEXT NOT NULL,
|
|
30
|
+
status TEXT NOT NULL DEFAULT 'draft',
|
|
31
|
+
delivery_status TEXT NOT NULL DEFAULT 'not-started',
|
|
32
|
+
current_phase TEXT NOT NULL DEFAULT 'backlog',
|
|
33
|
+
delivery_state_path TEXT NOT NULL DEFAULT '',
|
|
34
|
+
path TEXT NOT NULL UNIQUE,
|
|
35
|
+
intent_map TEXT,
|
|
36
|
+
personas_json TEXT NOT NULL DEFAULT '[]',
|
|
37
|
+
relationships_json TEXT NOT NULL DEFAULT '[]',
|
|
38
|
+
delivery_shape_json TEXT NOT NULL DEFAULT 'null',
|
|
39
|
+
excerpt TEXT NOT NULL DEFAULT '',
|
|
40
|
+
markdown TEXT NOT NULL,
|
|
41
|
+
content_hash TEXT NOT NULL,
|
|
42
|
+
source_mtime_ms REAL NOT NULL DEFAULT 0,
|
|
43
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
44
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_intents_status ON intents(status, title);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_intents_domain ON intents(domain, title);
|
|
49
|
+
|
|
50
|
+
CREATE TABLE IF NOT EXISTS delivery_groups (
|
|
51
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
+
slug TEXT NOT NULL UNIQUE,
|
|
53
|
+
name TEXT NOT NULL,
|
|
54
|
+
description TEXT NOT NULL DEFAULT '',
|
|
55
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
56
|
+
priority TEXT NOT NULL DEFAULT 'P2',
|
|
57
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
58
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
CREATE TABLE IF NOT EXISTS work_items (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
intent_id TEXT NOT NULL UNIQUE REFERENCES intents(id) ON DELETE CASCADE,
|
|
64
|
+
slug TEXT NOT NULL,
|
|
65
|
+
domain TEXT NOT NULL DEFAULT 'general',
|
|
66
|
+
title TEXT NOT NULL,
|
|
67
|
+
intent_path TEXT NOT NULL,
|
|
68
|
+
lane TEXT NOT NULL DEFAULT 'backlog',
|
|
69
|
+
state TEXT NOT NULL DEFAULT 'preparing',
|
|
70
|
+
intent_state TEXT NOT NULL DEFAULT 'intent-draft',
|
|
71
|
+
completion_percent INTEGER NOT NULL DEFAULT 0 CHECK (completion_percent BETWEEN 0 AND 100),
|
|
72
|
+
priority TEXT NOT NULL DEFAULT 'P2',
|
|
73
|
+
current_sprint INTEGER NOT NULL DEFAULT 0,
|
|
74
|
+
current_phase TEXT NOT NULL DEFAULT 'intent',
|
|
75
|
+
blocked_by TEXT NOT NULL DEFAULT '',
|
|
76
|
+
notes TEXT NOT NULL DEFAULT '',
|
|
77
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
78
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_work_items_lane ON work_items(lane, priority, title);
|
|
82
|
+
CREATE INDEX IF NOT EXISTS idx_work_items_sprint ON work_items(current_sprint, lane);
|
|
83
|
+
|
|
84
|
+
CREATE TABLE IF NOT EXISTS group_items (
|
|
85
|
+
group_id INTEGER NOT NULL REFERENCES delivery_groups(id) ON DELETE CASCADE,
|
|
86
|
+
work_item_id TEXT NOT NULL REFERENCES work_items(id) ON DELETE CASCADE,
|
|
87
|
+
position INTEGER NOT NULL DEFAULT 0,
|
|
88
|
+
source TEXT NOT NULL DEFAULT 'manual',
|
|
89
|
+
PRIMARY KEY (group_id, work_item_id)
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
CREATE TABLE IF NOT EXISTS pipeline_phases (
|
|
93
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
94
|
+
work_item_id TEXT NOT NULL REFERENCES work_items(id) ON DELETE CASCADE,
|
|
95
|
+
phase_key TEXT NOT NULL,
|
|
96
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
97
|
+
started_at TEXT,
|
|
98
|
+
completed_at TEXT,
|
|
99
|
+
artefact_path TEXT NOT NULL DEFAULT '',
|
|
100
|
+
iteration_count INTEGER NOT NULL DEFAULT 0,
|
|
101
|
+
notes TEXT NOT NULL DEFAULT '',
|
|
102
|
+
UNIQUE (work_item_id, phase_key)
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
CREATE TABLE IF NOT EXISTS artefacts (
|
|
106
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
107
|
+
work_item_id TEXT NOT NULL REFERENCES work_items(id) ON DELETE CASCADE,
|
|
108
|
+
kind TEXT NOT NULL,
|
|
109
|
+
path TEXT NOT NULL,
|
|
110
|
+
title TEXT NOT NULL DEFAULT '',
|
|
111
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
112
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
113
|
+
UNIQUE (work_item_id, kind, path)
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
CREATE TABLE IF NOT EXISTS active_sessions (
|
|
117
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
118
|
+
work_item_id TEXT NOT NULL UNIQUE REFERENCES work_items(id) ON DELETE CASCADE,
|
|
119
|
+
owner_id TEXT NOT NULL DEFAULT '',
|
|
120
|
+
tool TEXT NOT NULL DEFAULT '',
|
|
121
|
+
phase_key TEXT NOT NULL DEFAULT '',
|
|
122
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
123
|
+
summary TEXT NOT NULL DEFAULT '',
|
|
124
|
+
awaiting_human INTEGER NOT NULL DEFAULT 0,
|
|
125
|
+
question TEXT NOT NULL DEFAULT '',
|
|
126
|
+
started_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
127
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
128
|
+
ended_at TEXT
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_active_sessions_status ON active_sessions(status, updated_at);
|
|
132
|
+
|
|
133
|
+
CREATE TABLE IF NOT EXISTS execution_leases (
|
|
134
|
+
id TEXT PRIMARY KEY,
|
|
135
|
+
work_item_id TEXT NOT NULL REFERENCES work_items(id) ON DELETE CASCADE,
|
|
136
|
+
task_id TEXT NOT NULL,
|
|
137
|
+
owner_id TEXT NOT NULL,
|
|
138
|
+
tool TEXT NOT NULL DEFAULT '',
|
|
139
|
+
run_id TEXT NOT NULL DEFAULT '',
|
|
140
|
+
token TEXT NOT NULL UNIQUE,
|
|
141
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
142
|
+
acquired_at TEXT NOT NULL,
|
|
143
|
+
heartbeat_at TEXT NOT NULL,
|
|
144
|
+
expires_at TEXT NOT NULL,
|
|
145
|
+
released_at TEXT,
|
|
146
|
+
outcome TEXT NOT NULL DEFAULT ''
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_execution_leases_active_task
|
|
150
|
+
ON execution_leases(work_item_id, task_id) WHERE status = 'active';
|
|
151
|
+
CREATE INDEX IF NOT EXISTS idx_execution_leases_expiry
|
|
152
|
+
ON execution_leases(status, expires_at);
|
|
153
|
+
|
|
154
|
+
CREATE TABLE IF NOT EXISTS activity_events (
|
|
155
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
156
|
+
session_id INTEGER REFERENCES active_sessions(id) ON DELETE SET NULL,
|
|
157
|
+
work_item_id TEXT NOT NULL REFERENCES work_items(id) ON DELETE CASCADE,
|
|
158
|
+
event_type TEXT NOT NULL DEFAULT 'progress',
|
|
159
|
+
tool TEXT NOT NULL DEFAULT '',
|
|
160
|
+
phase_key TEXT NOT NULL DEFAULT '',
|
|
161
|
+
summary TEXT NOT NULL DEFAULT '',
|
|
162
|
+
details TEXT NOT NULL DEFAULT '',
|
|
163
|
+
requires_human INTEGER NOT NULL DEFAULT 0,
|
|
164
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
165
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_work_item ON activity_events(work_item_id, created_at DESC);
|
|
169
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_session ON activity_events(session_id, created_at DESC);
|
|
170
|
+
|
|
171
|
+
CREATE TABLE IF NOT EXISTS command_runs (
|
|
172
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
173
|
+
work_item_id TEXT REFERENCES work_items(id) ON DELETE SET NULL,
|
|
174
|
+
run_uuid TEXT NOT NULL UNIQUE,
|
|
175
|
+
phase_key TEXT NOT NULL DEFAULT '',
|
|
176
|
+
action_id TEXT NOT NULL DEFAULT '',
|
|
177
|
+
tool TEXT NOT NULL DEFAULT '',
|
|
178
|
+
command TEXT NOT NULL DEFAULT '',
|
|
179
|
+
mode TEXT NOT NULL DEFAULT 'normal',
|
|
180
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
181
|
+
started_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
182
|
+
completed_at TEXT,
|
|
183
|
+
exit_code INTEGER,
|
|
184
|
+
stdout_path TEXT NOT NULL DEFAULT '',
|
|
185
|
+
stderr_path TEXT NOT NULL DEFAULT '',
|
|
186
|
+
summary TEXT NOT NULL DEFAULT ''
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_command_runs_work_item ON command_runs(work_item_id, started_at DESC);
|
|
190
|
+
|
|
191
|
+
CREATE TABLE IF NOT EXISTS repo_index_runs (
|
|
192
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
193
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
194
|
+
started_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
195
|
+
completed_at TEXT,
|
|
196
|
+
duration_ms INTEGER,
|
|
197
|
+
summary TEXT NOT NULL DEFAULT '',
|
|
198
|
+
repos_json TEXT NOT NULL DEFAULT '{}',
|
|
199
|
+
profile_digest TEXT NOT NULL DEFAULT '',
|
|
200
|
+
profile_summary_json TEXT NOT NULL DEFAULT '[]',
|
|
201
|
+
outcome_totals_json TEXT NOT NULL DEFAULT '{}'
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
CREATE TABLE IF NOT EXISTS repo_files (
|
|
205
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
206
|
+
run_id INTEGER REFERENCES repo_index_runs(id) ON DELETE SET NULL,
|
|
207
|
+
repo TEXT NOT NULL,
|
|
208
|
+
path TEXT NOT NULL,
|
|
209
|
+
language TEXT NOT NULL DEFAULT '',
|
|
210
|
+
parser TEXT NOT NULL DEFAULT '',
|
|
211
|
+
parser_status TEXT NOT NULL DEFAULT 'not_applicable',
|
|
212
|
+
content_hash TEXT NOT NULL DEFAULT '',
|
|
213
|
+
size_bytes INTEGER NOT NULL DEFAULT 0,
|
|
214
|
+
line_count INTEGER NOT NULL DEFAULT 0,
|
|
215
|
+
parse_error_count INTEGER NOT NULL DEFAULT 0,
|
|
216
|
+
classification TEXT NOT NULL DEFAULT '',
|
|
217
|
+
profile_id TEXT NOT NULL DEFAULT '',
|
|
218
|
+
analyser TEXT NOT NULL DEFAULT '',
|
|
219
|
+
analysis_depth TEXT NOT NULL DEFAULT 'inventory',
|
|
220
|
+
analysis_outcome TEXT NOT NULL DEFAULT 'inventory_only',
|
|
221
|
+
fingerprint_kind TEXT NOT NULL DEFAULT '',
|
|
222
|
+
fingerprint TEXT NOT NULL DEFAULT '',
|
|
223
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
224
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
225
|
+
UNIQUE (run_id, path)
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_repo_files_path ON repo_files(path);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS idx_repo_files_language ON repo_files(language, parser_status);
|
|
230
|
+
CREATE TABLE IF NOT EXISTS repo_index_profiles (
|
|
231
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
232
|
+
run_id INTEGER NOT NULL REFERENCES repo_index_runs(id) ON DELETE CASCADE,
|
|
233
|
+
profile_id TEXT NOT NULL,
|
|
234
|
+
source_kind TEXT NOT NULL DEFAULT 'core',
|
|
235
|
+
source_ref TEXT NOT NULL DEFAULT '',
|
|
236
|
+
classification TEXT NOT NULL DEFAULT '',
|
|
237
|
+
analyser TEXT NOT NULL DEFAULT '',
|
|
238
|
+
analysis_depth TEXT NOT NULL DEFAULT 'inventory',
|
|
239
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
240
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
241
|
+
UNIQUE (run_id, profile_id)
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
CREATE INDEX IF NOT EXISTS idx_repo_index_profiles_run ON repo_index_profiles(run_id, profile_id);
|
|
245
|
+
|
|
246
|
+
CREATE TABLE IF NOT EXISTS repo_symbols (
|
|
247
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
248
|
+
run_id INTEGER REFERENCES repo_index_runs(id) ON DELETE SET NULL,
|
|
249
|
+
repo TEXT NOT NULL,
|
|
250
|
+
symbol_kind TEXT NOT NULL,
|
|
251
|
+
symbol_name TEXT NOT NULL,
|
|
252
|
+
path TEXT NOT NULL,
|
|
253
|
+
line INTEGER,
|
|
254
|
+
signature TEXT NOT NULL DEFAULT '',
|
|
255
|
+
tags_json TEXT NOT NULL DEFAULT '[]',
|
|
256
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
257
|
+
content_hash TEXT NOT NULL DEFAULT '',
|
|
258
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
CREATE INDEX IF NOT EXISTS idx_repo_symbols_kind_name ON repo_symbols(symbol_kind, symbol_name);
|
|
262
|
+
CREATE INDEX IF NOT EXISTS idx_repo_symbols_path ON repo_symbols(path);
|
|
263
|
+
|
|
264
|
+
CREATE TABLE IF NOT EXISTS repo_spans (
|
|
265
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
266
|
+
run_id INTEGER REFERENCES repo_index_runs(id) ON DELETE SET NULL,
|
|
267
|
+
repo TEXT NOT NULL,
|
|
268
|
+
path TEXT NOT NULL,
|
|
269
|
+
symbol_kind TEXT NOT NULL,
|
|
270
|
+
symbol_name TEXT NOT NULL,
|
|
271
|
+
start_line INTEGER NOT NULL,
|
|
272
|
+
end_line INTEGER NOT NULL,
|
|
273
|
+
start_byte INTEGER NOT NULL DEFAULT 0,
|
|
274
|
+
end_byte INTEGER NOT NULL DEFAULT 0,
|
|
275
|
+
evidence_snippet TEXT NOT NULL DEFAULT '',
|
|
276
|
+
parser TEXT NOT NULL DEFAULT '',
|
|
277
|
+
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
CREATE INDEX IF NOT EXISTS idx_repo_spans_path ON repo_spans(path);
|
|
281
|
+
CREATE INDEX IF NOT EXISTS idx_repo_spans_symbol ON repo_spans(symbol_kind, symbol_name);
|
|
282
|
+
|
|
283
|
+
CREATE TABLE IF NOT EXISTS repo_imports (
|
|
284
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
285
|
+
run_id INTEGER REFERENCES repo_index_runs(id) ON DELETE SET NULL,
|
|
286
|
+
repo TEXT NOT NULL,
|
|
287
|
+
path TEXT NOT NULL,
|
|
288
|
+
source_module TEXT NOT NULL DEFAULT '',
|
|
289
|
+
imported_name TEXT NOT NULL DEFAULT '',
|
|
290
|
+
local_name TEXT NOT NULL DEFAULT '',
|
|
291
|
+
import_kind TEXT NOT NULL DEFAULT '',
|
|
292
|
+
line INTEGER,
|
|
293
|
+
parser TEXT NOT NULL DEFAULT '',
|
|
294
|
+
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
CREATE INDEX IF NOT EXISTS idx_repo_imports_path ON repo_imports(path);
|
|
298
|
+
CREATE INDEX IF NOT EXISTS idx_repo_imports_module ON repo_imports(source_module);
|
|
299
|
+
|
|
300
|
+
CREATE TABLE IF NOT EXISTS repo_relationships (
|
|
301
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
302
|
+
run_id INTEGER REFERENCES repo_index_runs(id) ON DELETE SET NULL,
|
|
303
|
+
source_kind TEXT NOT NULL,
|
|
304
|
+
source_name TEXT NOT NULL,
|
|
305
|
+
source_path TEXT NOT NULL DEFAULT '',
|
|
306
|
+
relationship_kind TEXT NOT NULL,
|
|
307
|
+
target_kind TEXT NOT NULL,
|
|
308
|
+
target_name TEXT NOT NULL,
|
|
309
|
+
target_path TEXT NOT NULL DEFAULT '',
|
|
310
|
+
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
CREATE INDEX IF NOT EXISTS idx_repo_relationships_source ON repo_relationships(source_kind, source_name);
|
|
314
|
+
CREATE INDEX IF NOT EXISTS idx_repo_relationships_target ON repo_relationships(target_kind, target_name);
|
|
315
|
+
|
|
316
|
+
CREATE TABLE IF NOT EXISTS standards_applicability (
|
|
317
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
318
|
+
run_id INTEGER REFERENCES repo_index_runs(id) ON DELETE SET NULL,
|
|
319
|
+
target_kind TEXT NOT NULL,
|
|
320
|
+
target_path TEXT NOT NULL,
|
|
321
|
+
standard_id TEXT NOT NULL,
|
|
322
|
+
source_path TEXT NOT NULL,
|
|
323
|
+
rule_summary TEXT NOT NULL DEFAULT '',
|
|
324
|
+
confidence REAL NOT NULL DEFAULT 0.7,
|
|
325
|
+
required INTEGER NOT NULL DEFAULT 1,
|
|
326
|
+
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
CREATE INDEX IF NOT EXISTS idx_standards_target ON standards_applicability(target_kind, target_path);
|
|
330
|
+
CREATE INDEX IF NOT EXISTS idx_standards_id ON standards_applicability(standard_id);
|
|
331
|
+
|
|
332
|
+
CREATE TABLE IF NOT EXISTS capability_fingerprints (
|
|
333
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
334
|
+
slug TEXT NOT NULL UNIQUE,
|
|
335
|
+
title TEXT NOT NULL DEFAULT '',
|
|
336
|
+
domain TEXT NOT NULL DEFAULT '',
|
|
337
|
+
status TEXT NOT NULL DEFAULT '',
|
|
338
|
+
surfaces_json TEXT NOT NULL DEFAULT '[]',
|
|
339
|
+
route_shapes_json TEXT NOT NULL DEFAULT '[]',
|
|
340
|
+
components_json TEXT NOT NULL DEFAULT '[]',
|
|
341
|
+
standards_json TEXT NOT NULL DEFAULT '[]',
|
|
342
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
343
|
+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
CREATE INDEX IF NOT EXISTS idx_capability_fingerprints_domain ON capability_fingerprints(domain);
|
|
347
|
+
|
|
348
|
+
CREATE TABLE IF NOT EXISTS validation_findings (
|
|
349
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
350
|
+
slug TEXT NOT NULL DEFAULT '',
|
|
351
|
+
phase_key TEXT NOT NULL DEFAULT '',
|
|
352
|
+
source TEXT NOT NULL DEFAULT '',
|
|
353
|
+
severity TEXT NOT NULL DEFAULT '',
|
|
354
|
+
finding_class TEXT NOT NULL DEFAULT '',
|
|
355
|
+
title TEXT NOT NULL DEFAULT '',
|
|
356
|
+
surface TEXT NOT NULL DEFAULT '',
|
|
357
|
+
root_cause TEXT NOT NULL DEFAULT '',
|
|
358
|
+
preventable INTEGER NOT NULL DEFAULT 0,
|
|
359
|
+
path TEXT NOT NULL DEFAULT '',
|
|
360
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
361
|
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
CREATE INDEX IF NOT EXISTS idx_validation_findings_slug ON validation_findings(slug);
|
|
365
|
+
CREATE INDEX IF NOT EXISTS idx_validation_findings_class ON validation_findings(finding_class);
|
|
366
|
+
|
|
367
|
+
CREATE TABLE IF NOT EXISTS lifecycle_handlers (
|
|
368
|
+
id TEXT PRIMARY KEY,
|
|
369
|
+
name TEXT NOT NULL,
|
|
370
|
+
publisher_id TEXT NOT NULL,
|
|
371
|
+
publisher_name TEXT NOT NULL,
|
|
372
|
+
version TEXT NOT NULL,
|
|
373
|
+
protocol_version TEXT NOT NULL,
|
|
374
|
+
event_schema_version TEXT NOT NULL,
|
|
375
|
+
trusted_root TEXT NOT NULL,
|
|
376
|
+
entrypoint TEXT NOT NULL,
|
|
377
|
+
manifest_digest TEXT NOT NULL,
|
|
378
|
+
package_digest TEXT NOT NULL,
|
|
379
|
+
manifest_json TEXT NOT NULL,
|
|
380
|
+
registered_at TEXT NOT NULL,
|
|
381
|
+
updated_at TEXT NOT NULL
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
CREATE TABLE IF NOT EXISTS lifecycle_subscriptions (
|
|
385
|
+
id TEXT PRIMARY KEY,
|
|
386
|
+
handler_id TEXT NOT NULL REFERENCES lifecycle_handlers(id) ON DELETE RESTRICT,
|
|
387
|
+
patterns_json TEXT NOT NULL,
|
|
388
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
389
|
+
created_at TEXT NOT NULL,
|
|
390
|
+
updated_at TEXT NOT NULL,
|
|
391
|
+
disabled_at TEXT,
|
|
392
|
+
UNIQUE (handler_id, patterns_json)
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
CREATE INDEX IF NOT EXISTS idx_lifecycle_subscriptions_enabled
|
|
396
|
+
ON lifecycle_subscriptions(enabled, handler_id);
|
|
397
|
+
|
|
398
|
+
CREATE TABLE IF NOT EXISTS lifecycle_events (
|
|
399
|
+
id TEXT PRIMARY KEY,
|
|
400
|
+
name TEXT NOT NULL,
|
|
401
|
+
schema_version TEXT NOT NULL,
|
|
402
|
+
occurred_at TEXT NOT NULL,
|
|
403
|
+
source_key TEXT NOT NULL UNIQUE,
|
|
404
|
+
source_revision TEXT NOT NULL DEFAULT '',
|
|
405
|
+
project_json TEXT NOT NULL,
|
|
406
|
+
scope_json TEXT NOT NULL,
|
|
407
|
+
facts_json TEXT NOT NULL,
|
|
408
|
+
evidence_json TEXT NOT NULL,
|
|
409
|
+
personas_json TEXT NOT NULL,
|
|
410
|
+
stream_id TEXT NOT NULL,
|
|
411
|
+
stream_sequence INTEGER NOT NULL,
|
|
412
|
+
created_at TEXT NOT NULL,
|
|
413
|
+
UNIQUE (stream_id, stream_sequence)
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
CREATE INDEX IF NOT EXISTS idx_lifecycle_events_name_time
|
|
417
|
+
ON lifecycle_events(name, occurred_at DESC);
|
|
418
|
+
CREATE INDEX IF NOT EXISTS idx_lifecycle_events_stream
|
|
419
|
+
ON lifecycle_events(stream_id, stream_sequence);
|
|
420
|
+
|
|
421
|
+
CREATE TABLE IF NOT EXISTS lifecycle_deliveries (
|
|
422
|
+
id TEXT PRIMARY KEY,
|
|
423
|
+
event_id TEXT NOT NULL REFERENCES lifecycle_events(id) ON DELETE CASCADE,
|
|
424
|
+
subscription_id TEXT NOT NULL REFERENCES lifecycle_subscriptions(id) ON DELETE RESTRICT,
|
|
425
|
+
handler_snapshot_json TEXT NOT NULL,
|
|
426
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
427
|
+
status TEXT NOT NULL DEFAULT 'queued',
|
|
428
|
+
automatic_attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
429
|
+
manual_pending INTEGER NOT NULL DEFAULT 0,
|
|
430
|
+
next_attempt_at TEXT,
|
|
431
|
+
last_code TEXT NOT NULL DEFAULT '',
|
|
432
|
+
last_message TEXT NOT NULL DEFAULT '',
|
|
433
|
+
created_at TEXT NOT NULL,
|
|
434
|
+
updated_at TEXT NOT NULL,
|
|
435
|
+
resolved_at TEXT,
|
|
436
|
+
disabled_at TEXT,
|
|
437
|
+
retention_after TEXT,
|
|
438
|
+
UNIQUE (event_id, subscription_id)
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
CREATE INDEX IF NOT EXISTS idx_lifecycle_deliveries_dispatch
|
|
442
|
+
ON lifecycle_deliveries(status, next_attempt_at, subscription_id);
|
|
443
|
+
CREATE INDEX IF NOT EXISTS idx_lifecycle_deliveries_event
|
|
444
|
+
ON lifecycle_deliveries(event_id);
|
|
445
|
+
|
|
446
|
+
CREATE TABLE IF NOT EXISTS lifecycle_attempts (
|
|
447
|
+
id TEXT PRIMARY KEY,
|
|
448
|
+
delivery_id TEXT NOT NULL REFERENCES lifecycle_deliveries(id) ON DELETE CASCADE,
|
|
449
|
+
kind TEXT NOT NULL,
|
|
450
|
+
ordinal INTEGER NOT NULL,
|
|
451
|
+
started_at TEXT NOT NULL,
|
|
452
|
+
completed_at TEXT NOT NULL,
|
|
453
|
+
status TEXT NOT NULL,
|
|
454
|
+
code TEXT NOT NULL DEFAULT '',
|
|
455
|
+
message TEXT NOT NULL DEFAULT '',
|
|
456
|
+
duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
457
|
+
UNIQUE (delivery_id, ordinal)
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
CREATE INDEX IF NOT EXISTS idx_lifecycle_attempts_delivery
|
|
461
|
+
ON lifecycle_attempts(delivery_id, ordinal);
|
|
462
|
+
|
|
463
|
+
CREATE TABLE IF NOT EXISTS security_adapters (
|
|
464
|
+
id TEXT PRIMARY KEY,
|
|
465
|
+
name TEXT NOT NULL,
|
|
466
|
+
publisher_id TEXT NOT NULL,
|
|
467
|
+
publisher_name TEXT NOT NULL,
|
|
468
|
+
version TEXT NOT NULL,
|
|
469
|
+
protocol_version TEXT NOT NULL,
|
|
470
|
+
trusted_root TEXT NOT NULL,
|
|
471
|
+
entrypoint TEXT NOT NULL,
|
|
472
|
+
manifest_digest TEXT NOT NULL,
|
|
473
|
+
package_digest TEXT NOT NULL,
|
|
474
|
+
capabilities_json TEXT NOT NULL,
|
|
475
|
+
manifest_json TEXT NOT NULL,
|
|
476
|
+
registered_at TEXT NOT NULL,
|
|
477
|
+
updated_at TEXT NOT NULL
|
|
478
|
+
);
|
|
479
|
+
|
|
480
|
+
CREATE TABLE IF NOT EXISTS security_runs (
|
|
481
|
+
id TEXT PRIMARY KEY,
|
|
482
|
+
profile_id TEXT NOT NULL,
|
|
483
|
+
provider_id TEXT,
|
|
484
|
+
adapter_id TEXT REFERENCES security_adapters(id) ON DELETE RESTRICT,
|
|
485
|
+
interaction_mode TEXT NOT NULL,
|
|
486
|
+
capability TEXT NOT NULL,
|
|
487
|
+
status TEXT NOT NULL,
|
|
488
|
+
revision TEXT NOT NULL DEFAULT '',
|
|
489
|
+
scope_json TEXT NOT NULL DEFAULT '{}',
|
|
490
|
+
target_class TEXT,
|
|
491
|
+
target_ref TEXT,
|
|
492
|
+
complete INTEGER NOT NULL DEFAULT 0,
|
|
493
|
+
outcome TEXT NOT NULL DEFAULT '',
|
|
494
|
+
report_digest TEXT NOT NULL DEFAULT '',
|
|
495
|
+
policy_digest TEXT NOT NULL DEFAULT '',
|
|
496
|
+
profile_snapshot_json TEXT NOT NULL DEFAULT '{}',
|
|
497
|
+
tool_json TEXT NOT NULL DEFAULT '{}',
|
|
498
|
+
redaction_status TEXT NOT NULL DEFAULT '',
|
|
499
|
+
warnings_json TEXT NOT NULL DEFAULT '[]',
|
|
500
|
+
created_at TEXT NOT NULL,
|
|
501
|
+
started_at TEXT,
|
|
502
|
+
completed_at TEXT
|
|
503
|
+
);
|
|
504
|
+
|
|
505
|
+
CREATE INDEX IF NOT EXISTS idx_security_runs_profile
|
|
506
|
+
ON security_runs(profile_id, created_at DESC);
|
|
507
|
+
CREATE INDEX IF NOT EXISTS idx_security_runs_status
|
|
508
|
+
ON security_runs(status, created_at DESC);
|
|
509
|
+
|
|
510
|
+
CREATE TABLE IF NOT EXISTS security_attempts (
|
|
511
|
+
id TEXT PRIMARY KEY,
|
|
512
|
+
run_id TEXT NOT NULL REFERENCES security_runs(id) ON DELETE CASCADE,
|
|
513
|
+
ordinal INTEGER NOT NULL,
|
|
514
|
+
status TEXT NOT NULL,
|
|
515
|
+
exit_code INTEGER,
|
|
516
|
+
signal TEXT NOT NULL DEFAULT '',
|
|
517
|
+
timed_out INTEGER NOT NULL DEFAULT 0,
|
|
518
|
+
duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
519
|
+
started_at TEXT NOT NULL,
|
|
520
|
+
completed_at TEXT,
|
|
521
|
+
UNIQUE (run_id, ordinal)
|
|
522
|
+
);
|
|
523
|
+
|
|
524
|
+
CREATE INDEX IF NOT EXISTS idx_security_attempts_run
|
|
525
|
+
ON security_attempts(run_id, ordinal);
|
|
526
|
+
|
|
527
|
+
CREATE TABLE IF NOT EXISTS security_findings (
|
|
528
|
+
id TEXT PRIMARY KEY,
|
|
529
|
+
run_id TEXT NOT NULL REFERENCES security_runs(id) ON DELETE RESTRICT,
|
|
530
|
+
finding_key TEXT NOT NULL,
|
|
531
|
+
capability TEXT NOT NULL,
|
|
532
|
+
provider_severity TEXT NOT NULL DEFAULT 'unknown',
|
|
533
|
+
provider_confidence REAL,
|
|
534
|
+
summary TEXT NOT NULL,
|
|
535
|
+
locations_json TEXT NOT NULL DEFAULT '[]',
|
|
536
|
+
remediation TEXT NOT NULL DEFAULT '',
|
|
537
|
+
evidence_json TEXT NOT NULL DEFAULT '[]',
|
|
538
|
+
policy_consequence TEXT NOT NULL DEFAULT 'review',
|
|
539
|
+
created_at TEXT NOT NULL,
|
|
540
|
+
UNIQUE (run_id, finding_key)
|
|
541
|
+
);
|
|
542
|
+
|
|
543
|
+
CREATE INDEX IF NOT EXISTS idx_security_findings_run
|
|
544
|
+
ON security_findings(run_id, policy_consequence);
|
|
545
|
+
|
|
546
|
+
CREATE TABLE IF NOT EXISTS security_dispositions (
|
|
547
|
+
id TEXT PRIMARY KEY,
|
|
548
|
+
finding_id TEXT NOT NULL REFERENCES security_findings(id) ON DELETE RESTRICT,
|
|
549
|
+
decision TEXT NOT NULL,
|
|
550
|
+
reviewer TEXT NOT NULL,
|
|
551
|
+
reason TEXT NOT NULL,
|
|
552
|
+
evidence_json TEXT NOT NULL DEFAULT '[]',
|
|
553
|
+
risk_owner TEXT,
|
|
554
|
+
expires_at TEXT,
|
|
555
|
+
next_role TEXT,
|
|
556
|
+
created_at TEXT NOT NULL
|
|
557
|
+
);
|
|
558
|
+
|
|
559
|
+
CREATE INDEX IF NOT EXISTS idx_security_dispositions_finding
|
|
560
|
+
ON security_dispositions(finding_id, created_at);
|
|
561
|
+
|
|
562
|
+
CREATE TABLE IF NOT EXISTS security_discovery_tokens (
|
|
563
|
+
id TEXT PRIMARY KEY,
|
|
564
|
+
provider_id TEXT NOT NULL,
|
|
565
|
+
profile_id TEXT NOT NULL,
|
|
566
|
+
artefacts_json TEXT NOT NULL,
|
|
567
|
+
created_at TEXT NOT NULL,
|
|
568
|
+
expires_at TEXT NOT NULL,
|
|
569
|
+
consumed_at TEXT
|
|
570
|
+
);
|
|
571
|
+
|
|
572
|
+
CREATE INDEX IF NOT EXISTS idx_security_discovery_tokens_expiry
|
|
573
|
+
ON security_discovery_tokens(expires_at, consumed_at);
|
|
574
|
+
|
|
575
|
+
CREATE TABLE IF NOT EXISTS starter_adapters (
|
|
576
|
+
id TEXT PRIMARY KEY,
|
|
577
|
+
name TEXT NOT NULL,
|
|
578
|
+
publisher_id TEXT NOT NULL,
|
|
579
|
+
publisher_name TEXT NOT NULL,
|
|
580
|
+
version TEXT NOT NULL,
|
|
581
|
+
protocol_version TEXT NOT NULL,
|
|
582
|
+
source_classes_json TEXT NOT NULL,
|
|
583
|
+
trusted_root TEXT NOT NULL,
|
|
584
|
+
entrypoint TEXT NOT NULL,
|
|
585
|
+
manifest_digest TEXT NOT NULL,
|
|
586
|
+
package_digest TEXT NOT NULL,
|
|
587
|
+
manifest_json TEXT NOT NULL,
|
|
588
|
+
registered_at TEXT NOT NULL,
|
|
589
|
+
updated_at TEXT NOT NULL
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
CREATE TABLE IF NOT EXISTS starter_attempts (
|
|
593
|
+
id TEXT PRIMARY KEY,
|
|
594
|
+
receipt_id TEXT NOT NULL,
|
|
595
|
+
adapter_id TEXT NOT NULL REFERENCES starter_adapters(id) ON DELETE RESTRICT,
|
|
596
|
+
status TEXT NOT NULL,
|
|
597
|
+
nonce TEXT NOT NULL,
|
|
598
|
+
staging_root TEXT NOT NULL,
|
|
599
|
+
receipt_json TEXT NOT NULL,
|
|
600
|
+
target_mappings_json TEXT NOT NULL DEFAULT '[]',
|
|
601
|
+
adapter_snapshot_json TEXT NOT NULL,
|
|
602
|
+
limits_json TEXT NOT NULL,
|
|
603
|
+
repository_revisions_json TEXT NOT NULL DEFAULT '{}',
|
|
604
|
+
tree_digest TEXT NOT NULL DEFAULT '',
|
|
605
|
+
target_tree_digests_json TEXT NOT NULL DEFAULT '[]',
|
|
606
|
+
preview_id TEXT NOT NULL DEFAULT '',
|
|
607
|
+
preview_digest TEXT NOT NULL DEFAULT '',
|
|
608
|
+
expires_at TEXT,
|
|
609
|
+
journal_json TEXT NOT NULL DEFAULT '[]',
|
|
610
|
+
evidence_path TEXT NOT NULL DEFAULT '',
|
|
611
|
+
error_code TEXT NOT NULL DEFAULT '',
|
|
612
|
+
created_at TEXT NOT NULL,
|
|
613
|
+
updated_at TEXT NOT NULL,
|
|
614
|
+
completed_at TEXT
|
|
615
|
+
);
|
|
616
|
+
|
|
617
|
+
CREATE INDEX IF NOT EXISTS idx_starter_attempts_status
|
|
618
|
+
ON starter_attempts(status, updated_at DESC);
|
|
619
|
+
CREATE INDEX IF NOT EXISTS idx_starter_attempts_receipt
|
|
620
|
+
ON starter_attempts(receipt_id, created_at DESC);
|
|
621
|
+
|
|
622
|
+
CREATE TABLE IF NOT EXISTS starter_files (
|
|
623
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
624
|
+
attempt_id TEXT NOT NULL REFERENCES starter_attempts(id) ON DELETE CASCADE,
|
|
625
|
+
target_role TEXT NOT NULL,
|
|
626
|
+
repository_name TEXT NOT NULL,
|
|
627
|
+
source_path TEXT NOT NULL,
|
|
628
|
+
destination_path TEXT NOT NULL,
|
|
629
|
+
content_digest TEXT NOT NULL,
|
|
630
|
+
size_bytes INTEGER NOT NULL,
|
|
631
|
+
classification TEXT NOT NULL DEFAULT '',
|
|
632
|
+
created_at TEXT NOT NULL,
|
|
633
|
+
UNIQUE (attempt_id, target_role, source_path)
|
|
634
|
+
);
|
|
635
|
+
|
|
636
|
+
CREATE INDEX IF NOT EXISTS idx_starter_files_attempt
|
|
637
|
+
ON starter_files(attempt_id, target_role, source_path);
|
|
638
|
+
|
|
639
|
+
CREATE TABLE IF NOT EXISTS starter_approvals (
|
|
640
|
+
id TEXT PRIMARY KEY,
|
|
641
|
+
attempt_id TEXT NOT NULL UNIQUE REFERENCES starter_attempts(id) ON DELETE RESTRICT,
|
|
642
|
+
preview_id TEXT NOT NULL UNIQUE,
|
|
643
|
+
approved_by TEXT NOT NULL,
|
|
644
|
+
approved_at TEXT NOT NULL,
|
|
645
|
+
evidence_path TEXT NOT NULL DEFAULT '',
|
|
646
|
+
created_at TEXT NOT NULL
|
|
647
|
+
);
|
|
648
|
+
|
|
649
|
+
CREATE TABLE IF NOT EXISTS palace_index_runs (
|
|
650
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
651
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
652
|
+
source_fingerprint TEXT NOT NULL DEFAULT '',
|
|
653
|
+
document_count INTEGER NOT NULL DEFAULT 0,
|
|
654
|
+
section_count INTEGER NOT NULL DEFAULT 0,
|
|
655
|
+
link_count INTEGER NOT NULL DEFAULT 0,
|
|
656
|
+
started_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
657
|
+
completed_at TEXT,
|
|
658
|
+
summary TEXT NOT NULL DEFAULT ''
|
|
659
|
+
);
|
|
660
|
+
|
|
661
|
+
CREATE TABLE IF NOT EXISTS palace_documents (
|
|
662
|
+
path TEXT PRIMARY KEY,
|
|
663
|
+
title TEXT NOT NULL DEFAULT '',
|
|
664
|
+
extension TEXT NOT NULL DEFAULT '',
|
|
665
|
+
content_hash TEXT NOT NULL,
|
|
666
|
+
content_length INTEGER NOT NULL DEFAULT 0,
|
|
667
|
+
source_mtime TEXT NOT NULL DEFAULT '',
|
|
668
|
+
has_title INTEGER NOT NULL DEFAULT 0,
|
|
669
|
+
section_count INTEGER NOT NULL DEFAULT 0,
|
|
670
|
+
indexed_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
671
|
+
);
|
|
672
|
+
|
|
673
|
+
CREATE INDEX IF NOT EXISTS idx_palace_documents_hash ON palace_documents(content_hash);
|
|
674
|
+
CREATE INDEX IF NOT EXISTS idx_palace_documents_title ON palace_documents(title);
|
|
675
|
+
|
|
676
|
+
CREATE TABLE IF NOT EXISTS palace_links (
|
|
677
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
678
|
+
source_path TEXT NOT NULL,
|
|
679
|
+
target_path TEXT NOT NULL DEFAULT '',
|
|
680
|
+
target_anchor TEXT NOT NULL DEFAULT '',
|
|
681
|
+
kind TEXT NOT NULL DEFAULT 'project',
|
|
682
|
+
exists_on_disk INTEGER NOT NULL DEFAULT 0,
|
|
683
|
+
line INTEGER,
|
|
684
|
+
raw_target TEXT NOT NULL DEFAULT ''
|
|
685
|
+
);
|
|
686
|
+
|
|
687
|
+
CREATE INDEX IF NOT EXISTS idx_palace_links_source ON palace_links(source_path);
|
|
688
|
+
CREATE INDEX IF NOT EXISTS idx_palace_links_target ON palace_links(kind, target_path);
|
|
689
|
+
|
|
690
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS palace_sections_fts USING fts5(
|
|
691
|
+
path UNINDEXED,
|
|
692
|
+
title,
|
|
693
|
+
heading,
|
|
694
|
+
body,
|
|
695
|
+
heading_path UNINDEXED,
|
|
696
|
+
line UNINDEXED,
|
|
697
|
+
tokenize = 'unicode61 remove_diacritics 2'
|
|
698
|
+
);
|
|
699
|
+
`);
|
|
700
|
+
|
|
701
|
+
const groupItemColumns = database.prepare('PRAGMA table_info(group_items)').all().map((column) => column.name);
|
|
702
|
+
if (!groupItemColumns.includes('source')) {
|
|
703
|
+
database.exec("ALTER TABLE group_items ADD COLUMN source TEXT NOT NULL DEFAULT 'manual'");
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
const intentColumns = database.prepare('PRAGMA table_info(intents)').all().map((column) => column.name);
|
|
707
|
+
if (!intentColumns.includes('delivery_status')) {
|
|
708
|
+
database.exec("ALTER TABLE intents ADD COLUMN delivery_status TEXT NOT NULL DEFAULT 'not-started'");
|
|
709
|
+
}
|
|
710
|
+
if (!intentColumns.includes('current_phase')) {
|
|
711
|
+
database.exec("ALTER TABLE intents ADD COLUMN current_phase TEXT NOT NULL DEFAULT 'backlog'");
|
|
712
|
+
}
|
|
713
|
+
if (!intentColumns.includes('delivery_state_path')) {
|
|
714
|
+
database.exec("ALTER TABLE intents ADD COLUMN delivery_state_path TEXT NOT NULL DEFAULT ''");
|
|
715
|
+
}
|
|
716
|
+
if (!intentColumns.includes('intent_map')) {
|
|
717
|
+
database.exec('ALTER TABLE intents ADD COLUMN intent_map TEXT');
|
|
718
|
+
}
|
|
719
|
+
if (!intentColumns.includes('relationships_json')) {
|
|
720
|
+
database.exec("ALTER TABLE intents ADD COLUMN relationships_json TEXT NOT NULL DEFAULT '[]'");
|
|
721
|
+
}
|
|
722
|
+
if (!intentColumns.includes('delivery_shape_json')) {
|
|
723
|
+
database.exec("ALTER TABLE intents ADD COLUMN delivery_shape_json TEXT NOT NULL DEFAULT 'null'");
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
const activeSessionColumns = database.prepare('PRAGMA table_info(active_sessions)').all().map((column) => column.name);
|
|
727
|
+
if (!activeSessionColumns.includes('owner_id')) {
|
|
728
|
+
database.exec("ALTER TABLE active_sessions ADD COLUMN owner_id TEXT NOT NULL DEFAULT ''");
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
const securityRunColumns = database.prepare('PRAGMA table_info(security_runs)').all().map((column) => column.name);
|
|
732
|
+
if (!securityRunColumns.includes('policy_digest')) {
|
|
733
|
+
database.exec("ALTER TABLE security_runs ADD COLUMN policy_digest TEXT NOT NULL DEFAULT ''");
|
|
734
|
+
}
|
|
735
|
+
if (!securityRunColumns.includes('profile_snapshot_json')) {
|
|
736
|
+
database.exec("ALTER TABLE security_runs ADD COLUMN profile_snapshot_json TEXT NOT NULL DEFAULT '{}'");
|
|
737
|
+
}
|
|
738
|
+
if (!securityRunColumns.includes('tool_json')) {
|
|
739
|
+
database.exec("ALTER TABLE security_runs ADD COLUMN tool_json TEXT NOT NULL DEFAULT '{}'");
|
|
740
|
+
}
|
|
741
|
+
if (!securityRunColumns.includes('redaction_status')) {
|
|
742
|
+
database.exec("ALTER TABLE security_runs ADD COLUMN redaction_status TEXT NOT NULL DEFAULT ''");
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
const repoIndexRunColumns = database.prepare('PRAGMA table_info(repo_index_runs)').all().map((column) => column.name);
|
|
746
|
+
if (!repoIndexRunColumns.includes('profile_digest')) {
|
|
747
|
+
database.exec("ALTER TABLE repo_index_runs ADD COLUMN profile_digest TEXT NOT NULL DEFAULT ''");
|
|
748
|
+
}
|
|
749
|
+
if (!repoIndexRunColumns.includes('profile_summary_json')) {
|
|
750
|
+
database.exec("ALTER TABLE repo_index_runs ADD COLUMN profile_summary_json TEXT NOT NULL DEFAULT '[]'");
|
|
751
|
+
}
|
|
752
|
+
if (!repoIndexRunColumns.includes('outcome_totals_json')) {
|
|
753
|
+
database.exec("ALTER TABLE repo_index_runs ADD COLUMN outcome_totals_json TEXT NOT NULL DEFAULT '{}'");
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
const repoFileColumns = database.prepare('PRAGMA table_info(repo_files)').all().map((column) => column.name);
|
|
757
|
+
const repoFileMigrations = [
|
|
758
|
+
['classification', "TEXT NOT NULL DEFAULT ''"],
|
|
759
|
+
['profile_id', "TEXT NOT NULL DEFAULT ''"],
|
|
760
|
+
['analyser', "TEXT NOT NULL DEFAULT ''"],
|
|
761
|
+
['analysis_depth', "TEXT NOT NULL DEFAULT 'inventory'"],
|
|
762
|
+
['analysis_outcome', "TEXT NOT NULL DEFAULT 'inventory_only'"],
|
|
763
|
+
['fingerprint_kind', "TEXT NOT NULL DEFAULT ''"],
|
|
764
|
+
['fingerprint', "TEXT NOT NULL DEFAULT ''"]
|
|
765
|
+
];
|
|
766
|
+
for (const [column, definition] of repoFileMigrations) {
|
|
767
|
+
if (!repoFileColumns.includes(column)) database.exec(`ALTER TABLE repo_files ADD COLUMN ${column} ${definition}`);
|
|
768
|
+
}
|
|
769
|
+
database.exec(`
|
|
770
|
+
CREATE INDEX IF NOT EXISTS idx_repo_files_outcome ON repo_files(analysis_outcome, classification);
|
|
771
|
+
CREATE INDEX IF NOT EXISTS idx_repo_files_profile ON repo_files(profile_id, analyser);
|
|
772
|
+
`);
|
|
773
|
+
|
|
774
|
+
database.prepare(`
|
|
775
|
+
INSERT INTO runtime_meta (key, value, updated_at)
|
|
776
|
+
VALUES ('schema_version', '14', CURRENT_TIMESTAMP)
|
|
777
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP
|
|
778
|
+
`).run();
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
export function initializeRuntime(projectRoot) {
|
|
782
|
+
const database = openRuntimeDatabase(projectRoot);
|
|
783
|
+
database.close();
|
|
784
|
+
const paths = runtimePaths(projectRoot);
|
|
785
|
+
return {
|
|
786
|
+
schema: 'ewai.runtime/v1',
|
|
787
|
+
databasePath: paths.databasePath
|
|
788
|
+
};
|
|
789
|
+
}
|