@gotgenes/pi-permission-system 33.0.2 → 33.0.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/CHANGELOG.md CHANGED
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [33.0.3](https://github.com/gotgenes/pi-packages/compare/pi-permission-system-v33.0.2...pi-permission-system-v33.0.3) (2026-09-19)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **pi-permission-system:** project the operands of a command hosted in a quoted argument ([3da8a63](https://github.com/gotgenes/pi-packages/commit/3da8a63b0f4f4f234c1dfdf2196a83f4f62940e8)), closes [#945](https://github.com/gotgenes/pi-packages/issues/945)
14
+ * **pi-permission-system:** project the operands of a command hosted in a generic command's quoted argument ([9eeece0](https://github.com/gotgenes/pi-packages/commit/9eeece05789fab4fe44b71f98cd3179e838a5def)), closes [#945](https://github.com/gotgenes/pi-packages/issues/945)
15
+
16
+ ### Documentation
17
+
18
+ * **pi-permission-system:** record the widened hosted-argument projection ([c9b277a](https://github.com/gotgenes/pi-packages/commit/c9b277a495dad8fde7fe4d18536aae9ee384fee3)), closes [#945](https://github.com/gotgenes/pi-packages/issues/945)
19
+
8
20
  ## [33.0.2](https://github.com/gotgenes/pi-packages/compare/pi-permission-system-v33.0.1...pi-permission-system-v33.0.2) (2026-09-19)
9
21
 
10
22
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gotgenes/pi-permission-system",
3
- "version": "33.0.2",
3
+ "version": "33.0.3",
4
4
  "description": "Permission enforcement extension for the Pi coding agent.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -129,7 +129,9 @@ export function collectRedirectTokens(node: TSNode): PathToken[] {
129
129
  * execution contexts, reading none of the host subtree's own text.
130
130
  *
131
131
  * This is what lets a heredoc body contribute its substitution's operands while
132
- * its prose stays out of the path surface entirely.
132
+ * its prose stays out of the path surface entirely, and an argument node
133
+ * contribute its quoted substitution's operands while its own text is judged
134
+ * by whatever role its walker gave it (#945).
133
135
  *
134
136
  * `node` may be a context outright (`> $(cmd)`) or merely contain one
135
137
  * (`> ${DIR}/$(cmd)`), so the traversal is the root-inclusive
@@ -617,6 +619,15 @@ function collectPatternCommandTokens(
617
619
  const isArgNode = ARG_NODE_TYPES.has(child.type);
618
620
  const text = resolveNodeText(child);
619
621
 
622
+ // An argument is read for its text below, and its text alone — but a
623
+ // quoted substitution sitting there really runs, and its own operands are
624
+ // candidates wherever it sits (ADR 0009's positional invariance). The
625
+ // unquoted spelling reaches the nested command through the `!isArgNode`
626
+ // recursions below; the quoted one parses as a `string` and would
627
+ // otherwise stop here, whichever role the argument turns out to have
628
+ // (#945).
629
+ if (isArgNode) tokens.push(...collectHostedExecutionTokens(child));
630
+
620
631
  // Handle the argument a previous flag consumed. The consumption discharges
621
632
  // on whatever node type follows, not only on an ARG_NODE_TYPES one: a bare
622
633
  // number (`-A 3`), an expansion (`-A $N`), and a substitution
@@ -772,6 +783,13 @@ function collectGenericCommandTokens(
772
783
  continue;
773
784
  }
774
785
 
786
+ // Read for its text below — but a quoted substitution among these
787
+ // arguments really runs, and its own operands are candidates wherever it
788
+ // sits (ADR 0009's positional invariance, #945). The unquoted spelling
789
+ // reaches the nested command through the trailing recursion.
790
+ if (ARG_NODE_TYPES.has(child.type))
791
+ tokens.push(...collectHostedExecutionTokens(child));
792
+
775
793
  // If there was no explicit command_name node, the first word-like
776
794
  // child is the command name itself — skip it.
777
795
  if (!seenCommandName && ARG_NODE_TYPES.has(child.type)) {