openplanr 1.2.2 → 1.2.4

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 (61) hide show
  1. package/dist/ai/prompts/prompt-builder.d.ts +13 -0
  2. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  3. package/dist/ai/prompts/prompt-builder.js +39 -4
  4. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  5. package/dist/cli/commands/epic.js +5 -3
  6. package/dist/cli/commands/epic.js.map +1 -1
  7. package/dist/cli/commands/feature.d.ts.map +1 -1
  8. package/dist/cli/commands/feature.js +2 -7
  9. package/dist/cli/commands/feature.js.map +1 -1
  10. package/dist/cli/commands/plan.d.ts.map +1 -1
  11. package/dist/cli/commands/plan.js +2 -8
  12. package/dist/cli/commands/plan.js.map +1 -1
  13. package/dist/cli/commands/quick.d.ts.map +1 -1
  14. package/dist/cli/commands/quick.js +5 -3
  15. package/dist/cli/commands/quick.js.map +1 -1
  16. package/dist/cli/commands/sprint.d.ts.map +1 -1
  17. package/dist/cli/commands/sprint.js +13 -11
  18. package/dist/cli/commands/sprint.js.map +1 -1
  19. package/dist/cli/commands/status.d.ts.map +1 -1
  20. package/dist/cli/commands/status.js +1 -7
  21. package/dist/cli/commands/status.js.map +1 -1
  22. package/dist/cli/commands/story.d.ts.map +1 -1
  23. package/dist/cli/commands/story.js +2 -7
  24. package/dist/cli/commands/story.js.map +1 -1
  25. package/dist/cli/commands/sync.js +4 -2
  26. package/dist/cli/commands/sync.js.map +1 -1
  27. package/dist/services/ai-service.d.ts.map +1 -1
  28. package/dist/services/ai-service.js +8 -2
  29. package/dist/services/ai-service.js.map +1 -1
  30. package/dist/services/artifact-service.d.ts +4 -0
  31. package/dist/services/artifact-service.d.ts.map +1 -1
  32. package/dist/services/artifact-service.js +6 -0
  33. package/dist/services/artifact-service.js.map +1 -1
  34. package/dist/services/config-service.d.ts +4 -0
  35. package/dist/services/config-service.d.ts.map +1 -1
  36. package/dist/services/config-service.js +4 -0
  37. package/dist/services/config-service.js.map +1 -1
  38. package/dist/services/id-service.d.ts +2 -0
  39. package/dist/services/id-service.d.ts.map +1 -1
  40. package/dist/services/id-service.js +2 -0
  41. package/dist/services/id-service.js.map +1 -1
  42. package/dist/services/prompt-service.d.ts +7 -0
  43. package/dist/services/prompt-service.d.ts.map +1 -1
  44. package/dist/services/prompt-service.js +7 -0
  45. package/dist/services/prompt-service.js.map +1 -1
  46. package/dist/services/template-service.d.ts +1 -0
  47. package/dist/services/template-service.d.ts.map +1 -1
  48. package/dist/services/template-service.js +1 -0
  49. package/dist/services/template-service.js.map +1 -1
  50. package/dist/templates/rules/claude/CLAUDE.md.hbs +5 -1
  51. package/dist/templates/rules/codex/AGENTS.md.hbs +5 -1
  52. package/dist/templates/rules/cursor/implement-task-list.mdc.hbs +5 -1
  53. package/dist/utils/format.d.ts +11 -0
  54. package/dist/utils/format.d.ts.map +1 -0
  55. package/dist/utils/format.js +18 -0
  56. package/dist/utils/format.js.map +1 -0
  57. package/dist/utils/fs.d.ts +20 -0
  58. package/dist/utils/fs.d.ts.map +1 -1
  59. package/dist/utils/fs.js +29 -1
  60. package/dist/utils/fs.js.map +1 -1
  61. package/package.json +1 -2
@@ -1,4 +1,6 @@
1
+ /** Return the next available sequential ID (e.g. "FEAT-004") for the given prefix in a directory. */
1
2
  export declare function getNextId(dir: string, prefix: string): Promise<string>;
