@hivecommons/promptargs 0.7.0 → 0.9.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.
Files changed (81) hide show
  1. package/README.md +106 -20
  2. package/dist/autodetect.js +39 -12
  3. package/dist/autodetect.js.map +1 -1
  4. package/dist/cli.js +78 -147
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands.d.ts +4 -0
  7. package/dist/commands.js +148 -0
  8. package/dist/commands.js.map +1 -0
  9. package/dist/flags.d.ts +20 -0
  10. package/dist/flags.js +101 -0
  11. package/dist/flags.js.map +1 -0
  12. package/dist/loader.d.ts +2 -0
  13. package/dist/loader.js +84 -11
  14. package/dist/loader.js.map +1 -1
  15. package/dist/log.d.ts +19 -0
  16. package/dist/log.js +41 -0
  17. package/dist/log.js.map +1 -0
  18. package/dist/parser.js +39 -9
  19. package/dist/parser.js.map +1 -1
  20. package/dist/resolver.d.ts +3 -1
  21. package/dist/resolver.js +105 -34
  22. package/dist/resolver.js.map +1 -1
  23. package/dist/status.d.ts +1 -1
  24. package/dist/status.js +5 -4
  25. package/dist/status.js.map +1 -1
  26. package/dist/ui.d.ts +3 -0
  27. package/dist/ui.html +21 -6
  28. package/dist/ui.js +89 -12
  29. package/dist/ui.js.map +1 -1
  30. package/package.json +13 -4
  31. package/dist/autodetect.test.d.ts +0 -1
  32. package/dist/autodetect.test.js +0 -207
  33. package/dist/autodetect.test.js.map +0 -1
  34. package/dist/cli.test.d.ts +0 -1
  35. package/dist/cli.test.js +0 -310
  36. package/dist/cli.test.js.map +0 -1
  37. package/dist/index.test.d.ts +0 -1
  38. package/dist/index.test.js +0 -59
  39. package/dist/index.test.js.map +0 -1
  40. package/dist/iterate.test.d.ts +0 -1
  41. package/dist/iterate.test.js +0 -20
  42. package/dist/iterate.test.js.map +0 -1
  43. package/dist/loader.test.d.ts +0 -1
  44. package/dist/loader.test.js +0 -65
  45. package/dist/loader.test.js.map +0 -1
  46. package/dist/parser.test.d.ts +0 -1
  47. package/dist/parser.test.js +0 -93
  48. package/dist/parser.test.js.map +0 -1
  49. package/dist/resolver.test.d.ts +0 -1
  50. package/dist/resolver.test.js +0 -184
  51. package/dist/resolver.test.js.map +0 -1
  52. package/dist/sanitize.test.d.ts +0 -1
  53. package/dist/sanitize.test.js +0 -38
  54. package/dist/sanitize.test.js.map +0 -1
  55. package/dist/status.test.d.ts +0 -1
  56. package/dist/status.test.js +0 -33
  57. package/dist/status.test.js.map +0 -1
  58. package/dist/ui-bootstrap.test.d.ts +0 -1
  59. package/dist/ui-bootstrap.test.js +0 -479
  60. package/dist/ui-bootstrap.test.js.map +0 -1
  61. package/dist/ui-builder.test.d.ts +0 -1
  62. package/dist/ui-builder.test.js +0 -272
  63. package/dist/ui-builder.test.js.map +0 -1
  64. package/dist/ui-command-quoting.test.d.ts +0 -1
  65. package/dist/ui-command-quoting.test.js +0 -95
  66. package/dist/ui-command-quoting.test.js.map +0 -1
  67. package/dist/ui-harness.d.ts +0 -20
  68. package/dist/ui-harness.js +0 -40
  69. package/dist/ui-harness.js.map +0 -1
  70. package/dist/ui-harness.test.d.ts +0 -1
  71. package/dist/ui-harness.test.js +0 -30
  72. package/dist/ui-harness.test.js.map +0 -1
  73. package/dist/ui-inline.test.d.ts +0 -1
  74. package/dist/ui-inline.test.js +0 -90
  75. package/dist/ui-inline.test.js.map +0 -1
  76. package/dist/ui-interactions.test.d.ts +0 -1
  77. package/dist/ui-interactions.test.js +0 -489
  78. package/dist/ui-interactions.test.js.map +0 -1
  79. package/dist/ui.test.d.ts +0 -1
  80. package/dist/ui.test.js +0 -283
  81. package/dist/ui.test.js.map +0 -1
