@mc1global/opencode-jarvis 0.4.0 → 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/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/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 +53 -0
- package/dist/index.js.map +1 -1
- 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 +33 -2
- package/dist/mcp-server.js.map +1 -1
- 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,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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap Application — Use Cases
|
|
3
|
+
*
|
|
4
|
+
* Generates AGENTS.md with config-adaptive content and ensures
|
|
5
|
+
* the full JARVIS project structure exists (.jarvis/, config/, vault).
|
|
6
|
+
*
|
|
7
|
+
* SOLID: SRP — bootstrap orchestration only
|
|
8
|
+
* SOLID: OCP — new sections can be added without modifying existing ones
|
|
9
|
+
* SOLID: DIP — depends on ConfigService abstraction for config reading
|
|
10
|
+
*/
|
|
11
|
+
import type { AzureSyncConfig } from "../../domain/config/value-objects.js";
|
|
12
|
+
/** Config snapshot used for adaptive template generation. */
|
|
13
|
+
export interface BootstrapConfig {
|
|
14
|
+
/** Whether azure-sync is configured (has org + project). */
|
|
15
|
+
readonly azureSyncEnabled: boolean;
|
|
16
|
+
/** Azure DevOps organization name (if configured). */
|
|
17
|
+
readonly azureOrg: string;
|
|
18
|
+
/** Azure DevOps project name (if configured). */
|
|
19
|
+
readonly azureProject: string;
|
|
20
|
+
/** Whether pipeline/dagger features are available. */
|
|
21
|
+
readonly pipelineEnabled: boolean;
|
|
22
|
+
/** Whether container-use environments are available. */
|
|
23
|
+
readonly containerUseEnabled: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Result of bootstrap operation. */
|
|
26
|
+
export interface BootstrapResult {
|
|
27
|
+
readonly agentsMdCreated: boolean;
|
|
28
|
+
readonly agentsMdPath: string;
|
|
29
|
+
readonly directoriesCreated: readonly string[];
|
|
30
|
+
readonly configCreated: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Orchestrates project bootstrap: AGENTS.md generation + directory structure.
|
|
34
|
+
*/
|
|
35
|
+
export declare class BootstrapUseCases {
|
|
36
|
+
/**
|
|
37
|
+
* Bootstrap a project directory.
|
|
38
|
+
* Creates AGENTS.md (if missing), .jarvis/, config/jarvis.yaml, and vault skeleton.
|
|
39
|
+
*
|
|
40
|
+
* @param directory - Project root directory
|
|
41
|
+
* @param config - Config snapshot for adaptive content
|
|
42
|
+
* @param force - If true, regenerate AGENTS.md even if it exists
|
|
43
|
+
*/
|
|
44
|
+
bootstrap(directory: string, config: BootstrapConfig, force?: boolean): BootstrapResult;
|
|
45
|
+
/**
|
|
46
|
+
* Build a BootstrapConfig from an AzureSyncConfig (or defaults).
|
|
47
|
+
*/
|
|
48
|
+
buildConfig(azureSyncConfig?: AzureSyncConfig): BootstrapConfig;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate config-adaptive AGENTS.md content.
|
|
52
|
+
* Sections for Azure DevOps, Dagger, and container-use only appear when enabled.
|
|
53
|
+
*/
|
|
54
|
+
export declare function generateAgentsMd(config: BootstrapConfig): string;
|
|
55
|
+
//# sourceMappingURL=use-cases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-cases.d.ts","sourceRoot":"","sources":["../../../src/application/bootstrap/use-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAI5E,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAED,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AA8DD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;OAOG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,UAAQ,GAAG,eAAe;IAiDrF;;OAEG;IACH,WAAW,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,eAAe;CAUhE;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CA4BhE"}
|