3
+ /** Parse an artifact ID string (e.g. "FEAT-002") into its prefix and numeric parts. */
2
4
  export declare function parseId(id: string): {
3
5
  prefix: string;
4
6
  num: number;
@@ -1 +1 @@
1
- {"version":3,"file":"id-service.d.ts","sourceRoot":"","sources":["../../src/services/id-service.ts"],"names":[],"mappings":"AAEA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5E;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAI1E"}
1
+ {"version":3,"file":"id-service.d.ts","sourceRoot":"","sources":["../../src/services/id-service.ts"],"names":[],"mappings":"AAEA,qGAAqG;AACrG,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5E;AAED,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAI1E"}
@@ -1,4 +1,5 @@
1
1
  import { listFiles } from '../utils/fs.js';
2
+ /** Return the next available sequential ID (e.g. "FEAT-004") for the given prefix in a directory. */
2
3
  export async function getNextId(dir, prefix) {
3
4
  const files = await listFiles(dir, new RegExp(`^${prefix}-\\d{3}`));
4
5
  const usedNums = new Set();
@@ -16,6 +17,7 @@ export async function getNextId(dir, prefix) {
16
17
  const nextNum = next.toString().padStart(3, '0');
17
18
  return `${prefix}-${nextNum}`;
18
19
  }
20
+ /** Parse an artifact ID string (e.g. "FEAT-002") into its prefix and numeric parts. */
19
21
  export function parseId(id) {
20
22
  const match = id.match(/^([A-Z]+)-(\d{3})$/);
21
23
  if (!match)
@@ -1 +1 @@
1
- {"version":3,"file":"id-service.js","sourceRoot":"","sources":["../../src/services/id-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,MAAc;IACzD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,WAAW,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,+CAA+C;IAC/C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAI,EAAE,CAAC;IACT,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"id-service.js","sourceRoot":"","sources":["../../src/services/id-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,MAAc;IACzD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,WAAW,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,+CAA+C;IAC/C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAI,EAAE,CAAC;IACT,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC"}
@@ -1,15 +1,22 @@
1
+ /** Prompt the user for a single line of text input. Falls back to defaultValue in non-interactive mode. */
1
2
  export declare function promptText(message: string, defaultValue?: string): Promise<string>;
3
+ /** Prompt the user to select one option from a list. */
2
4
  export declare function promptSelect<T extends string>(message: string, choices: Array<{
3
5
  name: string;
4
6
  value: T;
5
7
  }>, defaultValue?: T): Promise<T>;
8
+ /** Prompt the user for a yes/no confirmation. */
6
9
  export declare function promptConfirm(message: string, defaultValue?: boolean): Promise<boolean>;
10
+ /** Open the user's default editor for multi-line text input. */
7
11
  export declare function promptEditor(message: string, defaultValue?: string): Promise<string>;
12
+ /** Prompt the user for sensitive input with masked characters. */
8
13
  export declare function promptSecret(message: string): Promise<string>;
14
+ /** Prompt the user to select multiple options from a checkbox list. */
9
15
  export declare function promptCheckbox<T extends string>(message: string, choices: Array<{
10
16
  name: string;
11
17
  value: T;
12
18
  checked?: boolean;
13
19
  }>): Promise<T[]>;
20
+ /** Prompt the user for comma-separated text values, returned as a trimmed array. */
14
21
  export declare function promptMultiText(message: string, hint?: string): Promise<string[]>;
15
22
  //# sourceMappingURL=prompt-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-service.d.ts","sourceRoot":"","sources":["../../src/services/prompt-service.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASxF;AAED,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,EAC1C,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAM1F;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1F;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnE;AAED,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,EACnD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC5D,OAAO,CAAC,CAAC,EAAE,CAAC,CAOd;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAavF"}
1
+ {"version":3,"file":"prompt-service.d.ts","sourceRoot":"","sources":["../../src/services/prompt-service.ts"],"names":[],"mappings":"AAIA,2GAA2G;AAC3G,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASxF;AAED,wDAAwD;AACxD,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,EAC1C,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED,iDAAiD;AACjD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAM1F;AAED,gEAAgE;AAChE,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1F;AAED,kEAAkE;AAClE,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnE;AAED,uEAAuE;AACvE,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,EACnD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC5D,OAAO,CAAC,CAAC,EAAE,CAAC,CAOd;AAED,oFAAoF;AACpF,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAavF"}
@@ -1,6 +1,7 @@
1
1
  import { checkbox, confirm, editor, input, password, select } from '@inquirer/prompts';
2
2
  import { logger } from '../utils/logger.js';
3
3
  import { isNonInteractive } from './interactive-state.js';
4
+ /** Prompt the user for a single line of text input. Falls back to defaultValue in non-interactive mode. */
4
5
  export async function promptText(message, defaultValue) {
5
6
  if (isNonInteractive()) {
6
7
  if (defaultValue !== undefined) {
@@ -11,6 +12,7 @@ export async function promptText(message, defaultValue) {
11
12
  }
12
13
  return input({ message, default: defaultValue });
13
14
  }
15
+ /** Prompt the user to select one option from a list. */
14
16
  export async function promptSelect(message, choices, defaultValue) {
15
17
  if (isNonInteractive()) {
16
18
  const value = defaultValue ?? choices[0].value;
@@ -19,6 +21,7 @@ export async function promptSelect(message, choices, defaultValue) {
19
21
  }
20
22
  return select({ message, choices, default: defaultValue });
21
23
  }
24
+ /** Prompt the user for a yes/no confirmation. */
22
25
  export async function promptConfirm(message, defaultValue = true) {
23
26
  if (isNonInteractive()) {
24
27
  logger.dim(` [auto] ${message} → ${defaultValue ? 'yes' : 'no'}`);
@@ -26,6 +29,7 @@ export async function promptConfirm(message, defaultValue = true) {
26
29
  }
27
30
  return confirm({ message, default: defaultValue });
28
31
  }
32
+ /** Open the user's default editor for multi-line text input. */
29
33
  export async function promptEditor(message, defaultValue) {
30
34
  if (isNonInteractive()) {
31
35
  if (defaultValue !== undefined) {
@@ -36,6 +40,7 @@ export async function promptEditor(message, defaultValue) {
36
40
  }
37
41
  return editor({ message, default: defaultValue });
38
42
  }
43
+ /** Prompt the user for sensitive input with masked characters. */
39
44
  export async function promptSecret(message) {
40
45
  if (isNonInteractive()) {
41
46
  logger.dim(' [auto] Skipping secret prompt (set via environment variable)');
@@ -43,6 +48,7 @@ export async function promptSecret(message) {
43
48
  }
44
49
  return password({ message, mask: '*' });
45
50
  }
51
+ /** Prompt the user to select multiple options from a checkbox list. */
46
52
  export async function promptCheckbox(message, choices) {
47
53
  if (isNonInteractive()) {
48
54
  const checked = choices.filter((c) => c.checked).map((c) => c.value);
@@ -51,6 +57,7 @@ export async function promptCheckbox(message, choices) {
51
57
  }
52
58
  return checkbox({ message, choices });
53
59
  }
60
+ /** Prompt the user for comma-separated text values, returned as a trimmed array. */
54
61
  export async function promptMultiText(message, hint) {
55
62
  if (isNonInteractive()) {
56
63
  throw new Error(`Non-interactive mode: multi-text prompt "${message}" requires interactive input`);
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-service.js","sourceRoot":"","sources":["../../src/services/prompt-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-service.js","sourceRoot":"","sources":["../../src/services/prompt-service.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ /** Compile and render a Handlebars template, checking the override directory first. */
1
2
  export declare function renderTemplate(templatePath: string, data: Record<string, unknown>, // Template data is inherently untyped
2
3
  overrideDir?: string): Promise<string>;
3
4
  //# sourceMappingURL=template-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-service.d.ts","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"AAyBA,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,sCAAsC;AACrE,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAYjB"}
1
+ {"version":3,"file":"template-service.d.ts","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"AAyBA,uFAAuF;AACvF,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,sCAAsC;AACrE,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAYjB"}
@@ -13,6 +13,7 @@ Handlebars.registerHelper('checkboxList', (items) => {
13
13
  });
14
14
  Handlebars.registerHelper('join', (arr, sep) => Array.isArray(arr) ? arr.join(typeof sep === 'string' ? sep : ', ') : '');
15
15
  Handlebars.registerHelper('eq', (a, b) => a === b);
16
+ /** Compile and render a Handlebars template, checking the override directory first. */
16
17
  export async function renderTemplate(templatePath, data, // Template data is inherently untyped
17
18
  overrideDir) {
18
19
  const fullPath = await resolveTemplatePath(templatePath, overrideDir);
@@ -1 +1 @@
1
- {"version":3,"file":"template-service.js","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsC,CAAC;AAEpE,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhF,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,GAAW,EAAE,EAAE,CACrD,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CACjD,CAAC;AAEF,UAAU,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,KAAe,EAAE,EAAE;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,GAAa,EAAE,GAAY,EAAE,EAAE,CAChE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CACzE,CAAC;AAEF,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,IAA6B,EAAE,sCAAsC;AACrE,WAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACtE,IAAI,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,YAAoB,EAAE,WAAoB;IAC3E,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"template-service.js","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsC,CAAC;AAEpE,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhF,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,GAAW,EAAE,EAAE,CACrD,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CACjD,CAAC;AAEF,UAAU,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,KAAe,EAAE,EAAE;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,GAAa,EAAE,GAAY,EAAE,EAAE,CAChE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CACzE,CAAC;AAEF,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAErE,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,IAA6B,EAAE,sCAAsC;AACrE,WAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACtE,IAAI,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,YAAoB,EAAE,WAAoB;IAC3E,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC"}
@@ -57,7 +57,11 @@ Before writing code, understand what exists:
57
57
  2. **Wait for user approval** before moving to the next subtask
58
58
  3. **Follow existing patterns** — match the code style, naming conventions, and architecture from Step 4
59
59
  4. **Map to acceptance criteria** — every implementation must satisfy the Gherkin scenarios from Step 2
60
- 5. **Update the task file** — check the box `- [x]` for completed subtasks
60
+ 5. **Mark completed work** — after implementing a subtask, update the task file:
61
+ - Change `- [ ]` to `- [x]` for the completed subtask
62
+ - When ALL subtasks in a task group are done, also mark the parent group `- [x]`
63
+ - When ALL groups in the file are done, update frontmatter `status: "done"`
64
+ - This applies to both `{{agilePath}}/tasks/` and `{{agilePath}}/quick/` files
61
65
  6. **Don't modify unrelated code** — stay focused on the target subtask
62
66
 
63
67
  ## Agile Workflow Phases
@@ -57,7 +57,11 @@ Before writing code, understand what exists:
57
57
  2. **Wait for user approval** before moving to the next subtask
58
58
  3. **Follow existing patterns** — match the code style, naming conventions, and architecture from Step 4
59
59
  4. **Map to acceptance criteria** — every implementation must satisfy the Gherkin scenarios from Step 2
60
- 5. **Update the task file** — check the box `- [x]` for completed subtasks
60
+ 5. **Mark completed work** — after implementing a subtask, update the task file:
61
+ - Change `- [ ]` to `- [x]` for the completed subtask
62
+ - When ALL subtasks in a task group are done, also mark the parent group `- [x]`
63
+ - When ALL groups in the file are done, update frontmatter `status: "done"`
64
+ - This applies to both `{{agilePath}}/tasks/` and `{{agilePath}}/quick/` files
61
65
  6. **Don't modify unrelated code** — stay focused on the target subtask
62
66
 
63
67
  ## Artifact Locations
@@ -61,7 +61,11 @@ Before writing code, understand what exists:
61
61
  2. **Wait for user approval** before moving to the next subtask
62
62
  3. **Follow existing patterns** — match the code style, naming conventions, and architecture from Step 4
63
63
  4. **Map to acceptance criteria** — every implementation must satisfy the Gherkin scenarios from Step 2
64
- 5. **Update the task file** — check the box `- [x]` for completed subtasks
64
+ 5. **Mark completed work** — after implementing a subtask, update the task file:
65
+ - Change `- [ ]` to `- [x]` for the completed subtask
66
+ - When ALL subtasks in a task group are done, also mark the parent group `- [x]`
67
+ - When ALL groups in the file are done, update frontmatter `status: "done"`
68
+ - This applies to both `{{agilePath}}/tasks/` and `{{agilePath}}/quick/` files
65
69
  6. **Don't modify unrelated code** — stay focused on the target subtask
66
70
 
67
71
  ## Artifact Locations
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared formatting utilities for CLI output.
3
+ */
4
+ /**
5
+ * Colors text green/yellow/red based on a percentage threshold.
6
+ * - ≥75% → green
7
+ * - ≥25% → yellow
8
+ * - <25% → red
9
+ */
10
+ export declare function colorByPercent(text: string, pct: number): string;
11
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared formatting utilities for CLI output.
3
+ */
4
+ import chalk from 'chalk';
5
+ /**
6
+ * Colors text green/yellow/red based on a percentage threshold.
7
+ * - ≥75% → green
8
+ * - ≥25% → yellow
9
+ * - <25% → red
10
+ */
11
+ export function colorByPercent(text, pct) {
12
+ if (pct >= 75)
13
+ return chalk.green(text);
14
+ if (pct >= 25)
15
+ return chalk.yellow(text);
16
+ return chalk.red(text);
17
+ }
18
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW;IACtD,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -3,4 +3,24 @@ export declare function writeFile(filePath: string, content: string): Promise<vo
3
3
  export declare function readFile(filePath: string): Promise<string>;
4
4
  export declare function fileExists(filePath: string): Promise<boolean>;
5
5
  export declare function listFiles(dirPath: string, pattern?: RegExp): Promise<string[]>;
6
+ /** Maximum file size allowed for --file inputs (500KB). */
7
+ export declare const MAX_INPUT_FILE_SIZE = 500000;
8
+ /**
9
+ * Reads and validates a user-provided input file (e.g., --file flag).
10
+ * Checks size limit before reading to avoid loading oversized files into memory.
11
+ *
12
+ * @returns File contents as string, or `null` if validation failed (error already logged).
13
+ */
14
+ export declare function readInputFile(filePath: string, logger: {
15
+ error: (msg: string) => void;
16
+ dim: (msg: string) => void;
17
+ }): Promise<string | null>;
18
+ /**
19
+ * Validates that a file is within the allowed size limit.
20
+ * @returns Object with `valid` flag and actual `size` in bytes.
21
+ */
22
+ export declare function validateFileSize(filePath: string): Promise<{
23
+ valid: boolean;
24
+ size: number;
25
+ }>;
6
26
  //# sourceMappingURL=fs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AASA,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAInE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWpF"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAUA,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAInE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWpF;AAED,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAE3C;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACnE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3C"}
package/dist/utils/fs.js CHANGED
@@ -1,4 +1,4 @@
1
- import { access, readFile as fsReadFile, writeFile as fsWriteFile, mkdir, readdir, } from 'node:fs/promises';
1
+ import { access, readFile as fsReadFile, writeFile as fsWriteFile, mkdir, readdir, stat, } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  export async function ensureDir(dirPath) {
4
4
  await mkdir(dirPath, { recursive: true });
@@ -27,4 +27,32 @@ export async function listFiles(dirPath, pattern) {
27
27
  }
28
28
  return entries;
29
29
  }
30
+ /** Maximum file size allowed for --file inputs (500KB). */
31
+ export const MAX_INPUT_FILE_SIZE = 500_000;
32
+ /**
33
+ * Reads and validates a user-provided input file (e.g., --file flag).
34
+ * Checks size limit before reading to avoid loading oversized files into memory.
35
+ *
36
+ * @returns File contents as string, or `null` if validation failed (error already logged).
37
+ */
38
+ export async function readInputFile(filePath, logger) {
39
+ const { valid, size } = await validateFileSize(filePath);
40
+ if (!valid) {
41
+ const sizeMB = (size / 1_000_000).toFixed(2);
42
+ const maxMB = (MAX_INPUT_FILE_SIZE / 1_000_000).toFixed(2);
43
+ logger.error(`File too large: ${sizeMB}MB exceeds maximum of ${maxMB}MB.`);
44
+ return null;
45
+ }
46
+ const content = await readFile(filePath);
47
+ logger.dim(`Read ${content.split('\n').length} lines from ${path.basename(filePath)}`);
48
+ return content;
49
+ }
50
+ /**
51
+ * Validates that a file is within the allowed size limit.
52
+ * @returns Object with `valid` flag and actual `size` in bytes.
53
+ */
54
+ export async function validateFileSize(filePath) {
55
+ const { size } = await stat(filePath);
56
+ return { valid: size <= MAX_INPUT_FILE_SIZE, size };
57
+ }
30
58
  //# sourceMappingURL=fs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,QAAQ,IAAI,UAAU,EACtB,SAAS,IAAI,WAAW,EACxB,KAAK,EACL,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC;SACpB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,OAAgB;IAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;SACjC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,QAAQ,IAAI,UAAU,EACtB,SAAS,IAAI,WAAW,EACxB,KAAK,EACL,OAAO,EACP,IAAI,GACL,MAAM,kBAAkB,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC;SACpB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,OAAgB;IAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;SACjC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,MAAoE;IAEpE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,yBAAyB,KAAK,KAAK,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,eAAe,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB;IAEhB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,mBAAmB,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "AI-powered planning CLI — backlog, sprints, task templates, estimation, GitHub sync, and AI agent rules for Cursor, Claude Code, and Codex",
5
5
  "type": "module",
6
6
  "main": "./dist/cli/index.js",
@@ -83,7 +83,6 @@
83
83
  },
84
84
  "devDependencies": {
85
85
  "@biomejs/biome": "^2.4.9",
86
- "@changesets/changelog-github": "^0.6.0",
87
86
  "@changesets/cli": "^2.30.0",
88
87
  "@types/node": "^25.5.0",
89
88
  "@vitest/coverage-v8": "^4.1.2",