package/dist/cli.js CHANGED
@@ -9,15 +9,15 @@
9
9
  * promptargs init # create .prompts/ with examples
10
10
  * promptargs show <template> # show template with vars highlighted
11
11
  */
12
- import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
13
- import { join } from 'node:path';
14
- import { parseVars, expand, VAR_PATTERN } from './parser.js';
15
- import { findTemplate, loadTemplates } from './loader.js';
12
+ import { parseVars, expand } from './parser.js';
13
+ import { findTemplate } from './loader.js';
16
14
  import { resolve } from './resolver.js';
17
15
  import { renderStatus } from './status.js';
18
- import { autodetect, AUTODETECT_VARS } from './autodetect.js';
19
- import { sanitizeForTerminal } from './sanitize.js';
20
16
  import { startUI } from './ui.js';
17
+ import { UsageError, assertKnownFlags, assertNoReservedVars, assertNoArgs, parseFlags, parsePort, wantsHelp, SUBCOMMANDS, assertOnlyFlags } from './flags.js';
18
+ import { diag, classifyError } from './log.js';
19
+ import { doInit, doList, doShow, printEnv } from './commands.js';
20
+ import { sanitizeForTerminal } from './sanitize.js';
21
21
  const HELP = `
22
22
  promptargs — Template arguments for AI prompts 🏴‍☠️
23
23
 
@@ -34,9 +34,10 @@ Usage:
34
34
  Flags:
35
35
  --no-interactive Skip interactive prompts (use defaults/auto only)
36
36
  --cross Cross-product mode: all combinations of array values
37
- --parallel Run array iterations in parallel (print all at once)
38
37
  --json Output as JSON instead of plain text
39
38
  --status Print status line only (for IDE integration)
39
+ -h, --help Show this help
40
+ --var value Same as --var=value (switches above take no value)
40
41
 
41
42
  Array values:
42
43
  --file=a.go,b.go Comma-separated → one run per value
@@ -44,54 +45,61 @@ Array values:
44
45
  --file=@list.txt File → one value per line
45
46
 
46
47
  Iteration modes:
47
- Default (zip): --file=a,b --focus=x,y → 2 runs (a+x, b+y)
48
+ Default (zip): --file=a,b --focus=x,y → 2 runs (a+x, b+y); shorter arrays repeat
48
49
  Cross-product: --file=a,b --focus=x,y --cross → 4 runs (a+x, a+y, b+x, b+y)
49
50
 
50
51
  Templates live in:
51
52
  .prompts/ Project-level (checked into repo)
52
53
  ~/.prompts/ User-level (personal templates)
53
54
  `;
