openplanr 1.2.8 → 1.4.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 (171) hide show
  1. package/README.md +30 -3
  2. package/dist/agents/task-parser.d.ts.map +1 -1
  3. package/dist/agents/task-parser.js +8 -34
  4. package/dist/agents/task-parser.js.map +1 -1
  5. package/dist/ai/prompts/prompt-builder.d.ts +14 -0
  6. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  7. package/dist/ai/prompts/prompt-builder.js +32 -1
  8. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  9. package/dist/ai/prompts/system-prompts.d.ts +3 -2
  10. package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
  11. package/dist/ai/prompts/system-prompts.js +117 -7
  12. package/dist/ai/prompts/system-prompts.js.map +1 -1
  13. package/dist/ai/schemas/ai-response-schemas.d.ts +62 -0
  14. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
  15. package/dist/ai/schemas/ai-response-schemas.js +51 -1
  16. package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
  17. package/dist/ai/types.d.ts.map +1 -1
  18. package/dist/ai/types.js +2 -0
  19. package/dist/ai/types.js.map +1 -1
  20. package/dist/cli/commands/backlog.d.ts +12 -0
  21. package/dist/cli/commands/backlog.d.ts.map +1 -1
  22. package/dist/cli/commands/backlog.js +88 -2
  23. package/dist/cli/commands/backlog.js.map +1 -1
  24. package/dist/cli/commands/config.d.ts.map +1 -1
  25. package/dist/cli/commands/config.js +8 -2
  26. package/dist/cli/commands/config.js.map +1 -1
  27. package/dist/cli/commands/linear.d.ts +8 -0
  28. package/dist/cli/commands/linear.d.ts.map +1 -0
  29. package/dist/cli/commands/linear.js +550 -0
  30. package/dist/cli/commands/linear.js.map +1 -0
  31. package/dist/cli/commands/quick.d.ts +17 -0
  32. package/dist/cli/commands/quick.d.ts.map +1 -1
  33. package/dist/cli/commands/quick.js +31 -15
  34. package/dist/cli/commands/quick.js.map +1 -1
  35. package/dist/cli/commands/revise.d.ts +9 -8
  36. package/dist/cli/commands/revise.d.ts.map +1 -1
  37. package/dist/cli/commands/revise.js +93 -25
  38. package/dist/cli/commands/revise.js.map +1 -1
  39. package/dist/cli/commands/spec.d.ts +28 -0
  40. package/dist/cli/commands/spec.d.ts.map +1 -0
  41. package/dist/cli/commands/spec.js +529 -0
  42. package/dist/cli/commands/spec.js.map +1 -0
  43. package/dist/cli/index.js +4 -0
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/models/schema.d.ts +44 -0
  46. package/dist/models/schema.d.ts.map +1 -1
  47. package/dist/models/schema.js +50 -0
  48. package/dist/models/schema.js.map +1 -1
  49. package/dist/models/types.d.ts +188 -3
  50. package/dist/models/types.d.ts.map +1 -1
  51. package/dist/services/artifact-gathering.d.ts +4 -0
  52. package/dist/services/artifact-gathering.d.ts.map +1 -1
  53. package/dist/services/artifact-gathering.js +1 -1
  54. package/dist/services/artifact-gathering.js.map +1 -1
  55. package/dist/services/artifact-service.d.ts +12 -1
  56. package/dist/services/artifact-service.d.ts.map +1 -1
  57. package/dist/services/artifact-service.js +49 -6
  58. package/dist/services/artifact-service.js.map +1 -1
  59. package/dist/services/atomic-write-service.d.ts +2 -2
  60. package/dist/services/atomic-write-service.js +2 -2
  61. package/dist/services/audit-log-service.d.ts +3 -6
  62. package/dist/services/audit-log-service.d.ts.map +1 -1
  63. package/dist/services/audit-log-service.js +4 -7
  64. package/dist/services/audit-log-service.js.map +1 -1
  65. package/dist/services/cascade-service.d.ts +2 -2
  66. package/dist/services/cascade-service.js +3 -3
  67. package/dist/services/cascade-service.js.map +1 -1
  68. package/dist/services/config-service.d.ts.map +1 -1
  69. package/dist/services/config-service.js +1 -0
  70. package/dist/services/config-service.js.map +1 -1
  71. package/dist/services/credentials-service.js +2 -2
  72. package/dist/services/credentials-service.js.map +1 -1
  73. package/dist/services/diff-service.d.ts +1 -1
  74. package/dist/services/diff-service.js +1 -1
  75. package/dist/services/evidence-verifier.d.ts +1 -1
  76. package/dist/services/evidence-verifier.d.ts.map +1 -1
  77. package/dist/services/evidence-verifier.js +5 -2
  78. package/dist/services/evidence-verifier.js.map +1 -1
  79. package/dist/services/git-service.d.ts +4 -4
  80. package/dist/services/git-service.js +4 -4
  81. package/dist/services/graph-integrity.d.ts +2 -3
  82. package/dist/services/graph-integrity.d.ts.map +1 -1
  83. package/dist/services/graph-integrity.js +2 -3
  84. package/dist/services/graph-integrity.js.map +1 -1
  85. package/dist/services/linear/body-formatters.d.ts +69 -0
  86. package/dist/services/linear/body-formatters.d.ts.map +1 -0
  87. package/dist/services/linear/body-formatters.js +183 -0
  88. package/dist/services/linear/body-formatters.js.map +1 -0
  89. package/dist/services/linear/constants.d.ts +61 -0
  90. package/dist/services/linear/constants.d.ts.map +1 -0
  91. package/dist/services/linear/constants.js +84 -0
  92. package/dist/services/linear/constants.js.map +1 -0
  93. package/dist/services/linear/errors.d.ts +14 -0
  94. package/dist/services/linear/errors.d.ts.map +1 -0
  95. package/dist/services/linear/errors.js +106 -0
  96. package/dist/services/linear/errors.js.map +1 -0
  97. package/dist/services/linear/estimate-resolver.d.ts +50 -0
  98. package/dist/services/linear/estimate-resolver.d.ts.map +1 -0
  99. package/dist/services/linear/estimate-resolver.js +82 -0
  100. package/dist/services/linear/estimate-resolver.js.map +1 -0
  101. package/dist/services/linear/plan-builders.d.ts +64 -0
  102. package/dist/services/linear/plan-builders.d.ts.map +1 -0
  103. package/dist/services/linear/plan-builders.js +237 -0
  104. package/dist/services/linear/plan-builders.js.map +1 -0
  105. package/dist/services/linear/scope-loaders.d.ts +79 -0
  106. package/dist/services/linear/scope-loaders.d.ts.map +1 -0
  107. package/dist/services/linear/scope-loaders.js +227 -0
  108. package/dist/services/linear/scope-loaders.js.map +1 -0
  109. package/dist/services/linear/strategy-context.d.ts +66 -0
  110. package/dist/services/linear/strategy-context.d.ts.map +1 -0
  111. package/dist/services/linear/strategy-context.js +121 -0
  112. package/dist/services/linear/strategy-context.js.map +1 -0
  113. package/dist/services/linear-mapping-service.d.ts +11 -0
  114. package/dist/services/linear-mapping-service.d.ts.map +1 -0
  115. package/dist/services/linear-mapping-service.js +220 -0
  116. package/dist/services/linear-mapping-service.js.map +1 -0
  117. package/dist/services/linear-pull-service.d.ts +137 -0
  118. package/dist/services/linear-pull-service.d.ts.map +1 -0
  119. package/dist/services/linear-pull-service.js +720 -0
  120. package/dist/services/linear-pull-service.js.map +1 -0
  121. package/dist/services/linear-push-service.d.ts +86 -0
  122. package/dist/services/linear-push-service.d.ts.map +1 -0
  123. package/dist/services/linear-push-service.js +956 -0
  124. package/dist/services/linear-push-service.js.map +1 -0
  125. package/dist/services/linear-service.d.ts +122 -0
  126. package/dist/services/linear-service.d.ts.map +1 -0
  127. package/dist/services/linear-service.js +361 -0
  128. package/dist/services/linear-service.js.map +1 -0
  129. package/dist/services/prompt-service.d.ts +19 -0
  130. package/dist/services/prompt-service.d.ts.map +1 -1
  131. package/dist/services/prompt-service.js +64 -0
  132. package/dist/services/prompt-service.js.map +1 -1
  133. package/dist/services/revise-apply-service.d.ts +55 -0
  134. package/dist/services/revise-apply-service.d.ts.map +1 -0
  135. package/dist/services/revise-apply-service.js +255 -0
  136. package/dist/services/revise-apply-service.js.map +1 -0
  137. package/dist/services/revise-cache-service.d.ts +1 -1
  138. package/dist/services/revise-cache-service.js +1 -1
  139. package/dist/services/revise-plan-service.d.ts +38 -0
  140. package/dist/services/revise-plan-service.d.ts.map +1 -0
  141. package/dist/services/revise-plan-service.js +151 -0
  142. package/dist/services/revise-plan-service.js.map +1 -0
  143. package/dist/services/revise-service.d.ts +18 -11
  144. package/dist/services/revise-service.d.ts.map +1 -1
  145. package/dist/services/revise-service.js +57 -12
  146. package/dist/services/revise-service.js.map +1 -1
  147. package/dist/services/spec-service.d.ts +292 -0
  148. package/dist/services/spec-service.d.ts.map +1 -0
  149. package/dist/services/spec-service.js +805 -0
  150. package/dist/services/spec-service.js.map +1 -0
  151. package/dist/services/template-sections.d.ts +1 -1
  152. package/dist/services/template-sections.js +1 -1
  153. package/dist/templates/backlog/backlog-item.md.hbs +3 -0
  154. package/dist/templates/quick/quick-task.md.hbs +6 -0
  155. package/dist/templates/spec/spec-shaped.md.hbs +89 -0
  156. package/dist/templates/spec/spec.md.hbs +68 -0
  157. package/dist/templates/spec/story.md.hbs +51 -0
  158. package/dist/templates/spec/task.md.hbs +98 -0
  159. package/dist/utils/constants.d.ts +18 -0
  160. package/dist/utils/constants.d.ts.map +1 -1
  161. package/dist/utils/constants.js +25 -0
  162. package/dist/utils/constants.js.map +1 -1
  163. package/dist/utils/diff.d.ts +22 -1
  164. package/dist/utils/diff.d.ts.map +1 -1
  165. package/dist/utils/diff.js +136 -1
  166. package/dist/utils/diff.js.map +1 -1
  167. package/dist/utils/markdown.d.ts +23 -0
  168. package/dist/utils/markdown.d.ts.map +1 -1
  169. package/dist/utils/markdown.js +79 -0
  170. package/dist/utils/markdown.js.map +1 -1
  171. package/package.json +3 -2
