@mc1global/opencode-jarvis 0.3.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/QUICK-GUIDE.md +53 -0
- package/README.md +308 -89
- package/dist/application/azure-sync/index.d.ts +2 -0
- package/dist/application/azure-sync/index.d.ts.map +1 -1
- package/dist/application/azure-sync/index.js +1 -0
- package/dist/application/azure-sync/index.js.map +1 -1
- package/dist/application/azure-sync/poll-service.d.ts +94 -0
- package/dist/application/azure-sync/poll-service.d.ts.map +1 -0
- package/dist/application/azure-sync/poll-service.js +227 -0
- package/dist/application/azure-sync/poll-service.js.map +1 -0
- package/dist/application/bootstrap/healthcheck-use-cases.d.ts +68 -0
- package/dist/application/bootstrap/healthcheck-use-cases.d.ts.map +1 -0
- package/dist/application/bootstrap/healthcheck-use-cases.js +303 -0
- package/dist/application/bootstrap/healthcheck-use-cases.js.map +1 -0
- package/dist/application/bootstrap/index.d.ts +10 -0
- package/dist/application/bootstrap/index.d.ts.map +1 -0
- package/dist/application/bootstrap/index.js +8 -0
- package/dist/application/bootstrap/index.js.map +1 -0
- package/dist/application/bootstrap/use-cases.d.ts +55 -0
- package/dist/application/bootstrap/use-cases.d.ts.map +1 -0
- package/dist/application/bootstrap/use-cases.js +355 -0
- package/dist/application/bootstrap/use-cases.js.map +1 -0
- package/dist/application/rag/dtos.d.ts +6 -0
- package/dist/application/rag/dtos.d.ts.map +1 -1
- package/dist/application/rag/use-cases.d.ts +9 -1
- package/dist/application/rag/use-cases.d.ts.map +1 -1
- package/dist/application/rag/use-cases.js +121 -56
- package/dist/application/rag/use-cases.js.map +1 -1
- package/dist/domain/azure-sync/entities.d.ts +59 -2
- package/dist/domain/azure-sync/entities.d.ts.map +1 -1
- package/dist/domain/azure-sync/entities.js +59 -0
- package/dist/domain/azure-sync/entities.js.map +1 -1
- package/dist/domain/azure-sync/index.d.ts +5 -5
- package/dist/domain/azure-sync/index.d.ts.map +1 -1
- package/dist/domain/azure-sync/index.js +2 -2
- package/dist/domain/azure-sync/index.js.map +1 -1
- package/dist/domain/azure-sync/ports.d.ts +2 -0
- package/dist/domain/azure-sync/ports.d.ts.map +1 -1
- package/dist/domain/azure-sync/repositories.d.ts +22 -2
- package/dist/domain/azure-sync/repositories.d.ts.map +1 -1
- package/dist/domain/azure-sync/value-objects.d.ts +12 -0
- package/dist/domain/azure-sync/value-objects.d.ts.map +1 -1
- package/dist/domain/azure-sync/value-objects.js +21 -0
- package/dist/domain/azure-sync/value-objects.js.map +1 -1
- package/dist/domain/config/value-objects.d.ts +4 -0
- package/dist/domain/config/value-objects.d.ts.map +1 -1
- package/dist/domain/config/value-objects.js +2 -0
- package/dist/domain/config/value-objects.js.map +1 -1
- package/dist/domain/rag/repositories.d.ts +42 -0
- package/dist/domain/rag/repositories.d.ts.map +1 -1
- package/dist/domain/rag/services.d.ts +10 -0
- package/dist/domain/rag/services.d.ts.map +1 -1
- package/dist/domain/rag/services.js +38 -0
- package/dist/domain/rag/services.js.map +1 -1
- package/dist/hooks/first-run-guide.d.ts +33 -0
- package/dist/hooks/first-run-guide.d.ts.map +1 -0
- package/dist/hooks/first-run-guide.js +58 -0
- package/dist/hooks/first-run-guide.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -27
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/azure-sync/azure-devops-client.d.ts +1 -0
- package/dist/infrastructure/azure-sync/azure-devops-client.d.ts.map +1 -1
- package/dist/infrastructure/azure-sync/azure-devops-client.js +11 -13
- package/dist/infrastructure/azure-sync/azure-devops-client.js.map +1 -1
- package/dist/infrastructure/azure-sync/index.d.ts +1 -0
- package/dist/infrastructure/azure-sync/index.d.ts.map +1 -1
- package/dist/infrastructure/azure-sync/index.js +2 -1
- package/dist/infrastructure/azure-sync/index.js.map +1 -1
- package/dist/infrastructure/azure-sync/sqlite-event-repository.d.ts +31 -0
- package/dist/infrastructure/azure-sync/sqlite-event-repository.d.ts.map +1 -0
- package/dist/infrastructure/azure-sync/sqlite-event-repository.js +105 -0
- package/dist/infrastructure/azure-sync/sqlite-event-repository.js.map +1 -0
- package/dist/infrastructure/rag/file-discovery.d.ts.map +1 -1
- package/dist/infrastructure/rag/file-discovery.js +1 -0
- package/dist/infrastructure/rag/file-discovery.js.map +1 -1
- package/dist/infrastructure/rag/file-index-registry.d.ts +18 -0
- package/dist/infrastructure/rag/file-index-registry.d.ts.map +1 -0
- package/dist/infrastructure/rag/file-index-registry.js +67 -0
- package/dist/infrastructure/rag/file-index-registry.js.map +1 -0
- package/dist/mcp-server.js +68 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/tools/azure-sync-event-tools.d.ts +13 -0
- package/dist/tools/azure-sync-event-tools.d.ts.map +1 -0
- package/dist/tools/azure-sync-event-tools.js +100 -0
- package/dist/tools/azure-sync-event-tools.js.map +1 -0
- package/dist/tools/bootstrap-tools.d.ts +15 -0
- package/dist/tools/bootstrap-tools.d.ts.map +1 -0
- package/dist/tools/bootstrap-tools.js +113 -0
- package/dist/tools/bootstrap-tools.js.map +1 -0
- package/dist/tools/rag-tools.d.ts.map +1 -1
- package/dist/tools/rag-tools.js +9 -2
- package/dist/tools/rag-tools.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Azure Sync Application — Poll Service
|
|
3
|
+
*
|
|
4
|
+
* Background service that periodically queries Azure DevOps for changes
|
|
5
|
+
* to mapped work items. Detects field edits, state changes, and revision
|
|
6
|
+
* bumps by comparing current rev against stored azureRevision in mappings.
|
|
7
|
+
*
|
|
8
|
+
* Emits events via a callback when changes are detected, and persists
|
|
9
|
+
* SyncEvent entities for later inspection by the agent.
|
|
10
|
+
*
|
|
11
|
+
* SOLID: SRP — polling orchestration and change detection only
|
|
12
|
+
* SOLID: OCP — new event types can be added without modifying detection loop
|
|
13
|
+
* SOLID: DIP — depends on repository/port abstractions
|
|
14
|
+
*/
|
|
15
|
+
import { SyncEvent } from "../../domain/azure-sync/entities.js";
|
|
16
|
+
import { SyncEventId } from "../../domain/azure-sync/value-objects.js";
|
|
17
|
+
// ─── Poll Service ─────────────────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Background polling service for Azure DevOps change detection.
|
|
20
|
+
* Call start() to begin periodic polling, stop() to halt.
|
|
21
|
+
*/
|
|
22
|
+
export class AzurePollService {
|
|
23
|
+
deps;
|
|
24
|
+
intervalSecs;
|
|
25
|
+
timer;
|
|
26
|
+
_running = false;
|
|
27
|
+
_pollCount = 0;
|
|
28
|
+
_lastPollAt;
|
|
29
|
+
constructor(deps, intervalSecs) {
|
|
30
|
+
this.deps = deps;
|
|
31
|
+
this.intervalSecs = intervalSecs;
|
|
32
|
+
if (intervalSecs < 30) {
|
|
33
|
+
throw new Error("Poll interval must be at least 30 seconds");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Whether the service is currently running. */
|
|
37
|
+
get running() { return this._running; }
|
|
38
|
+
/** Number of completed poll cycles. */
|
|
39
|
+
get pollCount() { return this._pollCount; }
|
|
40
|
+
/** ISO timestamp of the last poll. */
|
|
41
|
+
get lastPollAt() { return this._lastPollAt; }
|
|
42
|
+
/** Start the polling loop. No-op if already running. */
|
|
43
|
+
start() {
|
|
44
|
+
if (this._running)
|
|
45
|
+
return;
|
|
46
|
+
this._running = true;
|
|
47
|
+
// Run immediately, then on interval
|
|
48
|
+
this.poll().catch((err) => {
|
|
49
|
+
this.deps.onError?.(`Poll failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
50
|
+
});
|
|
51
|
+
this.timer = setInterval(() => {
|
|
52
|
+
this.poll().catch((err) => {
|
|
53
|
+
this.deps.onError?.(`Poll failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
54
|
+
});
|
|
55
|
+
}, this.intervalSecs * 1000);
|
|
56
|
+
}
|
|
57
|
+
/** Stop the polling loop. */
|
|
58
|
+
stop() {
|
|
59
|
+
if (!this._running)
|
|
60
|
+
return;
|
|
61
|
+
this._running = false;
|
|
62
|
+
if (this.timer !== undefined) {
|
|
63
|
+
clearInterval(this.timer);
|
|
64
|
+
this.timer = undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Execute a single poll cycle. Exposed for testing. */
|
|
68
|
+
async poll() {
|
|
69
|
+
const mappings = await this.deps.syncMappingRepo.findByProject(this.deps.project);
|
|
70
|
+
if (mappings.length === 0)
|
|
71
|
+
return undefined;
|
|
72
|
+
// Collect all Azure work item IDs from mappings
|
|
73
|
+
const idMap = new Map();
|
|
74
|
+
for (const m of mappings) {
|
|
75
|
+
idMap.set(m.azureWorkItemId.value, m);
|
|
76
|
+
}
|
|
77
|
+
const ids = [...idMap.keys()];
|
|
78
|
+
// Batch fetch current state from Azure
|
|
79
|
+
const result = await this.deps.azureClient.getWorkItemsBatch(this.deps.org, this.deps.project, ids);
|
|
80
|
+
if (!result.success) {
|
|
81
|
+
this.deps.onError?.(`Azure API error: ${result.error}`);
|
|
82
|
+
this._pollCount++;
|
|
83
|
+
this._lastPollAt = new Date().toISOString();
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
const events = [];
|
|
87
|
+
for (const workItem of result.data) {
|
|
88
|
+
const mapping = idMap.get(workItem.id);
|
|
89
|
+
if (!mapping)
|
|
90
|
+
continue;
|
|
91
|
+
// Compare revision — if unchanged, skip
|
|
92
|
+
if (workItem.rev <= mapping.azureRevision)
|
|
93
|
+
continue;
|
|
94
|
+
// Detect what changed
|
|
95
|
+
const eventType = detectEventType(workItem, mapping);
|
|
96
|
+
const changedBy = extractChangedBy(workItem);
|
|
97
|
+
const changedFields = extractChangedFields(workItem);
|
|
98
|
+
const seq = await this.deps.syncEventRepo.nextEventSequence();
|
|
99
|
+
const syncEvent = SyncEvent.create({
|
|
100
|
+
id: SyncEventId.create(seq),
|
|
101
|
+
mappingId: mapping.id,
|
|
102
|
+
azureWorkItemId: workItem.id,
|
|
103
|
+
eventType,
|
|
104
|
+
changedBy,
|
|
105
|
+
changedFields,
|
|
106
|
+
previousRevision: mapping.azureRevision,
|
|
107
|
+
newRevision: workItem.rev,
|
|
108
|
+
});
|
|
109
|
+
await this.deps.syncEventRepo.save(syncEvent);
|
|
110
|
+
events.push({
|
|
111
|
+
workItemId: workItem.id,
|
|
112
|
+
eventType,
|
|
113
|
+
changedBy,
|
|
114
|
+
localId: mapping.localId,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
this._pollCount++;
|
|
118
|
+
this._lastPollAt = new Date().toISOString();
|
|
119
|
+
if (events.length === 0)
|
|
120
|
+
return undefined;
|
|
121
|
+
const notification = {
|
|
122
|
+
eventCount: events.length,
|
|
123
|
+
summary: `${events.length} change(s) detected in Azure DevOps`,
|
|
124
|
+
events,
|
|
125
|
+
};
|
|
126
|
+
this.deps.onChangesDetected?.(notification);
|
|
127
|
+
return notification;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Use cases for managing sync events (list, acknowledge, dismiss). */
|
|
131
|
+
export class SyncEventUseCases {
|
|
132
|
+
eventRepo;
|
|
133
|
+
constructor(eventRepo) {
|
|
134
|
+
this.eventRepo = eventRepo;
|
|
135
|
+
}
|
|
136
|
+
/** List pending events. */
|
|
137
|
+
async listPending(limit = 50) {
|
|
138
|
+
const events = await this.eventRepo.findPending(limit);
|
|
139
|
+
return events.map(toEventResponse);
|
|
140
|
+
}
|
|
141
|
+
/** List recent events (all statuses). */
|
|
142
|
+
async listRecent(limit = 20) {
|
|
143
|
+
const events = await this.eventRepo.findRecent(limit);
|
|
144
|
+
return events.map(toEventResponse);
|
|
145
|
+
}
|
|
146
|
+
/** Acknowledge an event by ID. */
|
|
147
|
+
async acknowledge(eventId) {
|
|
148
|
+
const event = await this.eventRepo.findById(SyncEventId.from(eventId));
|
|
149
|
+
if (!event)
|
|
150
|
+
return `Event ${eventId} not found`;
|
|
151
|
+
event.acknowledge();
|
|
152
|
+
await this.eventRepo.update(event);
|
|
153
|
+
return `Event ${eventId} acknowledged`;
|
|
154
|
+
}
|
|
155
|
+
/** Dismiss an event by ID. */
|
|
156
|
+
async dismiss(eventId) {
|
|
157
|
+
const event = await this.eventRepo.findById(SyncEventId.from(eventId));
|
|
158
|
+
if (!event)
|
|
159
|
+
return `Event ${eventId} not found`;
|
|
160
|
+
event.dismiss();
|
|
161
|
+
await this.eventRepo.update(event);
|
|
162
|
+
return `Event ${eventId} dismissed`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
166
|
+
function toEventResponse(e) {
|
|
167
|
+
const p = e.toProps();
|
|
168
|
+
return {
|
|
169
|
+
id: p.id, mappingId: p.mappingId,
|
|
170
|
+
azureWorkItemId: p.azureWorkItemId, eventType: p.eventType,
|
|
171
|
+
status: p.status, changedBy: p.changedBy,
|
|
172
|
+
changedFields: p.changedFields, previousRevision: p.previousRevision,
|
|
173
|
+
newRevision: p.newRevision, detectedAt: p.detectedAt,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/** Detect the type of change based on work item fields. */
|
|
177
|
+
function detectEventType(workItem, mapping) {
|
|
178
|
+
const stateField = workItem.fields["System.State"];
|
|
179
|
+
const prevState = mapping.toProps().syncStatus;
|
|
180
|
+
// If state changed, it's a state_change
|
|
181
|
+
if (typeof stateField === "string" && stateField.toLowerCase() !== prevState) {
|
|
182
|
+
return "state_change";
|
|
183
|
+
}
|
|
184
|
+
// Check for comment count change (heuristic)
|
|
185
|
+
const commentCount = workItem.fields["System.CommentCount"];
|
|
186
|
+
if (typeof commentCount === "number" && commentCount > 0) {
|
|
187
|
+
return "comment_added";
|
|
188
|
+
}
|
|
189
|
+
// Default: field change or general revision bump
|
|
190
|
+
const changedFields = extractChangedFields(workItem);
|
|
191
|
+
if (changedFields.length > 0)
|
|
192
|
+
return "field_change";
|
|
193
|
+
return "revision_bump";
|
|
194
|
+
}
|
|
195
|
+
/** Extract who last changed the work item. */
|
|
196
|
+
function extractChangedBy(workItem) {
|
|
197
|
+
const changedBy = workItem.fields["System.ChangedBy"];
|
|
198
|
+
if (typeof changedBy === "object" && changedBy !== null) {
|
|
199
|
+
const obj = changedBy;
|
|
200
|
+
if (typeof obj["displayName"] === "string")
|
|
201
|
+
return obj["displayName"];
|
|
202
|
+
if (typeof obj["uniqueName"] === "string")
|
|
203
|
+
return obj["uniqueName"];
|
|
204
|
+
}
|
|
205
|
+
if (typeof changedBy === "string")
|
|
206
|
+
return changedBy;
|
|
207
|
+
return "unknown";
|
|
208
|
+
}
|
|
209
|
+
/** Extract names of recently changed fields. */
|
|
210
|
+
function extractChangedFields(workItem) {
|
|
211
|
+
// Azure API doesn't directly tell us which fields changed in a rev bump.
|
|
212
|
+
// We report key fields present in the response as a heuristic.
|
|
213
|
+
const interesting = [
|
|
214
|
+
"System.State", "System.Title", "System.Description",
|
|
215
|
+
"System.AssignedTo", "Microsoft.VSTS.Scheduling.StoryPoints",
|
|
216
|
+
"System.Tags",
|
|
217
|
+
];
|
|
218
|
+
const present = [];
|
|
219
|
+
for (const field of interesting) {
|
|
220
|
+
if (workItem.fields[field] !== undefined) {
|
|
221
|
+
const short = field.split(".").pop() ?? field;
|
|
222
|
+
present.push(short);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return present.join(", ");
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=poll-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll-service.js","sourceRoot":"","sources":["../../../src/application/azure-sync/poll-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** Status of a single healthcheck probe. */
|
|
2
|
+
export type CheckStatus = "pass" | "warn" | "fail";
|
|
3
|
+
/** Result of a single healthcheck probe. */
|
|
4
|
+
export interface CheckResult {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly status: CheckStatus;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
/** Optional extra details (version, count, etc.). */
|
|
9
|
+
readonly detail?: string;
|
|
10
|
+
/** Copy-paste ready fix commands for warn/fail results. */
|
|
11
|
+
readonly fix?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Aggregated healthcheck response. */
|
|
14
|
+
export interface HealthcheckResponse {
|
|
15
|
+
readonly checks: readonly CheckResult[];
|
|
16
|
+
readonly summary: {
|
|
17
|
+
readonly pass: number;
|
|
18
|
+
readonly warn: number;
|
|
19
|
+
readonly fail: number;
|
|
20
|
+
readonly total: number;
|
|
21
|
+
};
|
|
22
|
+
readonly healthy: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Dependencies injected into the healthcheck. */
|
|
25
|
+
export interface HealthcheckDeps {
|
|
26
|
+
/** Ollama base URL (e.g., "http://localhost:11434"). */
|
|
27
|
+
readonly ollamaUrl: string;
|
|
28
|
+
/** Configured embedding model name. */
|
|
29
|
+
readonly ollamaModel: string;
|
|
30
|
+
/** Path to .jarvis/jarvis.db. */
|
|
31
|
+
readonly dbPath: string;
|
|
32
|
+
/** Path to config/jarvis.yaml. */
|
|
33
|
+
readonly configPath: string;
|
|
34
|
+
/** RAG workspace name for status check. */
|
|
35
|
+
readonly workspace: string;
|
|
36
|
+
/** Function to get RAG status (document count). Returns null on error. */
|
|
37
|
+
readonly getRagStatus: (workspace: string) => Promise<{
|
|
38
|
+
documentCount: number;
|
|
39
|
+
} | null>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Orchestrates non-destructive environment readiness probes.
|
|
43
|
+
*/
|
|
44
|
+
export declare class HealthcheckUseCases {
|
|
45
|
+
private readonly deps;
|
|
46
|
+
constructor(deps: HealthcheckDeps);
|
|
47
|
+
/**
|
|
48
|
+
* Run all healthchecks and return aggregated results.
|
|
49
|
+
*/
|
|
50
|
+
runAll(): Promise<HealthcheckResponse>;
|
|
51
|
+
/** Check if Bun runtime is available on PATH. */
|
|
52
|
+
checkBun(): Promise<CheckResult>;
|
|
53
|
+
/** Check if Ollama is reachable at the configured URL. */
|
|
54
|
+
checkOllamaConnectivity(): Promise<CheckResult>;
|
|
55
|
+
/** Check if the configured embedding model is available in Ollama. */
|
|
56
|
+
checkOllamaModel(): Promise<CheckResult>;
|
|
57
|
+
/** Check if the SQLite database file exists. */
|
|
58
|
+
checkSqlite(): Promise<CheckResult>;
|
|
59
|
+
/** Check if config/jarvis.yaml exists. */
|
|
60
|
+
checkConfig(): Promise<CheckResult>;
|
|
61
|
+
/** Check RAG index status (document count). */
|
|
62
|
+
checkRagIndex(): Promise<CheckResult>;
|
|
63
|
+
/** Check if Dagger CLI is available (optional). */
|
|
64
|
+
checkDagger(): Promise<CheckResult>;
|
|
65
|
+
/** Check if Azure CLI is available (optional). */
|
|
66
|
+
checkAzureCli(): Promise<CheckResult>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=healthcheck-use-cases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthcheck-use-cases.d.ts","sourceRoot":"","sources":["../../../src/application/bootstrap/healthcheck-use-cases.ts"],"names":[],"mappings":"AAiBA,4CAA4C;AAC5C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACzF;AAID;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;gBAE3B,IAAI,EAAE,eAAe;IAIjC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAyB5C,iDAAiD;IAC3C,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAsBtC,0DAA0D;IACpD,uBAAuB,IAAI,OAAO,CAAC,WAAW,CAAC;IAqCrD,sEAAsE;IAChE,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC;IAiD9C,gDAAgD;IAC1C,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAiBzC,0CAA0C;IACpC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAiBzC,+CAA+C;IACzC,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC;IAoC3C,mDAAmD;IAC7C,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAuBzC,kDAAkD;IAC5C,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC;CAuB5C"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap Application — Healthcheck Use Cases
|
|
3
|
+
*
|
|
4
|
+
* Probes environment readiness by checking external dependencies
|
|
5
|
+
* (Ollama, Bun, Dagger, Azure CLI) and internal state (SQLite, config, RAG).
|
|
6
|
+
* All checks are non-destructive read-only probes with timeouts.
|
|
7
|
+
*
|
|
8
|
+
* SOLID: SRP — environment healthcheck orchestration only
|
|
9
|
+
* SOLID: OCP — new checks can be added without modifying existing ones
|
|
10
|
+
* SOLID: DIP — depends on port abstractions, not concrete implementations
|
|
11
|
+
*/
|
|
12
|
+
import { execFile } from "node:child_process";
|
|
13
|
+
import { existsSync } from "node:fs";
|
|
14
|
+
import { platform } from "node:os";
|
|
15
|
+
// ── Healthcheck Use Cases ─────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Orchestrates non-destructive environment readiness probes.
|
|
18
|
+
*/
|
|
19
|
+
export class HealthcheckUseCases {
|
|
20
|
+
deps;
|
|
21
|
+
constructor(deps) {
|
|
22
|
+
this.deps = deps;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run all healthchecks and return aggregated results.
|
|
26
|
+
*/
|
|
27
|
+
async runAll() {
|
|
28
|
+
const checks = await Promise.all([
|
|
29
|
+
this.checkBun(),
|
|
30
|
+
this.checkOllamaConnectivity(),
|
|
31
|
+
this.checkOllamaModel(),
|
|
32
|
+
this.checkSqlite(),
|
|
33
|
+
this.checkConfig(),
|
|
34
|
+
this.checkRagIndex(),
|
|
35
|
+
this.checkDagger(),
|
|
36
|
+
this.checkAzureCli(),
|
|
37
|
+
]);
|
|
38
|
+
const pass = checks.filter((c) => c.status === "pass").length;
|
|
39
|
+
const warn = checks.filter((c) => c.status === "warn").length;
|
|
40
|
+
const fail = checks.filter((c) => c.status === "fail").length;
|
|
41
|
+
return {
|
|
42
|
+
checks,
|
|
43
|
+
summary: { pass, warn, fail, total: checks.length },
|
|
44
|
+
healthy: fail === 0,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// ── Individual Checks ───────────────────────────────────────────────
|
|
48
|
+
/** Check if Bun runtime is available on PATH. */
|
|
49
|
+
async checkBun() {
|
|
50
|
+
try {
|
|
51
|
+
const version = await execCommand("bun", ["--version"], 3000);
|
|
52
|
+
return {
|
|
53
|
+
name: "Bun Runtime",
|
|
54
|
+
status: "pass",
|
|
55
|
+
message: "Bun is available",
|
|
56
|
+
detail: `v${version.trim()}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return {
|
|
61
|
+
name: "Bun Runtime",
|
|
62
|
+
status: "fail",
|
|
63
|
+
message: "Bun is not installed or not on PATH. Required for SQLite and production runtime.",
|
|
64
|
+
detail: "Install: https://bun.sh",
|
|
65
|
+
fix: isMac()
|
|
66
|
+
? "curl -fsSL https://bun.sh/install | bash"
|
|
67
|
+
: "curl -fsSL https://bun.sh/install | bash",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Check if Ollama is reachable at the configured URL. */
|
|
72
|
+
async checkOllamaConnectivity() {
|
|
73
|
+
try {
|
|
74
|
+
const controller = new AbortController();
|
|
75
|
+
const timeout = setTimeout(() => controller.abort(), 3000);
|
|
76
|
+
try {
|
|
77
|
+
const response = await fetch(`${this.deps.ollamaUrl}/api/tags`, {
|
|
78
|
+
signal: controller.signal,
|
|
79
|
+
});
|
|
80
|
+
if (response.ok) {
|
|
81
|
+
return {
|
|
82
|
+
name: "Ollama Connectivity",
|
|
83
|
+
status: "pass",
|
|
84
|
+
message: `Ollama is reachable at ${this.deps.ollamaUrl}`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
name: "Ollama Connectivity",
|
|
89
|
+
status: "fail",
|
|
90
|
+
message: `Ollama responded with status ${String(response.status)} at ${this.deps.ollamaUrl}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timeout);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
const installCmd = isMac()
|
|
99
|
+
? "brew install ollama && ollama serve"
|
|
100
|
+
: "curl -fsSL https://ollama.ai/install.sh | sh && ollama serve";
|
|
101
|
+
return {
|
|
102
|
+
name: "Ollama Connectivity",
|
|
103
|
+
status: "fail",
|
|
104
|
+
message: `Cannot reach Ollama at ${this.deps.ollamaUrl}. Is Ollama running?`,
|
|
105
|
+
detail: "Install: https://ollama.ai — then run: ollama serve",
|
|
106
|
+
fix: installCmd,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Check if the configured embedding model is available in Ollama. */
|
|
111
|
+
async checkOllamaModel() {
|
|
112
|
+
try {
|
|
113
|
+
const controller = new AbortController();
|
|
114
|
+
const timeout = setTimeout(() => controller.abort(), 3000);
|
|
115
|
+
try {
|
|
116
|
+
const response = await fetch(`${this.deps.ollamaUrl}/api/tags`, {
|
|
117
|
+
signal: controller.signal,
|
|
118
|
+
});
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
return {
|
|
121
|
+
name: "Embedding Model",
|
|
122
|
+
status: "fail",
|
|
123
|
+
message: "Cannot check models — Ollama not reachable",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const data = await response.json();
|
|
127
|
+
const models = data.models ?? [];
|
|
128
|
+
const modelNames = models.map((m) => {
|
|
129
|
+
const name = m.name ?? "";
|
|
130
|
+
// Ollama returns "model:tag", match against base name
|
|
131
|
+
return name.split(":")[0] ?? "";
|
|
132
|
+
});
|
|
133
|
+
if (modelNames.includes(this.deps.ollamaModel)) {
|
|
134
|
+
return {
|
|
135
|
+
name: "Embedding Model",
|
|
136
|
+
status: "pass",
|
|
137
|
+
message: `Model "${this.deps.ollamaModel}" is available`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
name: "Embedding Model",
|
|
142
|
+
status: "fail",
|
|
143
|
+
message: `Model "${this.deps.ollamaModel}" not found in Ollama`,
|
|
144
|
+
detail: `Available models: ${modelNames.join(", ") || "(none)"}`,
|
|
145
|
+
fix: `ollama pull ${this.deps.ollamaModel}`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
clearTimeout(timeout);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return {
|
|
154
|
+
name: "Embedding Model",
|
|
155
|
+
status: "fail",
|
|
156
|
+
message: `Cannot check model "${this.deps.ollamaModel}" — Ollama not reachable`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** Check if the SQLite database file exists. */
|
|
161
|
+
async checkSqlite() {
|
|
162
|
+
if (existsSync(this.deps.dbPath)) {
|
|
163
|
+
return {
|
|
164
|
+
name: "SQLite Database",
|
|
165
|
+
status: "pass",
|
|
166
|
+
message: "Database file exists",
|
|
167
|
+
detail: this.deps.dbPath,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
name: "SQLite Database",
|
|
172
|
+
status: "warn",
|
|
173
|
+
message: "Database file not found — will be created on first use",
|
|
174
|
+
detail: this.deps.dbPath,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** Check if config/jarvis.yaml exists. */
|
|
178
|
+
async checkConfig() {
|
|
179
|
+
if (existsSync(this.deps.configPath)) {
|
|
180
|
+
return {
|
|
181
|
+
name: "Configuration",
|
|
182
|
+
status: "pass",
|
|
183
|
+
message: "config/jarvis.yaml exists",
|
|
184
|
+
detail: this.deps.configPath,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
name: "Configuration",
|
|
189
|
+
status: "warn",
|
|
190
|
+
message: "config/jarvis.yaml not found — will be created by auto-bootstrap",
|
|
191
|
+
detail: this.deps.configPath,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/** Check RAG index status (document count). */
|
|
195
|
+
async checkRagIndex() {
|
|
196
|
+
try {
|
|
197
|
+
const status = await this.deps.getRagStatus(this.deps.workspace);
|
|
198
|
+
if (status === null) {
|
|
199
|
+
return {
|
|
200
|
+
name: "RAG Index",
|
|
201
|
+
status: "warn",
|
|
202
|
+
message: "RAG index not available — Ollama may be offline",
|
|
203
|
+
detail: `Workspace: ${this.deps.workspace}`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (status.documentCount === 0) {
|
|
207
|
+
return {
|
|
208
|
+
name: "RAG Index",
|
|
209
|
+
status: "warn",
|
|
210
|
+
message: "RAG index is empty — semantic code search will not return results",
|
|
211
|
+
detail: `Workspace: ${this.deps.workspace}`,
|
|
212
|
+
fix: "Use the rag-index tool to index the codebase, then rag-oracle-index with directory=\"obsidian-vault\" for documentation",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
name: "RAG Index",
|
|
217
|
+
status: "pass",
|
|
218
|
+
message: `RAG index contains ${String(status.documentCount)} documents`,
|
|
219
|
+
detail: `Workspace: ${this.deps.workspace}`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return {
|
|
224
|
+
name: "RAG Index",
|
|
225
|
+
status: "warn",
|
|
226
|
+
message: "Could not check RAG index status",
|
|
227
|
+
detail: `Workspace: ${this.deps.workspace}`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/** Check if Dagger CLI is available (optional). */
|
|
232
|
+
async checkDagger() {
|
|
233
|
+
try {
|
|
234
|
+
const version = await execCommand("dagger", ["version"], 3000);
|
|
235
|
+
return {
|
|
236
|
+
name: "Dagger CLI (optional)",
|
|
237
|
+
status: "pass",
|
|
238
|
+
message: "Dagger is available",
|
|
239
|
+
detail: version.trim(),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
const installCmd = isMac()
|
|
244
|
+
? "brew install dagger/tap/dagger"
|
|
245
|
+
: "curl -fsSL https://dl.dagger.io/dagger/install.sh | sh";
|
|
246
|
+
return {
|
|
247
|
+
name: "Dagger CLI (optional)",
|
|
248
|
+
status: "warn",
|
|
249
|
+
message: "Dagger is not installed — pipeline CI/CD features will be unavailable",
|
|
250
|
+
detail: "Install: https://docs.dagger.io/install",
|
|
251
|
+
fix: installCmd,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/** Check if Azure CLI is available (optional). */
|
|
256
|
+
async checkAzureCli() {
|
|
257
|
+
try {
|
|
258
|
+
const version = await execCommand("az", ["version", "--output", "tsv"], 3000);
|
|
259
|
+
const firstLine = version.split("\n")[0] ?? "";
|
|
260
|
+
return {
|
|
261
|
+
name: "Azure CLI (optional)",
|
|
262
|
+
status: "pass",
|
|
263
|
+
message: "Azure CLI is available",
|
|
264
|
+
detail: firstLine.trim(),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
const installCmd = isMac()
|
|
269
|
+
? "brew install azure-cli && az login"
|
|
270
|
+
: "curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash && az login";
|
|
271
|
+
return {
|
|
272
|
+
name: "Azure CLI (optional)",
|
|
273
|
+
status: "warn",
|
|
274
|
+
message: "Azure CLI is not installed — Azure DevOps sync will be unavailable",
|
|
275
|
+
detail: "Install: https://learn.microsoft.com/en-us/cli/azure/install-azure-cli",
|
|
276
|
+
fix: installCmd,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ── Platform Helper ───────────────────────────────────────────────────────────
|
|
282
|
+
/** Detect if running on macOS. */
|
|
283
|
+
function isMac() {
|
|
284
|
+
return platform() === "darwin";
|
|
285
|
+
}
|
|
286
|
+
// ── Shell Command Helper ──────────────────────────────────────────────────────
|
|
287
|
+
/**
|
|
288
|
+
* Execute a command with timeout. Returns stdout on success, throws on failure.
|
|
289
|
+
*/
|
|
290
|
+
function execCommand(cmd, args, timeoutMs) {
|
|
291
|
+
return new Promise((resolve, reject) => {
|
|
292
|
+
const proc = execFile(cmd, [...args], { timeout: timeoutMs }, (error, stdout) => {
|
|
293
|
+
if (error) {
|
|
294
|
+
reject(error);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
resolve(stdout);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
proc.on("error", reject);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=healthcheck-use-cases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthcheck-use-cases.js","sourceRoot":"","sources":["../../../src/application/bootstrap/healthcheck-use-cases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap Application — Barrel Export
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the bootstrap use cases, healthcheck, types, and template generator.
|
|
5
|
+
*/
|
|
6
|
+
export { BootstrapUseCases, generateAgentsMd, } from "./use-cases.js";
|
|
7
|
+
export type { BootstrapConfig, BootstrapResult, } from "./use-cases.js";
|
|
8
|
+
export { HealthcheckUseCases } from "./healthcheck-use-cases.js";
|
|
9
|
+
export type { CheckStatus, CheckResult, HealthcheckResponse, HealthcheckDeps, } from "./healthcheck-use-cases.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/application/bootstrap/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,eAAe,EACf,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,YAAY,EACV,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap Application — Barrel Export
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the bootstrap use cases, healthcheck, types, and template generator.
|
|
5
|
+
*/
|
|
6
|
+
export { BootstrapUseCases, generateAgentsMd, } from "./use-cases.js";
|
|
7
|
+
export { HealthcheckUseCases } from "./healthcheck-use-cases.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/application/bootstrap/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|