openplanr 1.0.0 → 1.1.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 (74) hide show
  1. package/README.md +9 -7
  2. package/dist/ai/validation/index.d.ts +0 -1
  3. package/dist/ai/validation/index.d.ts.map +1 -1
  4. package/dist/ai/validation/index.js +0 -1
  5. package/dist/ai/validation/index.js.map +1 -1
  6. package/dist/ai/validation/task-validator.d.ts +3 -3
  7. package/dist/ai/validation/task-validator.d.ts.map +1 -1
  8. package/dist/ai/validation/task-validator.js +3 -11
  9. package/dist/ai/validation/task-validator.js.map +1 -1
  10. package/dist/cli/commands/checklist.d.ts.map +1 -1
  11. package/dist/cli/commands/checklist.js +34 -17
  12. package/dist/cli/commands/checklist.js.map +1 -1
  13. package/dist/cli/commands/epic.d.ts.map +1 -1
  14. package/dist/cli/commands/epic.js +3 -0
  15. package/dist/cli/commands/epic.js.map +1 -1
  16. package/dist/cli/commands/feature.d.ts.map +1 -1
  17. package/dist/cli/commands/feature.js +3 -0
  18. package/dist/cli/commands/feature.js.map +1 -1
  19. package/dist/cli/commands/init.d.ts.map +1 -1
  20. package/dist/cli/commands/init.js +21 -2
  21. package/dist/cli/commands/init.js.map +1 -1
  22. package/dist/cli/commands/plan.d.ts.map +1 -1
  23. package/dist/cli/commands/plan.js +123 -0
  24. package/dist/cli/commands/plan.js.map +1 -1
  25. package/dist/cli/commands/story.d.ts.map +1 -1
  26. package/dist/cli/commands/story.js +3 -0
  27. package/dist/cli/commands/story.js.map +1 -1
  28. package/dist/cli/commands/task.d.ts.map +1 -1
  29. package/dist/cli/commands/task.js +4 -0
  30. package/dist/cli/commands/task.js.map +1 -1
  31. package/dist/cli/helpers/task-creation.d.ts.map +1 -1
  32. package/dist/cli/helpers/task-creation.js +2 -3
  33. package/dist/cli/helpers/task-creation.js.map +1 -1
  34. package/dist/cli/index.js +13 -2
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/generators/cursor-generator.js +6 -6
  37. package/dist/generators/cursor-generator.js.map +1 -1
  38. package/dist/models/schema.js +1 -1
  39. package/dist/models/schema.js.map +1 -1
  40. package/dist/services/checklist-service.d.ts +5 -0
  41. package/dist/services/checklist-service.d.ts.map +1 -1
  42. package/dist/services/checklist-service.js +16 -0
  43. package/dist/services/checklist-service.js.map +1 -1
  44. package/dist/services/config-service.d.ts +3 -0
  45. package/dist/services/config-service.d.ts.map +1 -1
  46. package/dist/services/config-service.js +8 -2
  47. package/dist/services/config-service.js.map +1 -1
  48. package/dist/templates/adrs/adr-general.md.hbs +9 -0
  49. package/dist/templates/backlog/backlog-item.md.hbs +1 -0
  50. package/dist/templates/checklists/agile-checklist.md.hbs +24 -24
  51. package/dist/templates/epics/epic.md.hbs +3 -0
  52. package/dist/templates/export/planning-report.md.hbs +11 -7
  53. package/dist/templates/features/feature.md.hbs +2 -0
  54. package/dist/templates/guides/estimation.md.hbs +14 -14
  55. package/dist/templates/quick/quick-task.md.hbs +1 -0
  56. package/dist/templates/rules/claude/CLAUDE.md.hbs +11 -0
  57. package/dist/templates/rules/codex/AGENTS.md.hbs +9 -0
  58. package/dist/templates/rules/cursor/{2001-agile-create-epic.mdc.hbs → create-epic.mdc.hbs} +6 -0
  59. package/dist/templates/rules/cursor/{2002-agile-create-features.mdc.hbs → create-features.mdc.hbs} +6 -0
  60. package/dist/templates/rules/cursor/{2100-create-task-list.mdc.hbs → create-task-list.mdc.hbs} +7 -0
  61. package/dist/templates/rules/cursor/{2003-agile-create-user-story.mdc.hbs → create-user-story.mdc.hbs} +6 -0
  62. package/dist/templates/rules/cursor/{2101-implement-task-list.mdc.hbs → implement-task-list.mdc.hbs} +7 -0
  63. package/dist/templates/sprints/sprint.md.hbs +3 -0
  64. package/dist/templates/tasks/task-list.md.hbs +3 -0
  65. package/dist/utils/constants.d.ts +2 -2
  66. package/dist/utils/constants.d.ts.map +1 -1
  67. package/dist/utils/constants.js +2 -2
  68. package/dist/utils/constants.js.map +1 -1
  69. package/package.json +4 -4
  70. package/dist/ai/validation/dependency-chains.d.ts +0 -21
  71. package/dist/ai/validation/dependency-chains.d.ts.map +0 -1
  72. package/dist/ai/validation/dependency-chains.js +0 -114
  73. package/dist/ai/validation/dependency-chains.js.map +0 -1
  74. /package/dist/templates/rules/cursor/{2000-agile-checklist.mdc.hbs → agile-checklist.mdc.hbs} +0 -0