@@ -1,11 +1,9 @@
1
1
  /**
2
- * `planr revise` — core service (EPIC-003, FEAT-010 + FEAT-011).
2
+ * `planr revise` — core service.
3
3
  *
4
- * Exposes composable primitives; the CLI and future cascade service
5
- * orchestrate them. Phase 1 (FEAT-010) ships `reviseArtifact` for dry-run
6
- * decision generation; Phase 2 (FEAT-011) adds `applyDecision` for the
7
- * write path and exposes the verifier context so callers can run
8
- * `verifyDecision` against the same inputs the agent saw.
4
+ * Exposes composable primitives. `reviseArtifact` produces dry-run decisions;
5
+ * `applyDecision` writes them to disk. The verifier context is exposed so
6
+ * callers can run `verifyDecision` against the same inputs the agent saw.
9
7
  */
10
8
  import { type RevisePromptArtifact, type ReviseWritableScope } from '../ai/prompts/prompt-builder.js';
11
9
  import { type AIProvider, type AIUsage } from '../ai/types.js';
@@ -13,7 +11,7 @@ import type { ArtifactType, OpenPlanrConfig, ReviseAuditEntry, ReviseDecision }
13
11
  import type { AuditLogWriter } from './audit-log-service.js';
14
12
  import type { EvidenceVerifierContext } from './evidence-verifier.js';
