openplanr 1.2.5 → 1.2.7

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 (84) hide show
  1. package/README.md +20 -0
  2. package/dist/cli/commands/context.d.ts +6 -0
  3. package/dist/cli/commands/context.d.ts.map +1 -0
  4. package/dist/cli/commands/context.js +45 -0
  5. package/dist/cli/commands/context.js.map +1 -0
  6. package/dist/cli/commands/export.d.ts.map +1 -1
  7. package/dist/cli/commands/export.js +8 -0
  8. package/dist/cli/commands/export.js.map +1 -1
  9. package/dist/cli/commands/report-linter.d.ts +6 -0
  10. package/dist/cli/commands/report-linter.d.ts.map +1 -0
  11. package/dist/cli/commands/report-linter.js +61 -0
  12. package/dist/cli/commands/report-linter.js.map +1 -0
  13. package/dist/cli/commands/report.d.ts +6 -0
  14. package/dist/cli/commands/report.d.ts.map +1 -0
  15. package/dist/cli/commands/report.js +150 -0
  16. package/dist/cli/commands/report.js.map +1 -0
  17. package/dist/cli/commands/story.d.ts.map +1 -1
  18. package/dist/cli/commands/story.js +31 -0
  19. package/dist/cli/commands/story.js.map +1 -1
  20. package/dist/cli/commands/voice.d.ts +6 -0
  21. package/dist/cli/commands/voice.d.ts.map +1 -0
  22. package/dist/cli/commands/voice.js +64 -0
  23. package/dist/cli/commands/voice.js.map +1 -0
  24. package/dist/cli/index.js +8 -0
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/models/schema.d.ts +63 -0
  27. package/dist/models/schema.d.ts.map +1 -1
  28. package/dist/models/schema.js +31 -0
  29. package/dist/models/schema.js.map +1 -1
  30. package/dist/models/types.d.ts +160 -0
  31. package/dist/models/types.d.ts.map +1 -1
  32. package/dist/services/context-pack-service.d.ts +12 -0
  33. package/dist/services/context-pack-service.d.ts.map +1 -0
  34. package/dist/services/context-pack-service.js +155 -0
  35. package/dist/services/context-pack-service.js.map +1 -0
  36. package/dist/services/distribution-service.d.ts +18 -0
  37. package/dist/services/distribution-service.d.ts.map +1 -0
  38. package/dist/services/distribution-service.js +104 -0
  39. package/dist/services/distribution-service.js.map +1 -0
  40. package/dist/services/evidence-service.d.ts +17 -0
  41. package/dist/services/evidence-service.d.ts.map +1 -0
  42. package/dist/services/evidence-service.js +85 -0
  43. package/dist/services/evidence-service.js.map +1 -0
  44. package/dist/services/github-service.d.ts +28 -1
  45. package/dist/services/github-service.d.ts.map +1 -1
  46. package/dist/services/github-service.js +95 -0
  47. package/dist/services/github-service.js.map +1 -1
  48. package/dist/services/report-linter-service.d.ts +10 -0
  49. package/dist/services/report-linter-service.d.ts.map +1 -0
  50. package/dist/services/report-linter-service.js +95 -0
  51. package/dist/services/report-linter-service.js.map +1 -0
  52. package/dist/services/report-service.d.ts +37 -0
  53. package/dist/services/report-service.d.ts.map +1 -0
  54. package/dist/services/report-service.js +173 -0
  55. package/dist/services/report-service.js.map +1 -0
  56. package/dist/services/standup-parser.d.ts +21 -0
  57. package/dist/services/standup-parser.d.ts.map +1 -0
  58. package/dist/services/standup-parser.js +104 -0
  59. package/dist/services/standup-parser.js.map +1 -0
  60. package/dist/services/story-standup-service.d.ts +7 -0
  61. package/dist/services/story-standup-service.d.ts.map +1 -0
  62. package/dist/services/story-standup-service.js +27 -0
  63. package/dist/services/story-standup-service.js.map +1 -0
  64. package/dist/services/template-service.d.ts.map +1 -1
  65. package/dist/services/template-service.js +1 -0
  66. package/dist/services/template-service.js.map +1 -1
  67. package/dist/services/voice-service.d.ts +12 -0
  68. package/dist/services/voice-service.d.ts.map +1 -0
  69. package/dist/services/voice-service.js +42 -0
  70. package/dist/services/voice-service.js.map +1 -0
  71. package/dist/templates/export/planning-report.html.hbs +10 -0
  72. package/dist/templates/export/planning-report.md.hbs +11 -0
  73. package/dist/templates/linter/linter-config.json.hbs +13 -0
  74. package/dist/templates/reports/executive.md.hbs +28 -0
  75. package/dist/templates/reports/release-notes.md.hbs +37 -0
  76. package/dist/templates/reports/retrospective.md.hbs +36 -0
  77. package/dist/templates/reports/sprint.md.hbs +91 -0
  78. package/dist/templates/reports/standup.md.hbs +27 -0
  79. package/dist/templates/reports/weekly.md.hbs +42 -0
  80. package/dist/templates/voice/standup.md.hbs +20 -0
  81. package/dist/utils/markdown.d.ts.map +1 -1
  82. package/dist/utils/markdown.js +11 -5
  83. package/dist/utils/markdown.js.map +1 -1
  84. package/package.json +2 -2
