@miniaxolotl/grove-claude-plugin 1.11.0 → 1.11.1
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/.claude-plugin/plugin.json +1 -1
- package/README.md +2 -0
- package/dist/bridge.js +63 -9
- package/dist/bridge.js.map +3 -3
- package/dist/cli.js +1724 -49
- package/dist/cli.js.map +4 -4
- package/dist/hook.js +27170 -27118
- package/dist/hook.js.map +4 -4
- package/package.json +1 -1
- package/skills/setup/SKILL.md +4 -0
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@ Install `grove@grove` from the `miniaxolotl/grove` marketplace, or use
|
|
|
4
4
|
`grove init --client claude --url https://YOUR-GROVE-API`. Includes the four memory
|
|
5
5
|
tools, setup/memory skills, optional SessionStart recall and complete prebuilt
|
|
6
6
|
executables. No lifecycle build or database installation is required.
|
|
7
|
+
The actual Claude host needs Node 22+ on PATH. Use `grove doctor --client claude`
|
|
8
|
+
for local checks, or add `--probe`; separately verify the running host's MCP status.
|
|
7
9
|
|
|
8
10
|
```text
|
|
9
11
|
/plugin install grove --marketplace miniaxolotl/grove
|
package/dist/bridge.js
CHANGED
|
@@ -36,7 +36,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
36
36
|
var define_GROVE_TELEMETRY_default;
|
|
37
37
|
var init_define_GROVE_TELEMETRY = __esm({
|
|
38
38
|
"<define:__GROVE_TELEMETRY__>"() {
|
|
39
|
-
define_GROVE_TELEMETRY_default = { enabled: true, revision: "
|
|
39
|
+
define_GROVE_TELEMETRY_default = { enabled: true, revision: "ad1b9fe27941b0dc370ee3a0c4742dd6215e9f41", version: "1.11.1", component: "cli", key: "phc_AqVrjhk7W2X2pFjyngY7uWxcSSRREfJhgr8mBmKbXYEh", cliDsn: "https://3f6d0711b5890dea4ce8e6ccf2a1a7fd@o4511632209346560.ingest.us.sentry.io/4512290791620608", apiDsn: "https://4524e8910e318110277babdfe818999b@o4511632209346560.ingest.us.sentry.io/4512290791489536" };
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
42
|
|
|
@@ -48447,7 +48447,23 @@ var ApiClient = class {
|
|
|
48447
48447
|
redirect: "error",
|
|
48448
48448
|
cache: "no-store"
|
|
48449
48449
|
});
|
|
48450
|
-
|
|
48450
|
+
let result;
|
|
48451
|
+
try {
|
|
48452
|
+
result = await response.json();
|
|
48453
|
+
} catch (error48) {
|
|
48454
|
+
if (signal.aborted || !(error48 instanceof SyntaxError)) throw error48;
|
|
48455
|
+
throw new GroveError(
|
|
48456
|
+
"invalid_response",
|
|
48457
|
+
"Invalid Grove API response",
|
|
48458
|
+
response.ok ? 502 : response.status
|
|
48459
|
+
);
|
|
48460
|
+
}
|
|
48461
|
+
if (!result || typeof result !== "object" || Array.isArray(result) || typeof result.success !== "boolean" || !result.success && (!result.error || typeof result.error.code !== "string" || typeof result.error.message !== "string"))
|
|
48462
|
+
throw new GroveError(
|
|
48463
|
+
"invalid_response",
|
|
48464
|
+
"Invalid Grove API response",
|
|
48465
|
+
response.ok ? 502 : response.status
|
|
48466
|
+
);
|
|
48451
48467
|
if (!response.ok || !result.success) {
|
|
48452
48468
|
const error48 = !result.success ? result.error : void 0;
|
|
48453
48469
|
throw new GroveError(
|
|
@@ -48465,6 +48481,7 @@ var ApiClient = class {
|
|
|
48465
48481
|
completed = true;
|
|
48466
48482
|
return result.data;
|
|
48467
48483
|
} catch (error48) {
|
|
48484
|
+
options.signal?.throwIfAborted();
|
|
48468
48485
|
if (error48 instanceof GroveError) throw error48;
|
|
48469
48486
|
throw new GroveError(
|
|
48470
48487
|
signal.aborted ? "timeout" : "unreachable",
|
|
@@ -48500,9 +48517,14 @@ async function atomicJson(path, value) {
|
|
|
48500
48517
|
}
|
|
48501
48518
|
async function readConfig() {
|
|
48502
48519
|
try {
|
|
48503
|
-
|
|
48520
|
+
const value = JSON.parse(
|
|
48504
48521
|
await readFile(join3(configDirectory(), "config.json"), "utf8")
|
|
48505
48522
|
);
|
|
48523
|
+
const record2 = (entry) => !!entry && typeof entry === "object" && !Array.isArray(entry);
|
|
48524
|
+
const strings = (entry) => record2(entry) && Object.values(entry).every((item) => typeof item === "string");
|
|
48525
|
+
if (!record2(value) || value.origin !== void 0 && typeof value.origin !== "string" || value.paused !== void 0 && typeof value.paused !== "boolean" || value.generation !== void 0 && (!Number.isSafeInteger(value.generation) || Number(value.generation) < 0) || value.origins !== void 0 && !strings(value.origins) || value.accounts !== void 0 && (!record2(value.accounts) || !Object.values(value.accounts).every(strings)))
|
|
48526
|
+
throw new Error("Invalid local configuration");
|
|
48527
|
+
return value;
|
|
48506
48528
|
} catch (error48) {
|
|
48507
48529
|
if (error48.code === "ENOENT") return {};
|
|
48508
48530
|
throw new GroveError(
|
|
@@ -48610,6 +48632,21 @@ function credentialPath(origin, agent, accountId) {
|
|
|
48610
48632
|
`credentials-${hash2(`${origin}|${agent}|${accountId}`)}.json`
|
|
48611
48633
|
);
|
|
48612
48634
|
}
|
|
48635
|
+
var credentialAuthSchema = external_exports.object({
|
|
48636
|
+
key: external_exports.string().trim().min(1).optional(),
|
|
48637
|
+
tokens: OAuthTokensSchema.extend({
|
|
48638
|
+
access_token: external_exports.string().trim().min(1),
|
|
48639
|
+
token_type: external_exports.string().trim().min(1),
|
|
48640
|
+
refresh_token: external_exports.string().trim().min(1).optional()
|
|
48641
|
+
}).optional(),
|
|
48642
|
+
expiresAt: external_exports.number().nonnegative().optional(),
|
|
48643
|
+
client: OAuthClientInformationSchema.extend({
|
|
48644
|
+
client_id: external_exports.string().trim().min(1)
|
|
48645
|
+
}).optional(),
|
|
48646
|
+
redirectUrl: external_exports.url().optional()
|
|
48647
|
+
}).refine(
|
|
48648
|
+
(value) => !!value.key || !!(value.tokens && value.client && value.redirectUrl)
|
|
48649
|
+
);
|
|
48613
48650
|
async function loadCredentials(origin, agent) {
|
|
48614
48651
|
const accountId = (await readConfig()).accounts?.[origin]?.[agent];
|
|
48615
48652
|
if (!accountId)
|
|
@@ -48618,20 +48655,37 @@ async function loadCredentials(origin, agent) {
|
|
|
48618
48655
|
`Run grove login --client ${agent} --url ${origin}`,
|
|
48619
48656
|
401
|
|
48620
48657
|
);
|
|
48658
|
+
let value;
|
|
48621
48659
|
try {
|
|
48622
|
-
|
|
48660
|
+
value = JSON.parse(
|
|
48623
48661
|
await readFile(credentialPath(origin, agent, accountId), "utf8")
|
|
48624
48662
|
);
|
|
48625
|
-
|
|
48626
|
-
|
|
48627
|
-
|
|
48628
|
-
|
|
48663
|
+
} catch (error48) {
|
|
48664
|
+
if (error48.code !== "ENOENT")
|
|
48665
|
+
throw new GroveError(
|
|
48666
|
+
"credential_store_unavailable",
|
|
48667
|
+
"Grove credentials could not be read. Check local store permissions and integrity; no credentials were changed.",
|
|
48668
|
+
503
|
|
48669
|
+
);
|
|
48629
48670
|
throw new GroveError(
|
|
48630
48671
|
"sign_in_required",
|
|
48631
|
-
"Grove credentials are missing
|
|
48672
|
+
"Grove credentials are missing; sign in again",
|
|
48632
48673
|
401
|
|
48633
48674
|
);
|
|
48634
48675
|
}
|
|
48676
|
+
if (!value || value.origin !== origin || value.agent !== agent || value.accountId !== accountId)
|
|
48677
|
+
throw new GroveError(
|
|
48678
|
+
"sign_in_required",
|
|
48679
|
+
"Grove credential identity does not match; sign in again",
|
|
48680
|
+
401
|
|
48681
|
+
);
|
|
48682
|
+
if (!credentialAuthSchema.safeParse(value).success)
|
|
48683
|
+
throw new GroveError(
|
|
48684
|
+
"credential_store_unavailable",
|
|
48685
|
+
"Grove credentials are incomplete or damaged. Check local store integrity; no credentials were changed.",
|
|
48686
|
+
503
|
|
48687
|
+
);
|
|
48688
|
+
return value;
|
|
48635
48689
|
}
|
|
48636
48690
|
var BrowserOAuthProvider = class {
|
|
48637
48691
|
constructor(data, redirect) {
|