@soddong/agentic-runtime 0.16.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.
Files changed (114) hide show
  1. package/.tbls.yml +103 -0
  2. package/CHANGELOG.md +229 -0
  3. package/README.md +707 -0
  4. package/dist/agent-router.d.ts +39 -0
  5. package/dist/agent-router.d.ts.map +1 -0
  6. package/dist/agent-router.js +175 -0
  7. package/dist/agent-router.js.map +1 -0
  8. package/dist/bundle-installer.d.ts +25 -0
  9. package/dist/bundle-installer.d.ts.map +1 -0
  10. package/dist/bundle-installer.js +149 -0
  11. package/dist/bundle-installer.js.map +1 -0
  12. package/dist/bundle-registry.d.ts +30 -0
  13. package/dist/bundle-registry.d.ts.map +1 -0
  14. package/dist/bundle-registry.js +102 -0
  15. package/dist/bundle-registry.js.map +1 -0
  16. package/dist/claude-code-adapter.d.ts +27 -0
  17. package/dist/claude-code-adapter.d.ts.map +1 -0
  18. package/dist/claude-code-adapter.js +177 -0
  19. package/dist/claude-code-adapter.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +1731 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/codex-adapter.d.ts +23 -0
  25. package/dist/codex-adapter.d.ts.map +1 -0
  26. package/dist/codex-adapter.js +264 -0
  27. package/dist/codex-adapter.js.map +1 -0
  28. package/dist/database.d.ts +22 -0
  29. package/dist/database.d.ts.map +1 -0
  30. package/dist/database.js +184 -0
  31. package/dist/database.js.map +1 -0
  32. package/dist/execution-projects.d.ts +71 -0
  33. package/dist/execution-projects.d.ts.map +1 -0
  34. package/dist/execution-projects.js +333 -0
  35. package/dist/execution-projects.js.map +1 -0
  36. package/dist/execution-query.d.ts +73 -0
  37. package/dist/execution-query.d.ts.map +1 -0
  38. package/dist/execution-query.js +370 -0
  39. package/dist/execution-query.js.map +1 -0
  40. package/dist/execution.d.ts +47 -0
  41. package/dist/execution.d.ts.map +1 -0
  42. package/dist/execution.js +153 -0
  43. package/dist/execution.js.map +1 -0
  44. package/dist/hook-command.d.ts +3 -0
  45. package/dist/hook-command.d.ts.map +1 -0
  46. package/dist/hook-command.js +13 -0
  47. package/dist/hook-command.js.map +1 -0
  48. package/dist/hook-record.d.ts +16 -0
  49. package/dist/hook-record.d.ts.map +1 -0
  50. package/dist/hook-record.js +427 -0
  51. package/dist/hook-record.js.map +1 -0
  52. package/dist/index.d.ts +29 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +15 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/kiro-adapter.d.ts +38 -0
  57. package/dist/kiro-adapter.d.ts.map +1 -0
  58. package/dist/kiro-adapter.js +374 -0
  59. package/dist/kiro-adapter.js.map +1 -0
  60. package/dist/module-registry.d.ts +21 -0
  61. package/dist/module-registry.d.ts.map +1 -0
  62. package/dist/module-registry.js +75 -0
  63. package/dist/module-registry.js.map +1 -0
  64. package/dist/runtime-info.d.ts +8 -0
  65. package/dist/runtime-info.d.ts.map +1 -0
  66. package/dist/runtime-info.js +15 -0
  67. package/dist/runtime-info.js.map +1 -0
  68. package/dist/seed-importer.d.ts +77 -0
  69. package/dist/seed-importer.d.ts.map +1 -0
  70. package/dist/seed-importer.js +570 -0
  71. package/dist/seed-importer.js.map +1 -0
  72. package/docs/build.md +129 -0
  73. package/docs/configuration.md +61 -0
  74. package/docs/delivery.md +90 -0
  75. package/docs/operations.md +112 -0
  76. package/docs/publishing.md +196 -0
  77. package/docs/schema/generated/README.md +31 -0
  78. package/docs/schema/generated/agentic_execution_logs.md +90 -0
  79. package/docs/schema/generated/agentic_execution_logs.svg +52 -0
  80. package/docs/schema/generated/agentic_execution_outputs.md +85 -0
  81. package/docs/schema/generated/agentic_execution_outputs.svg +52 -0
  82. package/docs/schema/generated/agentic_execution_project_activities.md +83 -0
  83. package/docs/schema/generated/agentic_execution_project_activities.svg +71 -0
  84. package/docs/schema/generated/agentic_execution_project_stages.md +69 -0
  85. package/docs/schema/generated/agentic_execution_project_stages.svg +71 -0
  86. package/docs/schema/generated/agentic_execution_projects.md +82 -0
  87. package/docs/schema/generated/agentic_execution_projects.svg +92 -0
  88. package/docs/schema/generated/agentic_execution_runs.md +111 -0
  89. package/docs/schema/generated/agentic_execution_runs.svg +92 -0
  90. package/docs/schema/generated/agentic_project_bundles.md +106 -0
  91. package/docs/schema/generated/agentic_project_bundles.svg +91 -0
  92. package/docs/schema/generated/agentic_project_modules.md +77 -0
  93. package/docs/schema/generated/agentic_project_modules.svg +49 -0
  94. package/docs/schema/generated/agentic_runtime_metadata.md +62 -0
  95. package/docs/schema/generated/agentic_runtime_metadata.svg +28 -0
  96. package/docs/schema/generated/agentic_schema_migrations.md +65 -0
  97. package/docs/schema/generated/agentic_schema_migrations.svg +32 -0
  98. package/docs/schema/generated/agentic_seed_import_items.md +85 -0
  99. package/docs/schema/generated/agentic_seed_import_items.svg +47 -0
  100. package/docs/schema/generated/agentic_seed_import_runs.md +103 -0
  101. package/docs/schema/generated/agentic_seed_import_runs.svg +68 -0
  102. package/docs/schema/generated/agentic_user_requests.md +66 -0
  103. package/docs/schema/generated/agentic_user_requests.svg +52 -0
  104. package/docs/schema/generated/schema.json +1976 -0
  105. package/docs/schema/generated/schema.mmd +167 -0
  106. package/docs/schema/generated/schema.svg +266 -0
  107. package/docs/schema/migrations.md +163 -0
  108. package/docs/usage.md +774 -0
  109. package/package.json +32 -0
  110. package/src/database/migrations/0001_runtime_base.sql +231 -0
  111. package/src/database/migrations/0002_runtime_bundles.sql +61 -0
  112. package/src/database/migrations/0003_runtime_seed_imports.sql +121 -0
  113. package/src/database/migrations/0004_runtime_seed_apply_status.sql +76 -0
  114. package/src/database/migrations/0005_runtime_execution_projects.sql +92 -0
