opencode-gitloops 0.2.0 → 0.2.2
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/README.md +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -3
- package/dist/config.js.map +1 -1
- package/dist/eviction.d.ts.map +1 -1
- package/dist/eviction.js +24 -2
- package/dist/eviction.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -35
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +26 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +32 -0
- package/dist/logger.js.map +1 -0
- package/dist/repo-manager.d.ts.map +1 -1
- package/dist/repo-manager.js +31 -0
- package/dist/repo-manager.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +19 -0
- package/dist/tools.js.map +1 -1
- package/package.json +4 -3
- package/schema/config.schema.json +1 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Gitloops auto-creates a config file on first load at:
|
|
|
14
14
|
|
|
15
15
|
```json
|
|
16
16
|
{
|
|
17
|
-
"$schema": "https://raw.githubusercontent.com/
|
|
17
|
+
"$schema": "https://raw.githubusercontent.com/maharshi365/opencode-gitloops/master/schema/config.schema.json",
|
|
18
18
|
"max_repos": 10,
|
|
19
19
|
"cache_loc": "~/.cache/gitloops/repos",
|
|
20
20
|
"eviction_strategy": "lru"
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;AAEzD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,gBAAgB,CAAA;CACpC;AAiCD;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CA8CzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAyBzD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/config.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as fs from "fs/promises";
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import * as os from "os";
|
|
4
|
-
|
|
4
|
+
import { logger } from "./logger";
|
|
5
|
+
const SCHEMA_URL = "https://raw.githubusercontent.com/maharshi365/opencode-gitloops/master/schema/config.schema.json";
|
|
5
6
|
const CONFIG_PATH = path.join(os.homedir(), ".config", "opencode", "plugin", "gitloops.json");
|
|
6
7
|
const DEFAULT_CACHE_LOC = path.join(os.homedir(), ".cache", "gitloops", "repos");
|
|
7
8
|
const DEFAULTS = {
|
|
@@ -31,8 +32,19 @@ export async function getConfig() {
|
|
|
31
32
|
const contents = await fs.readFile(CONFIG_PATH, "utf8");
|
|
32
33
|
raw = JSON.parse(contents);
|
|
33
34
|
}
|
|
34
|
-
catch {
|
|
35
|
-
//
|
|
35
|
+
catch (err) {
|
|
36
|
+
// Distinguish between missing file and invalid JSON
|
|
37
|
+
if (err?.code === "ENOENT") {
|
|
38
|
+
await logger.debug("Config file not found, using defaults", {
|
|
39
|
+
path: CONFIG_PATH,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
await logger.warn("Config file has invalid JSON, falling back to defaults", {
|
|
44
|
+
path: CONFIG_PATH,
|
|
45
|
+
error: err?.message || String(err),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
36
48
|
}
|
|
37
49
|
const merged = {
|
|
38
50
|
max_repos: typeof raw.max_repos === "number" && raw.max_repos >= 1
|
|
@@ -47,6 +59,11 @@ export async function getConfig() {
|
|
|
47
59
|
: DEFAULTS.eviction_strategy,
|
|
48
60
|
};
|
|
49
61
|
_cached = merged;
|
|
62
|
+
await logger.info("Config loaded", {
|
|
63
|
+
max_repos: merged.max_repos,
|
|
64
|
+
cache_loc: merged.cache_loc,
|
|
65
|
+
eviction_strategy: merged.eviction_strategy,
|
|
66
|
+
});
|
|
50
67
|
return merged;
|
|
51
68
|
}
|
|
52
69
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/eviction.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eviction.d.ts","sourceRoot":"","sources":["../src/eviction.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"eviction.d.ts","sourceRoot":"","sources":["../src/eviction.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,UAAU,CAAA;AAyIhE;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiDnB"}
|
package/dist/eviction.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "fs/promises";
|
|
2
2
|
import * as path from "path";
|
|
3
|
+
import { logger } from "./logger";
|
|
3
4
|
/**
|
|
4
5
|
* Recursively compute the total size (in bytes) of a directory.
|
|
5
6
|
*/
|
|
@@ -129,9 +130,14 @@ async function sortByStrategy(repos, strategy) {
|
|
|
129
130
|
export async function evictIfNeeded(config, currentSlug) {
|
|
130
131
|
const allRepos = await gatherRepoStats(config.cache_loc);
|
|
131
132
|
if (allRepos.length <= config.max_repos) {
|
|
133
|
+
await logger.debug("Eviction check passed", {
|
|
134
|
+
cached: allRepos.length,
|
|
135
|
+
max: config.max_repos,
|
|
136
|
+
});
|
|
132
137
|
return [];
|
|
133
138
|
}
|
|
134
139
|
const evictCount = allRepos.length - config.max_repos;
|
|
140
|
+
await logger.info(`Eviction triggered: ${allRepos.length} cached repos exceeds limit of ${config.max_repos}`, { strategy: config.eviction_strategy, evictCount });
|
|
135
141
|
const sorted = await sortByStrategy(allRepos, config.eviction_strategy);
|
|
136
142
|
// Filter out the current repo from eviction candidates
|
|
137
143
|
const candidates = currentSlug
|
|
@@ -140,9 +146,25 @@ export async function evictIfNeeded(config, currentSlug) {
|
|
|
140
146
|
const evicted = [];
|
|
141
147
|
for (let i = 0; i < evictCount && i < candidates.length; i++) {
|
|
142
148
|
const repo = candidates[i];
|
|
143
|
-
|
|
144
|
-
|
|
149
|
+
try {
|
|
150
|
+
await removeRepo(repo.repoPath, config.cache_loc);
|
|
151
|
+
evicted.push(repo.slug);
|
|
152
|
+
await logger.info(`Evicted repo: ${repo.slug}`, {
|
|
153
|
+
strategy: config.eviction_strategy,
|
|
154
|
+
path: repo.repoPath,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
await logger.warn(`Failed to evict repo: ${repo.slug}`, {
|
|
159
|
+
path: repo.repoPath,
|
|
160
|
+
error: err?.message || String(err),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
145
163
|
}
|
|
164
|
+
await logger.info(`Eviction complete: removed ${evicted.length} repo(s)`, {
|
|
165
|
+
evicted,
|
|
166
|
+
remaining: allRepos.length - evicted.length,
|
|
167
|
+
});
|
|
146
168
|
return evicted;
|
|
147
169
|
}
|
|
148
170
|
//# sourceMappingURL=eviction.js.map
|
package/dist/eviction.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eviction.js","sourceRoot":"","sources":["../src/eviction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"eviction.js","sourceRoot":"","sources":["../src/eviction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAUjC;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,OAAe;IACvC,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAA;QACrC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAe,EAAE,CAAA;IAE5B,IAAI,MAAgB,CAAA;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC5C,IAAI,SAAS,CAAA;QACb,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YAAE,SAAQ;QAEtC,IAAI,SAAmB,CAAA;QACvB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;oBAAE,SAAQ;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAQ,CAAC,iBAAiB;YAC5B,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACpC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE;oBACxB,QAAQ;oBACR,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,IAAI,EAAE,CAAC,EAAE,yCAAyC;iBACnD,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,SAAQ;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,QAAgB;IAC1D,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvD,iCAAiC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,KAAiB,EACjB,QAA0B;IAE1B,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;IAEzB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,KAAK;YACR,gCAAgC;YAChC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YAC5D,MAAK;QAEP,KAAK,MAAM;YACT,6BAA6B;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;YACpE,MAAK;QAEP,KAAK,SAAS;YACZ,wCAAwC;YACxC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC7C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;YACtC,MAAK;IACT,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAsB,EACtB,WAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAExD,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;YAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,EAAE,MAAM,CAAC,SAAS;SACtB,CAAC,CAAA;QACF,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAA;IAErD,MAAM,MAAM,CAAC,IAAI,CACf,uBAAuB,QAAQ,CAAC,MAAM,kCAAkC,MAAM,CAAC,SAAS,EAAE,EAC1F,EAAE,QAAQ,EAAE,MAAM,CAAC,iBAAiB,EAAE,UAAU,EAAE,CACnD,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAEvE,uDAAuD;IACvD,MAAM,UAAU,GAAG,WAAW;QAC5B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;QAC9C,CAAC,CAAC,MAAM,CAAA;IAEV,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;YACjD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACvB,MAAM,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,EAAE,EAAE;gBAC9C,QAAQ,EAAE,MAAM,CAAC,iBAAiB;gBAClC,IAAI,EAAE,IAAI,CAAC,QAAQ;aACpB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,EAAE,EAAE;gBACtD,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;aACnC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,CAAC,IAAI,CAAC,8BAA8B,OAAO,CAAC,MAAM,UAAU,EAAE;QACxE,OAAO;QACP,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;KAC5C,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAmDjD,eAAO,MAAM,cAAc,EAAE,MA4E5B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { gitloops_clone, gitloops_refresh, gitloops_list } from "./tools";
|
|
2
2
|
import { ensureRepo } from "./repo-manager";
|
|
3
3
|
import { ensureConfigFile, getConfig, getConfigPath } from "./config";
|
|
4
|
+
import { initLogger, logger } from "./logger";
|
|
4
5
|
import * as fs from "fs/promises";
|
|
5
6
|
import * as path from "path";
|
|
6
7
|
import * as os from "os";
|
|
@@ -46,6 +47,9 @@ Repos are cached at: ${cacheLoc}/<owner>/<repo>/
|
|
|
46
47
|
`;
|
|
47
48
|
}
|
|
48
49
|
export const GitLoopsPlugin = async ({ client }) => {
|
|
50
|
+
// Initialize the logger so all modules can use it
|
|
51
|
+
initLogger(client);
|
|
52
|
+
await logger.info("Gitloops plugin initialized");
|
|
49
53
|
return {
|
|
50
54
|
// Write agent definition and ensure config on server connect (idempotent)
|
|
51
55
|
"server.connected": async () => {
|
|
@@ -53,23 +57,11 @@ export const GitLoopsPlugin = async ({ client }) => {
|
|
|
53
57
|
try {
|
|
54
58
|
const created = await ensureConfigFile();
|
|
55
59
|
if (created) {
|
|
56
|
-
await
|
|
57
|
-
body: {
|
|
58
|
-
service: "opencode-gitloops",
|
|
59
|
-
level: "info",
|
|
60
|
-
message: `Config created with defaults at ${getConfigPath()}`,
|
|
61
|
-
},
|
|
62
|
-
});
|
|
60
|
+
await logger.info(`Config created with defaults at ${getConfigPath()}`);
|
|
63
61
|
}
|
|
64
62
|
}
|
|
65
63
|
catch (err) {
|
|
66
|
-
await
|
|
67
|
-
body: {
|
|
68
|
-
service: "opencode-gitloops",
|
|
69
|
-
level: "warn",
|
|
70
|
-
message: `Failed to create config: ${err.message || err}`,
|
|
71
|
-
},
|
|
72
|
-
});
|
|
64
|
+
await logger.warn(`Failed to create config: ${err.message || err}`);
|
|
73
65
|
}
|
|
74
66
|
// Write agent definition to global config
|
|
75
67
|
try {
|
|
@@ -83,23 +75,11 @@ export const GitLoopsPlugin = async ({ client }) => {
|
|
|
83
75
|
.catch(() => null);
|
|
84
76
|
if (existing !== agentMD) {
|
|
85
77
|
await fs.writeFile(agentPath, agentMD, "utf8");
|
|
86
|
-
await
|
|
87
|
-
body: {
|
|
88
|
-
service: "opencode-gitloops",
|
|
89
|
-
level: "info",
|
|
90
|
-
message: `Agent definition written to ${agentPath}`,
|
|
91
|
-
},
|
|
92
|
-
});
|
|
78
|
+
await logger.info(`Agent definition written to ${agentPath}`);
|
|
93
79
|
}
|
|
94
80
|
}
|
|
95
81
|
catch (err) {
|
|
96
|
-
await
|
|
97
|
-
body: {
|
|
98
|
-
service: "opencode-gitloops",
|
|
99
|
-
level: "warn",
|
|
100
|
-
message: `Failed to write agent definition: ${err.message || err}`,
|
|
101
|
-
},
|
|
102
|
-
});
|
|
82
|
+
await logger.warn(`Failed to write agent definition: ${err.message || err}`);
|
|
103
83
|
}
|
|
104
84
|
},
|
|
105
85
|
// Auto-fetch: when a gitloops session is created, pre-warm clone if a slug
|
|
@@ -115,13 +95,7 @@ export const GitLoopsPlugin = async ({ client }) => {
|
|
|
115
95
|
const slugMatch = session.title?.match(/([a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+)/);
|
|
116
96
|
if (slugMatch) {
|
|
117
97
|
await ensureRepo(slugMatch[1]);
|
|
118
|
-
await
|
|
119
|
-
body: {
|
|
120
|
-
service: "opencode-gitloops",
|
|
121
|
-
level: "info",
|
|
122
|
-
message: `Pre-warmed repo: ${slugMatch[1]}`,
|
|
123
|
-
},
|
|
124
|
-
});
|
|
98
|
+
await logger.info(`Pre-warmed repo: ${slugMatch[1]}`);
|
|
125
99
|
}
|
|
126
100
|
}
|
|
127
101
|
catch {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACrE,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAExB,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAqCc,QAAQ;CAC9B,CAAA;AACD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAW,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACzD,OAAO;QACL,0EAA0E;QAC1E,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAC7B,mEAAmE;YACnE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAA;gBACxC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
interface LogClient {
|
|
3
|
+
app: {
|
|
4
|
+
log(opts: {
|
|
5
|
+
body: {
|
|
6
|
+
service: string;
|
|
7
|
+
level: LogLevel;
|
|
8
|
+
message: string;
|
|
9
|
+
extra?: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
}): Promise<unknown>;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the logger with the OpenCode plugin client.
|
|
16
|
+
* Call this once during plugin setup.
|
|
17
|
+
*/
|
|
18
|
+
export declare function initLogger(client: LogClient): void;
|
|
19
|
+
export declare const logger: {
|
|
20
|
+
debug: (message: string, extra?: Record<string, unknown>) => Promise<void>;
|
|
21
|
+
info: (message: string, extra?: Record<string, unknown>) => Promise<void>;
|
|
22
|
+
warn: (message: string, extra?: Record<string, unknown>) => Promise<void>;
|
|
23
|
+
error: (message: string, extra?: Record<string, unknown>) => Promise<void>;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAEnD,UAAU,SAAS;IACjB,GAAG,EAAE;QACH,GAAG,CAAC,IAAI,EAAE;YACR,IAAI,EAAE;gBACJ,OAAO,EAAE,MAAM,CAAA;gBACf,KAAK,EAAE,QAAQ,CAAA;gBACf,OAAO,EAAE,MAAM,CAAA;gBACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;aAChC,CAAA;SACF,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KACrB,CAAA;CACF;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAElD;AAqBD,eAAO,MAAM,MAAM;qBACA,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAExC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAEvC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBAEtC,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAEzD,CAAA"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const SERVICE = "opencode-gitloops";
|
|
2
|
+
let _client = null;
|
|
3
|
+
/**
|
|
4
|
+
* Initialize the logger with the OpenCode plugin client.
|
|
5
|
+
* Call this once during plugin setup.
|
|
6
|
+
*/
|
|
7
|
+
export function initLogger(client) {
|
|
8
|
+
_client = client;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Log a structured message via the OpenCode SDK.
|
|
12
|
+
* Silently no-ops if the logger hasn't been initialized yet.
|
|
13
|
+
*/
|
|
14
|
+
async function log(level, message, extra) {
|
|
15
|
+
if (!_client)
|
|
16
|
+
return;
|
|
17
|
+
try {
|
|
18
|
+
await _client.app.log({
|
|
19
|
+
body: { service: SERVICE, level, message, ...(extra ? { extra } : {}) },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Never let logging failures propagate
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export const logger = {
|
|
27
|
+
debug: (message, extra) => log("debug", message, extra),
|
|
28
|
+
info: (message, extra) => log("info", message, extra),
|
|
29
|
+
warn: (message, extra) => log("warn", message, extra),
|
|
30
|
+
error: (message, extra) => log("error", message, extra),
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,mBAAmB,CAAA;AAiBnC,IAAI,OAAO,GAAqB,IAAI,CAAA;AAEpC;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,OAAO,GAAG,MAAM,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,GAAG,CAChB,KAAe,EACf,OAAe,EACf,KAA+B;IAE/B,IAAI,CAAC,OAAO;QAAE,OAAM;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YACpB,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SACxE,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,KAA+B,EAAE,EAAE,CAC1D,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;IAC9B,IAAI,EAAE,CAAC,OAAe,EAAE,KAA+B,EAAE,EAAE,CACzD,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;IAC7B,IAAI,EAAE,CAAC,OAAe,EAAE,KAA+B,EAAE,EAAE,CACzD,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;IAC7B,KAAK,EAAE,CAAC,OAAe,EAAE,KAA+B,EAAE,EAAE,CAC1D,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;CAC/B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-manager.d.ts","sourceRoot":"","sources":["../src/repo-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repo-manager.d.ts","sourceRoot":"","sources":["../src/repo-manager.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA8CvD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhE;AA0BD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwFjE;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAgD7D"}
|
package/dist/repo-manager.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as fs from "fs/promises";
|
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
import { getConfig } from "./config";
|
|
5
5
|
import { evictIfNeeded } from "./eviction";
|
|
6
|
+
import { logger } from "./logger";
|
|
6
7
|
/**
|
|
7
8
|
* Parse a repo slug or URL into its components.
|
|
8
9
|
*
|
|
@@ -89,12 +90,21 @@ async function getLastCommit(repoPath) {
|
|
|
89
90
|
*/
|
|
90
91
|
export async function ensureRepo(input) {
|
|
91
92
|
const parsed = parseRepoSlug(input);
|
|
93
|
+
await logger.debug(`Parsed repo identifier: ${parsed.slug}`, {
|
|
94
|
+
input,
|
|
95
|
+
owner: parsed.owner,
|
|
96
|
+
repo: parsed.repo,
|
|
97
|
+
});
|
|
92
98
|
const config = await getConfig();
|
|
93
99
|
const localPath = path.join(config.cache_loc, parsed.owner, parsed.repo);
|
|
94
100
|
const fullClone = process.env.GITLOOPS_FULL_CLONE === "true";
|
|
95
101
|
const depthArgs = fullClone ? [] : ["--depth=1"];
|
|
96
102
|
if (await dirExists(path.join(localPath, ".git"))) {
|
|
97
103
|
// Repo already cloned — fetch latest
|
|
104
|
+
await logger.info(`Fetching updates for ${parsed.slug}`, {
|
|
105
|
+
path: localPath,
|
|
106
|
+
fullClone,
|
|
107
|
+
});
|
|
98
108
|
try {
|
|
99
109
|
if (fullClone) {
|
|
100
110
|
await $ `git -C ${localPath} fetch origin`.quiet();
|
|
@@ -103,24 +113,45 @@ export async function ensureRepo(input) {
|
|
|
103
113
|
await $ `git -C ${localPath} fetch --depth=1 origin`.quiet();
|
|
104
114
|
}
|
|
105
115
|
await $ `git -C ${localPath} reset --hard origin/HEAD`.quiet();
|
|
116
|
+
await logger.info(`Updated repo: ${parsed.slug}`);
|
|
106
117
|
}
|
|
107
118
|
catch (err) {
|
|
119
|
+
await logger.error(`Failed to fetch updates for ${parsed.slug}`, {
|
|
120
|
+
error: err?.message || String(err),
|
|
121
|
+
});
|
|
108
122
|
throw new Error(`Failed to fetch updates for ${parsed.slug}: ${err.message || err}`);
|
|
109
123
|
}
|
|
110
124
|
}
|
|
111
125
|
else {
|
|
112
126
|
// Fresh clone
|
|
127
|
+
await logger.info(`Cloning ${parsed.slug}`, {
|
|
128
|
+
url: parsed.cloneUrl,
|
|
129
|
+
path: localPath,
|
|
130
|
+
fullClone,
|
|
131
|
+
});
|
|
132
|
+
const startTime = Date.now();
|
|
113
133
|
await fs.mkdir(path.dirname(localPath), { recursive: true });
|
|
114
134
|
try {
|
|
115
135
|
await $ `git clone ${depthArgs} ${parsed.cloneUrl} ${localPath}`.quiet();
|
|
136
|
+
const duration = Date.now() - startTime;
|
|
137
|
+
await logger.info(`Cloned repo: ${parsed.slug} (${duration}ms)`, {
|
|
138
|
+
path: localPath,
|
|
139
|
+
durationMs: duration,
|
|
140
|
+
});
|
|
116
141
|
}
|
|
117
142
|
catch (err) {
|
|
118
143
|
// Clean up partial clone on failure
|
|
119
144
|
await fs.rm(localPath, { recursive: true, force: true }).catch(() => { });
|
|
120
145
|
if (String(err).includes("not found") ||
|
|
121
146
|
String(err).includes("Repository not found")) {
|
|
147
|
+
await logger.error(`Repository not found: ${parsed.slug}`, {
|
|
148
|
+
url: parsed.cloneUrl,
|
|
149
|
+
});
|
|
122
150
|
throw new Error(`Repository "${parsed.slug}" not found on GitHub. Only public repos are supported in v1.`);
|
|
123
151
|
}
|
|
152
|
+
await logger.error(`Failed to clone ${parsed.slug}`, {
|
|
153
|
+
error: err?.message || String(err),
|
|
154
|
+
});
|
|
124
155
|
throw new Error(`Failed to clone ${parsed.slug}: ${err.message || err}`);
|
|
125
156
|
}
|
|
126
157
|
// Evict old repos if we've exceeded the max
|
package/dist/repo-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-manager.js","sourceRoot":"","sources":["../src/repo-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"repo-manager.js","sourceRoot":"","sources":["../src/repo-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc;;;;;;;;;;CA0DzB,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;CA0B3B,CAAA;AAEF,eAAO,MAAM,aAAa;;;;CAqBxB,CAAA"}
|
package/dist/tools.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { tool } from "@opencode-ai/plugin";
|
|
2
2
|
import { ensureRepo, listCachedRepos } from "./repo-manager";
|
|
3
|
+
import { logger } from "./logger";
|
|
3
4
|
export const gitloops_clone = tool({
|
|
4
5
|
description: "Clone or ensure a GitHub repo is available locally for exploration. " +
|
|
5
6
|
"Returns the local filesystem path to use with read/grep/glob/list tools. " +
|
|
@@ -14,19 +15,30 @@ export const gitloops_clone = tool({
|
|
|
14
15
|
.describe("Branch to checkout after cloning (default: repo default branch)"),
|
|
15
16
|
},
|
|
16
17
|
async execute(args) {
|
|
18
|
+
await logger.info("Tool invoked: gitloops_clone", {
|
|
19
|
+
repo: args.repo,
|
|
20
|
+
branch: args.branch ?? null,
|
|
21
|
+
});
|
|
17
22
|
const info = await ensureRepo(args.repo);
|
|
18
23
|
// If a specific branch was requested, check it out
|
|
19
24
|
if (args.branch) {
|
|
25
|
+
await logger.info(`Checking out branch "${args.branch}" for ${info.slug}`);
|
|
20
26
|
const { $ } = await import("bun");
|
|
21
27
|
try {
|
|
22
28
|
await $ `git -C ${info.localPath} fetch origin ${args.branch}`.quiet();
|
|
23
29
|
await $ `git -C ${info.localPath} checkout ${args.branch}`.quiet();
|
|
24
30
|
await $ `git -C ${info.localPath} reset --hard origin/${args.branch}`.quiet();
|
|
31
|
+
await logger.info(`Checked out branch "${args.branch}" for ${info.slug}`);
|
|
25
32
|
}
|
|
26
33
|
catch (err) {
|
|
34
|
+
await logger.error(`Failed to checkout branch "${args.branch}" for ${info.slug}`, { error: err?.message || String(err) });
|
|
27
35
|
throw new Error(`Failed to checkout branch "${args.branch}" for ${info.slug}: ${err.message || err}`);
|
|
28
36
|
}
|
|
29
37
|
}
|
|
38
|
+
await logger.debug("gitloops_clone complete", {
|
|
39
|
+
slug: info.slug,
|
|
40
|
+
path: info.localPath,
|
|
41
|
+
});
|
|
30
42
|
return [
|
|
31
43
|
`Repository: ${info.slug}`,
|
|
32
44
|
`Local path: ${info.localPath}`,
|
|
@@ -46,7 +58,12 @@ export const gitloops_refresh = tool({
|
|
|
46
58
|
.describe("Repo identifier — e.g. 'facebook/react'"),
|
|
47
59
|
},
|
|
48
60
|
async execute(args) {
|
|
61
|
+
await logger.info("Tool invoked: gitloops_refresh", { repo: args.repo });
|
|
49
62
|
const info = await ensureRepo(args.repo);
|
|
63
|
+
await logger.debug("gitloops_refresh complete", {
|
|
64
|
+
slug: info.slug,
|
|
65
|
+
commit: info.lastCommit,
|
|
66
|
+
});
|
|
50
67
|
return [
|
|
51
68
|
`Refreshed: ${info.slug}`,
|
|
52
69
|
`Local path: ${info.localPath}`,
|
|
@@ -60,7 +77,9 @@ export const gitloops_list = tool({
|
|
|
60
77
|
"Shows slug, local path, and last modified time for each cached repo.",
|
|
61
78
|
args: {},
|
|
62
79
|
async execute() {
|
|
80
|
+
await logger.info("Tool invoked: gitloops_list");
|
|
63
81
|
const repos = await listCachedRepos();
|
|
82
|
+
await logger.debug("gitloops_list complete", { count: repos.length });
|
|
64
83
|
if (repos.length === 0) {
|
|
65
84
|
return "No repos cached. Use gitloops_clone to clone a repo first.";
|
|
66
85
|
}
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-gitloops",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "GitHub repo explorer agent and plugin for OpenCode. Clone and explore any public GitHub repo locally.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
],
|
|
26
26
|
"scripts": {
|
|
27
27
|
"build": "bun run tsc",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
28
29
|
"prepublishOnly": "bun run build"
|
|
29
30
|
},
|
|
30
31
|
"dependencies": {
|
|
@@ -37,9 +38,9 @@
|
|
|
37
38
|
"license": "MIT",
|
|
38
39
|
"repository": {
|
|
39
40
|
"type": "git",
|
|
40
|
-
"url": "https://github.com/
|
|
41
|
+
"url": "https://github.com/maharshi365/opencode-gitloops"
|
|
41
42
|
},
|
|
42
|
-
"author": "",
|
|
43
|
+
"author": "maharshi365",
|
|
43
44
|
"engines": {
|
|
44
45
|
"node": ">=18"
|
|
45
46
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://raw.githubusercontent.com/
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/maharshi365/opencode-gitloops/master/schema/config.schema.json",
|
|
4
4
|
"title": "Gitloops Configuration",
|
|
5
5
|
"description": "Configuration for the opencode-gitloops plugin.",
|
|
6
6
|
"type": "object",
|