54
- const EXAMPLE_REVIEW = `Review {{file}} for {{focus=correctness}} issues.
55
- Be {{tone=concise}} in your feedback.
56
- Focus on real bugs, not style nitpicks.
57
- `;
58
- const EXAMPLE_EXPLAIN = `Explain what {{file}} does in {{style=simple}} terms.
59
- Assume the reader is a {{audience=junior developer}}.
60
- `;
61
- const EXAMPLE_FIX = `Fix the {{issue}} in {{file}}.
62
- The expected behavior is: {{expected}}
63
- The actual behavior is: {{actual}}
64
- `;
55
+ // The shared set supplies the runtime gate and its names supply the key union.
56
+ // The Record makes adding a subcommand without a handler (or vice versa) a type error.
57
+ const SUBCOMMAND_HANDLERS = {
58
+ help: () => {
59
+ console.log(HELP);
60
+ printEnv();
61
+ },
62
+ env: (args) => {
63
+ assertNoArgs(args);
64
+ printEnv();
65
+ },
66
+ ui: (args) => {
67
+ const flags = parseFlags(args);
68
+ assertOnlyFlags(flags, ['port'], 'ui');
69
+ startUI(parsePort(flags));
70
+ },
71
+ init: (args) => {
72
+ assertNoArgs(args);
73
+ doInit();
74
+ },
75
+ list: (args) => {
76
+ assertNoArgs(args);
77
+ doList();
78
+ },
79
+ show: (args) => {
80
+ assertNoArgs(args.slice(1));
81
+ doShow(args[0]);
82
+ },
83
+ };
84
+ function isSubcommand(value) {
85
+ return SUBCOMMANDS.has(value);
86
+ }
65
87
  async function main() {
66
88
  const args = process.argv.slice(2);
67
- if (args.length === 0 || args[0] === 'help' || args[0] === '--help') {
89
+ if (args.length === 0 || wantsHelp(args)) {
68
90
  console.log(HELP);
69
91
  printEnv();
70
92
  return;
71
93
  }
72
- if (args[0] === 'env') {
73
- printEnv();
94
+ const command = args[0];
95
+ if (isSubcommand(command)) {
96
+ await SUBCOMMAND_HANDLERS[command](args.slice(1));
74
97
  return;
75
98
  }
76
- if (args[0] === 'ui') {
77
- const flags = parseFlags(args.slice(1));
78
- const port = flags['port'] ? Number(flags['port']) : undefined;
79
- startUI(port);
80
- return;
81
- }
82
- if (args[0] === 'init') {
83
- return doInit();
84
- }
85
- if (args[0] === 'list') {
86
- return doList();
87
- }
88
- if (args[0] === 'show') {
89
- return doShow(args[1]);
90
- }
91
99
  // Run a template
92
100
  const templateName = args[0];
93
101
  const flags = parseFlags(args.slice(1));
94
- const interactive = !flags['no-interactive'];
102
+ const interactive = !flags['no-interactive'] && process.stdin.isTTY === true;
95
103
  const cross = 'cross' in flags;
96
104
  const asJson = 'json' in flags;
97
105
  const statusOnly = 'status' in flags;
@@ -105,27 +113,47 @@ async function main() {
105
113
  else {
106
114
  const tpl = findTemplate(templateName);
107
115
  if (!tpl) {
108
- console.error(`Template "${templateName}" not found.`);
109
- console.error('Run "promptargs list" to see available templates.');
110
- console.error('Run "promptargs init" to create example templates.');
111
- process.exit(1);
112
- return;
116
+ throw new UsageError(`Template "${templateName}" not found.\n` +
117
+ 'Run "promptargs list" to see available templates.\n' +
118
+ 'Run "promptargs init" to create example templates.');
113
119
  }
114
120
  content = tpl.content;
115
121
  name = tpl.name;
116
122
  }
117
123
  const vars = parseVars(content);
124
+ assertNoReservedVars(vars);
125
+ assertKnownFlags(flags, vars, name);
118
126
  if (vars.length === 0) {
119
- // No variables — just output the template as-is
120
- console.log(content);
127
+ // No variables — skip expand() so Mustache-style content that is not a promptargs blank stays untouched
128
+ if (statusOnly) {
129
+ console.log(renderStatus(name, vars, {}, undefined, new Set()));
130
+ }
131
+ else if (asJson) {
132
+ console.log(JSON.stringify(content, null, 2));
133
+ }
134
+ else {
135
+ console.log(content);
136
+ }
121
137
  return;
122
138
  }
123
- const { iterations } = await resolve(vars, flags, interactive, cross);
139
+ const { iterations, defaulted } = await resolve(vars, flags, interactive, cross);
124
140
  if (statusOnly) {
125
- const status = renderStatus(name, vars, iterations[0]);
141
+ const status = renderStatus(name, vars, iterations[0], undefined, defaulted);
126
142
  console.log(status);
127
143
  return;
128
144
  }
145
+ const missing = vars.filter(v => iterations.some(values => !Object.hasOwn(values, v.name)));
146
+ if (missing.length > 0) {
147
+ const first = missing[0].name;
148
+ // A flag that expanded to nothing (e.g. --file= or --file=@empty.txt) was passed but filled no blank
149
+ const supply = Object.hasOwn(flags, first)
150
+ ? `give --${first} a non-empty value`
151
+ : `pass --${first}=<value>`;
152
+ const tail = flags['no-interactive']
153
+ ? 'or run without --no-interactive to be asked.'
154
+ : 'or give the blank a default; stdin is not a terminal, so it cannot be asked for.';
155
+ throw new UsageError(`Missing value for ${missing.map(v => `{{${v.name}}}`).join(', ')}: ${supply} ${tail}`);
156
+ }
129
157
  const results = [];
130
158
  for (let i = 0; i < iterations.length; i++) {
131
159
  const values = iterations[i];
@@ -134,8 +162,8 @@ async function main() {
134
162
  const status = renderStatus(name, vars, values, {
135
163
  current: i + 1,
136
164
  total: iterations.length,
137
- });
138
- console.error(status);
165
+ }, defaulted);
166
+ diag('cli_iteration', { current: i + 1, total: iterations.length }, status);
139
167
  }
140
168
  results.push(expanded);
141
169
  }
@@ -146,105 +174,8 @@ async function main() {
146
174
  console.log(results.join('\n---\n'));
147
175
  }
148
176
  }
149
- function parseFlags(args) {
150
- const flags = {};
151
- for (const arg of args) {
152
- if (arg.startsWith('--')) {
153
- const eq = arg.indexOf('=');
154
- if (eq > 0) {
155
- flags[arg.slice(2, eq)] = arg.slice(eq + 1);
156
- }
157
- else {
158
- flags[arg.slice(2)] = 'true';
159
- }
160
- }
161
- }
162
- return flags;
163
- }
164
- function doInit() {
165
- const dir = join(process.cwd(), '.prompts');
166
- if (existsSync(dir)) {
167
- console.log('.prompts/ already exists!');
168
- return;
169
- }
170
- mkdirSync(dir, { recursive: true });
171
- writeFileSync(join(dir, 'review.md'), EXAMPLE_REVIEW);
172
- writeFileSync(join(dir, 'explain.md'), EXAMPLE_EXPLAIN);
173
- writeFileSync(join(dir, 'fix.md'), EXAMPLE_FIX);
174
- console.log('Created .prompts/ with 3 example templates:');
175
- console.log(' review.md — Code review with focus area');
176
- console.log(' explain.md — Explain code simply');
177
- console.log(' fix.md — Bug fix template');
178
- console.log('');
179
- console.log('Try it: promptargs review --file=src/main.ts');
180
- }
181
- function doList() {
182
- const templates = loadTemplates();
183
- if (templates.length === 0) {
184
- console.log('No templates found.');
185
- console.log('Run "promptargs init" to create example templates.');
186
- return;
187
- }
188
- console.log('Available templates:\n');
189
- for (const t of templates) {
190
- const vars = parseVars(t.content);
191
- const varNames = vars.map(v => {
192
- if (v.defaultValue !== undefined)
193
- return `${v.name}=${v.defaultValue}`;
194
- return v.name;
195
- });
196
- const source = t.source === 'user' ? ' (user)' : '';
197
- console.log(sanitizeForTerminal(` ${t.name}${source}`));
198
- console.log(sanitizeForTerminal(` vars: {{${varNames.join('}} {{')}}}`));
199
- console.log('');
200
- }
201
- }
202
- function doShow(templateName) {
203
- if (!templateName) {
204
- console.error('Usage: promptargs show <template>');
205
- process.exit(1);
206
- return;
207
- }
208
- const tpl = findTemplate(templateName);
209
- if (!tpl) {
210
- console.error(`Template "${templateName}" not found.`);
211
- process.exit(1);
212
- return;
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.
219
- if (defaultVal !== undefined) {
220
- return `\x1b[33m${raw}\x1b[0m`;
221
- }
222
- return `\x1b[31m${raw}\x1b[0m`;
223
- });
224
- console.log(sanitizeForTerminal(`Template: ${tpl.name} (${tpl.path})`) + '\n');
225
- console.log(highlighted);
226
- console.log('\n\x1b[31mred\x1b[0m = required \x1b[33myellow\x1b[0m = has default');
227
- }
228
- const DIFF_PREVIEW_MAX_CHARS = 60;
229
- function printEnv() {
230
- console.log('Auto-detected variables:\n');
231
- for (const name of AUTODETECT_VARS) {
232
- const value = autodetect(name);
233
- if (value !== undefined) {
234
- let display = value;
235
- if (name === 'diff' && display.length > DIFF_PREVIEW_MAX_CHARS) {
236
- display = display.slice(0, DIFF_PREVIEW_MAX_CHARS) + '...';
237
- }
238
- console.log(` \x1b[32m{{${name}}}\x1b[0m = ${sanitizeForTerminal(display)}`);
239
- }
240
- else {
241
- console.log(` \x1b[90m{{${name}}}\x1b[0m = (not detected)`);
242
- }
243
- }
244
- console.log('');
245
- }
246
177
  main().catch(err => {
247
- console.error(err.message);
178
+ diag('cli_error', { error_class: classifyError(err) }, sanitizeForTerminal(String(err.message)));
248
179
  process.exit(1);
249
180
  });