@@ -13,6 +13,7 @@ taskIds: [{{#each taskIds}}"{{this}}"{{#unless @last}}, {{/unless}}{{/each}}]
13
13
  # {{id}}: {{name}}
14
14
 
15
15
  ## Sprint Details
16
+
16
17
  - **Duration:** {{duration}}
17
18
  - **Start:** {{startDate}}
18
19
  - **End:** {{endDate}}
@@ -20,12 +21,14 @@ taskIds: [{{#each taskIds}}"{{this}}"{{#unless @last}}, {{/unless}}{{/each}}]
20
21
 
21
22
  {{#if goals}}
22
23
  ## Goals
24
+
23
25
  {{#each goals}}
24
26
  - {{this}}
25
27
  {{/each}}
26
28
  {{/if}}
27
29
 
28
30
  ## Tasks
31
+
29
32
  {{#if taskIds}}
30
33
  {{#each taskIds}}
31
34
  - [ ] {{this}}
@@ -15,6 +15,7 @@ status: "pending"
15
15
 
16
16
  {{#if artifactSources}}
17
17
  ## Artifact Sources
18
+
18
19
  {{#each artifactSources}}
19
20
  - **{{this.type}}:** `{{this.path}}`
20
21
  {{/each}}
@@ -31,6 +32,7 @@ status: "pending"
31
32
 
32
33
  {{#if acceptanceCriteriaMapping}}
33
34
  ## Acceptance Criteria Mapping
35
+
34
36
  {{#each acceptanceCriteriaMapping}}
35
37
  - [ ] {{this.criterion}} ({{this.sourceStoryId}}) → Tasks {{join this.taskIds ", "}}
36
38
  {{/each}}
@@ -38,6 +40,7 @@ status: "pending"
38
40
 
39
41
  {{#if relevantFiles}}
40
42
  ## Relevant Files
43
+
41
44
  {{#each relevantFiles}}
42
45
  - `{{this.path}}` — {{this.reason}}
43
46
  {{/each}}
@@ -1,5 +1,5 @@
1
- export declare const CONFIG_FILENAME = "planr.config.json";
2
- export declare const DEFAULT_AGILE_DIR = "docs/agile";
1
+ export declare const CONFIG_FILENAME = ".planr/config.json";
2
+ export declare const DEFAULT_AGILE_DIR = ".planr";
3
3
  export declare const DEFAULT_CURSOR_RULES_DIR = ".cursor/rules";
4
4
  export declare const ARTIFACT_DIRS: {
5
5
  readonly epics: "epics";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AAExD,eAAO,MAAM,aAAa;;;;;;;;;;CAUhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAC1C,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AAExD,eAAO,MAAM,aAAa;;;;;;;;;;CAUhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -2,8 +2,8 @@ import path from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  const __filename = fileURLToPath(import.meta.url);
4
4
  const __dirname = path.dirname(__filename);
5
- export const CONFIG_FILENAME = 'planr.config.json';
6
- export const DEFAULT_AGILE_DIR = 'docs/agile';
5
+ export const CONFIG_FILENAME = '.planr/config.json';
6
+ export const DEFAULT_AGILE_DIR = '.planr';
7
7
  export const DEFAULT_CURSOR_RULES_DIR = '.cursor/rules';
8
8
  export const ARTIFACT_DIRS = {
9
9
  epics: 'epics',
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
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",
@@ -58,11 +58,11 @@
58
58
  "license": "MIT",
59
59
  "repository": {
60
60
  "type": "git",
61
- "url": "git+https://github.com/TechArc-io/OpenPlanr.git"
61
+ "url": "git+https://github.com/openplanr/OpenPlanr.git"
62
62
  },
63
- "homepage": "https://github.com/TechArc-io/OpenPlanr#readme",
63
+ "homepage": "https://openplanr.dev",
64
64
  "bugs": {
65
- "url": "https://github.com/TechArc-io/OpenPlanr/issues"
65
+ "url": "https://github.com/openplanr/OpenPlanr/issues"
66
66
  },
67
67
  "dependencies": {
68
68
  "@anthropic-ai/sdk": "^0.81.0",
@@ -1,21 +0,0 @@
1
- /**
2
- * Detects file dependency chains from architecture files.
3
- *
4
- * When one file in a chain is modified, others likely need updating too.
5
- * Chains are detected via import analysis: if file A imports from file B,
6
- * they form a dependency hint.
7
- */
8
- export interface DependencyHint {
9
- /** Files in this chain (relative paths). */
10
- files: string[];
11
- /** Human-readable explanation of why these files are linked. */
12
- reason: string;
13
- }
14
- /**
15
- * Detect dependency hints by analysing import statements across
16
- * architecture files. If file A imports from file B, they form a chain.
17
- *
18
- * @param architectureFiles - Map of relative path → content from findArchitectureFiles
19
- */
20
- export declare function detectDependencyHints(architectureFiles: Map<string, string>): DependencyHint[];
21
- //# sourceMappingURL=dependency-chains.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency-chains.d.ts","sourceRoot":"","sources":["../../../src/ai/validation/dependency-chains.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,EAAE,CA+D9F"}
@@ -1,114 +0,0 @@
1
- /**
2
- * Detects file dependency chains from architecture files.
3
- *
4
- * When one file in a chain is modified, others likely need updating too.
5
- * Chains are detected via import analysis: if file A imports from file B,
6
- * they form a dependency hint.
7
- */
8
- /**
9
- * Detect dependency hints by analysing import statements across
10
- * architecture files. If file A imports from file B, they form a chain.
11
- *
12
- * @param architectureFiles - Map of relative path → content from findArchitectureFiles
13
- */
14
- export function detectDependencyHints(architectureFiles) {
15
- const archPaths = [...architectureFiles.keys()];
16
- if (archPaths.length < 2)
17
- return [];
18
- // Build a map of which architecture files import which others
19
- const importGraph = new Map();
20
- for (const [filePath, content] of architectureFiles) {
21
- const importedPaths = extractImportPaths(content);
22
- for (const imp of importedPaths) {
23
- const resolved = resolveImportToArchFile(imp, filePath, archPaths);
24
- if (resolved) {
25
- if (!importGraph.has(filePath))
26
- importGraph.set(filePath, new Set());
27
- const deps = importGraph.get(filePath);
28
- if (deps)
29
- deps.add(resolved);
30
- }
31
- }
32
- }
33
- // Find hub files (imported by 3+ others)
34
- const importCounts = new Map();
35
- for (const [importer, imports] of importGraph) {
36
- for (const imported of imports) {
37
- if (!importCounts.has(imported))
38
- importCounts.set(imported, []);
39
- const arr = importCounts.get(imported);
40
- if (arr)
41
- arr.push(importer);
42
- }
43
- }
44
- const hints = [];
45
- const seen = new Set();
46
- // Hub chains: file imported by 3+ architecture files
47
- for (const [hubFile, importers] of importCounts) {
48
- if (importers.length >= 3) {
49
- const chain = [hubFile, ...importers].sort();
50
- const key = chain.join(',');
51
- if (!seen.has(key)) {
52
- seen.add(key);
53
- hints.push({
54
- files: chain,
55
- reason: `${hubFile} is a central module imported by ${importers.join(', ')} — changes may require updates in all`,
56
- });
57
- }
58
- }
59
- }
60
- // Pair chains: direct import relationships not already covered by hubs
61
- for (const [importer, imports] of importGraph) {
62
- for (const imported of imports) {
63
- const pair = [importer, imported].sort();
64
- const key = pair.join(',');
65
- if (!seen.has(key)) {
66
- seen.add(key);
67
- hints.push({
68
- files: pair,
69
- reason: `${importer} imports from ${imported} — changes to one may require updates in the other`,
70
- });
71
- }
72
- }
73
- }
74
- return hints;
75
- }
76
- // ---------------------------------------------------------------------------
77
- // Helpers
78
- // ---------------------------------------------------------------------------
79
- /** Extract import paths from TypeScript/JavaScript source. */
80
- function extractImportPaths(content) {
81
- return [...content.matchAll(/(?:import|from)\s+['"]([^'"]+)['"]/g)].map((m) => m[1]);
82
- }
83
- /**
84
- * Resolve an import path to one of the known architecture file paths.
85
- * Handles relative imports and extension stripping.
86
- */
87
- function resolveImportToArchFile(importPath, fromFile, archPaths) {
88
- // Only consider relative imports
89
- if (!importPath.startsWith('.'))
90
- return null;
91
- // Strip .js/.ts extension
92
- const stripped = importPath.replace(/\.\w+$/, '');
93
- // Resolve relative to the importing file's directory
94
- const fromDir = fromFile.split('/').slice(0, -1).join('/');
95
- const parts = stripped.split('/');
96
- const resolvedParts = fromDir ? fromDir.split('/') : [];
97
- for (const part of parts) {
98
- if (part === '.')
99
- continue;
100
- if (part === '..') {
101
- resolvedParts.pop();
102
- }
103
- else {
104
- resolvedParts.push(part);
105
- }
106
- }
107
- const resolved = resolvedParts.join('/');
108
- // Match against architecture paths (with or without extension)
109
- return (archPaths.find((p) => {
110
- const pBase = p.replace(/\.\w+$/, '');
111
- return pBase === resolved;
112
- }) ?? null);
113
- }
114
- //# sourceMappingURL=dependency-chains.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency-chains.js","sourceRoot":"","sources":["../../../src/ai/validation/dependency-chains.ts"],"names":[],"mappings":"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"}