@wernerbisschoff/pi-gatekeeper 0.1.1 → 0.1.3
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/dist/default-rules.json +2 -0
- package/dist/gatekeeper.d.ts +161 -30
- package/dist/gatekeeper.d.ts.map +1 -1
- package/dist/gatekeeper.js +597 -136
- package/dist/gatekeeper.js.map +1 -1
- package/package.json +14 -4
package/dist/default-rules.json
CHANGED
package/dist/gatekeeper.d.ts
CHANGED
|
@@ -51,6 +51,24 @@ export type PermissionDecision = {
|
|
|
51
51
|
decision: "allow" | "ask" | "deny";
|
|
52
52
|
reason: string;
|
|
53
53
|
};
|
|
54
|
+
/**
|
|
55
|
+
* Outcome of prompting for a compound (multi-segment) command. Maps each segment to its
|
|
56
|
+
* scoped decision and records whether the Allow All Once shortcut was triggered.
|
|
57
|
+
* Used as the return type of {@link promptForCompoundCommand} (FLOW-12 Step 3).
|
|
58
|
+
*
|
|
59
|
+
* Flow references:
|
|
60
|
+
* - FLOW-12 Step 3 ("CompoundDecision as return type of promptForCompoundCommand")
|
|
61
|
+
* - FLOW-08 Step 3 (scope-based persistence routing from scope field)
|
|
62
|
+
*/
|
|
63
|
+
export type CompoundDecision = {
|
|
64
|
+
segments: Array<{
|
|
65
|
+
segment: string;
|
|
66
|
+
decision: "allow" | "deny";
|
|
67
|
+
scope: "ephemeral" | "session" | "persist";
|
|
68
|
+
pattern?: string;
|
|
69
|
+
}>;
|
|
70
|
+
allowAllOnceUsed: boolean;
|
|
71
|
+
};
|
|
54
72
|
/** ─── Sensitive Path Guard (compile-time, not user-configurable) ─── */
|
|
55
73
|
/**
|
|
56
74
|
* Compile-time regex pattern + human-readable label for a sensitive path category.
|
|
@@ -235,17 +253,23 @@ export declare const PERMISSION_STATUS_KEY = "perm";
|
|
|
235
253
|
* TUI footer labels keyed by PermissionLevel. Specific emoji + label pairs are
|
|
236
254
|
* documented in AC-010-01 / AC-010-02
|
|
237
255
|
* (`specs/001-pi-gatekeeper/issues/001-foundation-packaging.md:33`):
|
|
238
|
-
* - `low` →
|
|
239
|
-
* - `medium` →
|
|
240
|
-
* - `high` →
|
|
256
|
+
* - `low` → `LOW` (restricted/safe)
|
|
257
|
+
* - `medium` → `MEDIUM` (balanced)
|
|
258
|
+
* - `high` → `HIGH` (permissive)
|
|
241
259
|
* The status key (`PERMISSION_STATUS_KEY`) is reserved by `architecture.md:157` — no other extension
|
|
242
260
|
* may write to it (otherwise the level indicator could be shadowed on the TUI footer).
|
|
243
261
|
*/
|
|
262
|
+
/**
|
|
263
|
+
* Plain-text level labels used by {@link updateStatus} to build the
|
|
264
|
+
* TUI footer indicator. The labels are intentionally simple — the
|
|
265
|
+
* `/perm` hint is appended at render time so the indicator is
|
|
266
|
+
* self-documenting without coloured circles.
|
|
267
|
+
*/
|
|
244
268
|
export declare const MODE_LABELS: Record<PermissionLevel, string>;
|
|
245
269
|
/**
|
|
246
270
|
* Render the active permission level into the TUI footer via `ctx.ui.setStatus(...)` using the
|
|
247
271
|
* reserved `PERMISSION_STATUS_KEY`. The custom footer extension (`footer.ts`) reads the
|
|
248
|
-
* `~/.pi/agent/perm-mode` file directly and overlays the
|
|
272
|
+
* `~/.pi/agent/perm-mode` file directly and overlays the level indicator in the
|
|
249
273
|
* bottom powerline bar — so the `setStatus` call here serves as the fallback for built-in
|
|
250
274
|
* footer mode and as a data source for any extension that reads status keys directly.
|
|
251
275
|
*
|
|
@@ -521,34 +545,80 @@ export declare function isEnvAssignment(segment: string): boolean;
|
|
|
521
545
|
*/
|
|
522
546
|
export declare function stripLeadingEnvAssignments(command: string): string;
|
|
523
547
|
/**
|
|
524
|
-
* Compute
|
|
525
|
-
*
|
|
526
|
-
*
|
|
527
|
-
*
|
|
528
|
-
*
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
*
|
|
532
|
-
*
|
|
533
|
-
*
|
|
534
|
-
* → `["npm install express", "npm install express && npm test", "npm test"]`
|
|
535
|
-
* - `getAllowListEntries("a && b && c")` → `["a", "a && b && c", "b", "c"]`
|
|
536
|
-
* - `getAllowListEntries("cat /tmp/output.txt")` → `["cat /tmp/output.txt"]`
|
|
537
|
-
* (bare path inside the segment survives; the bare path as a standalone entry is filtered)
|
|
538
|
-
* - `getAllowListEntries("echo hello")` → `["echo hello"]` (single segment, no dedup)
|
|
539
|
-
* - `getAllowListEntries("npm test && npm test")` → `["npm test", "npm test && npm test"]`
|
|
540
|
-
* (first-occurrence-wins dedup; duplicate segment removed, full compound preserved)
|
|
541
|
-
*
|
|
542
|
-
* Contract anchors:
|
|
543
|
-
* - `data-model.md:177-228` (FR-008: allowlist entry computation)
|
|
544
|
-
* - PRD AC-008-01 / AC-008-02 / AC-008-03 (`["npm install express", "npm install express && npm test", "npm test"]`)
|
|
545
|
-
* - `architecture.md:152-163` (prompt preview ordering)
|
|
546
|
-
*
|
|
547
|
-
* Pure data transformation — no I/O, no `ExtensionContext`, no `os.homedir()` access. The
|
|
548
|
-
* empty-input early-return keeps dedup logic clean and matches PRD's "empty command → empty array"
|
|
549
|
-
* exception strategy.
|
|
548
|
+
* Compute allowlist entries for a command — returns the FULL parsed segments
|
|
549
|
+
* (not command stems). These entries are used by:
|
|
550
|
+
* - `promptForPermission` for the "Will allow" preview (which further filters
|
|
551
|
+
* to show only the "ask" segments' command stems)
|
|
552
|
+
* - `appendStemsToAllowList` for persistence (each entry is already a command stem
|
|
553
|
+
* extracted by the caller — this function does NOT do the stem extraction)
|
|
554
|
+
* - "allow-session" and "allow-once" for session/ephemeral caching of the
|
|
555
|
+
* full resolved command
|
|
556
|
+
*
|
|
557
|
+
* Returns full segments so the caller can decide how to display/persist them.
|
|
550
558
|
*/
|
|
551
559
|
export declare function getAllowListEntries(command: string): string[];
|
|
560
|
+
/**
|
|
561
|
+
* Compute the list of positional wildcard candidates for a single shell segment. Used by
|
|
562
|
+
* FLOW-12's segment-by-segment prompt (TSK-009-04) to build `<candidate> * This Session` and
|
|
563
|
+
* `<candidate> * Always` options from the segment's executable token chain.
|
|
564
|
+
*
|
|
565
|
+
* Pipeline:
|
|
566
|
+
* 1. {@link stripLeadingEnvAssignments} — drop transient `VAR=val` prefixes so they do not
|
|
567
|
+
* leak into the candidate list.
|
|
568
|
+
* 2. {@link splitShellWords} — tokenize on whitespace, respecting single/double quotes so
|
|
569
|
+
* `"hello world"` is one token, not two.
|
|
570
|
+
* 3. {@link stripRedirectsFromTokens} — drop redirect operators (`>`, `>>`, `<`, `<<`,
|
|
571
|
+
* `2>`, `2>&1`, …) and their targets so `pnpm exec biome check test/ 2>&1` produces the
|
|
572
|
+
* same candidates as `pnpm exec biome check test/`.
|
|
573
|
+
* 4. Prefix-depth unfolding — emit one candidate per prefix depth `k`:
|
|
574
|
+
* `<tokens[0..k).join(" ") + " *">`. The wildcard is always on the LAST emitted token,
|
|
575
|
+
* never between tokens.
|
|
576
|
+
*
|
|
577
|
+
* Contract (pinned by `test/prompt.test.ts` FLOW-12 sub-describe):
|
|
578
|
+
* - `unfoldPositionalCandidates("pnpm exec biome check test/")` →
|
|
579
|
+
* `["pnpm *", "pnpm exec *", "pnpm exec biome *", "pnpm exec biome check *", "pnpm exec biome check test/ *"]`
|
|
580
|
+
* - `unfoldPositionalCandidates("pnpm exec biome check test/ 2>&1")` → identical to above
|
|
581
|
+
* (the `2>&1` redirect contributes nothing).
|
|
582
|
+
* - `unfoldPositionalCandidates("> /dev/null")` → `[]` (bare redirect consumes its target).
|
|
583
|
+
* - `unfoldPositionalCandidates("NODE_ENV=test pnpm test")` → `["pnpm *", "pnpm test *"]`
|
|
584
|
+
* (env-var prefix stripped, then unfolded).
|
|
585
|
+
* - `unfoldPositionalCandidates("head")` → `["head *"]` (single-word segment).
|
|
586
|
+
* - `unfoldPositionalCandidates("")` → `[]` (empty / whitespace-only inputs never throw).
|
|
587
|
+
*
|
|
588
|
+
* Pure function — no I/O, no side effects, no module-level state. O(n) over the segment's
|
|
589
|
+
* character count.
|
|
590
|
+
*
|
|
591
|
+
* Source anchor: AC-ADHOC-012-01 / AC-ADHOC-012-02 (positional wildcard unfolding).
|
|
592
|
+
*/
|
|
593
|
+
export declare function unfoldPositionalCandidates(segment: string): string[];
|
|
594
|
+
/**
|
|
595
|
+
* Validate that every `*` wildcard in `pattern` is preceded by either a whitespace character or
|
|
596
|
+
* the start of the pattern. Used by FLOW-12 as the write-time guard inside
|
|
597
|
+
* {@link appendStemsToAllowList} (defense-in-depth) and by the ingest-time check on any
|
|
598
|
+
* programmatically-built wildcard before it lands in `perm-rules.json`.
|
|
599
|
+
*
|
|
600
|
+
* Rule (Issue 009 Hard Inclusion #2, AC-ADHOC-012-04):
|
|
601
|
+
* - Every `*` in `pattern` MUST be at position 0 OR immediately preceded by whitespace
|
|
602
|
+
* (` `, `\t`, or `\n`).
|
|
603
|
+
* - Patterns without a `*` are vacuously valid.
|
|
604
|
+
*
|
|
605
|
+
* Why: a pattern like `git*` (no space before the wildcard) compiles to the regex
|
|
606
|
+
* `^git.*$`, which matches `gitlog`, `git-fetch`, and any other input that merely STARTS
|
|
607
|
+
* with `git`. The full-token-boundary rule prevents this class of accidental over-match
|
|
608
|
+
* — `git *` is the correct pattern for "git followed by anything" and matches only inputs
|
|
609
|
+
* where `git` is its own whitespace-delimited token.
|
|
610
|
+
*
|
|
611
|
+
* Pure predicate — single linear scan, O(n) over `pattern.length`. Sub-microsecond per call.
|
|
612
|
+
*
|
|
613
|
+
* Contract (pinned by `test/prompt.test.ts` FLOW-12 sub-describe):
|
|
614
|
+
* - `validateFullTokenBoundary("git *")` → `true`
|
|
615
|
+
* - `validateFullTokenBoundary("git*")` → `false`
|
|
616
|
+
* - `validateFullTokenBoundary("*")` → `true` (position 0)
|
|
617
|
+
* - `validateFullTokenBoundary("git diff *")` → `true`
|
|
618
|
+
* - `validateFullTokenBoundary("npm install express")` → `true` (no `*`, vacuously valid)
|
|
619
|
+
* - `validateFullTokenBoundary("")` → `true` (vacuously valid)
|
|
620
|
+
*/
|
|
621
|
+
export declare function validateFullTokenBoundary(pattern: string): boolean;
|
|
552
622
|
/**
|
|
553
623
|
* Add `command` to the in-memory ephemeral allow set so the next evaluation that matches the
|
|
554
624
|
* command returns `{ allow: true }` without consulting the classifier or showing a prompt. Consumed
|
|
@@ -578,6 +648,67 @@ export declare function sessionAllow(command: string): void;
|
|
|
578
648
|
* {@link setCurrentMode}.
|
|
579
649
|
*/
|
|
580
650
|
export declare function isSessionAllowed(command: string): boolean;
|
|
651
|
+
/**
|
|
652
|
+
* Set the Allow All Once flag. After this call, the next
|
|
653
|
+
* {@link consumeAllowAllOnce} returns `true` and clears the flag.
|
|
654
|
+
* Exported so the TSK-009-03 lifecycle tests can drive it directly
|
|
655
|
+
* without going through {@link promptForCompoundCommand}.
|
|
656
|
+
*/
|
|
657
|
+
export declare function setAllowAllOnce(): void;
|
|
658
|
+
/**
|
|
659
|
+
* Consume (read-and-clear) the Allow All Once flag. Returns `true`
|
|
660
|
+
* exactly once when the flag was set by a prior {@link setAllowAllOnce}
|
|
661
|
+
* call; subsequent calls return `false` until the flag is re-set.
|
|
662
|
+
* This one-shot semantics mirrors the existing {@link isEphemeralAllowed}
|
|
663
|
+
* pattern.
|
|
664
|
+
*/
|
|
665
|
+
export declare function consumeAllowAllOnce(): boolean;
|
|
666
|
+
/**
|
|
667
|
+
* Unconditionally clear the Allow All Once flag. Idempotent — calling
|
|
668
|
+
* when the flag is already `false` is a no-op. Primed as the test-teardown
|
|
669
|
+
* seam (per-test `beforeEach` in the FLOW-12 lifecycle describe); intended
|
|
670
|
+
* for cleanup after compound command execution resolves (FLOW-12 Step 8 —
|
|
671
|
+
* integration pending).
|
|
672
|
+
*/
|
|
673
|
+
export declare function resetAllowAllOnce(): void;
|
|
674
|
+
/**
|
|
675
|
+
* Persist command stems from "ask" segments to the current level's allow list.
|
|
676
|
+
* Each stem is written in two forms — bare (`"git diff"`) and wildcard (`"git diff *"`)
|
|
677
|
+
* — matching the default-rules convention without being overly broad (`"git *"`
|
|
678
|
+
* would allow all subcommands). Dedup via {@link appendUnique} so re-clicking
|
|
679
|
+
* "Allow Always" on the same compound does NOT duplicate entries.
|
|
680
|
+
*
|
|
681
|
+
* Defense-in-depth (Issue 009 §Hard Inclusion #2, AC-ADHOC-012-04): each candidate
|
|
682
|
+
* is filtered through {@link validateFullTokenBoundary}, silently dropping
|
|
683
|
+
* glued-wildcard forms (`"git*"`) so future programmatic callers (FLOW-12's
|
|
684
|
+
* `promptForCompoundCommand`) cannot seed `perm-rules.json` with an over-broad
|
|
685
|
+
* pattern that would match `gitlog` / `git-fetch`. Empty input is a no-op (no write).
|
|
686
|
+
*/
|
|
687
|
+
export declare function appendStemsToAllowList(stems: readonly string[], ctx: ExtensionContext): void;
|
|
688
|
+
/**
|
|
689
|
+
* Segment-by-segment interactive prompt for compound commands (FLOW-12).
|
|
690
|
+
*
|
|
691
|
+
* For each "ask" segment, computes positional wildcard candidates via
|
|
692
|
+
* {@link unfoldPositionalCandidates}, presents them in a `ctx.ui.select()`
|
|
693
|
+
* dialog with Allow All Once / This Session / Always / Deny options, and
|
|
694
|
+
* returns a {@link CompoundDecision} mapping each segment to its scoped result.
|
|
695
|
+
*
|
|
696
|
+
* The Allow All Once option short-circuits remaining segments without prompting
|
|
697
|
+
* and sets the Allow All Once flag so {@link runPermissionGate} can skip
|
|
698
|
+
* re-prompting for subsequent segments of the same compound execution.
|
|
699
|
+
*
|
|
700
|
+
* Headless short-circuit (FLOW-11): when `ctx.hasUI === false`, returns an empty
|
|
701
|
+
* `CompoundDecision` immediately without calling `ctx.ui.select` — the caller
|
|
702
|
+
* should treat this as a deny per the existing headless auto-deny contract.
|
|
703
|
+
* Similarly, when `ctx.ui.select` is not a function (UI is absent at runtime),
|
|
704
|
+
* returns an empty result conservatively.
|
|
705
|
+
*
|
|
706
|
+
* Flow references:
|
|
707
|
+
* - FLOW-12 Step 3 ("segment-by-segment prompt loop")
|
|
708
|
+
* - FLOW-12 Step 8 ("Allow All Once flag lifecycle")
|
|
709
|
+
* - FLOW-08 Step 3 ("scope-based persistence routing")
|
|
710
|
+
*/
|
|
711
|
+
export declare function promptForCompoundCommand(segments: string[], ctx: ExtensionContext): Promise<CompoundDecision>;
|
|
581
712
|
/**
|
|
582
713
|
* Four-branch permission gate — the user-visible keystone for FLOW-07 (interactive prompt),
|
|
583
714
|
* FLOW-08 (scope: ephemeral / persist-allow / persist-deny), and FLOW-11 (headless auto-deny).
|
package/dist/gatekeeper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gatekeeper.d.ts","sourceRoot":"","sources":["../src/gatekeeper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,OAAO,KAAK,EAGV,YAAY,EACZ,gBAAgB,EAGjB,MAAM,iCAAiC,CAAC;AAKzC,mEAAmE;AAEnE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxD;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,KAAK,EAAE;QACL,GAAG,EAAE,UAAU,CAAC;QAChB,MAAM,EAAE,UAAU,CAAC;QACnB,IAAI,EAAE,UAAU,CAAC;KAClB,CAAC;CACH;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,yEAAyE;AAEzE;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;CACpC;AAED;;;;;;GAMG;AACH,QAAA,MAAM,MAAM;;;;;;;;;;;;;CAaF,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAEtE;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EA6BnD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAgC,CAAC;AAEpE;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,kBAAkB,GAAG,EAAE,CAAA;CAAE,CAOhG;AA4KD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,EACxB,GAAG,CAAC,EAAE,gBAAgB,GACrB,IAAI,CAON;AAED,yDAAyD;AAEzD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CASlD;AAiDD;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,eAAe,CAEhD;AAkED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,eAAe,CA+BnF;AAsCD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,eAAe,CAEhD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAI3D;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAE5C;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAIvD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"gatekeeper.d.ts","sourceRoot":"","sources":["../src/gatekeeper.ts"],"names":[],"mappings":"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"}
|