15
13
  export interface ReviseArtifactOptions {
16
- /** Must be `true` in Phase 1; reserved for future write path (FEAT-011). */
14
+ /** Must be `true` in this release; reserved for future write path. */
17
15
  dryRun: true;
18
16
  /** Which parts of the artifact the agent may modify. Default: 'all'. */
19
17
  writableScope?: ReviseWritableScope;
@@ -50,12 +48,12 @@ export declare class ReviseArtifactNotFoundError extends Error {
50
48
  constructor(artifactId: string, message: string);
51
49
  }
52
50
  /**
53
- * Revise a single artifact — Phase 1 dry-run.
51
+ * Revise a single artifact (dry-run).
54
52
  *
55
53
  * Does NOT write any files. The returned decision is the agent output after
56
- * schema validation; evidence verification, diff preview, and write are all
57
- * Phase 2 responsibilities (FEAT-011). Cascade, siblings, and declared
58
- * sources are Phase 3 (FEAT-012) and onwards.
54
+ * schema validation; evidence verification, diff preview, and write live in
55
+ * the CLI / apply path. Cascade, siblings, and declared sources are future
56
+ * extensions.
59
57
  */
60
58
  export declare function reviseArtifact(projectDir: string, config: OpenPlanrConfig, provider: AIProvider, artifactId: string, options: ReviseArtifactOptions): Promise<ReviseArtifactResult>;
61
59
  export interface ApplyDecisionOptions {
@@ -88,6 +86,15 @@ export interface ApplyDecisionResult {
88
86
  * trusts that whatever decision arrives is allowed to be written.
89
87
  */
90
88
  export declare function applyDecision(options: ApplyDecisionOptions): Promise<ApplyDecisionResult>;
89
+ /**
90
+ * `true` when the agent's `revisedMarkdown` is byte-identical to `original`,
91
+ * or differs only in trailing whitespace/newlines (LLM markdown serializers
92
+ * routinely drop or add one trailing newline without changing semantics).
93
+ *
94
+ * Exported so the `--apply-from <audit>` replay path and the interactive
95
+ * UI can share the same unchanged-detection rule.
96
+ */
97
+ export declare function isEffectivelyUnchanged(original: string, revised: string | undefined): boolean;
91
98
  /**
92
99
  * Load immediate-sibling artifacts (same artifact type, same parent) as
93
100
  * prompt entries. Lazy-reads each sibling's body only if it's going to be
@@ -1 +1 @@
1
- {"version":3,"file":"revise-service.d.ts","sourceRoot":"","sources":["../../src/services/revise-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"revise-service.d.ts","sourceRoot":"","sources":["../../src/services/revise-service.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,9 @@
1
1
  /**
2
- * `planr revise` — core service (EPIC-003, FEAT-010 + FEAT-011).
2
+ * `planr revise` — core service.
3
3
  *
4
- * Exposes composable primitives; the CLI and future cascade service
5
- * orchestrate them. Phase 1 (FEAT-010) ships `reviseArtifact` for dry-run
6
- * decision generation; Phase 2 (FEAT-011) adds `applyDecision` for the
7
- * write path and exposes the verifier context so callers can run
8
- * `verifyDecision` against the same inputs the agent saw.
4
+ * Exposes composable primitives. `reviseArtifact` produces dry-run decisions;
5
+ * `applyDecision` writes them to disk. The verifier context is exposed so
6
+ * callers can run `verifyDecision` against the same inputs the agent saw.
9
7
  */
10
8
  import path from 'node:path';
11
9
  import { buildCodebaseContext, extractKeywords, formatCodebaseContext, } from '../ai/codebase/context-builder.js';
@@ -31,12 +29,12 @@ export class ReviseArtifactNotFoundError extends Error {
31
29
  }
32
30
  }
33
31
  /**
34
- * Revise a single artifact — Phase 1 dry-run.
32
+ * Revise a single artifact (dry-run).
35
33
  *
36
34
  * Does NOT write any files. The returned decision is the agent output after
37
- * schema validation; evidence verification, diff preview, and write are all
38
- * Phase 2 responsibilities (FEAT-011). Cascade, siblings, and declared
39
- * sources are Phase 3 (FEAT-012) and onwards.
35
+ * schema validation; evidence verification, diff preview, and write live in
36
+ * the CLI / apply path. Cascade, siblings, and declared sources are future
37
+ * extensions.
40
38
  */
41
39
  export async function reviseArtifact(projectDir, config, provider, artifactId, options) {
42
40
  const artifactType = findArtifactTypeById(artifactId);
@@ -84,7 +82,7 @@ export async function reviseArtifact(projectDir, config, provider, artifactId, o
84
82
  config,
85
83
  artifactDir: path.dirname(artifactPath),
86
84
  codebaseContextFormatted,
87
- knownSourceRefs: [], // Phase 2 sources loader will populate
85
+ knownSourceRefs: [], // sources loader (future extension) will populate
88
86
  knownPatternRuleIds: codebaseCtx ? codebaseCtx.patternRules.map((r) => r.name) : [],
89
87
  };
90
88
  return {
@@ -126,6 +124,17 @@ export async function applyDecision(options) {
126
124
  return { outcome: 'skipped-by-agent', wrote: false, diff: '' };
127
125
  }
128
126
  if (decision.action === 'flag') {
127
+ // When a revise → flag demotion happened upstream, `revisedMarkdown`
128
+ // still holds the agent's proposed rewrite. Include the would-have-been
129
+ // diff in the audit entry so users can see what was rejected and decide
130
+ // whether to hand-apply it.
131
+ const proposedDiff = decision.revisedMarkdown
132
+ ? renderDiff(originalContent, decision.revisedMarkdown, {
133
+ color: false,
134
+ oldLabel: `${decision.artifactId} (before)`,
135
+ newLabel: `${decision.artifactId} (proposed — REJECTED by verifier)`,
136
+ })
137
+ : undefined;
129
138
  audit.appendEntry({
130
139
  artifactId: decision.artifactId,
131
140
  artifactPath,
@@ -134,9 +143,10 @@ export async function applyDecision(options) {
134
143
  evidence: decision.evidence,
135
144
  ambiguous: decision.ambiguous,
136
145
  cascadeLevel: options.cascadeLevel,
146
+ ...(proposedDiff ? { diff: proposedDiff } : {}),
137
147
  timestamp,
138
148
  });
139
- return { outcome: 'flagged', wrote: false, diff: '' };
149
+ return { outcome: 'flagged', wrote: false, diff: proposedDiff ?? '' };
140
150
  }
141
151
  // action === 'revise'
142
152
  const diff = decision.revisedMarkdown
@@ -146,6 +156,26 @@ export async function applyDecision(options) {
146
156
  newLabel: `${decision.artifactId} (proposed)`,
147
157
  })
148
158
  : '';
159
+ // Short-circuit: if the agent returned content that is effectively
160
+ // identical to the original (byte-exact, or only trailing-whitespace
161
+ // differences from markdown serializer normalization), skip the write
162
+ // and report `unchanged-by-agent`. Prevents the "Proposed diff: <empty>
163
+ // → applied" UX bug where a trivial newline-strip got reported as a
164
+ // successful revise even though the agent explicitly said the artifact
165
+ // was already well-structured.
166
+ if (isEffectivelyUnchanged(originalContent, decision.revisedMarkdown)) {
167
+ audit.appendEntry({
168
+ artifactId: decision.artifactId,
169
+ artifactPath,
170
+ outcome: 'unchanged-by-agent',
171
+ rationale: decision.rationale,
172
+ evidence: decision.evidence,
173
+ ambiguous: decision.ambiguous,
174
+ cascadeLevel: options.cascadeLevel,
175
+ timestamp,
176
+ });
177
+ return { outcome: 'unchanged-by-agent', wrote: false, diff: '' };
178
+ }
149
179
  if (dryRun) {
150
180
  audit.appendEntry({
151
181
  artifactId: decision.artifactId,
@@ -176,6 +206,21 @@ export async function applyDecision(options) {
176
206
  });
177
207
  return { outcome: 'applied', wrote: true, diff };
178
208
  }
209
+ /**
210
+ * `true` when the agent's `revisedMarkdown` is byte-identical to `original`,
211
+ * or differs only in trailing whitespace/newlines (LLM markdown serializers
212
+ * routinely drop or add one trailing newline without changing semantics).
213
+ *
214
+ * Exported so the `--apply-from <audit>` replay path and the interactive
215
+ * UI can share the same unchanged-detection rule.
216
+ */
217
+ export function isEffectivelyUnchanged(original, revised) {
218
+ if (revised === undefined)
219
+ return true;
220
+ if (revised === original)
221
+ return true;
222
+ return revised.replace(/\s+$/, '') === original.replace(/\s+$/, '');
223
+ }
179
224
  /**
180
225
  * Load immediate-sibling artifacts (same artifact type, same parent) as
181
226
  * prompt entries. Lazy-reads each sibling's body only if it's going to be
@@ -1 +1 @@
1
- {"version":3,"file":"revise-service.js","sourceRoot":"","sources":["../../src/services/revise-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"revise-service.js","sourceRoot":"","sources":["../../src/services/revise-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * spec-service — directory-aware CRUD for spec-driven planning mode.
3
+ *
4
+ * Unlike agile/QT artifacts which are flat single files, each spec is a
5
+ * **self-contained directory** (per BL-011 addendum + design doc):
6
+ *
7
+ * .planr/specs/SPEC-NNN-{slug}/
8
+ * ├── SPEC-NNN-{slug}.md ← the spec document
9
+ * ├── design/ ← UI mockups + design-spec.md (if any)
10
+ * │ ├── *.png
11
+ * │ └── design-spec.md ← reserved path (written by openplanr-pipeline's designer-agent)
12
+ * ├── stories/
13
+ * │ └── US-NNN-{slug}.md ← US-NNN scoped to this spec
14
+ * └── tasks/
15
+ * └── T-NNN-{slug}.md ← T-NNN scoped to this spec
16
+ *
17
+ * Why directory-per-spec:
18
+ * - Self-contained / portable / `rm -rf` clean
19
+ * - `PREFIX-NNN-slug` naming consistent with every other planr artifact
20
+ * - US-NNN and T-NNN are SCOPED TO THE PARENT SPEC (not project-globally
21
+ * unique). Two specs can each have their own US-001. Disambiguation is
22
+ * via the path or via `specId` frontmatter.
23
+ * - Schema matches openplanr-pipeline plugin verbatim — both products
24
+ * share one contract. See https://github.com/openplanr/openplanr-pipeline
25
+ *
26
+ * This service owns spec authoring inside the planr CLI. The
27
+ * openplanr-pipeline plugin is the executor: it reads `.planr/specs/` (when
28
+ * spec mode is active) and runs the PO/DEV phases to ship code.
29
+ */
30
+ import type { OpenPlanrConfig } from '../models/types.js';
31
+ /** Root directory holding all specs (e.g., `.planr/specs/`). */
32
+ export declare function getSpecsRootDir(projectDir: string, config: OpenPlanrConfig): string;
33
+ /** Self-contained directory for a single spec, e.g. `.planr/specs/SPEC-001-auth-flow/`. */
34
+ export declare function getSpecDir(projectDir: string, config: OpenPlanrConfig, specId: string, slug: string): string;
35
+ /** Stories subdirectory inside a spec. */
36
+ export declare function getSpecStoriesDir(specDir: string): string;
37
+ /** Tasks subdirectory inside a spec. */
38
+ export declare function getSpecTasksDir(specDir: string): string;
39
+ /** Design assets subdirectory inside a spec (PNGs + design-spec.md). */
40
+ export declare function getSpecDesignDir(specDir: string): string;
41
+ /**
42
+ * Resolve a spec ID (e.g. `SPEC-001`) to its on-disk directory by scanning
43
+ * `.planr/specs/` for a matching `SPEC-NNN-{slug}` directory. Returns null
44
+ * if the spec isn't found.
45
+ *
46
+ * The directory name encodes both ID and slug, so we don't need to read the
47
+ * spec file to find it.
48
+ */
49
+ export declare function resolveSpecDir(projectDir: string, config: OpenPlanrConfig, specId: string): Promise<{
50
+ dir: string;
51
+ slug: string;
52
+ } | null>;
53
+ /** Spec metadata returned by listSpecs. */
54
+ export interface SpecListing {
55
+ id: string;
56
+ slug: string;
57
+ title: string;
58
+ status: string;
59
+ dirName: string;
60
+ storyCount: number;
61
+ taskCount: number;
62
+ }
63
+ /**
64
+ * List every spec under `.planr/specs/`.
65
+ * Reads each spec's frontmatter for title + status; counts stories + tasks.
66
+ */
67
+ export declare function listSpecs(projectDir: string, config: OpenPlanrConfig): Promise<SpecListing[]>;
68
+ export interface CreateSpecOptions {
69
+ /** Optional explicit slug (kebab-case). If omitted, derived from title. */
70
+ slug?: string;
71
+ /** Priority (P0 / P1 / P2). Defaults to P1. */
72
+ priority?: string;
73
+ /** Milestone string (e.g., `v1.0`). */
74
+ milestone?: string;
75
+ /** Author handle. */
76
+ po?: string;
77
+ }
78
+ /**
79
+ * Create a new spec directory + spec file from the template.
80
+ * Returns the assigned ID and the absolute file path of the spec markdown.
81
+ *
82
+ * Refuses if a directory with the same slug already exists, to avoid
83
+ * accidental overwrites.
84
+ */
85
+ export declare function createSpec(projectDir: string, config: OpenPlanrConfig, title: string, options?: CreateSpecOptions): Promise<{
86
+ id: string;
87
+ slug: string;
88
+ specDir: string;
89
+ specFile: string;
90
+ }>;
91
+ export interface SpecArtifact {
92
+ id: string;
93
+ slug: string;
94
+ specDir: string;
95
+ specFile: string;
96
+ data: Record<string, unknown>;
97
+ content: string;
98
+ }
99
+ export declare function readSpec(projectDir: string, config: OpenPlanrConfig, specId: string): Promise<SpecArtifact | null>;
100
+ /** Overwrite the spec markdown file in place. Atomic. */
101
+ export declare function updateSpec(projectDir: string, config: OpenPlanrConfig, specId: string, content: string): Promise<void>;
102
+ /**
103
+ * Surgical YAML frontmatter update for a spec.
104
+ * Mirrors artifact-service.updateArtifactFields shape.
105
+ */
106
+ export declare function updateSpecFields(projectDir: string, config: OpenPlanrConfig, specId: string, fields: Partial<Record<string, unknown>>): Promise<void>;
107
+ export interface SyncSpecReport {
108
+ specId: string;
109
+ specSlug: string;
110
+ /** Issues that were auto-repaired (file was rewritten). */
111
+ fixed: string[];
112
+ /** Issues that need human attention (orphans, schema drift, etc.). */
113
+ warnings: string[];
114
+ }
115
+ /**
116
+ * Validate one spec's internal integrity and repair safe inconsistencies.
117
+ *
118
+ * Checks performed:
119
+ * 1. Orphaned task: `task.storyId` doesn't match any existing US in the same
120
+ * spec → WARN (don't auto-delete; user reviews and either fixes the
121
+ * storyId or destroys the task)
122
+ * 2. Story without tasks: WARN (decomposition is incomplete)
123
+ * 3. Missing `specId` in US/Task frontmatter → AUTO-FIX from path
124
+ * 4. Schema version mismatch (artifact's schemaVersion older than current)
125
+ * → WARN (no auto-migration in v1; flagged for follow-up)
126
+ *
127
+ * Note: this is a *read-mostly* operation. The only writes happen in case 3
128
+ * (adding a missing `specId` field via updateSpecFields-equivalent); all
129
+ * other findings are reported as warnings so the user controls the fix.
130
+ *
131
+ * `dryRun: true` skips writes entirely; only report.
132
+ */
133
+ export declare function syncSpec(projectDir: string, config: OpenPlanrConfig, specId: string, opts?: {
134
+ dryRun?: boolean;
135
+ }): Promise<SyncSpecReport>;
136
+ /**
137
+ * Run syncSpec across every spec in the project.
138
+ * Aggregates per-spec reports.
139
+ */
140
+ export declare function syncAllSpecs(projectDir: string, config: OpenPlanrConfig, opts?: {
141
+ dryRun?: boolean;
142
+ }): Promise<{
143
+ specsScanned: number;
144
+ reports: SyncSpecReport[];
145
+ }>;
146
+ export interface DecomposeSpecOptions {
147
+ /** When true, overwrite existing US/Task files. Default false. */
148
+ force?: boolean;
149
+ /**
150
+ * When true, skip the codebase scanner. Faster but generated tasks
151
+ * reference generic paths the user must edit afterwards.
152
+ */
153
+ noCodeContext?: boolean;
154
+ /** Cap the number of stories the AI emits (1-8, default 6 from prompt). */
155
+ maxStories?: number;
156
+ }
157
+ export interface DecomposeSpecResult {
158
+ storiesCreated: number;
159
+ tasksCreated: number;
160
+ decompositionNotes: string;
161
+ }
162
+ /**
163
+ * Decompose a SPEC into User Stories + Tasks via AI.
164
+ *
165
+ * High-level flow:
166
+ * 1. Read the spec; refuse if stories/ or tasks/ already populated
167
+ * (unless `opts.force === true`)
168
+ * 2. Read `input/tech/stack.md` (best-effort; passed as a hint to the AI)
169
+ * 3. Build codebase context via planr's existing scanner (skipped if
170
+ * `opts.noCodeContext === true`)
171
+ * 4. Build prompt + call AI provider via `generateStreamingJSON`
172
+ * 5. Validate the response with `aiSpecDecomposeResponseSchema`
173
+ * 6. Write each US via `createSpecStory` and each Task via `createSpecTask`
174
+ * 7. Update SPEC frontmatter status: pending|shaping → decomposing → decomposed
175
+ */
176
+ export declare function decomposeSpec(projectDir: string, config: OpenPlanrConfig, specId: string, opts?: DecomposeSpecOptions): Promise<DecomposeSpecResult>;
177
+ /**
178
+ * Answers gathered by `planr spec shape` from the PO.
179
+ *
180
+ * The shape command captures four areas: business context, functional
181
+ * requirements, business rules / constraints, and acceptance criteria.
182
+ * `decompositionNotes` is optional — hints for `planr spec decompose` later.
183
+ */
184
+ export interface ShapeSpecAnswers {
185
+ context: string;
186
+ functionalRequirements: string[];
187
+ businessRules?: string;
188
+ outOfScope?: string[];
189
+ acceptanceCriteria: string[];
190
+ decompositionNotes?: string;
191
+ }
192
+ /**
193
+ * Re-render the SPEC body from a structured set of answers and write it back
194
+ * atomically. Preserves frontmatter values that the user (or `planr spec
195
+ * create`) already set: priority, milestone, po, ui_files, created, etc.
196
+ *
197
+ * Updates `status` to `shaping` so subsequent commands (`decompose`, `promote`)
198
+ * can see the spec has moved past the initial empty placeholder body.
199
+ */
200
+ export declare function shapeSpec(projectDir: string, config: OpenPlanrConfig, specId: string, answers: ShapeSpecAnswers): Promise<{
201
+ specFile: string;
202
+ }>;
203
+ /**
204
+ * Destroy a spec directory. Self-contained = single `rm -rf` of the
205
+ * spec's own directory. Stories and tasks are removed atomically with the
206
+ * spec. No cross-spec references to clean up.
207
+ */
208
+ export declare function destroySpec(projectDir: string, config: OpenPlanrConfig, specId: string): Promise<void>;
209
+ export interface SpecStoryListing {
210
+ id: string;
211
+ slug: string;
212
+ title: string;
213
+ status: string;
214
+ filename: string;
215
+ filePath: string;
216
+ }
217
+ /**
218
+ * List US-NNN files inside a spec's stories/ subdirectory.
219
+ * Returns IDs scoped to this spec — two specs can each have US-001.
220
+ */
221
+ export declare function listSpecStories(specDir: string): Promise<SpecStoryListing[]>;
222
+ /** Append a US-NNN-{slug}.md file under the spec's stories/ directory. */
223
+ export declare function createSpecStory(projectDir: string, config: OpenPlanrConfig, specId: string, title: string, body: {
224
+ roleAction: string;
225
+ benefit: string;
226
+ scope?: string;
227
+ acceptanceCriteria?: string[];
228
+ }): Promise<{
229
+ id: string;
230
+ slug: string;
231
+ filePath: string;
232
+ }>;
233
+ export interface SpecTaskListing {
234
+ id: string;
235
+ slug: string;
236
+ title: string;
237
+ status: string;
238
+ type: string;
239
+ agent: string;
240
+ storyId: string;
241
+ filename: string;
242
+ filePath: string;
243
+ }
244
+ /**
245
+ * List T-NNN files inside a spec's tasks/ subdirectory.
246
+ */
247
+ export declare function listSpecTasks(specDir: string): Promise<SpecTaskListing[]>;
248
+ export interface CreateSpecTaskInput {
249
+ storyId: string;
250
+ title: string;
251
+ type: 'UI' | 'Tech';
252
+ agent: string;
253
+ filesCreate?: string[];
254
+ filesModify?: string[];
255
+ filesPreserve?: string[];
256
+ objective?: string;
257
+ technicalSpec?: string;
258
+ testRequirements?: string;
259
+ }
260
+ /** Create a new T-NNN task file under the spec's tasks/ directory. */
261
+ export declare function createSpecTask(projectDir: string, config: OpenPlanrConfig, specId: string, input: CreateSpecTaskInput): Promise<{
262
+ id: string;
263
+ slug: string;
264
+ filePath: string;
265
+ }>;
266
+ /**
267
+ * Copy PNG mockup files into a spec's design/ directory. Updates the
268
+ * spec frontmatter `ui_files` to list the copied filenames.
269
+ */
270
+ export declare function attachSpecDesigns(projectDir: string, config: OpenPlanrConfig, specId: string, pngPaths: string[]): Promise<{
271
+ copied: string[];
272
+ designDir: string;
273
+ }>;
274
+ /**
275
+ * Snapshot of all specs + their decomposition state. Used by `planr spec status`.
276
+ */
277
+ export interface SpecStatusReport {
278
+ specCount: number;
279
+ specs: SpecListing[];
280
+ totalStories: number;
281
+ totalTasks: number;
282
+ }
283
+ export declare function getSpecStatus(projectDir: string, config: OpenPlanrConfig): Promise<SpecStatusReport>;
284
+ /**
285
+ * Validate that a spec is ready to hand off to openplanr-pipeline.
286
+ * Returns the list of issues, or empty array if ready.
287
+ */
288
+ export declare function validateSpecForPromotion(projectDir: string, config: OpenPlanrConfig, specId: string): Promise<{
289
+ ready: boolean;
290
+ issues: string[];
291
+ }>;
292
+ //# sourceMappingURL=spec-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-service.d.ts","sourceRoot":"","sources":["../../src/services/spec-service.ts"],"names":[],"mappings":"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"}