@kenkaiiii/ggcoder-eyes 0.1.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/LICENSE +21 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +328 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/journal.d.ts +40 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +104 -0
- package/dist/journal.js.map +1 -0
- package/dist/manifest.d.ts +16 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +17 -0
- package/dist/manifest.js.map +1 -0
- package/package.json +41 -0
- package/probes/capture_email/impl/mailpit.sh +77 -0
- package/probes/capture_email/install.sh +83 -0
- package/probes/capture_email/test.sh +43 -0
- package/probes/http/impl/curl.sh +64 -0
- package/probes/http/install.sh +19 -0
- package/probes/http/test.sh +39 -0
- package/probes/runtime_logs/detect.sh +38 -0
- package/probes/runtime_logs/impl/adb-logcat.sh +46 -0
- package/probes/runtime_logs/impl/docker.sh +51 -0
- package/probes/runtime_logs/impl/simctl.sh +42 -0
- package/probes/runtime_logs/impl/tail.sh +55 -0
- package/probes/runtime_logs/install.sh +36 -0
- package/probes/runtime_logs/test.sh +44 -0
- package/probes/visual/detect.sh +78 -0
- package/probes/visual/impl/adb.sh +28 -0
- package/probes/visual/impl/generic.sh +7 -0
- package/probes/visual/impl/playwright.sh +70 -0
- package/probes/visual/impl/simctl.sh +29 -0
- package/probes/visual/impl/window.sh +59 -0
- package/probes/visual/install.sh +87 -0
- package/probes/visual/test.sh +69 -0
- package/shared/_lib.sh +88 -0
- package/shared/_redact.sh +29 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 KenKai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { appendEntry, isEyesActive, journalCount, readJournal, updateEntry, } from "./journal.js";
|
|
7
|
+
import { readManifest as readManifestShared } from "./manifest.js";
|
|
8
|
+
// In dev: __dirname = packages/ggcoder-eyes/src. After build: dist/.
|
|
9
|
+
// Probes + shared live at ../probes and ../shared relative to the built file.
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const PKG_ROOT = resolve(__dirname, "..");
|
|
12
|
+
const PROBES_DIR = join(PKG_ROOT, "probes");
|
|
13
|
+
const SHARED_DIR = join(PKG_ROOT, "shared");
|
|
14
|
+
const EYES_DIR = resolve(process.cwd(), ".gg/eyes");
|
|
15
|
+
const MANIFEST = join(EYES_DIR, "manifest.json");
|
|
16
|
+
const GITIGNORE_ENTRIES = [
|
|
17
|
+
".gg/eyes/out/",
|
|
18
|
+
".gg/eyes/state/",
|
|
19
|
+
".gg/eyes/bin/",
|
|
20
|
+
".gg/eyes/recordings/",
|
|
21
|
+
".gg/eyes/auth/",
|
|
22
|
+
".gg/eyes/remote.json",
|
|
23
|
+
".gg/eyes/_lib.sh",
|
|
24
|
+
".gg/eyes/_redact.sh",
|
|
25
|
+
];
|
|
26
|
+
function readManifest() {
|
|
27
|
+
return readManifestShared(process.cwd());
|
|
28
|
+
}
|
|
29
|
+
function writeManifest(m) {
|
|
30
|
+
mkdirSync(EYES_DIR, { recursive: true });
|
|
31
|
+
writeFileSync(MANIFEST, JSON.stringify(m, null, 2));
|
|
32
|
+
}
|
|
33
|
+
function ensureGitignore() {
|
|
34
|
+
const gi = resolve(process.cwd(), ".gitignore");
|
|
35
|
+
const existing = existsSync(gi) ? readFileSync(gi, "utf8") : "";
|
|
36
|
+
const missing = GITIGNORE_ENTRIES.filter((e) => !existing.includes(e));
|
|
37
|
+
if (missing.length) {
|
|
38
|
+
const suffix = (existing.endsWith("\n") || !existing ? "" : "\n") +
|
|
39
|
+
"\n# ggcoder-eyes\n" +
|
|
40
|
+
missing.join("\n") +
|
|
41
|
+
"\n";
|
|
42
|
+
writeFileSync(gi, existing + suffix);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function sh(cmd, args, opts = {}) {
|
|
46
|
+
const r = spawnSync(cmd, args, {
|
|
47
|
+
cwd: opts.cwd ?? process.cwd(),
|
|
48
|
+
env: { ...process.env, EYES_PROJECT_ROOT: process.cwd(), ...(opts.env ?? {}) },
|
|
49
|
+
stdio: ["ignore", "pipe", "inherit"],
|
|
50
|
+
encoding: "utf8",
|
|
51
|
+
});
|
|
52
|
+
return { stdout: r.stdout?.trim() ?? "", code: r.status ?? 1 };
|
|
53
|
+
}
|
|
54
|
+
function capabilityDirs() {
|
|
55
|
+
return readdirSync(PROBES_DIR).filter((d) => {
|
|
56
|
+
const p = join(PROBES_DIR, d);
|
|
57
|
+
return existsSync(join(p, "install.sh"));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function doInit() {
|
|
61
|
+
mkdirSync(EYES_DIR, { recursive: true });
|
|
62
|
+
mkdirSync(join(EYES_DIR, "out"), { recursive: true });
|
|
63
|
+
mkdirSync(join(EYES_DIR, "state"), { recursive: true });
|
|
64
|
+
mkdirSync(join(EYES_DIR, "bin"), { recursive: true });
|
|
65
|
+
// Copy shared infra
|
|
66
|
+
for (const f of ["_lib.sh", "_redact.sh"]) {
|
|
67
|
+
const src = join(SHARED_DIR, f);
|
|
68
|
+
const dst = join(EYES_DIR, f);
|
|
69
|
+
writeFileSync(dst, readFileSync(src));
|
|
70
|
+
sh("chmod", ["+x", dst]);
|
|
71
|
+
}
|
|
72
|
+
ensureGitignore();
|
|
73
|
+
if (!existsSync(MANIFEST))
|
|
74
|
+
writeManifest({ version: 1, probes: [] });
|
|
75
|
+
console.log(`initialized: ${EYES_DIR}`);
|
|
76
|
+
}
|
|
77
|
+
function doDetect() {
|
|
78
|
+
const out = {};
|
|
79
|
+
for (const cap of capabilityDirs()) {
|
|
80
|
+
const detect = join(PROBES_DIR, cap, "detect.sh");
|
|
81
|
+
if (!existsSync(detect)) {
|
|
82
|
+
// Universal capabilities without detect.sh (e.g. http) — single universal impl.
|
|
83
|
+
out[cap] = { candidates: ["*"], primary: "*" };
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const r = sh("bash", [detect]);
|
|
87
|
+
if (r.code === 0 && r.stdout) {
|
|
88
|
+
try {
|
|
89
|
+
out[cap] = JSON.parse(r.stdout);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
out[cap] = { candidates: [], primary: "" };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
out[cap] = { candidates: [], primary: "" };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
console.log(JSON.stringify(out, null, 2));
|
|
100
|
+
}
|
|
101
|
+
function doInstall(args) {
|
|
102
|
+
const cap = args[0];
|
|
103
|
+
if (!cap) {
|
|
104
|
+
console.error("usage: ggcoder-eyes install <capability> [--impl <name>] [--as <script-name>]");
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
let impl;
|
|
108
|
+
let asName;
|
|
109
|
+
for (let i = 1; i < args.length; i++) {
|
|
110
|
+
if (args[i] === "--impl")
|
|
111
|
+
impl = args[++i];
|
|
112
|
+
else if (args[i] === "--as")
|
|
113
|
+
asName = args[++i];
|
|
114
|
+
}
|
|
115
|
+
const capDir = join(PROBES_DIR, cap);
|
|
116
|
+
if (!existsSync(capDir)) {
|
|
117
|
+
console.error(`unknown capability: ${cap}. known: ${capabilityDirs().join(", ")}`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
// If no impl given, consult detect.sh
|
|
121
|
+
if (!impl) {
|
|
122
|
+
const detectPath = join(capDir, "detect.sh");
|
|
123
|
+
if (existsSync(detectPath)) {
|
|
124
|
+
const r = sh("bash", [detectPath]);
|
|
125
|
+
try {
|
|
126
|
+
impl = JSON.parse(r.stdout).primary;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* fall through */
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Universal probe — pick the only impl
|
|
134
|
+
const impls = readdirSync(join(capDir, "impl")).filter((f) => f.endsWith(".sh"));
|
|
135
|
+
if (impls.length === 1)
|
|
136
|
+
impl = impls[0].replace(/\.sh$/, "");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!impl) {
|
|
140
|
+
console.error(`could not auto-detect impl for ${cap}; pass --impl <name>`);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
// Ensure .gg/eyes exists + shared is present
|
|
144
|
+
doInit();
|
|
145
|
+
const installArgs = [join(capDir, "install.sh"), impl];
|
|
146
|
+
if (asName)
|
|
147
|
+
installArgs.push("--as", asName);
|
|
148
|
+
const r = spawnSync("bash", installArgs, {
|
|
149
|
+
stdio: "inherit",
|
|
150
|
+
env: { ...process.env, EYES_PROJECT_ROOT: process.cwd() },
|
|
151
|
+
});
|
|
152
|
+
if (r.status !== 0) {
|
|
153
|
+
console.error(`install failed for ${cap}/${impl}`);
|
|
154
|
+
process.exit(r.status ?? 1);
|
|
155
|
+
}
|
|
156
|
+
// Record in manifest
|
|
157
|
+
const m = readManifest();
|
|
158
|
+
const name = asName ?? cap;
|
|
159
|
+
const script = `.gg/eyes/${name}.sh`;
|
|
160
|
+
const existing = m.probes.findIndex((p) => p.name === name);
|
|
161
|
+
const entry = { capability: cap, name, impl, script, status: "built" };
|
|
162
|
+
if (existing >= 0)
|
|
163
|
+
m.probes[existing] = entry;
|
|
164
|
+
else
|
|
165
|
+
m.probes.push(entry);
|
|
166
|
+
writeManifest(m);
|
|
167
|
+
console.log(`installed ${cap}/${impl} as ${script}`);
|
|
168
|
+
}
|
|
169
|
+
function doVerify(args) {
|
|
170
|
+
const target = args[0];
|
|
171
|
+
const m = readManifest();
|
|
172
|
+
const targets = target
|
|
173
|
+
? m.probes.filter((p) => p.name === target)
|
|
174
|
+
: m.probes.filter((p) => p.status === "built");
|
|
175
|
+
if (!targets.length) {
|
|
176
|
+
console.log("no built probes to verify");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
for (const p of targets) {
|
|
180
|
+
const testPath = join(PROBES_DIR, p.capability, "test.sh");
|
|
181
|
+
if (!existsSync(testPath)) {
|
|
182
|
+
console.log(`- ${p.name}: no test.sh, skipping`);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const r = spawnSync("bash", [testPath, p.name], {
|
|
186
|
+
stdio: "inherit",
|
|
187
|
+
env: { ...process.env, EYES_PROJECT_ROOT: process.cwd() },
|
|
188
|
+
});
|
|
189
|
+
if (r.status === 0) {
|
|
190
|
+
p.status = "verified";
|
|
191
|
+
delete p.error;
|
|
192
|
+
console.log(`✓ ${p.name}`);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
p.status = "failed";
|
|
196
|
+
p.error = `test.sh exit ${r.status}`;
|
|
197
|
+
console.log(`✗ ${p.name} (exit ${r.status})`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
writeManifest(m);
|
|
201
|
+
}
|
|
202
|
+
function doList() {
|
|
203
|
+
const m = readManifest();
|
|
204
|
+
if (!m.probes.length) {
|
|
205
|
+
console.log("no probes installed. run: ggcoder-eyes detect | install <capability>");
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
for (const p of m.probes) {
|
|
209
|
+
const flag = p.status === "verified" ? "✓" : p.status === "failed" ? "✗" : "·";
|
|
210
|
+
console.log(`${flag} ${p.name.padEnd(20)} ${p.capability.padEnd(18)} ${p.impl.padEnd(12)} ${p.status}${p.error ? ` (${p.error})` : ""}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const LOG_KINDS = new Set(["rough", "wish", "blocked"]);
|
|
214
|
+
const LOG_STATUSES = new Set(["open", "deferred", "acked"]);
|
|
215
|
+
function doLog(args) {
|
|
216
|
+
const sub = args[0];
|
|
217
|
+
if (!sub) {
|
|
218
|
+
console.error("usage: ggcoder-eyes log <rough|wish|blocked|ack|defer|list|count> ...");
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
// Gate: non-eyes projects get silent no-ops for all log subcommands.
|
|
222
|
+
// Reads return empty / zero; writes do nothing. Exit code is always 0 so
|
|
223
|
+
// callers (probes, hooks) can invoke freely without branching on setup state.
|
|
224
|
+
if (!isEyesActive(process.cwd())) {
|
|
225
|
+
if (sub === "list")
|
|
226
|
+
console.log("[]");
|
|
227
|
+
else if (sub === "count")
|
|
228
|
+
console.log("0");
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (LOG_KINDS.has(sub)) {
|
|
232
|
+
const reason = args[1];
|
|
233
|
+
if (!reason) {
|
|
234
|
+
console.error(`usage: ggcoder-eyes log ${sub} "<reason>" [--probe <name>]`);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
let probe;
|
|
238
|
+
for (let i = 2; i < args.length; i++) {
|
|
239
|
+
if (args[i] === "--probe")
|
|
240
|
+
probe = args[++i];
|
|
241
|
+
}
|
|
242
|
+
const entry = appendEntry({ kind: sub, reason, probe });
|
|
243
|
+
if (entry)
|
|
244
|
+
console.log(entry.id);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (sub === "ack" || sub === "defer") {
|
|
248
|
+
const id = args[1];
|
|
249
|
+
if (!id) {
|
|
250
|
+
console.error(`usage: ggcoder-eyes log ${sub} <id>`);
|
|
251
|
+
process.exit(1);
|
|
252
|
+
}
|
|
253
|
+
const ok = updateEntry(id, { status: sub === "ack" ? "acked" : "deferred" });
|
|
254
|
+
if (!ok) {
|
|
255
|
+
console.error(`no entry with id: ${id}`);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
console.log(`${sub}: ${id}`);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (sub === "list" || sub === "count") {
|
|
262
|
+
let status;
|
|
263
|
+
let kind;
|
|
264
|
+
let limit;
|
|
265
|
+
for (let i = 1; i < args.length; i++) {
|
|
266
|
+
const flag = args[i];
|
|
267
|
+
const val = args[++i];
|
|
268
|
+
if (flag === "--status" && LOG_STATUSES.has(val))
|
|
269
|
+
status = val;
|
|
270
|
+
else if (flag === "--kind" && LOG_KINDS.has(val))
|
|
271
|
+
kind = val;
|
|
272
|
+
else if (flag === "--limit")
|
|
273
|
+
limit = Number(val);
|
|
274
|
+
}
|
|
275
|
+
if (sub === "count") {
|
|
276
|
+
console.log(String(journalCount({ status, kind })));
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
const entries = readJournal({ status, kind, limit, order: "desc" });
|
|
280
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
281
|
+
}
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
console.error(`unknown log subcommand: ${sub}`);
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
const cmd = process.argv[2];
|
|
288
|
+
const args = process.argv.slice(3);
|
|
289
|
+
switch (cmd) {
|
|
290
|
+
case "init":
|
|
291
|
+
doInit();
|
|
292
|
+
break;
|
|
293
|
+
case "detect":
|
|
294
|
+
doDetect();
|
|
295
|
+
break;
|
|
296
|
+
case "install":
|
|
297
|
+
doInstall(args);
|
|
298
|
+
break;
|
|
299
|
+
case "verify":
|
|
300
|
+
doVerify(args);
|
|
301
|
+
break;
|
|
302
|
+
case "list":
|
|
303
|
+
doList();
|
|
304
|
+
break;
|
|
305
|
+
case "log":
|
|
306
|
+
doLog(args);
|
|
307
|
+
break;
|
|
308
|
+
default:
|
|
309
|
+
console.error(`usage: ggcoder-eyes <command>
|
|
310
|
+
|
|
311
|
+
commands:
|
|
312
|
+
init create .gg/eyes/, copy shared infra, update .gitignore
|
|
313
|
+
detect emit JSON of capability → {candidates, primary}
|
|
314
|
+
install <cap> [--impl <name>] [--as <name>]
|
|
315
|
+
install deps + copy probe into .gg/eyes/
|
|
316
|
+
verify [<name>] run probe self-tests, update manifest
|
|
317
|
+
list show installed probes and their status
|
|
318
|
+
log <rough|wish|blocked> "<reason>" [--probe <name>]
|
|
319
|
+
append a journal entry (silent no-op if eyes not set up)
|
|
320
|
+
log <ack|defer> <id> change an entry's status
|
|
321
|
+
log list [--status S] [--kind K] [--limit N]
|
|
322
|
+
emit JSON array of journal entries
|
|
323
|
+
log count [--status S] [--kind K]
|
|
324
|
+
print count to stdout
|
|
325
|
+
`.trim());
|
|
326
|
+
process.exit(cmd ? 1 : 0);
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { isEyesActive, eyesRoot, manifestPath, journalPath, appendEntry, readJournal, journalCount, updateEntry, genId, } from "./journal.js";
|
|
2
|
+
export type { JournalEntry, JournalKind, JournalStatus } from "./journal.js";
|
|
3
|
+
export { readManifest } from "./manifest.js";
|
|
4
|
+
export type { Manifest, ProbeEntry, ProbeStatus } from "./manifest.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,GACN,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,GACN,MAAM,cAAc,CAAC;AAItB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type JournalKind = "rough" | "wish" | "blocked";
|
|
2
|
+
export type JournalStatus = "open" | "deferred" | "acked";
|
|
3
|
+
export type JournalEntry = {
|
|
4
|
+
id: string;
|
|
5
|
+
ts: string;
|
|
6
|
+
kind: JournalKind;
|
|
7
|
+
reason: string;
|
|
8
|
+
probe?: string;
|
|
9
|
+
status: JournalStatus;
|
|
10
|
+
};
|
|
11
|
+
export declare function eyesRoot(cwd?: string): string;
|
|
12
|
+
export declare function manifestPath(cwd?: string): string;
|
|
13
|
+
export declare function journalPath(cwd?: string): string;
|
|
14
|
+
/** Single gate for every eyes-related runtime behavior. If this returns false,
|
|
15
|
+
* the project has not been set up with `/eyes` and all integrations no-op. */
|
|
16
|
+
export declare function isEyesActive(cwd?: string): boolean;
|
|
17
|
+
export declare function genId(): string;
|
|
18
|
+
type AppendInput = {
|
|
19
|
+
kind: JournalKind;
|
|
20
|
+
reason: string;
|
|
21
|
+
probe?: string;
|
|
22
|
+
status?: JournalStatus;
|
|
23
|
+
};
|
|
24
|
+
export declare function appendEntry(input: AppendInput, cwd?: string): JournalEntry | null;
|
|
25
|
+
type ReadOptions = {
|
|
26
|
+
status?: JournalStatus;
|
|
27
|
+
kind?: JournalKind;
|
|
28
|
+
limit?: number;
|
|
29
|
+
order?: "asc" | "desc";
|
|
30
|
+
};
|
|
31
|
+
export declare function readJournal(options?: ReadOptions, cwd?: string): JournalEntry[];
|
|
32
|
+
export declare function journalCount(options?: {
|
|
33
|
+
status?: JournalStatus;
|
|
34
|
+
kind?: JournalKind;
|
|
35
|
+
}, cwd?: string): number;
|
|
36
|
+
/** Rewrite-based update. Journal is expected to stay small (tens to low
|
|
37
|
+
* hundreds of entries); a full rewrite is fine. */
|
|
38
|
+
export declare function updateEntry(id: string, patch: Partial<Pick<JournalEntry, "status" | "reason">>, cwd?: string): boolean;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAE5D;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEhE;AAED,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAE/D;AAED;8EAC8E;AAC9E,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAEjE;AAED,wBAAgB,KAAK,IAAI,MAAM,CAM9B;AAED,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,YAAY,GAAG,IAAI,CAchG;AAED,KAAK,WAAW,GAAG;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,WAAW,CACzB,OAAO,GAAE,WAAgB,EACzB,GAAG,GAAE,MAAsB,GAC1B,YAAY,EAAE,CAoBhB;AAED,wBAAgB,YAAY,CAC1B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,aAAa,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAAO,EAC5D,GAAG,GAAE,MAAsB,GAC1B,MAAM,CAER;AAED;mDACmD;AACnD,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC,EACvD,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAuBT"}
|
package/dist/journal.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { randomBytes } from "node:crypto";
|
|
4
|
+
export function eyesRoot(cwd = process.cwd()) {
|
|
5
|
+
return resolve(cwd, ".gg/eyes");
|
|
6
|
+
}
|
|
7
|
+
export function manifestPath(cwd = process.cwd()) {
|
|
8
|
+
return resolve(eyesRoot(cwd), "manifest.json");
|
|
9
|
+
}
|
|
10
|
+
export function journalPath(cwd = process.cwd()) {
|
|
11
|
+
return resolve(eyesRoot(cwd), "journal.jsonl");
|
|
12
|
+
}
|
|
13
|
+
/** Single gate for every eyes-related runtime behavior. If this returns false,
|
|
14
|
+
* the project has not been set up with `/eyes` and all integrations no-op. */
|
|
15
|
+
export function isEyesActive(cwd = process.cwd()) {
|
|
16
|
+
return existsSync(manifestPath(cwd));
|
|
17
|
+
}
|
|
18
|
+
export function genId() {
|
|
19
|
+
const ts = new Date()
|
|
20
|
+
.toISOString()
|
|
21
|
+
.replace(/[-:.TZ]/g, "")
|
|
22
|
+
.slice(0, 15);
|
|
23
|
+
return `${ts}-${randomBytes(2).toString("hex")}`;
|
|
24
|
+
}
|
|
25
|
+
export function appendEntry(input, cwd = process.cwd()) {
|
|
26
|
+
if (!isEyesActive(cwd))
|
|
27
|
+
return null;
|
|
28
|
+
const entry = {
|
|
29
|
+
id: genId(),
|
|
30
|
+
ts: new Date().toISOString(),
|
|
31
|
+
kind: input.kind,
|
|
32
|
+
reason: input.reason,
|
|
33
|
+
status: input.status ?? "open",
|
|
34
|
+
...(input.probe ? { probe: input.probe } : {}),
|
|
35
|
+
};
|
|
36
|
+
const p = journalPath(cwd);
|
|
37
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
38
|
+
appendFileSync(p, JSON.stringify(entry) + "\n");
|
|
39
|
+
return entry;
|
|
40
|
+
}
|
|
41
|
+
export function readJournal(options = {}, cwd = process.cwd()) {
|
|
42
|
+
if (!isEyesActive(cwd))
|
|
43
|
+
return [];
|
|
44
|
+
const p = journalPath(cwd);
|
|
45
|
+
if (!existsSync(p))
|
|
46
|
+
return [];
|
|
47
|
+
const text = readFileSync(p, "utf8");
|
|
48
|
+
let entries = [];
|
|
49
|
+
for (const line of text.split("\n")) {
|
|
50
|
+
const trimmed = line.trim();
|
|
51
|
+
if (!trimmed)
|
|
52
|
+
continue;
|
|
53
|
+
try {
|
|
54
|
+
entries.push(JSON.parse(trimmed));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// skip malformed — logs are append-only, don't die on one bad line
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (options.status)
|
|
61
|
+
entries = entries.filter((e) => e.status === options.status);
|
|
62
|
+
if (options.kind)
|
|
63
|
+
entries = entries.filter((e) => e.kind === options.kind);
|
|
64
|
+
if (options.order === "desc")
|
|
65
|
+
entries.reverse();
|
|
66
|
+
if (typeof options.limit === "number")
|
|
67
|
+
entries = entries.slice(0, options.limit);
|
|
68
|
+
return entries;
|
|
69
|
+
}
|
|
70
|
+
export function journalCount(options = {}, cwd = process.cwd()) {
|
|
71
|
+
return readJournal(options, cwd).length;
|
|
72
|
+
}
|
|
73
|
+
/** Rewrite-based update. Journal is expected to stay small (tens to low
|
|
74
|
+
* hundreds of entries); a full rewrite is fine. */
|
|
75
|
+
export function updateEntry(id, patch, cwd = process.cwd()) {
|
|
76
|
+
if (!isEyesActive(cwd))
|
|
77
|
+
return false;
|
|
78
|
+
const p = journalPath(cwd);
|
|
79
|
+
if (!existsSync(p))
|
|
80
|
+
return false;
|
|
81
|
+
const lines = readFileSync(p, "utf8").split("\n");
|
|
82
|
+
let found = false;
|
|
83
|
+
const next = lines.map((line) => {
|
|
84
|
+
const trimmed = line.trim();
|
|
85
|
+
if (!trimmed)
|
|
86
|
+
return line;
|
|
87
|
+
try {
|
|
88
|
+
const entry = JSON.parse(trimmed);
|
|
89
|
+
if (entry.id === id) {
|
|
90
|
+
found = true;
|
|
91
|
+
return JSON.stringify({ ...entry, ...patch });
|
|
92
|
+
}
|
|
93
|
+
return line;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return line;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
if (!found)
|
|
100
|
+
return false;
|
|
101
|
+
writeFileSync(p, next.join("\n"));
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=journal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type ProbeStatus = "pending" | "built" | "verified" | "failed";
|
|
2
|
+
export type ProbeEntry = {
|
|
3
|
+
capability: string;
|
|
4
|
+
name: string;
|
|
5
|
+
impl: string;
|
|
6
|
+
script: string;
|
|
7
|
+
status: ProbeStatus;
|
|
8
|
+
error?: string;
|
|
9
|
+
};
|
|
10
|
+
export type Manifest = {
|
|
11
|
+
version: 1;
|
|
12
|
+
phase_completed?: "research" | "design" | "build" | "verify" | "document";
|
|
13
|
+
probes: ProbeEntry[];
|
|
14
|
+
};
|
|
15
|
+
export declare function readManifest(cwd?: string): Manifest;
|
|
16
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEtE,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,eAAe,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC1E,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB,CAAC;AAIF,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,QAAQ,CASlE"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { isEyesActive, manifestPath } from "./journal.js";
|
|
3
|
+
const EMPTY = { version: 1, probes: [] };
|
|
4
|
+
export function readManifest(cwd = process.cwd()) {
|
|
5
|
+
if (!isEyesActive(cwd))
|
|
6
|
+
return EMPTY;
|
|
7
|
+
const p = manifestPath(cwd);
|
|
8
|
+
if (!existsSync(p))
|
|
9
|
+
return EMPTY;
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(readFileSync(p, "utf8"));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return EMPTY;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAmB1D,MAAM,KAAK,GAAa,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEnD,MAAM,UAAU,YAAY,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAa,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kenkaiiii/ggcoder-eyes",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Project-agnostic perception probes for coding agents — screenshots, logs, APIs, capture sinks",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/kenkaiiii/gg-framework.git",
|
|
10
|
+
"directory": "packages/ggcoder-eyes"
|
|
11
|
+
},
|
|
12
|
+
"bin": {
|
|
13
|
+
"ggcoder-eyes": "./dist/cli.js"
|
|
14
|
+
},
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./cli": "./dist/cli.js",
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"main": "./dist/index.js",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"probes",
|
|
28
|
+
"shared"
|
|
29
|
+
],
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"typescript": "^5.9.3",
|
|
32
|
+
"@types/node": "^22.0.0"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc && chmod +x dist/cli.js || true",
|
|
39
|
+
"check": "tsc --noEmit"
|
|
40
|
+
}
|
|
41
|
+
}
|