@hivecommons/promptargs 0.6.0 → 0.7.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/README.md +46 -6
- package/dist/autodetect.d.ts +2 -0
- package/dist/autodetect.js +53 -3
- package/dist/autodetect.js.map +1 -1
- package/dist/autodetect.test.d.ts +1 -0
- package/dist/autodetect.test.js +207 -0
- package/dist/autodetect.test.js.map +1 -0
- package/dist/cli.js +13 -8
- package/dist/cli.js.map +1 -1
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +310 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +59 -0
- package/dist/index.test.js.map +1 -0
- package/dist/iterate.d.ts +8 -0
- package/dist/iterate.js +28 -0
- package/dist/iterate.js.map +1 -0
- package/dist/iterate.test.d.ts +1 -0
- package/dist/iterate.test.js +20 -0
- package/dist/iterate.test.js.map +1 -0
- package/dist/loader.test.d.ts +1 -0
- package/dist/loader.test.js +65 -0
- package/dist/loader.test.js.map +1 -0
- package/dist/mustache.mjs +764 -0
- package/dist/parser.d.ts +1 -0
- package/dist/parser.js +16 -4
- package/dist/parser.js.map +1 -1
- package/dist/parser.test.js +37 -0
- package/dist/parser.test.js.map +1 -1
- package/dist/resolver.js +58 -44
- package/dist/resolver.js.map +1 -1
- package/dist/resolver.test.d.ts +1 -0
- package/dist/resolver.test.js +184 -0
- package/dist/resolver.test.js.map +1 -0
- package/dist/sanitize.d.ts +10 -0
- package/dist/sanitize.js +21 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/sanitize.test.d.ts +1 -0
- package/dist/sanitize.test.js +38 -0
- package/dist/sanitize.test.js.map +1 -0
- package/dist/status.js +4 -1
- package/dist/status.js.map +1 -1
- package/dist/status.test.d.ts +1 -0
- package/dist/status.test.js +33 -0
- package/dist/status.test.js.map +1 -0
- package/dist/ui-bootstrap.test.d.ts +1 -0
- package/dist/ui-bootstrap.test.js +479 -0
- package/dist/ui-bootstrap.test.js.map +1 -0
- package/dist/ui-builder.test.d.ts +1 -0
- package/dist/ui-builder.test.js +272 -0
- package/dist/ui-builder.test.js.map +1 -0
- package/dist/ui-command-quoting.test.d.ts +1 -0
- package/dist/ui-command-quoting.test.js +95 -0
- package/dist/ui-command-quoting.test.js.map +1 -0
- package/dist/ui-harness.d.ts +20 -0
- package/dist/ui-harness.js +40 -0
- package/dist/ui-harness.js.map +1 -0
- package/dist/ui-harness.test.d.ts +1 -0
- package/dist/ui-harness.test.js +30 -0
- package/dist/ui-harness.test.js.map +1 -0
- package/dist/ui-inline.test.d.ts +1 -0
- package/dist/ui-inline.test.js +90 -0
- package/dist/ui-inline.test.js.map +1 -0
- package/dist/ui-interactions.test.d.ts +1 -0
- package/dist/ui-interactions.test.js +489 -0
- package/dist/ui-interactions.test.js.map +1 -0
- package/dist/ui.d.ts +13 -1
- package/dist/ui.html +30 -57
- package/dist/ui.js +61 -18
- package/dist/ui.js.map +1 -1
- package/dist/ui.test.d.ts +1 -0
- package/dist/ui.test.js +283 -0
- package/dist/ui.test.js.map +1 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/assets/promptargs-logo.svg" alt="Promptargs" width="120" height="120">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
1
5
|
# promptargs 🏴☠️
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
Template arguments for AI prompts.
|
|
4
10
|
|
|
5
11
|
You write a prompt with blanks (`{{like_this}}`), and promptargs fills them in.
|
|
6
12
|
|
|
@@ -116,7 +122,11 @@ A blank looks like this: `{{name}}`
|
|
|
116
122
|
|
|
117
123
|
A blank with a default looks like this: `{{name=hello}}` (promptargs extension)
|
|
118
124
|
|
|
119
|
-
|
|
125
|
+
Padding inside the braces is fine too — `{{ name }}` and `{{ name=hello }}` mean the same thing.
|
|
126
|
+
|
|
127
|
+
That's the basics. Mustache comments (`{{! ignore me}}`) work as documented and are safe to use.
|
|
128
|
+
|
|
129
|
+
Mustache **sections** (`{{#flag}}...{{/flag}}`) and **partials** (`{{>name}}`) are parsed too, but aren't practically usable yet: promptargs only resolves plain `{{name}}` / `{{name=default}}` tags from `--flag=value`, auto-detected context, defaults, or interactive fill — a section's condition name is never filled this way (so its content is always dropped, or always kept for an inverted `{{^name}}` section), and partial content is never supplied, so `{{>name}}` always expands to nothing. Stick to plain blanks and comments; avoid sections and partials for now.
|
|
120
130
|
|
|
121
131
|
### Red means "you need to fill this in"
|
|
122
132
|
|
|
@@ -235,6 +245,12 @@ promptargs "Review {{file}} for {{focus}}" \
|
|
|
235
245
|
|
|
236
246
|
3 files × 3 focuses = 9 runs. Use `--cross` when you want the full matrix.
|
|
237
247
|
|
|
248
|
+
By default, array iterations run one at a time and print as they finish. Add `--parallel` to run every iteration at once and print all results together:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
promptargs review --file=api.go,auth.go,db.go --parallel
|
|
252
|
+
```
|
|
253
|
+
|
|
238
254
|
---
|
|
239
255
|
|
|
240
256
|
## Where Templates Live
|
|
@@ -252,6 +268,12 @@ Project templates override personal ones with the same name.
|
|
|
252
268
|
|
|
253
269
|
promptargs discovers variables from two sources:
|
|
254
270
|
|
|
271
|
+
Run `promptargs env` any time to preview exactly what's auto-detected in your current shell before you run a template:
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
promptargs env
|
|
275
|
+
```
|
|
276
|
+
|
|
255
277
|
### 1. Git context (always detected)
|
|
256
278
|
|
|
257
279
|
These variable names fill themselves automatically when you're in a git repo:
|
|
@@ -277,16 +299,20 @@ promptargs "Connect to {{DATABASE_URL}} in {{AWS_REGION}}"
|
|
|
277
299
|
|
|
278
300
|
In the **Builder UI** (`promptargs ui`), click "Show terminal env" to see all available env vars from your shell. Click any one to insert it at the cursor.
|
|
279
301
|
|
|
280
|
-
Common useful env vars: `NODE_ENV`, `AWS_REGION`, `
|
|
302
|
+
Common useful env vars: `NODE_ENV`, `AWS_REGION`, `CI`, `USER`, `EDITOR`, `PATH`, `SHELL`.
|
|
303
|
+
|
|
304
|
+
Credential-looking names are intentionally **excluded** from auto-detection: anything containing `TOKEN`, `SECRET`, `PASSWORD`/`PASSWD`/`PASSPHRASE`, `CREDENTIAL`, `API_KEY`/`ACCESS_KEY`/`PRIVATE_KEY`, `BEARER`, `COOKIE`, `WEBHOOK`, `JWT`, `HMAC`, `OAUTH`, `CONNECTION_STRING`, or the `_`-delimited words `AUTH`, `KEY`/`KEYS`, `PWD`, `PAT`, `PASS`, `DSN` (so `GITHUB_TOKEN`, `SIGNING_KEY`, `MYSQL_PWD`, `GITHUB_PAT` and `SLACK_WEBHOOK_URL` are all refused, while `PATH`, `PWD`, `KEYBOARD` and `AUTHOR` still work). Credential-**shaped** values are excluded whatever the name: URLs with a password in them (`postgres://user:pass@host/db`), PEM blocks, JWTs, and well-known token prefixes (`ghp_`, `github_pat_`, `glpat-`, `sk-`, `xoxb-`, `AKIA…`, `npm_…`, …). A repo-controlled template can therefore never expand `{{GITHUB_TOKEN}}` or `{{DATABASE_URL}}` into a secret, even though an explicit `--flag=value` can still pass any value you choose. This also applies to the Builder UI's "Show terminal env" list.
|
|
281
305
|
|
|
282
306
|
### Priority
|
|
283
307
|
|
|
284
308
|
You can always override any auto-detected value with a flag. The order is:
|
|
285
309
|
|
|
286
310
|
1. `--flag=value` (explicit, always wins)
|
|
287
|
-
2.
|
|
288
|
-
3.
|
|
289
|
-
4.
|
|
311
|
+
2. Auto-detect from environment (git context and terminal env vars)
|
|
312
|
+
3. Template default (`{{name=fallback}}`)
|
|
313
|
+
4. Interactive prompt — only for variables still unfilled, and only without `--no-interactive`
|
|
314
|
+
|
|
315
|
+
A variable that auto-detects or has a default is never prompted for; pass `--name=value` to override it.
|
|
290
316
|
|
|
291
317
|
---
|
|
292
318
|
|
|
@@ -343,6 +369,16 @@ promptargs ui --port=4000
|
|
|
343
369
|
|
|
344
370
|
---
|
|
345
371
|
|
|
372
|
+
## Privacy & Diagnostics
|
|
373
|
+
|
|
374
|
+
promptargs does not collect or export telemetry. There is no telemetry SDK, metrics endpoint, or observability backend configured anywhere in this package — nothing you run ever phones home.
|
|
375
|
+
|
|
376
|
+
All runtime diagnostics are human-readable console output (CLI status/errors, UI startup/port messages). The **Builder UI** (`promptargs ui`) binds to loopback only (`127.0.0.1`) and rejects requests with a non-local `Host` header, so the page — including the auto-detected Git and terminal environment values it embeds (see [Auto-Magic Variables](#auto-magic-variables-)) — is never reachable from other machines on your network.
|
|
377
|
+
|
|
378
|
+
If observability is ever added in the future, it will be explicit opt-in, bounded to local diagnostics, and will exclude environment values, template/prompt content, file paths, diffs, and user identifiers. No network exporter will be added unless you explicitly configure a backend yourself.
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
346
382
|
## Write Your Own Template
|
|
347
383
|
|
|
348
384
|
Create a file in `.prompts/` with any name ending in `.md`:
|
|
@@ -409,8 +445,10 @@ If you installed the skill (see [Install](#as-a-skill)), use it directly inside
|
|
|
409
445
|
| `promptargs review --file=x` | Run template with flags |
|
|
410
446
|
| `promptargs review` | Run template interactively |
|
|
411
447
|
| `promptargs "inline {{var}}"` | Use inline template |
|
|
448
|
+
| `promptargs env` | Show auto-detected variable values |
|
|
412
449
|
| `--no-interactive` | Skip questions, use defaults only |
|
|
413
450
|
| `--cross` | Cross-product mode (all combinations) |
|
|
451
|
+
| `--parallel` | Run array iterations in parallel |
|
|
414
452
|
| `--json` | Output as JSON |
|
|
415
453
|
| `--status` | Output status line only |
|
|
416
454
|
| `... \| claude -p "do this"` | Pipe to Claude |
|
|
@@ -421,3 +459,5 @@ If you installed the skill (see [Install](#as-a-skill)), use it directly inside
|
|
|
421
459
|
## License
|
|
422
460
|
|
|
423
461
|
Apache-2.0
|
|
462
|
+
|
|
463
|
+
Pirate flag icon: [Twemoji](https://twemoji.twitter.com/), [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/).
|
package/dist/autodetect.d.ts
CHANGED
|
@@ -2,5 +2,7 @@
|
|
|
2
2
|
* Auto-detect variable values from the current environment.
|
|
3
3
|
*/
|
|
4
4
|
export declare const AUTODETECT_VARS: string[];
|
|
5
|
+
export declare function isSensitiveEnvName(name: string): boolean;
|
|
6
|
+
export declare function isSensitiveEnvValue(value: string): boolean;
|
|
5
7
|
export declare function autodetect(varName: string): string | undefined;
|
|
6
8
|
export declare function autodetectAll(varNames: string[]): Record<string, string>;
|
package/dist/autodetect.js
CHANGED
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
import { execSync } from 'node:child_process';
|
|
5
5
|
function git(cmd) {
|
|
6
6
|
try {
|
|
7
|
-
|
|
7
|
+
const out = execSync(`git ${cmd}`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
8
|
+
// Success with empty output (detached HEAD for `branch --show-current`,
|
|
9
|
+
// clean tree for `diff`) is "nothing detected", not an empty value —
|
|
10
|
+
// otherwise it would override the template default and skip the prompt.
|
|
11
|
+
return out || undefined;
|
|
8
12
|
}
|
|
9
13
|
catch {
|
|
10
14
|
return undefined;
|
|
@@ -43,12 +47,58 @@ const DETECTORS = {
|
|
|
43
47
|
date: () => new Date().toISOString().split('T')[0],
|
|
44
48
|
};
|
|
45
49
|
export const AUTODETECT_VARS = Object.keys(DETECTORS);
|
|
50
|
+
// Env var names that look like credentials. The implicit process.env fallback
|
|
51
|
+
// must never expand these into prompt output (templates are repo-controlled),
|
|
52
|
+
// and the builder UI must never embed them in the served page.
|
|
53
|
+
//
|
|
54
|
+
// Word-bounded alternatives use (^|_)…(_|$) so PATH, KEYBOARD, PWD (the shell
|
|
55
|
+
// cwd) and AUTHOR stay detectable while GITHUB_PAT, SIGNING_KEY, MYSQL_PWD and
|
|
56
|
+
// AUTH_HEADER do not.
|
|
57
|
+
const SENSITIVE_ENV_PATTERN = new RegExp([
|
|
58
|
+
'TOKEN', 'SECRET', 'PASSWORD', 'PASSWD', 'PASSPHRASE', 'CREDENTIAL',
|
|
59
|
+
'API_?KEY', 'ACCESS_KEY', 'PRIVATE_KEY', 'BEARER', 'COOKIE', 'WEBHOOK',
|
|
60
|
+
'JWT', 'HMAC', 'OAUTH', 'CONN(?:ECTION)?_?STR(?:ING)?',
|
|
61
|
+
'(?:^|_)AUTH(?:_|$)', '(?:^|_)KEYS?(?:_|$)', '_PWD(?:_|$)',
|
|
62
|
+
'(?:^|_)PAT(?:_|$)', '(?:^|_)PASS(?:_|$)', '(?:^|_)DSN(?:_|$)',
|
|
63
|
+
].join('|'), 'i');
|
|
64
|
+
export function isSensitiveEnvName(name) {
|
|
65
|
+
return SENSITIVE_ENV_PATTERN.test(name);
|
|
66
|
+
}
|
|
67
|
+
// Values that are credentials regardless of what the variable is called:
|
|
68
|
+
// a URL carrying a password in its userinfo (DATABASE_URL, REDIS_URL,
|
|
69
|
+
// MONGO_URI, SENTRY_DSN), PEM blocks, JWTs, and the fixed prefixes vendors
|
|
70
|
+
// stamp on their tokens so scanners can recognise them.
|
|
71
|
+
const SENSITIVE_ENV_VALUE_PATTERN = new RegExp([
|
|
72
|
+
'^[a-z][a-z0-9+.-]*://[^/\\s:@]*:[^/\\s@]+@',
|
|
73
|
+
'-----BEGIN ',
|
|
74
|
+
'^eyJ[\\w-]+\\.eyJ[\\w-]+\\.',
|
|
75
|
+
'^(?:gh[pousr]_|github_pat_)[A-Za-z0-9_]{20,}',
|
|
76
|
+
'^glpat-[\\w-]{20,}',
|
|
77
|
+
'^sk-[A-Za-z0-9_-]{20,}',
|
|
78
|
+
'^sk_(?:live|test)_[A-Za-z0-9]{10,}',
|
|
79
|
+
'^xox[abprs]-[\\w-]{10,}',
|
|
80
|
+
'^AKIA[0-9A-Z]{16}$',
|
|
81
|
+
'^AIza[\\w-]{35}$',
|
|
82
|
+
'^npm_[A-Za-z0-9]{36}$',
|
|
83
|
+
'^hvs\\.[\\w-]{20,}',
|
|
84
|
+
].join('|'), 'i');
|
|
85
|
+
export function isSensitiveEnvValue(value) {
|
|
86
|
+
return SENSITIVE_ENV_VALUE_PATTERN.test(value);
|
|
87
|
+
}
|
|
46
88
|
export function autodetect(varName) {
|
|
47
89
|
const detector = DETECTORS[varName];
|
|
48
90
|
if (detector)
|
|
49
91
|
return detector();
|
|
50
|
-
// Fall back to terminal environment variables
|
|
51
|
-
|
|
92
|
+
// Fall back to terminal environment variables — but never implicitly expand
|
|
93
|
+
// credential-looking names ({{GITHUB_TOKEN}} in a repo template must not
|
|
94
|
+
// exfiltrate secrets into the generated prompt) or credential-shaped values
|
|
95
|
+
// under innocuous names ({{DATABASE_URL}}). Explicit --flags still work.
|
|
96
|
+
if (isSensitiveEnvName(varName))
|
|
97
|
+
return undefined;
|
|
98
|
+
const value = process.env[varName];
|
|
99
|
+
if (value === undefined || isSensitiveEnvValue(value))
|
|
100
|
+
return undefined;
|
|
101
|
+
return value;
|
|
52
102
|
}
|
|
53
103
|
export function autodetectAll(varNames) {
|
|
54
104
|
const result = {};
|
package/dist/autodetect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autodetect.js","sourceRoot":"","sources":["../src/autodetect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,SAAS,GAAG,CAAC,GAAW;IACtB,IAAI,CAAC;QACH,
|
|
1
|
+
{"version":3,"file":"autodetect.js","sourceRoot":"","sources":["../src/autodetect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,SAAS,GAAG,CAAC,GAAW;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjG,wEAAwE;QACxE,qEAAqE;QACrE,wEAAwE;QACxE,OAAO,GAAG,IAAI,SAAS,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAA6C;IAC1D,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC1C,IAAI,EAAE,GAAG,EAAE;QACT,MAAM,MAAM,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACpD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,GAAG,EAAE,GAAG,EAAE;QACR,MAAM,MAAM,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACjE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;IAC/C,EAAE,EAAE,GAAG,EAAE;QACP,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,uCAAuC,EAAE;gBAC5D,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,IAAI,SAAS,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACnC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEtD,8EAA8E;AAC9E,8EAA8E;AAC9E,+DAA+D;AAC/D,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,sBAAsB;AACtB,MAAM,qBAAqB,GAAG,IAAI,MAAM,CACtC;IACE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY;IACnE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS;IACtE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B;IACtD,oBAAoB,EAAE,qBAAqB,EAAE,aAAa;IAC1D,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB;CAC/D,CAAC,IAAI,CAAC,GAAG,CAAC,EACX,GAAG,CACJ,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,yEAAyE;AACzE,sEAAsE;AACtE,2EAA2E;AAC3E,wDAAwD;AACxD,MAAM,2BAA2B,GAAG,IAAI,MAAM,CAC5C;IACE,4CAA4C;IAC5C,aAAa;IACb,6BAA6B;IAC7B,8CAA8C;IAC9C,oBAAoB;IACpB,wBAAwB;IACxB,oCAAoC;IACpC,yBAAyB;IACzB,oBAAoB;IACpB,kBAAkB;IAClB,uBAAuB;IACvB,oBAAoB;CACrB,CAAC,IAAI,CAAC,GAAG,CAAC,EACX,GAAG,CACJ,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,QAAQ;QAAE,OAAO,QAAQ,EAAE,CAAC;IAChC,4EAA4E;IAC5E,yEAAyE;IACzE,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,kBAAkB,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,SAAS,IAAI,mBAAmB,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAkB;IAC9C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { describe, it, before, after } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { join, delimiter } from 'node:path';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { autodetect, autodetectAll, isSensitiveEnvName, isSensitiveEnvValue, AUTODETECT_VARS } from './autodetect.js';
|
|
8
|
+
// git-backed detectors read the process cwd, so run them inside a scratch
|
|
9
|
+
// repo with a known origin remote (each test file is its own process).
|
|
10
|
+
let repo;
|
|
11
|
+
let prevCwd;
|
|
12
|
+
before(() => {
|
|
13
|
+
prevCwd = process.cwd();
|
|
14
|
+
repo = mkdtempSync(join(process.cwd(), '.pa-auto-'));
|
|
15
|
+
process.chdir(repo);
|
|
16
|
+
const run = (cmd) => execSync(cmd, { stdio: 'pipe' });
|
|
17
|
+
run('git init -q -b pa-test-branch');
|
|
18
|
+
run('git config user.email pa@test.local');
|
|
19
|
+
run('git config user.name "PA Tester"');
|
|
20
|
+
run('git remote add origin https://github.com/pa-test-org/pa-test-repo.git');
|
|
21
|
+
run('git commit -q --allow-empty -m init');
|
|
22
|
+
});
|
|
23
|
+
after(() => {
|
|
24
|
+
process.chdir(prevCwd);
|
|
25
|
+
rmSync(repo, { recursive: true, force: true });
|
|
26
|
+
});
|
|
27
|
+
describe('git detectors', () => {
|
|
28
|
+
it('detects the current branch', () => {
|
|
29
|
+
assert.strictEqual(autodetect('branch'), 'pa-test-branch');
|
|
30
|
+
});
|
|
31
|
+
it('detects repo name from the origin remote, stripping .git', () => {
|
|
32
|
+
assert.strictEqual(autodetect('repo'), 'pa-test-repo');
|
|
33
|
+
});
|
|
34
|
+
it('detects the org from the origin remote', () => {
|
|
35
|
+
assert.strictEqual(autodetect('org'), 'pa-test-org');
|
|
36
|
+
});
|
|
37
|
+
it('detects repo/org from ssh-style remotes', () => {
|
|
38
|
+
execSync('git remote set-url origin git@github.com:ssh-org/ssh-repo.git', { stdio: 'pipe' });
|
|
39
|
+
try {
|
|
40
|
+
assert.strictEqual(autodetect('repo'), 'ssh-repo');
|
|
41
|
+
assert.strictEqual(autodetect('org'), 'ssh-org');
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
execSync('git remote set-url origin https://github.com/pa-test-org/pa-test-repo.git', { stdio: 'pipe' });
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('detects the git user name', () => {
|
|
48
|
+
assert.strictEqual(autodetect('user'), 'PA Tester');
|
|
49
|
+
});
|
|
50
|
+
it('returns undefined for branch on a detached HEAD', () => {
|
|
51
|
+
// `git branch --show-current` exits 0 and prints nothing when detached;
|
|
52
|
+
// that must not become an empty value that beats the template default.
|
|
53
|
+
execSync('git checkout -q --detach', { stdio: 'pipe' });
|
|
54
|
+
try {
|
|
55
|
+
assert.strictEqual(autodetect('branch'), undefined);
|
|
56
|
+
assert.ok(!('branch' in autodetectAll(['branch'])));
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
execSync('git checkout -q pa-test-branch', { stdio: 'pipe' });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
it('returns undefined for diff on a clean tree and the diff once there is one', () => {
|
|
63
|
+
assert.strictEqual(autodetect('diff'), undefined);
|
|
64
|
+
writeFileSync(join(repo, 'tracked.txt'), 'one\n');
|
|
65
|
+
execSync('git add tracked.txt && git commit -q -m add', { stdio: 'pipe' });
|
|
66
|
+
writeFileSync(join(repo, 'tracked.txt'), 'two\n');
|
|
67
|
+
try {
|
|
68
|
+
assert.match(autodetect('diff') ?? '', /^diff --git a\/tracked\.txt/);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
execSync('git checkout -q -- tracked.txt', { stdio: 'pipe' });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('date detector', () => {
|
|
76
|
+
it('returns an ISO date (YYYY-MM-DD)', () => {
|
|
77
|
+
assert.match(autodetect('date'), /^\d{4}-\d{2}-\d{2}$/);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('environment fallback', () => {
|
|
81
|
+
it('falls back to environment variables for unknown names', () => {
|
|
82
|
+
process.env.pa_custom_var = 'env-value';
|
|
83
|
+
try {
|
|
84
|
+
assert.strictEqual(autodetect('pa_custom_var'), 'env-value');
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
delete process.env.pa_custom_var;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
it('returns undefined for unknown names not in the environment', () => {
|
|
91
|
+
assert.strictEqual(autodetect('pa_definitely_not_set'), undefined);
|
|
92
|
+
});
|
|
93
|
+
it('never expands credential-looking env vars', () => {
|
|
94
|
+
process.env.PA_TEST_TOKEN = 'sekrit';
|
|
95
|
+
process.env.PA_TEST_API_KEY = 'sekrit';
|
|
96
|
+
try {
|
|
97
|
+
assert.strictEqual(autodetect('PA_TEST_TOKEN'), undefined);
|
|
98
|
+
assert.strictEqual(autodetect('PA_TEST_API_KEY'), undefined);
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
delete process.env.PA_TEST_TOKEN;
|
|
102
|
+
delete process.env.PA_TEST_API_KEY;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
it('never expands credential-shaped values under innocuous names', () => {
|
|
106
|
+
process.env.PA_TEST_DATABASE_URL = 'postgres://app:hunter2@db.internal/app';
|
|
107
|
+
process.env.PA_TEST_PLAIN_URL = 'postgres://db.internal/app';
|
|
108
|
+
try {
|
|
109
|
+
assert.strictEqual(autodetect('PA_TEST_DATABASE_URL'), undefined);
|
|
110
|
+
assert.strictEqual(autodetect('PA_TEST_PLAIN_URL'), 'postgres://db.internal/app');
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
delete process.env.PA_TEST_DATABASE_URL;
|
|
114
|
+
delete process.env.PA_TEST_PLAIN_URL;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('isSensitiveEnvName', () => {
|
|
119
|
+
it('flags credential-looking names', () => {
|
|
120
|
+
for (const name of [
|
|
121
|
+
'GITHUB_TOKEN', 'GH_TOKEN', 'NPM_TOKEN', 'MY_SECRET', 'DB_PASSWORD',
|
|
122
|
+
'PGPASSWD', 'AWS_SECRET_ACCESS_KEY', 'OPENAI_API_KEY', 'APIKEY',
|
|
123
|
+
'GOOGLE_APPLICATION_CREDENTIALS', 'SSH_PRIVATE_KEY', 'AUTH_HEADER',
|
|
124
|
+
'X_AUTH', 'SESSION_COOKIE', 'BEARER_VALUE', 'gh_token',
|
|
125
|
+
// Suffix conventions outside API_/ACCESS_/PRIVATE_KEY
|
|
126
|
+
'OPENAI_KEY', 'STRIPE_KEY', 'SIGNING_KEY', 'ENCRYPTION_KEY', 'HIVE_HEARTBEAT_KEY',
|
|
127
|
+
'LICENSE_KEY', 'SSH_KEYS', 'KEY', 'MYSQL_PWD', 'ORACLE_PWD', 'GITHUB_PAT', 'AZURE_DEVOPS_PAT',
|
|
128
|
+
'PAT', 'GIT_PASS', 'SSH_PASSPHRASE', 'SLACK_WEBHOOK_URL', 'DISCORD_WEBHOOK', 'SENTRY_DSN',
|
|
129
|
+
'DB_CONNECTION_STRING', 'AZURE_CONN_STR', 'JWT_SIGNING', 'HMAC_VALUE', 'OAUTH_CLIENT_ID',
|
|
130
|
+
]) {
|
|
131
|
+
assert.strictEqual(isSensitiveEnvName(name), true, `should flag ${name}`);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
it('does not flag ordinary names', () => {
|
|
135
|
+
for (const name of [
|
|
136
|
+
'EDITOR', 'PATH', 'GOPATH', 'AUTHOR', 'AUTHORIZED_USERS_FILE', 'branch', 'KEYBOARD',
|
|
137
|
+
'PWD', 'OLDPWD', 'PATTERN', 'PATCH_LEVEL', 'PASSENGER_COUNT', 'MONKEY', 'DSNAME', 'COMPASS',
|
|
138
|
+
]) {
|
|
139
|
+
assert.strictEqual(isSensitiveEnvName(name), false, `should not flag ${name}`);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('isSensitiveEnvValue', () => {
|
|
144
|
+
it('flags credential-shaped values regardless of name', () => {
|
|
145
|
+
for (const value of [
|
|
146
|
+
'postgres://app:hunter2@db.internal:5432/app',
|
|
147
|
+
'redis://:p4ss@cache.internal/0',
|
|
148
|
+
'mongodb+srv://user:pw@cluster0.example.net/db',
|
|
149
|
+
'-----BEGIN OPENSSH PRIVATE KEY-----\nabc',
|
|
150
|
+
'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIn0.sig',
|
|
151
|
+
'ghp_' + 'A'.repeat(36),
|
|
152
|
+
'github_pat_' + 'A'.repeat(22) + '_' + 'b'.repeat(59),
|
|
153
|
+
'glpat-' + 'x'.repeat(20),
|
|
154
|
+
'sk-' + 'x'.repeat(48),
|
|
155
|
+
'sk_live_' + 'x'.repeat(24),
|
|
156
|
+
'xoxb-' + '1'.repeat(12) + '-abc',
|
|
157
|
+
'AKIA' + 'A'.repeat(16),
|
|
158
|
+
'AIza' + 'a'.repeat(35),
|
|
159
|
+
'npm_' + 'a'.repeat(36),
|
|
160
|
+
'hvs.' + 'a'.repeat(24),
|
|
161
|
+
]) {
|
|
162
|
+
assert.strictEqual(isSensitiveEnvValue(value), true, `should flag ${value.slice(0, 12)}...`);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
it('does not flag ordinary values', () => {
|
|
166
|
+
for (const value of [
|
|
167
|
+
'main', '/usr/local/bin:/usr/bin', 'https://github.com/hivecommons/promptargs',
|
|
168
|
+
'postgres://db.internal/app', 'https://user@example.com/path', 'user@example.com',
|
|
169
|
+
'skills', 'sk-short', 'eyJ-not-a-jwt', 'AKIA-nope', 'Hello, world', '42',
|
|
170
|
+
]) {
|
|
171
|
+
assert.strictEqual(isSensitiveEnvValue(value), false, `should not flag ${value}`);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('autodetectAll', () => {
|
|
176
|
+
it('collects only detectable values', () => {
|
|
177
|
+
const result = autodetectAll(['branch', 'pa_definitely_not_set', 'date']);
|
|
178
|
+
assert.strictEqual(result.branch, 'pa-test-branch');
|
|
179
|
+
assert.ok('date' in result);
|
|
180
|
+
assert.ok(!('pa_definitely_not_set' in result));
|
|
181
|
+
});
|
|
182
|
+
it('AUTODETECT_VARS lists the built-in detectors', () => {
|
|
183
|
+
for (const name of ['branch', 'repo', 'org', 'diff', 'pr', 'user', 'date']) {
|
|
184
|
+
assert.ok(AUTODETECT_VARS.includes(name), `missing ${name}`);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('pr detector', () => {
|
|
189
|
+
it('returns undefined when gh exits 0 with empty output', t => {
|
|
190
|
+
// A branch with no PR: gh succeeds but prints nothing, so the detector
|
|
191
|
+
// must map '' to undefined rather than returning an empty value.
|
|
192
|
+
if (process.platform === 'win32')
|
|
193
|
+
return t.skip('POSIX shim script');
|
|
194
|
+
const shim = mkdtempSync(join(tmpdir(), 'pa-gh-shim-'));
|
|
195
|
+
writeFileSync(join(shim, 'gh'), '#!/bin/sh\nexit 0\n', { mode: 0o755 });
|
|
196
|
+
const prevPath = process.env.PATH;
|
|
197
|
+
process.env.PATH = `${shim}${delimiter}${prevPath ?? ''}`;
|
|
198
|
+
try {
|
|
199
|
+
assert.strictEqual(autodetect('pr'), undefined);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
process.env.PATH = prevPath;
|
|
203
|
+
rmSync(shim, { recursive: true, force: true });
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=autodetect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autodetect.test.js","sourceRoot":"","sources":["../src/autodetect.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -11,11 +11,12 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
-
import { parseVars, expand } from './parser.js';
|
|
14
|
+
import { parseVars, expand, VAR_PATTERN } from './parser.js';
|
|
15
15
|
import { findTemplate, loadTemplates } from './loader.js';
|
|
16
16
|
import { resolve } from './resolver.js';
|
|
17
17
|
import { renderStatus } from './status.js';
|
|
18
18
|
import { autodetect, AUTODETECT_VARS } from './autodetect.js';
|
|
19
|
+
import { sanitizeForTerminal } from './sanitize.js';
|
|
19
20
|
import { startUI } from './ui.js';
|
|
20
21
|
const HELP = `
|
|
21
22
|
promptargs — Template arguments for AI prompts 🏴☠️
|
|
@@ -193,8 +194,8 @@ function doList() {
|
|
|
193
194
|
return v.name;
|
|
194
195
|
});
|
|
195
196
|
const source = t.source === 'user' ? ' (user)' : '';
|
|
196
|
-
console.log(` ${t.name}${source}`);
|
|
197
|
-
console.log(` vars: {{${varNames.join('}} {{')}}}`);
|
|
197
|
+
console.log(sanitizeForTerminal(` ${t.name}${source}`));
|
|
198
|
+
console.log(sanitizeForTerminal(` vars: {{${varNames.join('}} {{')}}}`));
|
|
198
199
|
console.log('');
|
|
199
200
|
}
|
|
200
201
|
}
|
|
@@ -210,13 +211,17 @@ function doShow(templateName) {
|
|
|
210
211
|
process.exit(1);
|
|
211
212
|
return;
|
|
212
213
|
}
|
|
213
|
-
|
|
214
|
+
// Sanitize first: templates are repo-controlled and must not be able to
|
|
215
|
+
// inject their own terminal escapes; only our highlighting below may.
|
|
216
|
+
const highlighted = sanitizeForTerminal(tpl.content).replace(VAR_PATTERN, (raw, _varName, defaultVal) => {
|
|
217
|
+
// Colour the tag exactly as written so padded tags ({{ name }}) are
|
|
218
|
+
// shown as the author typed them.
|
|
214
219
|
if (defaultVal !== undefined) {
|
|
215
|
-
return `\x1b[33m
|
|
220
|
+
return `\x1b[33m${raw}\x1b[0m`;
|
|
216
221
|
}
|
|
217
|
-
return `\x1b[31m
|
|
222
|
+
return `\x1b[31m${raw}\x1b[0m`;
|
|
218
223
|
});
|
|
219
|
-
console.log(`Template: ${tpl.name} (${tpl.path})\n
|
|
224
|
+
console.log(sanitizeForTerminal(`Template: ${tpl.name} (${tpl.path})`) + '\n');
|
|
220
225
|
console.log(highlighted);
|
|
221
226
|
console.log('\n\x1b[31mred\x1b[0m = required \x1b[33myellow\x1b[0m = has default');
|
|
222
227
|
}
|
|
@@ -230,7 +235,7 @@ function printEnv() {
|
|
|
230
235
|
if (name === 'diff' && display.length > DIFF_PREVIEW_MAX_CHARS) {
|
|
231
236
|
display = display.slice(0, DIFF_PREVIEW_MAX_CHARS) + '...';
|
|
232
237
|
}
|
|
233
|
-
console.log(` \x1b[32m{{${name}}}\x1b[0m = ${display}`);
|
|
238
|
+
console.log(` \x1b[32m{{${name}}}\x1b[0m = ${sanitizeForTerminal(display)}`);
|
|
234
239
|
}
|
|
235
240
|
else {
|
|
236
241
|
console.log(` \x1b[90m{{${name}}}\x1b[0m = (not detected)`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|