@@ -0,0 +1,184 @@
1
+ import Database from "better-sqlite3";
2
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
3
+ import { dirname, isAbsolute, join } from "node:path";
4
+ import { getRuntimeInfo } from "./runtime-info.js";
5
+ const DEFAULT_DATABASE_PATH = ".agentic/platform.sqlite";
6
+ const RUNTIME_MIGRATIONS = [
7
+ {
8
+ migrationId: "0001_runtime_base",
9
+ schemaVersion: "1"
10
+ },
11
+ {
12
+ migrationId: "0002_runtime_bundles",
13
+ schemaVersion: "2"
14
+ },
15
+ {
16
+ migrationId: "0003_runtime_seed_imports",
17
+ schemaVersion: "3"
18
+ },
19
+ {
20
+ migrationId: "0004_runtime_seed_apply_status",
21
+ schemaVersion: "4"
22
+ },
23
+ {
24
+ migrationId: "0005_runtime_execution_projects",
25
+ schemaVersion: "5"
26
+ }
27
+ ];
28
+ function readProjectConfig(projectRoot) {
29
+ const configPath = join(projectRoot, "agentic.config.json");
30
+ if (!existsSync(configPath)) {
31
+ return {};
32
+ }
33
+ return JSON.parse(readFileSync(configPath, "utf8"));
34
+ }
35
+ export function resolveRuntimeDatabasePath(projectRoot = process.cwd()) {
36
+ const config = readProjectConfig(projectRoot);
37
+ const database = config.runtime?.database;
38
+ if (database?.type !== undefined && database.type !== "sqlite") {
39
+ throw new Error(`Unsupported runtime database type: ${database.type}`);
40
+ }
41
+ const configuredPath = database?.path ?? DEFAULT_DATABASE_PATH;
42
+ return isAbsolute(configuredPath) ? configuredPath : join(projectRoot, configuredPath);
43
+ }
44
+ function listAgenticTables(db) {
45
+ const rows = db
46
+ .prepare(`SELECT name
47
+ FROM sqlite_master
48
+ WHERE type = 'table'
49
+ AND name LIKE 'agentic_%'
50
+ ORDER BY name`)
51
+ .all();
52
+ return rows.map((row) => row.name);
53
+ }
54
+ function readRuntimeMigration(migrationId) {
55
+ const migrationUrl = new URL(`../src/database/migrations/${migrationId}.sql`, import.meta.url);
56
+ return readFileSync(migrationUrl, "utf8");
57
+ }
58
+ function hasMigrationTable(db) {
59
+ const row = db
60
+ .prepare(`SELECT name
61
+ FROM sqlite_master
62
+ WHERE type = 'table'
63
+ AND name = 'agentic_schema_migrations'`)
64
+ .get();
65
+ return row !== undefined;
66
+ }
67
+ function hasRuntimeMigration(db, migrationId) {
68
+ if (!hasMigrationTable(db)) {
69
+ return false;
70
+ }
71
+ const row = db
72
+ .prepare(`SELECT migration_id
73
+ FROM agentic_schema_migrations
74
+ WHERE package_name = ?
75
+ AND migration_id = ?`)
76
+ .get("@soddong/agentic-runtime", migrationId);
77
+ return row !== undefined;
78
+ }
79
+ function applyRuntimeMigration(db, migration) {
80
+ if (hasRuntimeMigration(db, migration.migrationId)) {
81
+ return;
82
+ }
83
+ const info = getRuntimeInfo();
84
+ db.exec(readRuntimeMigration(migration.migrationId));
85
+ db.prepare(`INSERT OR IGNORE INTO agentic_schema_migrations
86
+ (package_name, migration_id, checksum_sha256, applied_by_runtime_version, applied_at)
87
+ VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)`).run("@soddong/agentic-runtime", migration.migrationId, null, info.version);
88
+ }
89
+ function applyRuntimeMigrations(db) {
90
+ for (const migration of RUNTIME_MIGRATIONS) {
91
+ applyRuntimeMigration(db, migration);
92
+ }
93
+ }
94
+ function upsertRuntimeMetadata(db) {
95
+ const info = getRuntimeInfo();
96
+ const upsert = db.prepare(`
97
+ INSERT INTO agentic_runtime_metadata
98
+ (metadata_key, metadata_value, value_type, metadata_description, updated_at)
99
+ VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
100
+ ON CONFLICT(metadata_key) DO UPDATE SET
101
+ metadata_value = excluded.metadata_value,
102
+ value_type = excluded.value_type,
103
+ metadata_description = excluded.metadata_description,
104
+ updated_at = excluded.updated_at
105
+ `);
106
+ upsert.run("runtime.package", info.name, "string", "runtime package name");
107
+ upsert.run("runtime.version", info.version, "string", "runtime package version");
108
+ upsert.run("runtime.database.schema", RUNTIME_MIGRATIONS[RUNTIME_MIGRATIONS.length - 1]?.schemaVersion ?? "0", "integer", "runtime database schema version");
109
+ }
110
+ export function initializeRuntimeDatabase(projectRoot = process.cwd()) {
111
+ const databasePath = resolveRuntimeDatabasePath(projectRoot);
112
+ const created = !existsSync(databasePath);
113
+ const db = openRuntimeDatabase(projectRoot);
114
+ try {
115
+ return {
116
+ databasePath,
117
+ created,
118
+ tables: listAgenticTables(db)
119
+ };
120
+ }
121
+ finally {
122
+ db.close();
123
+ }
124
+ }
125
+ export function openRuntimeDatabase(projectRoot = process.cwd()) {
126
+ const databasePath = resolveRuntimeDatabasePath(projectRoot);
127
+ mkdirSync(dirname(databasePath), { recursive: true });
128
+ const db = new Database(databasePath);
129
+ try {
130
+ db.pragma("journal_mode = WAL");
131
+ db.pragma("foreign_keys = ON");
132
+ applyRuntimeMigrations(db);
133
+ upsertRuntimeMetadata(db);
134
+ return db;
135
+ }
136
+ catch (error) {
137
+ db.close();
138
+ throw error;
139
+ }
140
+ }
141
+ export function openRuntimeDatabaseReadOnly(projectRoot = process.cwd()) {
142
+ const databasePath = resolveRuntimeDatabasePath(projectRoot);
143
+ if (!existsSync(databasePath)) {
144
+ throw new Error(`Runtime database does not exist: ${databasePath}`);
145
+ }
146
+ const db = new Database(databasePath, {
147
+ readonly: true,
148
+ fileMustExist: true
149
+ });
150
+ try {
151
+ db.pragma("foreign_keys = ON");
152
+ return {
153
+ databasePath,
154
+ mode: "readonly",
155
+ database: db
156
+ };
157
+ }
158
+ catch (error) {
159
+ db.close();
160
+ throw error;
161
+ }
162
+ }
163
+ export function getRuntimeDatabaseStatus(projectRoot = process.cwd()) {
164
+ const databasePath = resolveRuntimeDatabasePath(projectRoot);
165
+ if (!existsSync(databasePath)) {
166
+ return {
167
+ databasePath,
168
+ exists: false,
169
+ tables: []
170
+ };
171
+ }
172
+ const db = new Database(databasePath, { readonly: true });
173
+ try {
174
+ return {
175
+ databasePath,
176
+ exists: true,
177
+ tables: listAgenticTables(db)
178
+ };
179
+ }
180
+ finally {
181
+ db.close();
182
+ }
183
+ }
184
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export type ExecutionProjectStatusCode = "planned" | "in_progress" | "completed" | "blocked" | "skipped";
2
+ export interface CreateExecutionProjectInput {
3
+ readonly projectCode: string;
4
+ readonly projectName: string;
5
+ readonly bundleCode: string;
6
+ readonly packageName?: string;
7
+ readonly status?: ExecutionProjectStatusCode;
8
+ }
9
+ export interface ExecutionProjectRecord {
10
+ readonly executionProjectId: number;
11
+ readonly projectCode: string;
12
+ readonly projectName: string;
13
+ readonly projectStatusCode: ExecutionProjectStatusCode;
14
+ readonly bundleId: number;
15
+ readonly packageName: string;
16
+ readonly packageVersion: string;
17
+ readonly bundleCode: string;
18
+ readonly bundleVersion: string;
19
+ readonly methodologyCode?: string;
20
+ readonly lifecycleCode?: string;
21
+ readonly phaseCode?: string;
22
+ readonly processCode?: string;
23
+ readonly metadata: unknown;
24
+ readonly createdAt: string;
25
+ readonly updatedAt: string;
26
+ }
27
+ export interface ExecutionProjectStageRecord {
28
+ readonly executionProjectStageId: number;
29
+ readonly executionProjectId: number;
30
+ readonly stageCode: string;
31
+ readonly stageName: string;
32
+ readonly stageStatusCode: ExecutionProjectStatusCode;
33
+ readonly sortOrder: number;
34
+ readonly metadata: unknown;
35
+ readonly createdAt: string;
36
+ readonly updatedAt: string;
37
+ }
38
+ export interface ExecutionProjectActivityRecord {
39
+ readonly executionProjectActivityId: number;
40
+ readonly executionProjectId: number;
41
+ readonly executionProjectStageId: number;
42
+ readonly activityCode: string;
43
+ readonly activityName: string;
44
+ readonly activityStatusCode: ExecutionProjectStatusCode;
45
+ readonly primaryArtifactStandardCode?: string;
46
+ readonly primaryArtifactStandardVersion?: string;
47
+ readonly artifactInstanceId?: string;
48
+ readonly sortOrder: number;
49
+ readonly metadata: unknown;
50
+ readonly createdAt: string;
51
+ readonly updatedAt: string;
52
+ }
53
+ export interface ExecutionProjectStageStatus {
54
+ readonly stage: ExecutionProjectStageRecord;
55
+ readonly activities: readonly ExecutionProjectActivityRecord[];
56
+ readonly activityCount: number;
57
+ readonly completedActivityCount: number;
58
+ }
59
+ export interface ExecutionProjectStatus {
60
+ readonly project: ExecutionProjectRecord;
61
+ readonly stages: readonly ExecutionProjectStageStatus[];
62
+ readonly activityCount: number;
63
+ readonly completedActivityCount: number;
64
+ readonly expectedOutputArtifactCount: number;
65
+ readonly createdArtifactInstanceCount: number;
66
+ }
67
+ export declare function createExecutionProjectFromBundle(input: CreateExecutionProjectInput, projectRoot?: string): Promise<ExecutionProjectStatus>;
68
+ export declare function getExecutionProjectStatus(input: {
69
+ readonly projectCode: string;
70
+ }, projectRoot?: string): ExecutionProjectStatus;
71
+ //# sourceMappingURL=execution-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-projects.d.ts","sourceRoot":"","sources":["../src/execution-projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,333 @@
1
+ import { createRequire } from "node:module";
2
+ import { join } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { openRuntimeDatabase } from "./database.js";
5
+ import { listProjectBundles } from "./bundle-registry.js";
6
+ function mapProjectRow(row) {
7
+ return {
8
+ executionProjectId: row.execution_project_id,
9
+ projectCode: row.project_code,
10
+ projectName: row.project_name,
11
+ projectStatusCode: row.project_status_code,
12
+ bundleId: row.bundle_id,
13
+ packageName: row.package_name,
14
+ packageVersion: row.package_version,
15
+ bundleCode: row.bundle_code,
16
+ bundleVersion: row.bundle_version,
17
+ methodologyCode: row.methodology_code ?? undefined,
18
+ lifecycleCode: row.lifecycle_code ?? undefined,
19
+ phaseCode: row.phase_code ?? undefined,
20
+ processCode: row.process_code ?? undefined,
21
+ metadata: JSON.parse(row.metadata_json),
22
+ createdAt: row.created_at,
23
+ updatedAt: row.updated_at
24
+ };
25
+ }
26
+ function mapStageRow(row) {
27
+ return {
28
+ executionProjectStageId: row.execution_project_stage_id,
29
+ executionProjectId: row.execution_project_id,
30
+ stageCode: row.stage_code,
31
+ stageName: row.stage_name,
32
+ stageStatusCode: row.stage_status_code,
33
+ sortOrder: row.sort_order,
34
+ metadata: JSON.parse(row.metadata_json),
35
+ createdAt: row.created_at,
36
+ updatedAt: row.updated_at
37
+ };
38
+ }
39
+ function mapActivityRow(row) {
40
+ return {
41
+ executionProjectActivityId: row.execution_project_activity_id,
42
+ executionProjectId: row.execution_project_id,
43
+ executionProjectStageId: row.execution_project_stage_id,
44
+ activityCode: row.activity_code,
45
+ activityName: row.activity_name,
46
+ activityStatusCode: row.activity_status_code,
47
+ primaryArtifactStandardCode: row.primary_artifact_standard_code ?? undefined,
48
+ primaryArtifactStandardVersion: row.primary_artifact_standard_version ?? undefined,
49
+ artifactInstanceId: row.artifact_instance_id ?? undefined,
50
+ sortOrder: row.sort_order,
51
+ metadata: JSON.parse(row.metadata_json),
52
+ createdAt: row.created_at,
53
+ updatedAt: row.updated_at
54
+ };
55
+ }
56
+ function stringValue(value, key) {
57
+ const raw = value[key];
58
+ return typeof raw === "string" && raw.length > 0 ? raw : undefined;
59
+ }
60
+ function numberValue(value, key) {
61
+ const raw = value[key];
62
+ return typeof raw === "number" && Number.isFinite(raw) ? raw : 0;
63
+ }
64
+ function findInstalledBundle(input, projectRoot) {
65
+ const matches = listProjectBundles(projectRoot).filter((bundle) => {
66
+ return (bundle.bundleCode === input.bundleCode &&
67
+ bundle.enabled &&
68
+ (input.packageName === undefined || bundle.packageName === input.packageName));
69
+ });
70
+ if (matches.length === 0) {
71
+ throw new Error(`Bundle was not installed in this project: ${input.bundleCode}`);
72
+ }
73
+ if (matches.length > 1) {
74
+ throw new Error(`Multiple installed bundles match ${input.bundleCode}. Use --package to disambiguate.`);
75
+ }
76
+ return matches[0];
77
+ }
78
+ function assertBundleApplied(db, bundle) {
79
+ const row = db
80
+ .prepare(`SELECT seed_import_run_id
81
+ FROM agentic_seed_import_runs
82
+ WHERE bundle_id = ?
83
+ AND import_mode = 'apply'
84
+ AND import_status = 'applied'
85
+ ORDER BY seed_import_run_id DESC
86
+ LIMIT 1`)
87
+ .get(bundle.bundleId);
88
+ if (row === undefined) {
89
+ throw new Error(`Bundle seed has not been applied yet: ${bundle.bundleCode}`);
90
+ }
91
+ }
92
+ async function loadInstalledBundle(bundle, projectRoot) {
93
+ const projectRequire = createRequire(join(projectRoot, "package.json"));
94
+ const packageMainPath = projectRequire.resolve(bundle.packageName);
95
+ const packageExports = await import(pathToFileURL(packageMainPath).href);
96
+ const loadBundle = packageExports.loadAiAgentSdlcBundle ?? packageExports.loadSeedBundle ?? packageExports.loadBundle;
97
+ if (typeof loadBundle !== "function") {
98
+ throw new Error(`Package does not provide a supported seed bundle loader: ${bundle.packageName}`);
99
+ }
100
+ return await loadBundle(bundle.bundleCode);
101
+ }
102
+ function primaryOutputsByActivity(bundle) {
103
+ const result = new Map();
104
+ for (const requirement of bundle.activityArtifactRequirements ?? []) {
105
+ if (stringValue(requirement, "requirementRoleCode") === "output" &&
106
+ requirement.isPrimary === true) {
107
+ const activityCode = stringValue(requirement, "activityCode");
108
+ if (activityCode !== undefined) {
109
+ result.set(activityCode, requirement);
110
+ }
111
+ }
112
+ }
113
+ return result;
114
+ }
115
+ function readProjectByCode(db, projectCode) {
116
+ const row = db
117
+ .prepare(`SELECT execution_project_id,
118
+ project_code,
119
+ project_name,
120
+ project_status_code,
121
+ bundle_id,
122
+ package_name,
123
+ package_version,
124
+ bundle_code,
125
+ bundle_version,
126
+ methodology_code,
127
+ lifecycle_code,
128
+ phase_code,
129
+ process_code,
130
+ metadata_json,
131
+ created_at,
132
+ updated_at
133
+ FROM agentic_execution_projects
134
+ WHERE project_code = ?`)
135
+ .get(projectCode);
136
+ return row === undefined ? undefined : mapProjectRow(row);
137
+ }
138
+ function readProjectById(db, executionProjectId) {
139
+ const row = db
140
+ .prepare(`SELECT execution_project_id,
141
+ project_code,
142
+ project_name,
143
+ project_status_code,
144
+ bundle_id,
145
+ package_name,
146
+ package_version,
147
+ bundle_code,
148
+ bundle_version,
149
+ methodology_code,
150
+ lifecycle_code,
151
+ phase_code,
152
+ process_code,
153
+ metadata_json,
154
+ created_at,
155
+ updated_at
156
+ FROM agentic_execution_projects
157
+ WHERE execution_project_id = ?`)
158
+ .get(executionProjectId);
159
+ if (row === undefined) {
160
+ throw new Error(`Execution project was not found: ${executionProjectId}`);
161
+ }
162
+ return mapProjectRow(row);
163
+ }
164
+ function readExecutionProjectStatus(db, projectCode) {
165
+ const project = readProjectByCode(db, projectCode);
166
+ if (project === undefined) {
167
+ throw new Error(`Execution project was not found: ${projectCode}`);
168
+ }
169
+ const stageRows = db.prepare(`SELECT execution_project_stage_id,
170
+ execution_project_id,
171
+ stage_code,
172
+ stage_name,
173
+ stage_status_code,
174
+ sort_order,
175
+ metadata_json,
176
+ created_at,
177
+ updated_at
178
+ FROM agentic_execution_project_stages
179
+ WHERE execution_project_id = ?
180
+ ORDER BY sort_order, execution_project_stage_id`).all(project.executionProjectId);
181
+ const activityRows = db.prepare(`SELECT execution_project_activity_id,
182
+ execution_project_id,
183
+ execution_project_stage_id,
184
+ activity_code,
185
+ activity_name,
186
+ activity_status_code,
187
+ primary_artifact_standard_code,
188
+ primary_artifact_standard_version,
189
+ artifact_instance_id,
190
+ sort_order,
191
+ metadata_json,
192
+ created_at,
193
+ updated_at
194
+ FROM agentic_execution_project_activities
195
+ WHERE execution_project_id = ?
196
+ ORDER BY sort_order, execution_project_activity_id`).all(project.executionProjectId);
197
+ const activities = activityRows.map(mapActivityRow);
198
+ const stages = stageRows.map(mapStageRow).map((stage) => {
199
+ const stageActivities = activities.filter((activity) => {
200
+ return activity.executionProjectStageId === stage.executionProjectStageId;
201
+ });
202
+ return {
203
+ stage,
204
+ activities: stageActivities,
205
+ activityCount: stageActivities.length,
206
+ completedActivityCount: stageActivities.filter((activity) => activity.activityStatusCode === "completed").length
207
+ };
208
+ });
209
+ return {
210
+ project,
211
+ stages,
212
+ activityCount: activities.length,
213
+ completedActivityCount: activities.filter((activity) => activity.activityStatusCode === "completed").length,
214
+ expectedOutputArtifactCount: activities.filter((activity) => activity.primaryArtifactStandardCode !== undefined).length,
215
+ createdArtifactInstanceCount: activities.filter((activity) => activity.artifactInstanceId !== undefined).length
216
+ };
217
+ }
218
+ export async function createExecutionProjectFromBundle(input, projectRoot = process.cwd()) {
219
+ if (input.projectCode.trim().length === 0) {
220
+ throw new Error("projectCode is required.");
221
+ }
222
+ if (input.projectName.trim().length === 0) {
223
+ throw new Error("projectName is required.");
224
+ }
225
+ const bundle = findInstalledBundle(input, projectRoot);
226
+ const bundleValue = await loadInstalledBundle(bundle, projectRoot);
227
+ const stages = bundleValue.stages ?? [];
228
+ const activities = bundleValue.activities ?? [];
229
+ if (stages.length === 0 || activities.length === 0) {
230
+ throw new Error(`Bundle does not provide stages and activities: ${bundle.bundleCode}`);
231
+ }
232
+ const primaryOutputs = primaryOutputsByActivity(bundleValue);
233
+ const db = openRuntimeDatabase(projectRoot);
234
+ try {
235
+ assertBundleApplied(db, bundle);
236
+ const existing = readProjectByCode(db, input.projectCode);
237
+ if (existing !== undefined) {
238
+ throw new Error(`Execution project already exists: ${input.projectCode}`);
239
+ }
240
+ const transaction = db.transaction(() => {
241
+ const metadata = {
242
+ source: "bundle",
243
+ sampleExecution: bundleValue.sampleExecution ?? null
244
+ };
245
+ const result = db.prepare(`INSERT INTO agentic_execution_projects
246
+ (
247
+ project_code,
248
+ project_name,
249
+ project_status_code,
250
+ bundle_id,
251
+ package_name,
252
+ package_version,
253
+ bundle_code,
254
+ bundle_version,
255
+ methodology_code,
256
+ lifecycle_code,
257
+ phase_code,
258
+ process_code,
259
+ metadata_json,
260
+ created_at,
261
+ updated_at
262
+ )
263
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`).run(input.projectCode, input.projectName, input.status ?? "planned", bundle.bundleId, bundle.packageName, bundle.packageVersion, bundle.bundleCode, bundle.bundleVersion, bundle.methodologyCode ?? null, bundleValue.manifest?.scope?.lifecycleCode ?? bundleValue.lifecycle?.lifecycleCode ?? null, bundleValue.manifest?.scope?.phaseCode ?? null, bundleValue.manifest?.scope?.processCode ?? null, JSON.stringify(metadata));
264
+ const executionProjectId = Number(result.lastInsertRowid);
265
+ const insertStage = db.prepare(`INSERT INTO agentic_execution_project_stages
266
+ (
267
+ execution_project_id,
268
+ stage_code,
269
+ stage_name,
270
+ stage_status_code,
271
+ sort_order,
272
+ metadata_json,
273
+ created_at,
274
+ updated_at
275
+ )
276
+ VALUES (?, ?, ?, 'planned', ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`);
277
+ const insertActivity = db.prepare(`INSERT INTO agentic_execution_project_activities
278
+ (
279
+ execution_project_id,
280
+ execution_project_stage_id,
281
+ activity_code,
282
+ activity_name,
283
+ activity_status_code,
284
+ primary_artifact_standard_code,
285
+ primary_artifact_standard_version,
286
+ sort_order,
287
+ metadata_json,
288
+ created_at,
289
+ updated_at
290
+ )
291
+ VALUES (?, ?, ?, ?, 'planned', ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`);
292
+ const stageIds = new Map();
293
+ for (const stage of [...stages].sort((a, b) => numberValue(a, "stageOrder") - numberValue(b, "stageOrder"))) {
294
+ const stageCode = stringValue(stage, "stageCode");
295
+ const stageName = stringValue(stage, "stageName");
296
+ if (stageCode === undefined || stageName === undefined) {
297
+ continue;
298
+ }
299
+ const stageResult = insertStage.run(executionProjectId, stageCode, stageName, numberValue(stage, "stageOrder"), JSON.stringify({ seed: stage }));
300
+ stageIds.set(stageCode, Number(stageResult.lastInsertRowid));
301
+ }
302
+ for (const activity of [...activities].sort((a, b) => numberValue(a, "sortOrder") - numberValue(b, "sortOrder"))) {
303
+ const activityCode = stringValue(activity, "activityCode");
304
+ const activityName = stringValue(activity, "activityName");
305
+ const stageCode = stringValue(activity, "stageCode");
306
+ if (activityCode === undefined || activityName === undefined || stageCode === undefined) {
307
+ continue;
308
+ }
309
+ const stageId = stageIds.get(stageCode);
310
+ if (stageId === undefined) {
311
+ throw new Error(`Activity references a stage that was not found: ${activityCode} -> ${stageCode}`);
312
+ }
313
+ const primaryOutput = primaryOutputs.get(activityCode);
314
+ insertActivity.run(executionProjectId, stageId, activityCode, activityName, stringValue(primaryOutput ?? {}, "artifactStandardCode") ?? null, stringValue(primaryOutput ?? {}, "artifactStandardVersion") ?? null, numberValue(activity, "sortOrder"), JSON.stringify({ seed: activity, primaryOutput: primaryOutput ?? null }));
315
+ }
316
+ return executionProjectId;
317
+ });
318
+ return readExecutionProjectStatus(db, readProjectById(db, transaction()).projectCode);
319
+ }
320
+ finally {
321
+ db.close();
322
+ }
323
+ }
324
+ export function getExecutionProjectStatus(input, projectRoot = process.cwd()) {
325
+ const db = openRuntimeDatabase(projectRoot);
326
+ try {
327
+ return readExecutionProjectStatus(db, input.projectCode);
328
+ }
329
+ finally {
330
+ db.close();
331
+ }
332
+ }
333
+ //# sourceMappingURL=execution-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-projects.js","sourceRoot":"","sources":["../src/execution-projects.ts"],"names":[],"mappings":"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"}