250
181
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9J,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCZ,CAAC;AAIF,+EAA+E;AAC/E,uFAAuF;AACvF,MAAM,mBAAmB,GAA0C;IACjE,IAAI,EAAE,GAAG,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACZ,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,EAAE,CAAC;IACb,CAAC;IACD,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACX,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,eAAe,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACb,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,EAAE,CAAC;IACX,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACb,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,EAAE,CAAC;IACX,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QACb,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,WAAW,CAAC,GAAG,CAAC,KAAmB,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7E,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,KAAK,CAAC;IAC/B,MAAM,UAAU,GAAG,QAAQ,IAAI,KAAK,CAAC;IAErC,0DAA0D;IAC1D,IAAI,OAAe,CAAC;IACpB,IAAI,IAAY,CAAC;IACjB,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,YAAY,CAAC;QACvB,IAAI,GAAG,QAAQ,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,UAAU,CAClB,aAAa,YAAY,gBAAgB;gBACvC,qDAAqD;gBACrD,oDAAoD,CACvD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QACtB,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3B,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,wGAAwG;QACxG,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9B,qGAAqG;QACrG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;YACxC,CAAC,CAAC,UAAU,KAAK,oBAAoB;YACrC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC;YAClC,CAAC,CAAC,8CAA8C;YAChD,CAAC,CAAC,kFAAkF,CAAC;QACvF,MAAM,IAAI,UAAU,CAClB,qBAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,CACvF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC9C,OAAO,EAAE,CAAC,GAAG,CAAC;gBACd,KAAK,EAAE,UAAU,CAAC,MAAM;aACzB,EAAE,SAAS,CAAC,CAAC;YACd,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function doInit(): void;
2
+ export declare function doList(): void;
3
+ export declare function doShow(templateName?: string): void;
4
+ export declare function printEnv(): void;
@@ -0,0 +1,148 @@
1
+ import { mkdirSync, writeFileSync, lstatSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { parseVars, VAR_PATTERN } from './parser.js';
4
+ import { findTemplate, loadTemplates } from './loader.js';
5
+ import { autodetect, AUTODETECT_VARS } from './autodetect.js';
6
+ import { sanitizeForTerminal } from './sanitize.js';
7
+ import { diag } from './log.js';
8
+ import { UsageError, assertNoReservedVars, subcommandCollision } from './flags.js';
9
+ const EXAMPLE_REVIEW = `Review {{file}} for {{focus=correctness}} issues.
10
+ Be {{tone=concise}} in your feedback.
11
+ Focus on real bugs, not style nitpicks.
12
+ `;
13
+ const EXAMPLE_EXPLAIN = `Explain what {{file}} does in {{style=simple}} terms.
14
+ Assume the reader is a {{audience=junior developer}}.
15
+ `;
16
+ const EXAMPLE_FIX = `Fix the {{issue}} in {{file}}.
17
+ The expected behavior is: {{expected}}
18
+ The actual behavior is: {{actual}}
19
+ `;
20
+ export function doInit() {
21
+ const dir = join(process.cwd(), '.prompts');
22
+ // Same rule as the loader: the project .prompts entry must be a real
23
+ // directory. lstat runs before any check, which is used to distinguish
24
+ // symlinks, regular files, and directories.
25
+ try {
26
+ const stats = lstatSync(dir);
27
+ if (stats.isSymbolicLink()) {
28
+ diag('loader_dir_symlink', { status: 'refused' }, sanitizeForTerminal(`promptargs: ${dir} is a symlink; the project .prompts directory must be a real directory`));
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ if (!stats.isDirectory()) {
33
+ throw new UsageError(`promptargs: ${dir} exists but is not a directory; move or remove it before running init`);
34
+ }
35
+ // Existing directory: already exists
36
+ console.log('.prompts/ already exists!');
37
+ return;
38
+ }
39
+ catch (err) {
40
+ if (err.code !== 'ENOENT')
41
+ throw err;
42
+ }
43
+ mkdirSync(dir, { recursive: true });
44
+ writeFileSync(join(dir, 'review.md'), EXAMPLE_REVIEW);
45
+ writeFileSync(join(dir, 'explain.md'), EXAMPLE_EXPLAIN);
46
+ writeFileSync(join(dir, 'fix.md'), EXAMPLE_FIX);
47
+ console.log('Created .prompts/ with 3 example templates:');
48
+ console.log(' review.md — Code review with focus area');
49
+ console.log(' explain.md — Explain code simply');
50
+ console.log(' fix.md — Bug fix template');
51
+ console.log('');
52
+ console.log('Try it: promptargs review --file=src/main.ts');
53
+ }
54
+ export function doList() {
55
+ const templates = loadTemplates();
56
+ if (templates.length === 0) {
57
+ console.log('No templates found.');
58
+ console.log('Run "promptargs init" to create example templates.');
59
+ return;
60
+ }
61
+ console.log('Available templates:\n');
62
+ for (const t of templates) {
63
+ const source = t.source === 'user' ? ' (user)' : '';
64
+ console.log(sanitizeForTerminal(` ${t.name}${source}`));
65
+ if (t.error) {
66
+ console.log(sanitizeForTerminal(` vars: (error: could not be read: ${t.error})`));
67
+ console.log('');
68
+ continue;
69
+ }
70
+ const collision = subcommandCollision(t.name);
71
+ if (collision) {
72
+ console.log(sanitizeForTerminal(` ${collision}`));
73
+ console.log('');
74
+ continue;
75
+ }
76
+ try {
77
+ const tplVars = parseVars(t.content);
78
+ assertNoReservedVars(tplVars);
79
+ const varNames = tplVars.map(v => {
80
+ if (v.defaultValue !== undefined)
81
+ return `${v.name}=${v.defaultValue}`;
82
+ return v.name;
83
+ });
84
+ if (varNames.length === 0) {
85
+ console.log(sanitizeForTerminal(` vars: (none)`));
86
+ }
87
+ else {
88
+ console.log(sanitizeForTerminal(` vars: {{${varNames.join('}} {{')}}}`));
89
+ }
90
+ }
91
+ catch (err) {
92
+ console.log(sanitizeForTerminal(` vars: (error: ${err instanceof Error ? err.message : String(err)})`));
93
+ }
94
+ console.log('');
95
+ }
96
+ }
97
+ export function doShow(templateName) {
98
+ if (!templateName) {
99
+ throw new UsageError('Usage: promptargs show <template>');
100
+ }
101
+ const tpl = findTemplate(templateName);
102
+ if (!tpl) {
103
+ throw new UsageError(`Template "${templateName}" not found.`);
104
+ }
105
+ const collision = subcommandCollision(tpl.name);
106
+ if (collision)
107
+ console.error(sanitizeForTerminal(collision));
108
+ // Defaults are merged across repeated blanks, so {{name}} … {{name=dflt}}
109
+ // must colour every occurrence as "has default", not just the one that
110
+ // carries it.
111
+ const tplVars = parseVars(tpl.content);
112
+ assertNoReservedVars(tplVars);
113
+ const hasDefault = new Set(tplVars
114
+ .filter((v) => v.defaultValue !== undefined)
115
+ .map((v) => v.name));
116
+ // Sanitize first: templates are repo-controlled and must not be able to
117
+ // inject their own terminal escapes; only our highlighting below may.
118
+ const highlighted = sanitizeForTerminal(tpl.content).replace(VAR_PATTERN, (raw, varName) => {
119
+ // Colour the tag exactly as written so padded tags ({{ name }}) are
120
+ // shown as the author typed them.
121
+ if (hasDefault.has(varName)) {
122
+ return `\x1b[33m${raw}\x1b[0m`;
123
+ }
124
+ return `\x1b[31m${raw}\x1b[0m`;
125
+ });
126
+ console.log(sanitizeForTerminal(`Template: ${tpl.name} (${tpl.path})`) + '\n');
127
+ console.log(highlighted);
128
+ console.log('\n\x1b[31mred\x1b[0m = required \x1b[33myellow\x1b[0m = has default');
129
+ }
130
+ const DIFF_PREVIEW_MAX_CHARS = 60;
131
+ export function printEnv() {
132
+ console.log('Auto-detected variables:\n');
133
+ for (const name of AUTODETECT_VARS) {
134
+ const value = autodetect(name);
135
+ if (value !== undefined) {
136
+ let display = value;
137
+ if (name === 'diff' && display.length > DIFF_PREVIEW_MAX_CHARS) {
138
+ display = display.slice(0, DIFF_PREVIEW_MAX_CHARS) + '...';
139
+ }
140
+ console.log(` \x1b[32m{{${name}}}\x1b[0m = ${sanitizeForTerminal(display)}`);
141
+ }
142
+ else {
143
+ console.log(` \x1b[90m{{${name}}}\x1b[0m = (not detected)`);
144
+ }
145
+ }
146
+ console.log('');
147
+ }
148
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare class UsageError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare const SWITCHES: Set<string>;
5
+ declare const SUBCOMMAND_NAMES: readonly ["help", "env", "ui", "init", "list", "show"];
6
+ export type Subcommand = (typeof SUBCOMMAND_NAMES)[number];
7
+ export declare const SUBCOMMANDS: Set<string>;
8
+ export declare function subcommandCollision(name: string): string | undefined;
9
+ export declare function assertNoReservedVars(vars: {
10
+ name: string;
11
+ }[]): void;
12
+ export declare function wantsHelp(args: string[]): boolean;
13
+ export declare function assertNoArgs(args: string[]): void;
14
+ export declare function assertKnownFlags(flags: Record<string, string>, vars: {
15
+ name: string;
16
+ }[], templateName: string): void;
17
+ export declare function assertOnlyFlags(flags: Record<string, string>, allowed: readonly string[], command: string): void;
18
+ export declare function parseFlags(args: string[]): Record<string, string>;
19
+ export declare function parsePort(flags: Record<string, string>): number | undefined;
20
+ export {};
package/dist/flags.js ADDED
@@ -0,0 +1,101 @@
1
+ export class UsageError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'UsageError';
5
+ }
6
+ }
7
+ export const SWITCHES = new Set(['no-interactive', 'cross', 'json', 'status']);
8
+ const SUBCOMMAND_NAMES = ['help', 'env', 'ui', 'init', 'list', 'show'];
9
+ export const SUBCOMMANDS = new Set(SUBCOMMAND_NAMES);
10
+ export function subcommandCollision(name) {
11
+ return SUBCOMMANDS.has(name)
12
+ ? `(unreachable: name collides with the "${name}" subcommand; rename the file)`
13
+ : undefined;
14
+ }
15
+ export function assertNoReservedVars(vars) {
16
+ for (const v of vars) {
17
+ if (v.name === 'help') {
18
+ throw new UsageError('Unsupported variable name "help": it is reserved for the --help flag; rename the blank');
19
+ }
20
+ if (SWITCHES.has(v.name)) {
21
+ throw new UsageError(`Unsupported variable name "${v.name}": it is reserved for the --${v.name} switch; rename the blank`);
22
+ }
23
+ }
24
+ }
25
+ // -h/--help anywhere requests usage, except as the value of a preceding bare --flag (as parseFlags consumes it).
26
+ export function wantsHelp(args) {
27
+ for (let i = 0; i < args.length; i++) {
28
+ const arg = args[i];
29
+ if (arg === '--help' || arg === '-h')
30
+ return true;
31
+ if (arg.startsWith('--') && !arg.includes('=') && !SWITCHES.has(arg.slice(2)) && i + 1 < args.length && !args[i + 1].startsWith('--')) {
32
+ i++;
33
+ }
34
+ }
35
+ return false;
36
+ }
37
+ export function assertNoArgs(args) {
38
+ if (args.length > 0) {
39
+ throw new UsageError(`Unexpected argument: ${args[0]}`);
40
+ }
41
+ }
42
+ export function assertKnownFlags(flags, vars, templateName) {
43
+ const known = new Set(vars.map((v) => v.name));
44
+ for (const key of Object.keys(flags)) {
45
+ if (!SWITCHES.has(key) && !known.has(key)) {
46
+ // An inline template cannot be re-shown by name, so the hint only applies to file templates.
47
+ const hint = templateName === 'inline' ? '' : ` Run "promptargs show ${templateName}" to see its variables.`;
48
+ throw new UsageError(`Unknown flag --${key}: template "${templateName}" has no {{${key}}} blank.${hint}`);
49
+ }
50
+ }
51
+ }
52
+ export function assertOnlyFlags(flags, allowed, command) {
53
+ const allowedSet = new Set(allowed);
54
+ for (const key of Object.keys(flags)) {
55
+ if (!allowedSet.has(key)) {
56
+ throw new UsageError(`Unknown flag --${key}: ${command} only accepts ${allowed.map((a) => `--${a}=<value>`).join(', ')}`);
57
+ }
58
+ }
59
+ }
60
+ export function parseFlags(args) {
61
+ // Null prototype so a key like __proto__ is stored as an own property instead of silently vanishing.
62
+ const flags = Object.create(null);
63
+ for (let i = 0; i < args.length; i++) {
64
+ const arg = args[i];
65
+ if (!arg.startsWith('--')) {
66
+ throw new UsageError(`Unexpected argument: ${arg}`);
67
+ }
68
+ const eq = arg.indexOf('=');
69
+ if (eq > 0) {
70
+ const key = arg.slice(2, eq);
71
+ if (SWITCHES.has(key)) {
72
+ throw new UsageError(`Invalid --${key}: --${key} takes no value`);
73
+ }
74
+ flags[key] = arg.slice(eq + 1);
75
+ continue;
76
+ }
77
+ const name = arg.slice(2);
78
+ if (SWITCHES.has(name)) {
79
+ flags[name] = 'true';
80
+ }
81
+ else if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
82
+ flags[name] = args[++i];
83
+ }
84
+ else {
85
+ throw new UsageError(`Invalid --${name}: --${name} requires a value: --${name}=<value>`);
86
+ }
87
+ }
88
+ // Spread copies own keys (including __proto__) onto an ordinary object for callers and deepStrictEqual.
89
+ return { ...flags };
90
+ }
91
+ export function parsePort(flags) {
92
+ if (!('port' in flags))
93
+ return undefined;
94
+ // Number('') is 0, so an empty --port= must be rejected before the range check.
95
+ const port = Number(flags['port']);
96
+ if (flags['port'] === '' || !Number.isInteger(port) || port < 0 || port > 65535) {
97
+ throw new UsageError('Invalid --port: expected an integer from 0 to 65535. Usage: promptargs ui --port=3700');
98
+ }
99
+ return port;
100
+ }
101
+ //# sourceMappingURL=flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"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"}
package/dist/loader.d.ts CHANGED
@@ -6,6 +6,8 @@ export interface PromptTemplate {
6
6
  content: string;
7
7
  path: string;
8
8
  source: 'project' | 'user';
9
+ /** Set when the file could not be read; content is then empty. */
10
+ error?: string;
9
11
  }
10
12
  export declare function loadTemplates(cwd?: string): PromptTemplate[];
11
13
  export declare function findTemplate(name: string, cwd?: string): PromptTemplate | undefined;