@@ -0,0 +1,91 @@
1
+ # Sprint report — {{projectName}}
2
+
3
+ > Generated {{generatedAt}} · Type: **{{reportType}}** · Lookback: **{{daysLookback}}** days
4
+
5
+ {{#if branding.orgName}}
6
+ _Organization: {{branding.orgName}}_
7
+ {{/if}}
8
+
9
+ {{#if placeholders.noSprint}}
10
+ > **Note:** No sprint was selected (`--sprint`). Add `--sprint SPRINT-001` for sprint-scoped sections.
11
+ {{/if}}
12
+
13
+ ## Sprint snapshot
14
+
15
+ {{#if sprint}}
16
+ | Field | Value |
17
+ |-------|-------|
18
+ | Sprint | {{sprint.sprintId}} |
19
+ | Name | {{sprint.name}} |
20
+ | Status | {{sprint.status}} |
21
+ | Window | {{sprint.startDate}} → {{sprint.endDate}} |
22
+
23
+ {{#if sprint.goals.length}}
24
+ **Goals**
25
+ {{#each sprint.goals}}
26
+ - {{this}}
27
+ {{/each}}
28
+ {{/if}}
29
+
30
+ **Tasks in sprint:** {{#if sprint.taskIds.length}}{{join sprint.taskIds ", "}}{{else}}_none linked in frontmatter_{{/if}}
31
+
32
+ {{else}}
33
+ _No sprint context._
34
+ {{/if}}
35
+
36
+ ## Planning artifacts (summary)
37
+
38
+ - **Epics:** {{length artifacts.epics}}
39
+ - **Features:** {{length artifacts.features}}
40
+ - **Stories:** {{length artifacts.stories}}
41
+ - **Task lists:** {{length artifacts.tasks}}
42
+
43
+ **Stories**
44
+
45
+ {{#each artifacts.stories}}
46
+ - `{{this.id}}` — {{this.title}} — _{{this.status}}_
47
+ {{/each}}
48
+
49
+ ## GitHub activity
50
+
51
+ {{#if placeholders.noGitHub}}
52
+ _No GitHub data (disabled or unavailable)._
53
+ {{else}}
54
+ {{#if github.warning}}
55
+ > **Warning:** {{github.warning}}
56
+ {{/if}}
57
+
58
+ ### Recent commits
59
+
60
+ {{#if github.commits.length}}
61
+ {{#each github.commits}}
62
+ - [{{this.shortSha}}]({{this.url}}) — {{this.message}} — _{{this.authorLogin}}_
63
+ {{/each}}
64
+ {{else}}
65
+ _No commits in window._
66
+ {{/if}}
67
+
68
+ ### Pull requests
69
+
70
+ {{#if github.pullRequests.length}}
71
+ {{#each github.pullRequests}}
72
+ - [PR #{{this.number}}]({{this.url}}) — {{this.title}} — _{{this.state}} · {{this.authorLogin}}_
73
+ {{/each}}
74
+ {{else}}
75
+ _No pull requests in window._
76
+ {{/if}}
77
+ {{/if}}
78
+
79
+ ## Evidence appendix
80
+
81
+ {{#each evidence}}
82
+ - **{{this.kind}}** — {{this.label}}{{#if this.url}} — {{this.url}}{{/if}}{{#if this.detail}} — _{{this.detail}}_{{/if}}
83
+ {{/each}}
84
+
85
+ {{#if branding.customSections}}
86
+ {{#each branding.customSections}}
87
+ ## {{@key}}
88
+
89
+ {{{this}}}
90
+ {{/each}}
91
+ {{/if}}
@@ -0,0 +1,27 @@
1
+ # Standup — {{projectName}}
2
+
3
+ > {{generatedAt}}
4
+
5
+ ## Yesterday
6
+
7
+ {{#if github.commits.length}}
8
+ {{#each github.commits}}
9
+ - [{{this.shortSha}}]({{this.url}}) {{this.message}}
10
+ {{/each}}
11
+ {{else}}
12
+ - _No commits in lookback — describe what you finished manually._
13
+ {{/if}}
14
+
15
+ ## Today
16
+
17
+ - _Planned work — link tasks `TASK-___` or stories `US-___`._
18
+
19
+ ## Blockers
20
+
21
+ - _None / list with owner_
22
+
23
+ ## Evidence
24
+
25
+ {{#each evidence}}
26
+ - **{{this.kind}}** — {{this.label}}{{#if this.url}} — {{this.url}}{{/if}}
27
+ {{/each}}
@@ -0,0 +1,42 @@
1
+ # Weekly stakeholder update — {{projectName}}
2
+
3
+ > {{generatedAt}} · lookback {{daysLookback}}d
4
+
5
+ {{#if branding.logoUrl}}
6
+ ![Logo]({{branding.logoUrl}})
7
+ {{/if}}
8
+
9
+ ## Wins
10
+
11
+ _Edit bullets — each should link to a PR, issue, or artifact._
12
+
13
+ {{#if github.commits.length}}
14
+ - Shipped commits: {{length github.commits}} in the last {{daysLookback}} days (see Evidence).
15
+ {{else}}
16
+ - _No commit data — add links manually._
17
+ {{/if}}
18
+
19
+ ## Risks
20
+
21
+ {{#if placeholders.noStoriesCompleted}}
22
+ - **Planning:** No stories marked done — confirm whether delivery is blocked or statuses need updating.
23
+ {{/if}}
24
+ - _Add concrete risks with owners and dates._
25
+
26
+ ## Ask
27
+
28
+ - _One clear request to leadership (resource, decision, or scope)._
29
+
30
+ ## Evidence
31
+
32
+ {{#each evidence}}
33
+ - **{{this.kind}}** — {{this.label}}{{#if this.url}} — [link]({{this.url}}){{/if}}
34
+ {{/each}}
35
+
36
+ {{#if branding.customSections}}
37
+ {{#each branding.customSections}}
38
+ ## {{@key}}
39
+
40
+ {{{this}}}
41
+ {{/each}}
42
+ {{/if}}
@@ -0,0 +1,20 @@
1
+ # Voice standup workflow — {{projectName}}
2
+
3
+ **Date:** {{date}}
4
+
5
+ ## Suggested commands
6
+
7
+ ```bash
8
+ # Transcript file → markdown on stdout
9
+ planr voice standup --file ./transcript.txt
10
+
11
+ # Save, lint, and attach to a story
12
+ planr voice standup --file ./transcript.txt --write .planr/last-standup.md --lint --append-story US-028
13
+
14
+ # Same as above via story command
15
+ planr story standup --story US-028 --file ./transcript.txt --lint
16
+ ```
17
+
18
+ ## Microphone capture
19
+
20
+ Live mic capture is not bundled yet. Use OS dictation, Whisper, or another STT tool, then pass the text file with `--file` or pipe stdin.
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAKzD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5F"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAWzD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG5F"}
@@ -1,11 +1,17 @@
1
- import matter from 'gray-matter';
1
+ import YAML from 'yaml';
2
+ const FRONTMATTER_REGEX = /^---[^\S\r\n]*\r?\n([\s\S]*?)\r?\n---[^\S\r\n]*\r?\n?([\s\S]*)$/;
2
3
  export function parseMarkdown(raw) {
3
- // gray-matter returns Record<string, unknown>; we cast to ArtifactFrontmatter
4
- // which is safe because the index signature accepts extra fields.
5
- const { data, content } = matter(raw);
4
+ const match = FRONTMATTER_REGEX.exec(raw);
5
+ if (!match) {
6
+ return { data: {}, content: raw };
7
+ }
8
+ const yamlStr = match[1];
9
+ const content = match[2];
10
+ const data = YAML.parse(yamlStr) ?? {};
6
11
  return { data: data, content };
7
12
  }
8
13
  export function toMarkdownWithFrontmatter(data, content) {
9
- return matter.stringify(content, data);
14
+ const yamlStr = YAML.stringify(data).trimEnd();
15
+ return `---\n${yamlStr}\n---\n${content}`;
10
16
  }
11
17
  //# sourceMappingURL=markdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAQjC,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,IAA2B,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAyB,EAAE,OAAe;IAClF,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,iBAAiB,GAAG,iEAAiE,CAAC;AAE5F,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,EAAyB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,EAAE,IAAI,EAAE,IAA2B,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAyB,EAAE,OAAe;IAClF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/C,OAAO,QAAQ,OAAO,UAAU,OAAO,EAAE,CAAC;AAC5C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "1.2.5",
3
+ "version": "1.2.7",
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",
@@ -76,9 +76,9 @@
76
76
  "@napi-rs/keyring": "^1.2.0",
77
77
  "chalk": "^5.3.0",
78
78
  "commander": "^14.0.3",
79
- "gray-matter": "^4.0.3",
80
79
  "handlebars": "^4.7.9",
81
80
  "openai": "^6.33.0",
81
+ "yaml": "^2.8.3",
82
82
  "zod": "^4.3.6"
83
83
  },
84
84
  "devDependencies": {