@h-rig/core 0.0.6-alpha.176 → 0.0.6-alpha.177

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.
@@ -1,252 +0,0 @@
1
- // @bun
2
- // packages/core/src/profile-ops.ts
3
- import { existsSync as existsSync2, mkdirSync, writeFileSync } from "fs";
4
-
5
- // packages/core/src/harness-paths.ts
6
- import { resolve as resolve3 } from "path";
7
-
8
- // packages/core/src/layout.ts
9
- import { resolve as resolve2 } from "path";
10
- import {
11
- RIG_ARTIFACTS_DIRNAME,
12
- RIG_DEFINITION_DIRNAME,
13
- RIG_STATE_DIRNAME
14
- } from "@rig/contracts";
15
-
16
- // packages/core/src/checkout-root.ts
17
- import { dirname, resolve } from "path";
18
- import { existsSync } from "fs";
19
- function findNearestGitCheckoutRoot(startDir) {
20
- let current = resolve(startDir);
21
- for (;; ) {
22
- if (existsSync(resolve(current, ".git")))
23
- return current;
24
- const parent = dirname(current);
25
- if (parent === current)
26
- return null;
27
- current = parent;
28
- }
29
- }
30
- function resolveCheckoutRoot(projectRoot) {
31
- const normalizedProjectRoot = resolve(projectRoot);
32
- const explicit = process.env.MONOREPO_ROOT?.trim();
33
- if (explicit) {
34
- const explicitRoot = resolve(explicit);
35
- const gitRoot = findNearestGitCheckoutRoot(explicitRoot);
36
- if (gitRoot)
37
- return gitRoot;
38
- throw new Error(`MONOREPO_ROOT points to ${explicitRoot}, but no git checkout was found there or above it.`);
39
- }
40
- return findNearestGitCheckoutRoot(normalizedProjectRoot) ?? normalizedProjectRoot;
41
- }
42
-
43
- // packages/core/src/layout.ts
44
- var resolveMonorepoRoot = resolveCheckoutRoot;
45
- function resolveRuntimeWorkspaceLayout(workspaceDir) {
46
- const root = resolve2(workspaceDir);
47
- const rigRoot = resolve2(root, ".rig");
48
- const logsDir = resolve2(rigRoot, "logs");
49
- const stateDir = resolve2(rigRoot, "state");
50
- const runtimeDir = resolve2(rigRoot, "runtime");
51
- const binDir = resolve2(rigRoot, "bin");
52
- return {
53
- workspaceDir: root,
54
- rigRoot,
55
- stateDir,
56
- logsDir,
57
- artifactsRoot: resolve2(root, RIG_ARTIFACTS_DIRNAME),
58
- runtimeDir,
59
- homeDir: resolve2(rigRoot, "home"),
60
- tmpDir: resolve2(rigRoot, "tmp"),
61
- cacheDir: resolve2(rigRoot, "cache"),
62
- sessionDir: resolve2(rigRoot, "session"),
63
- binDir,
64
- distDir: resolve2(rigRoot, "dist"),
65
- pluginBinDir: resolve2(binDir, "plugins"),
66
- contextPath: resolve2(rigRoot, "runtime-context.json"),
67
- controlPlaneEventsFile: resolve2(logsDir, "control-plane.events.jsonl")
68
- };
69
- }
70
- function resolveActiveRuntimeWorkspaceRoot(_monorepoRoot) {
71
- const explicit = process.env.RIG_TASK_WORKSPACE?.trim();
72
- if (!explicit) {
73
- throw new Error("No active runtime workspace. Set RIG_TASK_WORKSPACE or provision a task runtime first.");
74
- }
75
- return resolve2(explicit);
76
- }
77
- function resolveRigLayout(projectRoot) {
78
- const monorepoRoot = resolveMonorepoRoot(projectRoot);
79
- const definitionRoot = resolve2(projectRoot, RIG_DEFINITION_DIRNAME);
80
- const runtimeWorkspaceRoot = resolveActiveRuntimeWorkspaceRoot(monorepoRoot);
81
- const runtimeLayout = resolveRuntimeWorkspaceLayout(runtimeWorkspaceRoot);
82
- const policyDir = resolve2(definitionRoot, "policy");
83
- return {
84
- projectRoot,
85
- monorepoRoot,
86
- definitionRoot,
87
- runtimeWorkspaceRoot,
88
- stateRoot: runtimeLayout.rigRoot,
89
- artifactsRoot: runtimeLayout.artifactsRoot,
90
- configPath: resolve2(definitionRoot, "config.sh"),
91
- taskConfigPath: resolve2(runtimeWorkspaceRoot, ".rig", "task-config.json"),
92
- policyDir,
93
- policyFile: resolve2(policyDir, "policy.json"),
94
- pluginsDir: resolve2(definitionRoot, "plugins"),
95
- hooksDir: resolve2(definitionRoot, "hooks"),
96
- toolsDir: resolve2(definitionRoot, "tools"),
97
- templatesDir: resolve2(definitionRoot, "templates"),
98
- validationDir: resolve2(definitionRoot, "validation"),
99
- stateDir: runtimeLayout.stateDir,
100
- logsDir: runtimeLayout.logsDir,
101
- notificationsDir: resolve2(definitionRoot, "notifications"),
102
- runtimeDir: runtimeLayout.runtimeDir,
103
- distDir: runtimeLayout.distDir,
104
- binDir: runtimeLayout.binDir,
105
- pluginBinDir: runtimeLayout.pluginBinDir,
106
- keybindingsPath: resolve2(definitionRoot, "keybindings.json"),
107
- controlPlaneEventsFile: runtimeLayout.controlPlaneEventsFile
108
- };
109
- }
110
-
111
- // packages/core/src/harness-paths.ts
112
- function resolveHarnessPaths(projectRoot) {
113
- const hasRuntimeWorkspace = Boolean(process.env.RIG_TASK_WORKSPACE?.trim());
114
- const monorepoRoot = resolveCheckoutRoot(projectRoot);
115
- const harnessRoot = resolve3(projectRoot, "rig");
116
- const stateRoot = resolve3(projectRoot, ".rig");
117
- const layout = hasRuntimeWorkspace ? resolveRigLayout(projectRoot) : null;
118
- const stateDir = layout?.stateDir ?? resolve3(stateRoot, "state");
119
- const logsDir = layout?.logsDir ?? resolve3(stateRoot, "logs");
120
- const artifactsDir = layout?.artifactsRoot ?? resolve3(monorepoRoot, "artifacts");
121
- const taskConfigPath = layout?.taskConfigPath ?? resolve3(monorepoRoot, ".rig", "task-config.json");
122
- const binDir = layout?.binDir ?? resolve3(stateRoot, "bin");
123
- return {
124
- harnessRoot,
125
- stateDir: process.env.RIG_STATE_DIR || stateDir,
126
- artifactsDir,
127
- logsDir: process.env.RIG_LOGS_DIR || logsDir,
128
- binDir,
129
- hooksDir: resolve3(harnessRoot, "hooks"),
130
- validationDir: resolve3(harnessRoot, "validation"),
131
- taskConfigPath,
132
- sessionPath: process.env.RIG_SESSION_FILE || resolve3(stateRoot, "session", "session.json"),
133
- monorepoRoot,
134
- tsApiTestsDir: process.env.TS_API_TESTS_DIR || resolve3(monorepoRoot, "TSAPITests"),
135
- taskRepoCommitsPath: resolve3(stateDir, "task-repo-commits.json"),
136
- baseRepoPinsPath: resolve3(stateDir, "base-repo-pins.json"),
137
- failedApproachesPath: resolve3(stateDir, "failed_approaches.md"),
138
- agentProfilePath: resolve3(stateDir, "agent-profile.json"),
139
- reviewProfilePath: resolve3(stateDir, "review-profile.json")
140
- };
141
- }
142
-
143
- // packages/core/src/profile-ops.ts
144
- var DEFAULTS = {
145
- model: "pi",
146
- runtime: "pi",
147
- plugin: "pi",
148
- reviewMode: parseEnvOrDefault(process.env.AI_REVIEW_MODE, ["off", "advisory", "required"], "advisory"),
149
- reviewProvider: parseEnvOrDefault(process.env.AI_REVIEW_PROVIDER, ["greptile", "github"], "github")
150
- };
151
- function parseEnvOrDefault(value, allowed, fallback) {
152
- if (!value) {
153
- return fallback;
154
- }
155
- return allowed.includes(value) ? value : fallback;
156
- }
157
- async function readProfileFile(path) {
158
- if (!existsSync2(path)) {
159
- return null;
160
- }
161
- try {
162
- return await Bun.file(path).json();
163
- } catch {
164
- return null;
165
- }
166
- }
167
- async function showProfile(projectRoot, compact = false) {
168
- const paths = resolveHarnessPaths(projectRoot);
169
- const profile = await loadProfile(paths.agentProfilePath);
170
- if (compact) {
171
- console.log(`model=${profile.model} runtime=${profile.runtime} plugin=${profile.agent_plugin}`);
172
- return;
173
- }
174
- console.log("Execution Profile:");
175
- console.log(` model: ${profile.model}`);
176
- console.log(` runtime: ${profile.runtime}`);
177
- console.log(` plugin: ${profile.agent_plugin}`);
178
- }
179
- async function setProfile(projectRoot, options) {
180
- const invalid = [options.model, options.runtime, options.plugin, options.preset].filter((value) => typeof value === "string" && value.trim().length > 0 && value.trim() !== "pi");
181
- if (invalid.length > 0) {
182
- throw new Error("Only the Pi runtime profile is supported by this Rig substrate.");
183
- }
184
- const paths = resolveHarnessPaths(projectRoot);
185
- mkdirSync(paths.stateDir, { recursive: true });
186
- const next = {
187
- model: "pi",
188
- runtime: "pi",
189
- agent_plugin: "pi",
190
- updated_at: new Date().toISOString()
191
- };
192
- writeFileSync(paths.agentProfilePath, `${JSON.stringify(next, null, 2)}
193
- `, "utf-8");
194
- await showProfile(projectRoot, false);
195
- }
196
- async function showReviewProfile(projectRoot) {
197
- const paths = resolveHarnessPaths(projectRoot);
198
- const profile = await loadReviewProfile(paths.reviewProfilePath);
199
- console.log("AI Review Profile:");
200
- console.log(` mode: ${profile.mode}`);
201
- console.log(` provider: ${profile.provider}`);
202
- console.log(` file: ${paths.reviewProfilePath}`);
203
- }
204
- async function setReviewProfile(projectRoot, mode, provider) {
205
- if (mode !== "off" && mode !== "advisory" && mode !== "required") {
206
- throw new Error(`Invalid mode: ${mode}. Use off|advisory|required.`);
207
- }
208
- const resolvedProvider = provider || DEFAULTS.reviewProvider;
209
- if (resolvedProvider !== "greptile" && resolvedProvider !== "github") {
210
- throw new Error(`Invalid provider: ${resolvedProvider}. Supported: github|greptile.`);
211
- }
212
- const paths = resolveHarnessPaths(projectRoot);
213
- mkdirSync(paths.stateDir, { recursive: true });
214
- const next = {
215
- mode,
216
- provider: resolvedProvider,
217
- updated_at: new Date().toISOString()
218
- };
219
- writeFileSync(paths.reviewProfilePath, `${JSON.stringify(next, null, 2)}
220
- `, "utf-8");
221
- await showReviewProfile(projectRoot);
222
- }
223
- async function loadProfile(path) {
224
- const parsed = await readProfileFile(path);
225
- return {
226
- model: "pi",
227
- runtime: "pi",
228
- agent_plugin: "pi",
229
- updated_at: parsed?.updated_at || new Date().toISOString()
230
- };
231
- }
232
- async function loadReviewProfile(path) {
233
- const parsed = await readProfileFile(path);
234
- if (parsed) {
235
- return {
236
- mode: parsed.mode || DEFAULTS.reviewMode,
237
- provider: parsed.provider || DEFAULTS.reviewProvider,
238
- updated_at: parsed.updated_at || new Date().toISOString()
239
- };
240
- }
241
- return {
242
- mode: DEFAULTS.reviewMode,
243
- provider: DEFAULTS.reviewProvider,
244
- updated_at: new Date().toISOString()
245
- };
246
- }
247
- export {
248
- showReviewProfile,
249
- showProfile,
250
- setReviewProfile,
251
- setProfile
252
- };