openplanr 1.2.7 → 1.3.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 (164) hide show
  1. package/README.md +41 -4
  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 +48 -0
  6. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  7. package/dist/ai/prompts/prompt-builder.js +57 -1
  8. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  9. package/dist/ai/prompts/system-prompts.d.ts +24 -1
  10. package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
  11. package/dist/ai/prompts/system-prompts.js +104 -6
  12. package/dist/ai/prompts/system-prompts.js.map +1 -1
  13. package/dist/ai/schemas/ai-response-schemas.d.ts +68 -0
  14. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
  15. package/dist/ai/schemas/ai-response-schemas.js +81 -0
  16. package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
  17. package/dist/ai/types.d.ts +2 -0
  18. package/dist/ai/types.d.ts.map +1 -1
  19. package/dist/ai/types.js +4 -0
  20. package/dist/ai/types.js.map +1 -1
  21. package/dist/cli/commands/backlog.d.ts +12 -0
  22. package/dist/cli/commands/backlog.d.ts.map +1 -1
  23. package/dist/cli/commands/backlog.js +88 -2
  24. package/dist/cli/commands/backlog.js.map +1 -1
  25. package/dist/cli/commands/config.d.ts.map +1 -1
  26. package/dist/cli/commands/config.js +8 -2
  27. package/dist/cli/commands/config.js.map +1 -1
  28. package/dist/cli/commands/linear.d.ts +8 -0
  29. package/dist/cli/commands/linear.d.ts.map +1 -0
  30. package/dist/cli/commands/linear.js +550 -0
  31. package/dist/cli/commands/linear.js.map +1 -0
  32. package/dist/cli/commands/quick.d.ts +17 -0
  33. package/dist/cli/commands/quick.d.ts.map +1 -1
  34. package/dist/cli/commands/quick.js +31 -15
  35. package/dist/cli/commands/quick.js.map +1 -1
  36. package/dist/cli/commands/revise.d.ts +24 -0
  37. package/dist/cli/commands/revise.d.ts.map +1 -0
  38. package/dist/cli/commands/revise.js +570 -0
  39. package/dist/cli/commands/revise.js.map +1 -0
  40. package/dist/cli/index.js +4 -0
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/models/schema.d.ts +43 -0
  43. package/dist/models/schema.d.ts.map +1 -1
  44. package/dist/models/schema.js +49 -0
  45. package/dist/models/schema.js.map +1 -1
  46. package/dist/models/types.d.ts +296 -0
  47. package/dist/models/types.d.ts.map +1 -1
  48. package/dist/services/artifact-gathering.d.ts +4 -0
  49. package/dist/services/artifact-gathering.d.ts.map +1 -1
  50. package/dist/services/artifact-gathering.js +1 -1
  51. package/dist/services/artifact-gathering.js.map +1 -1
  52. package/dist/services/artifact-service.d.ts +12 -1
  53. package/dist/services/artifact-service.d.ts.map +1 -1
  54. package/dist/services/artifact-service.js +49 -6
  55. package/dist/services/artifact-service.js.map +1 -1
  56. package/dist/services/atomic-write-service.d.ts +41 -0
  57. package/dist/services/atomic-write-service.d.ts.map +1 -0
  58. package/dist/services/atomic-write-service.js +87 -0
  59. package/dist/services/atomic-write-service.js.map +1 -0
  60. package/dist/services/audit-log-service.d.ts +47 -0
  61. package/dist/services/audit-log-service.d.ts.map +1 -0
  62. package/dist/services/audit-log-service.js +210 -0
  63. package/dist/services/audit-log-service.js.map +1 -0
  64. package/dist/services/cascade-service.d.ts +62 -0
  65. package/dist/services/cascade-service.d.ts.map +1 -0
  66. package/dist/services/cascade-service.js +189 -0
  67. package/dist/services/cascade-service.js.map +1 -0
  68. package/dist/services/credentials-service.js +2 -2
  69. package/dist/services/credentials-service.js.map +1 -1
  70. package/dist/services/diff-service.d.ts +18 -0
  71. package/dist/services/diff-service.d.ts.map +1 -0
  72. package/dist/services/diff-service.js +35 -0
  73. package/dist/services/diff-service.js.map +1 -0
  74. package/dist/services/evidence-verifier.d.ts +71 -0
  75. package/dist/services/evidence-verifier.d.ts.map +1 -0
  76. package/dist/services/evidence-verifier.js +174 -0
  77. package/dist/services/evidence-verifier.js.map +1 -0
  78. package/dist/services/git-service.d.ts +60 -0
  79. package/dist/services/git-service.d.ts.map +1 -0
  80. package/dist/services/git-service.js +137 -0
  81. package/dist/services/git-service.js.map +1 -0
  82. package/dist/services/graph-integrity.d.ts +35 -0
  83. package/dist/services/graph-integrity.d.ts.map +1 -0
  84. package/dist/services/graph-integrity.js +53 -0
  85. package/dist/services/graph-integrity.js.map +1 -0
  86. package/dist/services/linear/body-formatters.d.ts +69 -0
  87. package/dist/services/linear/body-formatters.d.ts.map +1 -0
  88. package/dist/services/linear/body-formatters.js +183 -0
  89. package/dist/services/linear/body-formatters.js.map +1 -0
  90. package/dist/services/linear/constants.d.ts +61 -0
  91. package/dist/services/linear/constants.d.ts.map +1 -0
  92. package/dist/services/linear/constants.js +84 -0
  93. package/dist/services/linear/constants.js.map +1 -0
  94. package/dist/services/linear/errors.d.ts +14 -0
  95. package/dist/services/linear/errors.d.ts.map +1 -0
  96. package/dist/services/linear/errors.js +106 -0
  97. package/dist/services/linear/errors.js.map +1 -0
  98. package/dist/services/linear/estimate-resolver.d.ts +50 -0
  99. package/dist/services/linear/estimate-resolver.d.ts.map +1 -0
  100. package/dist/services/linear/estimate-resolver.js +82 -0
  101. package/dist/services/linear/estimate-resolver.js.map +1 -0
  102. package/dist/services/linear/plan-builders.d.ts +64 -0
  103. package/dist/services/linear/plan-builders.d.ts.map +1 -0
  104. package/dist/services/linear/plan-builders.js +237 -0
  105. package/dist/services/linear/plan-builders.js.map +1 -0
  106. package/dist/services/linear/scope-loaders.d.ts +79 -0
  107. package/dist/services/linear/scope-loaders.d.ts.map +1 -0
  108. package/dist/services/linear/scope-loaders.js +227 -0
  109. package/dist/services/linear/scope-loaders.js.map +1 -0
  110. package/dist/services/linear/strategy-context.d.ts +66 -0
  111. package/dist/services/linear/strategy-context.d.ts.map +1 -0
  112. package/dist/services/linear/strategy-context.js +121 -0
  113. package/dist/services/linear/strategy-context.js.map +1 -0
  114. package/dist/services/linear-mapping-service.d.ts +11 -0
  115. package/dist/services/linear-mapping-service.d.ts.map +1 -0
  116. package/dist/services/linear-mapping-service.js +220 -0
  117. package/dist/services/linear-mapping-service.js.map +1 -0
  118. package/dist/services/linear-pull-service.d.ts +137 -0
  119. package/dist/services/linear-pull-service.d.ts.map +1 -0
  120. package/dist/services/linear-pull-service.js +720 -0
  121. package/dist/services/linear-pull-service.js.map +1 -0
  122. package/dist/services/linear-push-service.d.ts +86 -0
  123. package/dist/services/linear-push-service.d.ts.map +1 -0
  124. package/dist/services/linear-push-service.js +956 -0
  125. package/dist/services/linear-push-service.js.map +1 -0
  126. package/dist/services/linear-service.d.ts +122 -0
  127. package/dist/services/linear-service.d.ts.map +1 -0
  128. package/dist/services/linear-service.js +361 -0
  129. package/dist/services/linear-service.js.map +1 -0
  130. package/dist/services/prompt-service.d.ts +37 -0
  131. package/dist/services/prompt-service.d.ts.map +1 -1
  132. package/dist/services/prompt-service.js +111 -0
  133. package/dist/services/prompt-service.js.map +1 -1
  134. package/dist/services/revise-apply-service.d.ts +55 -0
  135. package/dist/services/revise-apply-service.d.ts.map +1 -0
  136. package/dist/services/revise-apply-service.js +255 -0
  137. package/dist/services/revise-apply-service.js.map +1 -0
  138. package/dist/services/revise-cache-service.d.ts +46 -0
  139. package/dist/services/revise-cache-service.d.ts.map +1 -0
  140. package/dist/services/revise-cache-service.js +88 -0
  141. package/dist/services/revise-cache-service.js.map +1 -0
  142. package/dist/services/revise-plan-service.d.ts +38 -0
  143. package/dist/services/revise-plan-service.d.ts.map +1 -0
  144. package/dist/services/revise-plan-service.js +151 -0
  145. package/dist/services/revise-plan-service.js.map +1 -0
  146. package/dist/services/revise-service.d.ts +115 -0
  147. package/dist/services/revise-service.d.ts.map +1 -0
  148. package/dist/services/revise-service.js +294 -0
  149. package/dist/services/revise-service.js.map +1 -0
  150. package/dist/services/template-sections.d.ts +28 -0
  151. package/dist/services/template-sections.d.ts.map +1 -0
  152. package/dist/services/template-sections.js +55 -0
  153. package/dist/services/template-sections.js.map +1 -0
  154. package/dist/templates/backlog/backlog-item.md.hbs +3 -0
  155. package/dist/templates/quick/quick-task.md.hbs +6 -0
  156. package/dist/utils/diff.d.ts +47 -0
  157. package/dist/utils/diff.d.ts.map +1 -0
  158. package/dist/utils/diff.js +278 -0
  159. package/dist/utils/diff.js.map +1 -0
  160. package/dist/utils/markdown.d.ts +23 -0
  161. package/dist/utils/markdown.d.ts.map +1 -1
  162. package/dist/utils/markdown.js +79 -0
  163. package/dist/utils/markdown.js.map +1 -1
  164. package/package.json +3 -2
@@ -0,0 +1,570 @@
1
+ /**
2
+ * `planr revise` command.
3
+ *
4
+ * Runs the revise safety pipeline for a single artifact or a cascade:
5
+ *
6
+ * 1. **Clean-tree gate** — unless --allow-dirty.
7
+ * 2. **Agent decision** — per artifact.
8
+ * 3. **Evidence verification** — unverifiable evidence
9
+ * is dropped; revise → flag demotion when nothing survives.
10
+ * 4. **Diff preview + confirmation** — per artifact.
11
+ * 5. **Atomic write + audit log**.
12
+ *
13
+ * In `--cascade` mode, the cascade service drives the pipeline
14
+ * top-down (epic → features → stories → tasks). Children always see the
15
+ * *revised* parent because they are loaded fresh from disk between steps.
16
+ * `[q]uit` and SIGINT stop the cascade gracefully — already-applied
17
+ * artifacts stay applied, audit entries flush immediately.
18
+ *
19
+ * The `--all` flag + post-flight rollback extension layers on top of this
20
+ * command.
21
+ */
22
+ import path from 'node:path';
23
+ import chalk from 'chalk';
24
+ import { getAIProvider, isAIConfigured } from '../../services/ai-service.js';
25
+ import { findArtifactTypeById, listArtifacts, readArtifactRaw, } from '../../services/artifact-service.js';
26
+ import { createAuditLogWriter } from '../../services/audit-log-service.js';
27
+ import { buildCascadeOrder, executeCascade } from '../../services/cascade-service.js';
28
+ import { loadConfig } from '../../services/config-service.js';
29
+ import { renderDiff } from '../../services/diff-service.js';
30
+ import { verifyDecision } from '../../services/evidence-verifier.js';
31
+ import { checkCleanTree, checkoutPaths } from '../../services/git-service.js';
32
+ import { checkGraphIntegrity } from '../../services/graph-integrity.js';
33
+ import { confirmBulkRevise, promptReviseConfirm, promptText, } from '../../services/prompt-service.js';
34
+ import { hashArtifactContent, loadCache, recordOutcome, saveCache, shouldSkipArtifact, } from '../../services/revise-cache-service.js';
35
+ import { applyDecision, isEffectivelyUnchanged, ReviseArtifactNotFoundError, reviseArtifact, } from '../../services/revise-service.js';
36
+ import { display, logger } from '../../utils/logger.js';
37
+ const WRITABLE_SCOPES = ['prose', 'references', 'paths', 'all'];
38
+ const AUDIT_FORMATS = ['md', 'json'];
39
+ const DEFAULT_MAX_WRITES_PER_RUN = 50;
40
+ export function registerReviseCommand(program) {
41
+ program
42
+ .command('revise')
43
+ .description('AI-driven revision of planning artifacts against codebase reality')
44
+ .argument('[artifactId]', 'artifact ID (e.g., EPIC-001, FEAT-002, US-003, TASK-004). Omit and pass --all to revise every epic in the project.')
45
+ .option('--dry-run', 'do not write files; still emit an audit log with would-apply entries', false)
46
+ .option('--yes', 'skip per-artifact confirmation menu (still requires typed-YES in TTY)', false)
47
+ .option('--allow-dirty', 'run even with uncommitted changes (post-flight rollback cannot restore them)', false)
48
+ .option('--cascade', 'revise this artifact and its descendants top-down (epic → features → stories → tasks)', false)
49
+ .option('--no-cascade', 'explicitly disable cascade (overrides --cascade)')
50
+ .option('--all', 'revise every epic in the project top-down; mutually exclusive with artifactId', false)
51
+ .option('--max-writes-per-run <n>', `hard cap on writes performed in one run; exceeding this aborts with partial audit log (default: ${DEFAULT_MAX_WRITES_PER_RUN})`, (v) => parseInt(v, 10), DEFAULT_MAX_WRITES_PER_RUN)
52
+ .option('--scope-to <scope>', `which parts of the artifact the agent may modify: ${WRITABLE_SCOPES.join(', ')}`, 'all')
53
+ .option('--no-code-context', 'skip codebase context assembly (fast mode)')
54
+ .option('--no-sibling-context', 'skip immediate-sibling context gathering')
55
+ .option('--audit <path>', 'override the default audit log path')
56
+ .option('--audit-format <format>', `audit log format: ${AUDIT_FORMATS.join(', ')}`, 'md')
57
+ .option('--apply-from <report-path>', 'replay an existing dry-run audit report to disk without any model calls. Supports --dry-run for previewing the replay; ignores --cascade, --all, and AI flags; other safety gates (clean-tree, atomic write, graph integrity) still run.')
58
+ .action(async (artifactId, opts) => {
59
+ const projectDir = program.opts().projectDir;
60
+ const config = await loadConfig(projectDir);
61
+ // apply-from-audit short-circuits the whole AI pipeline.
62
+ // Runs before all AI-path validation because this mode makes no model calls.
63
+ if (opts.applyFrom) {
64
+ const { runApplyFromAudit } = await import('../../services/revise-apply-service.js');
65
+ const exitCode = await runApplyFromAudit({
66
+ projectDir,
67
+ config,
68
+ auditPath: opts.applyFrom,
69
+ allowDirty: opts.allowDirty,
70
+ dryRun: opts.dryRun,
71
+ yes: opts.yes,
72
+ });
73
+ process.exit(exitCode);
74
+ }
75
+ // Mutually-exclusive: --all vs explicit artifact id.
76
+ if (opts.all && artifactId) {
77
+ logger.error('Cannot combine --all with an explicit artifact id. Pass one or the other.');
78
+ process.exit(1);
79
+ }
80
+ if (!opts.all && !artifactId) {
81
+ logger.error('Missing required artifact id. Pass an id (e.g. EPIC-001) or use --all to revise every epic.');
82
+ process.exit(1);
83
+ }
84
+ if (!isAIConfigured(config)) {
85
+ logger.error('AI not configured. Run `planr config set-provider` to enable AI.');
86
+ logger.dim('Unlike refine, revise has no deterministic-only fallback — it must call an AI provider.');
87
+ process.exit(1);
88
+ }
89
+ if (!WRITABLE_SCOPES.includes(opts.scopeTo)) {
90
+ logger.error(`Invalid --scope-to: "${opts.scopeTo}". Expected one of: ${WRITABLE_SCOPES.join(', ')}`);
91
+ process.exit(1);
92
+ }
93
+ if (!AUDIT_FORMATS.includes(opts.auditFormat)) {
94
+ logger.error(`Invalid --audit-format: "${opts.auditFormat}". Expected one of: ${AUDIT_FORMATS.join(', ')}`);
95
+ process.exit(1);
96
+ }
97
+ if (!Number.isFinite(opts.maxWritesPerRun) || opts.maxWritesPerRun < 1) {
98
+ logger.error(`Invalid --max-writes-per-run: must be a positive integer.`);
99
+ process.exit(1);
100
+ }
101
+ const rootType = artifactId ? findArtifactTypeById(artifactId) : undefined;
102
+ if (artifactId && !rootType) {
103
+ logger.error(`Cannot determine artifact type from ID: ${artifactId}`);
104
+ logger.dim('Expected format: EPIC-001, FEAT-001, US-001, TASK-001');
105
+ process.exit(1);
106
+ }
107
+ const writableScope = opts.scopeTo;
108
+ const auditFormat = opts.auditFormat;
109
+ // --- Layer 1: clean-tree gate --------------------------------------
110
+ const treeCheck = await checkCleanTree(projectDir, { allowDirty: opts.allowDirty });
111
+ if (!treeCheck.ok) {
112
+ logger.error(treeCheck.message);
113
+ process.exit(1);
114
+ }
115
+ if (treeCheck.status.kind !== 'clean') {
116
+ logger.warn(treeCheck.message);
117
+ }
118
+ // --- Bulk confirmation: typed-YES in TTY, flag-only in CI ----------
119
+ if (opts.yes && !opts.dryRun) {
120
+ const summary = await buildBulkConfirmationSummary(artifactId, opts, projectDir, config);
121
+ const confirmed = await confirmBulkRevise(summary);
122
+ if (!confirmed) {
123
+ logger.dim('Confirmation declined — exiting without changes.');
124
+ process.exit(0);
125
+ }
126
+ }
127
+ const scope = opts.all ? 'all' : artifactId;
128
+ const writer = createAuditLogWriter({
129
+ projectDir,
130
+ scope,
131
+ cascade: opts.cascade || opts.all,
132
+ dryRun: opts.dryRun,
133
+ format: auditFormat,
134
+ overridePath: opts.audit,
135
+ });
136
+ logger.dim(`Audit log: ${writer.path}`);
137
+ // SIGINT guard: if the user Ctrl+Cs during a diff preview prompt (or at
138
+ // any other point before the run completes), close the audit log with
139
+ // an `interrupted: sigint` footer so the on-disk record is consistent.
140
+ // Installed once; removed in the finally block below.
141
+ let sigintFired = false;
142
+ const onSigint = () => {
143
+ if (sigintFired)
144
+ return; // defend against repeated signals
145
+ sigintFired = true;
146
+ try {
147
+ writer.close({ interrupted: { reason: 'sigint', atArtifactId: scope } });
148
+ }
149
+ catch {
150
+ // best-effort — process is exiting regardless
151
+ }
152
+ logger.warn('\nSIGINT received — audit log closed. Exiting.');
153
+ // 128 + signal number (SIGINT = 2) is the shell convention for signal exits.
154
+ process.exit(130);
155
+ };
156
+ process.once('SIGINT', onSigint);
157
+ logger.heading(`Revise ${scope}${opts.cascade || opts.all ? ' (cascade)' : ''} (${opts.dryRun ? 'dry-run' : 'apply'})`);
158
+ const preFlightHeadPaths = await collectCandidateArtifactPaths(projectDir, config);
159
+ try {
160
+ const provider = await getAIProvider(config);
161
+ if (opts.all) {
162
+ await runAll(projectDir, config, provider, opts, writableScope, writer);
163
+ }
164
+ else if (opts.cascade) {
165
+ await runCascade(projectDir, config, provider, rootType, artifactId, opts, writableScope, writer);
166
+ }
167
+ else {
168
+ await runSingle(projectDir, config, provider, artifactId, opts, writableScope, writer);
169
+ }
170
+ // --- Post-flight graph integrity + rollback
171
+ if (!opts.dryRun) {
172
+ const report = await checkGraphIntegrity(projectDir, config);
173
+ if (!report.ok) {
174
+ logger.error(`Post-flight graph integrity broken: ${report.issues.length} broken parent/child link(s).`);
175
+ for (const issue of report.issues) {
176
+ logger.dim(` · ${issue.childType} ${issue.childId} → ${issue.parentField}=${issue.parentId} (${issue.reason})`);
177
+ }
178
+ if (opts.allowDirty) {
179
+ logger.warn('Rollback disabled (--allow-dirty was passed; pre-run state may not match git HEAD).');
180
+ }
181
+ else {
182
+ logger.warn('Triggering post-flight rollback via `git checkout`…');
183
+ await checkoutPaths(projectDir, preFlightHeadPaths);
184
+ logger.info(`Rolled back ${preFlightHeadPaths.length} artifact path(s) to HEAD.`);
185
+ }
186
+ process.exitCode = 1;
187
+ }
188
+ else {
189
+ logger.dim('Post-flight graph integrity: ok.');
190
+ }
191
+ }
192
+ }
193
+ catch (err) {
194
+ writer.close();
195
+ if (err instanceof ReviseArtifactNotFoundError) {
196
+ logger.error(err.message);
197
+ logger.dim('Expected format: EPIC-001, FEAT-001, US-001, TASK-001');
198
+ process.exit(1);
199
+ }
200
+ const { AIError } = await import('../../ai/errors.js');
201
+ if (err instanceof AIError) {
202
+ logger.error(err.userMessage);
203
+ process.exit(1);
204
+ }
205
+ throw err;
206
+ }
207
+ finally {
208
+ // Always detach the SIGINT listener — normal completion shouldn't
209
+ // leave a process-level handler bound to this run's writer.
210
+ process.removeListener('SIGINT', onSigint);
211
+ }
212
+ });
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Single-artifact path
216
+ // ---------------------------------------------------------------------------
217
+ async function runSingle(projectDir, config, provider, artifactId, opts, writableScope, writer) {
218
+ const backupDir = defaultBackupDir(projectDir, artifactId);
219
+ const result = await processOneArtifact(projectDir, config, provider, artifactId, opts, writableScope, writer, backupDir, undefined);
220
+ writer.close({
221
+ tokenUsage: result.usage,
222
+ interrupted: result.quit ? { reason: 'q', atArtifactId: artifactId } : undefined,
223
+ });
224
+ renderFinalOutcome(result, artifactId, writer.path);
225
+ }
226
+ // ---------------------------------------------------------------------------
227
+ // --- All-epics path
228
+ // ---------------------------------------------------------------------------
229
+ async function runAll(projectDir, config, provider, opts, writableScope, writer) {
230
+ const epics = await listArtifacts(projectDir, config, 'epic');
231
+ if (epics.length === 0) {
232
+ logger.warn('No epics found in the project — nothing to revise.');
233
+ writer.close();
234
+ return;
235
+ }
236
+ logger.dim(`--all scope: ${epics.length} epic(s) found.`);
237
+ let totalWrites = 0;
238
+ let cacheSkips = 0;
239
+ const aggregateUsage = { inputTokens: 0, outputTokens: 0 };
240
+ let cache = loadCache(projectDir);
241
+ for (const epic of epics) {
242
+ if (totalWrites >= opts.maxWritesPerRun) {
243
+ logger.warn(`Hit --max-writes-per-run=${opts.maxWritesPerRun}; stopping --all run early to cap blast radius.`);
244
+ break;
245
+ }
246
+ logger.info(`\n→ Cascading ${epic.id}`);
247
+ const plan = await buildCascadeOrder(projectDir, config, 'epic', epic.id);
248
+ const backupDir = defaultBackupDir(projectDir, epic.id);
249
+ const cascadeResult = await executeCascade({
250
+ plan,
251
+ onProgress: (p) => {
252
+ logger.dim(` [${p.completed + 1}/${p.total}] ${p.currentLevelLabel}: ${p.currentArtifactId}${p.etaSeconds != null ? ` · ~${p.etaSeconds}s left` : ''}`);
253
+ },
254
+ processor: async ({ artifactId, levelLabel }) => {
255
+ if (totalWrites >= opts.maxWritesPerRun)
256
+ return { continue: false, stopReason: 'q' };
257
+ // Cache lookup: if this artifact's raw content is unchanged since a
258
+ // prior 'skipped-by-agent' run, skip the AI call entirely.
259
+ const artifactType = findArtifactTypeById(artifactId);
260
+ if (artifactType) {
261
+ const raw = await readArtifactRaw(projectDir, config, artifactType, artifactId);
262
+ if (raw) {
263
+ const artifactHash = hashArtifactContent(raw);
264
+ if (shouldSkipArtifact(cache, artifactId, artifactHash, undefined)) {
265
+ cacheSkips++;
266
+ logger.dim(` [cache] ${artifactId} unchanged since last clean revise — skip.`);
267
+ return { continue: true };
268
+ }
269
+ const out = await processOneArtifact(projectDir, config, provider, artifactId, opts, writableScope, writer, backupDir, levelLabel);
270
+ aggregateUsage.inputTokens += out.usage.inputTokens;
271
+ aggregateUsage.outputTokens += out.usage.outputTokens;
272
+ if (out.wrote)
273
+ totalWrites++;
274
+ // Record outcome (cache is updated in-memory; flushed at end of --all).
275
+ if (out.outcome === 'skipped-by-agent' ||
276
+ out.outcome === 'applied' ||
277
+ out.outcome === 'would-apply' ||
278
+ out.outcome === 'flagged') {
279
+ cache = recordOutcome(cache, artifactId, artifactHash, undefined, out.outcome);
280
+ }
281
+ if (out.quit)
282
+ return { continue: false, stopReason: 'q' };
283
+ return { continue: true };
284
+ }
285
+ }
286
+ // Fallback: artifact unresolvable — process without cache touching.
287
+ const out = await processOneArtifact(projectDir, config, provider, artifactId, opts, writableScope, writer, backupDir, levelLabel);
288
+ aggregateUsage.inputTokens += out.usage.inputTokens;
289
+ aggregateUsage.outputTokens += out.usage.outputTokens;
290
+ if (out.wrote)
291
+ totalWrites++;
292
+ if (out.quit)
293
+ return { continue: false, stopReason: 'q' };
294
+ return { continue: true };
295
+ },
296
+ });
297
+ if (cascadeResult.interrupted) {
298
+ writer.close({
299
+ tokenUsage: aggregateUsage,
300
+ interrupted: {
301
+ reason: cascadeResult.interrupted.reason,
302
+ atArtifactId: cascadeResult.interrupted.atArtifactId,
303
+ },
304
+ });
305
+ logger.warn(`Stopped inside ${epic.id} (reason: ${cascadeResult.interrupted.reason}).`);
306
+ return;
307
+ }
308
+ }
309
+ writer.close({ tokenUsage: aggregateUsage });
310
+ await saveCache(projectDir, cache);
311
+ logger.info(`\n--all complete: ${totalWrites} write(s) across ${epics.length} epic(s). Cache hits: ${cacheSkips}.`);
312
+ logger.dim(`Tokens: ${aggregateUsage.inputTokens.toLocaleString()} in → ${aggregateUsage.outputTokens.toLocaleString()} out`);
313
+ }
314
+ // ---------------------------------------------------------------------------
315
+ // Cascade path
316
+ // ---------------------------------------------------------------------------
317
+ async function runCascade(projectDir, config, provider, rootType, rootId, opts, writableScope, writer) {
318
+ const plan = await buildCascadeOrder(projectDir, config, rootType, rootId);
319
+ logger.dim(`Cascade plan: ${plan.levels
320
+ .filter((l) => l.artifactIds.length > 0)
321
+ .map((l) => `${l.label}=${l.artifactIds.length}`)
322
+ .join(', ')} · total=${plan.orderedIds.length}`);
323
+ const backupDir = defaultBackupDir(projectDir, rootId);
324
+ const aggregateUsage = { inputTokens: 0, outputTokens: 0 };
325
+ const result = await executeCascade({
326
+ plan,
327
+ onProgress: (p) => {
328
+ logger.dim(`[${p.completed + 1}/${p.total}] ${p.currentLevelLabel}: ${p.currentArtifactId}${p.etaSeconds != null ? ` · ~${p.etaSeconds}s left` : ''}`);
329
+ },
330
+ processor: async ({ artifactId, levelLabel }) => {
331
+ const out = await processOneArtifact(projectDir, config, provider, artifactId, opts, writableScope, writer, backupDir, levelLabel);
332
+ aggregateUsage.inputTokens += out.usage.inputTokens;
333
+ aggregateUsage.outputTokens += out.usage.outputTokens;
334
+ if (out.quit)
335
+ return { continue: false, stopReason: 'q' };
336
+ return { continue: true };
337
+ },
338
+ });
339
+ writer.close({
340
+ tokenUsage: aggregateUsage,
341
+ interrupted: result.interrupted
342
+ ? { reason: result.interrupted.reason, atArtifactId: result.interrupted.atArtifactId }
343
+ : undefined,
344
+ });
345
+ logger.info(`\nCascade complete: ${result.completed}/${result.total} artifacts processed${result.interrupted ? ` (interrupted: ${result.interrupted.reason})` : ''}`);
346
+ logger.dim(`Tokens: ${aggregateUsage.inputTokens.toLocaleString()} in → ${aggregateUsage.outputTokens.toLocaleString()} out`);
347
+ if (result.interrupted?.reason === 'agent_error') {
348
+ process.exit(1);
349
+ }
350
+ }
351
+ async function processOneArtifact(projectDir, config, provider, artifactId, opts, writableScope, writer, backupDir, cascadeLevel) {
352
+ const result = await reviseArtifact(projectDir, config, provider, artifactId, {
353
+ dryRun: true,
354
+ writableScope,
355
+ noCodeContext: !opts.codeContext,
356
+ noSiblingContext: !opts.siblingContext,
357
+ });
358
+ const verified = await verifyDecision(result.decision, result.verifierContext);
359
+ if (verified.dropped.length > 0) {
360
+ logger.warn(`${artifactId}: dropped ${verified.dropped.length} unverifiable evidence citation(s) — see audit log.`);
361
+ }
362
+ if (verified.demoted) {
363
+ logger.warn(`${artifactId}: decision demoted "revise" → "flag" (unverifiable evidence).`);
364
+ }
365
+ renderDecision(verified.decision, result.originalContent);
366
+ const finalDecision = await confirmAndMaybeEditRationale(verified.decision, result.originalContent, opts);
367
+ const applyResult = await applyDecision({
368
+ artifactPath: result.artifactPath,
369
+ originalContent: result.originalContent,
370
+ decision: finalDecision,
371
+ backupDir,
372
+ audit: writer,
373
+ dryRun: opts.dryRun || finalDecision.__userSkipped === true,
374
+ cascadeLevel,
375
+ });
376
+ return {
377
+ outcome: applyResult.outcome,
378
+ wrote: applyResult.wrote,
379
+ quit: finalDecision.__userQuit === true,
380
+ usage: result.usage,
381
+ artifactPath: result.artifactPath,
382
+ };
383
+ }
384
+ async function confirmAndMaybeEditRationale(decision, originalContent, opts) {
385
+ if (decision.action !== 'revise')
386
+ return decision;
387
+ if (opts.dryRun)
388
+ return decision;
389
+ if (opts.yes)
390
+ return decision;
391
+ // Nothing to apply — skip the prompt, the apply path will emit an
392
+ // `unchanged-by-agent` audit entry instead of writing.
393
+ if (isEffectivelyUnchanged(originalContent, decision.revisedMarkdown))
394
+ return decision;
395
+ let current = { ...decision };
396
+ for (;;) {
397
+ const action = await promptReviseConfirm(current.artifactId);
398
+ switch (action) {
399
+ case 'apply':
400
+ return current;
401
+ case 'skip':
402
+ return { ...current, __userSkipped: true };
403
+ case 'quit':
404
+ return { ...current, __userSkipped: true, __userQuit: true };
405
+ case 'diff-again':
406
+ renderDecision(current, originalContent);
407
+ continue;
408
+ case 'edit-rationale': {
409
+ const edited = await promptText('New rationale (recorded in the audit log):', current.rationale);
410
+ current = { ...current, rationale: edited };
411
+ continue;
412
+ }
413
+ }
414
+ }
415
+ }
416
+ function renderDecision(decision, originalContent) {
417
+ display.separator(60);
418
+ const actionColor = decision.action === 'revise'
419
+ ? chalk.yellow
420
+ : decision.action === 'flag'
421
+ ? chalk.magenta
422
+ : chalk.green;
423
+ display.heading(` Action: ${actionColor(decision.action.toUpperCase())}`);
424
+ display.line(` Artifact: ${decision.artifactId}`);
425
+ display.line(` Rationale: ${decision.rationale}`);
426
+ if (decision.evidence.length > 0) {
427
+ display.line('');
428
+ display.heading(' Evidence:');
429
+ for (const ev of decision.evidence) {
430
+ const quote = ev.quote
431
+ ? ` — "${ev.quote.slice(0, 80)}${ev.quote.length > 80 ? '…' : ''}"`
432
+ : '';
433
+ display.line(` • [${ev.type}] ${ev.ref}${quote}`);
434
+ }
435
+ }
436
+ if (decision.ambiguous.length > 0) {
437
+ display.line('');
438
+ display.heading(' Ambiguous (human decision required):');
439
+ for (const amb of decision.ambiguous) {
440
+ display.line(` • §${amb.section}: ${amb.reason}`);
441
+ }
442
+ }
443
+ if (decision.action === 'revise' && decision.revisedMarkdown) {
444
+ if (isEffectivelyUnchanged(originalContent, decision.revisedMarkdown)) {
445
+ display.line('');
446
+ display.heading(' Proposed diff:');
447
+ display.line(chalk.dim(` (no changes — agent's revised output matches the current file; nothing to apply)`));
448
+ }
449
+ else {
450
+ display.line('');
451
+ display.heading(' Proposed diff:');
452
+ const diff = renderDiff(originalContent, decision.revisedMarkdown, {
453
+ oldLabel: `${decision.artifactId} (before)`,
454
+ newLabel: `${decision.artifactId} (proposed)`,
455
+ });
456
+ display.line(diff
457
+ .split('\n')
458
+ .map((l) => ` ${l}`)
459
+ .join('\n'));
460
+ }
461
+ }
462
+ display.separator(60);
463
+ }
464
+ /**
465
+ * Print actionable next-step guidance for each terminal outcome.
466
+ *
467
+ * Users shouldn't be left wondering "now what?" after a non-trivial outcome.
468
+ * The most common confusion is `flagged` — the agent produced something but
469
+ * the safety pipeline refused to write it, and nothing in the terminal
470
+ * tells the user how to proceed.
471
+ */
472
+ function renderNextSteps(result, artifactId, auditPath) {
473
+ const auditHint = auditPath ? `\n Audit log (full proposal + evidence): ${auditPath}` : '';
474
+ if (result.outcome === 'flagged') {
475
+ logger.dim(`\nNext steps for flagged revise:` +
476
+ `${auditHint}` +
477
+ `\n 1. Read the audit log — it includes the agent's proposed rewrite and rationale.` +
478
+ `\n 2. If the proposal is right but evidence is weak, edit ${artifactId} manually to apply the fix.` +
479
+ `\n 3. To narrow what the agent touches, re-run with \`--scope-to prose\` (preserves references and paths).` +
480
+ `\n 4. To let the agent retry without stale context, re-run with \`--no-code-context\` (faster, less grounded).`);
481
+ return;
482
+ }
483
+ if (result.outcome === 'would-apply') {
484
+ logger.dim(`\nNext steps for dry-run:` +
485
+ `${auditHint}` +
486
+ `\n Re-run without \`--dry-run\` to apply the proposed changes to ${artifactId}.`);
487
+ return;
488
+ }
489
+ if (result.outcome === 'unchanged-by-agent') {
490
+ logger.dim(`\nNo action needed — ${artifactId} already matches the agent's reading of the codebase.`);
491
+ return;
492
+ }
493
+ if (result.outcome === 'skipped-by-agent') {
494
+ logger.dim(`\nAgent said no drift detected. If you disagree, edit ${artifactId} manually or re-run with` +
495
+ ` a narrower \`--scope-to\` to prompt the agent toward the section you expected it to touch.`);
496
+ return;
497
+ }
498
+ if (result.outcome === 'skipped-by-user') {
499
+ logger.dim(`\nSkipped — re-run \`planr revise ${artifactId}\` when you're ready to reconsider.`);
500
+ }
501
+ }
502
+ function renderFinalOutcome(result, artifactId, auditPath) {
503
+ const badge = result.outcome === 'applied'
504
+ ? chalk.green('applied')
505
+ : result.outcome === 'would-apply'
506
+ ? chalk.yellow('would-apply')
507
+ : result.outcome === 'flagged'
508
+ ? chalk.magenta('flagged')
509
+ : result.outcome === 'unchanged-by-agent'
510
+ ? chalk.dim('unchanged — no diff to apply')
511
+ : chalk.dim(result.outcome);
512
+ logger.info(`\nOutcome: ${badge}`);
513
+ if (result.wrote) {
514
+ logger.dim(`\nWrote ${result.artifactPath}\nSuggested commit: git commit -am "chore(plan): revise ${artifactId} against codebase"`);
515
+ }
516
+ renderNextSteps(result, artifactId, auditPath);
517
+ if (result.usage.inputTokens > 0) {
518
+ logger.dim(`Tokens: ${result.usage.inputTokens.toLocaleString()} in → ${result.usage.outputTokens.toLocaleString()} out`);
519
+ }
520
+ }
521
+ function defaultBackupDir(projectDir, scope) {
522
+ const d = new Date();
523
+ const stamp = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
524
+ return path.join(projectDir, '.planr', 'reports', `revise-${scope}-${stamp}`, 'backup');
525
+ }
526
+ /**
527
+ * Build the blast-radius summary for the typed-YES prompt. For `--all`,
528
+ * lists every epic (not just a count) so the user sees exact scope. For
529
+ * single scope, a shorter summary suffices.
530
+ */
531
+ async function buildBulkConfirmationSummary(artifactId, opts, projectDir, config) {
532
+ if (opts.all) {
533
+ const epics = await listArtifacts(projectDir, config, 'epic');
534
+ const list = epics.map((e) => ` - ${e.id}`).join('\n');
535
+ return `About to revise EVERY epic and its descendants in ${projectDir}. Affected epics (${epics.length}):\n${list}\n\nWrites are atomic with sidecar backups; max writes per run: ${opts.maxWritesPerRun}.`;
536
+ }
537
+ if (opts.cascade) {
538
+ return `About to revise ${artifactId} AND its descendants (top-down cascade) in ${projectDir}. Writes are atomic with sidecar backups.`;
539
+ }
540
+ return `About to revise ${artifactId} in ${projectDir}. Writes are atomic with sidecar backups.`;
541
+ }
542
+ /**
543
+ * Collect every artifact-file path under the four managed directories so
544
+ * the post-flight rollback has a bounded set to restore with `git checkout`.
545
+ * Intentionally wider than "paths we will write" — if revise touched a file
546
+ * unexpectedly, rollback still catches it.
547
+ */
548
+ async function collectCandidateArtifactPaths(projectDir, config) {
549
+ const types = ['epic', 'feature', 'story', 'task'];
550
+ const rel = [];
551
+ for (const t of types) {
552
+ const listing = await listArtifacts(projectDir, config, t);
553
+ for (const entry of listing) {
554
+ rel.push(`${config.outputPaths.agile}/${pluralDir(t)}/${entry.filename}`);
555
+ }
556
+ }
557
+ return rel;
558
+ }
559
+ function pluralDir(t) {
560
+ if (t === 'story')
561
+ return 'stories';
562
+ if (t === 'epic')
563
+ return 'epics';
564
+ if (t === 'feature')
565
+ return 'features';
566
+ if (t === 'task')
567
+ return 'tasks';
568
+ return `${t}s`;
569
+ }
570
+ //# sourceMappingURL=revise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revise.js","sourceRoot":"","sources":["../../../src/cli/commands/revise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAuB,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,GACX,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,SAAS,EAET,aAAa,EACb,SAAS,EACT,kBAAkB,GACnB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAEL,aAAa,EACb,sBAAsB,EACtB,2BAA2B,EAC3B,cAAc,GACf,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIxD,MAAM,eAAe,GAA0B,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACvF,MAAM,aAAa,GAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAkB1D,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEtC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mEAAmE,CAAC;SAChF,QAAQ,CACP,cAAc,EACd,oHAAoH,CACrH;SACA,MAAM,CACL,WAAW,EACX,sEAAsE,EACtE,KAAK,CACN;SACA,MAAM,CAAC,OAAO,EAAE,uEAAuE,EAAE,KAAK,CAAC;SAC/F,MAAM,CACL,eAAe,EACf,8EAA8E,EAC9E,KAAK,CACN;SACA,MAAM,CACL,WAAW,EACX,uFAAuF,EACvF,KAAK,CACN;SACA,MAAM,CAAC,cAAc,EAAE,kDAAkD,CAAC;SAC1E,MAAM,CACL,OAAO,EACP,+EAA+E,EAC/E,KAAK,CACN;SACA,MAAM,CACL,0BAA0B,EAC1B,mGAAmG,0BAA0B,GAAG,EAChI,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EACtB,0BAA0B,CAC3B;SACA,MAAM,CACL,oBAAoB,EACpB,qDAAqD,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACjF,KAAK,CACN;SACA,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,sBAAsB,EAAE,0CAA0C,CAAC;SAC1E,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;SAC/D,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;SACxF,MAAM,CACL,4BAA4B,EAC5B,0OAA0O,CAC3O;SACA,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,IAA0B,EAAE,EAAE;QAC3E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,yDAAyD;QACzD,6EAA6E;QAC7E,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;YACrF,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;gBACvC,UAAU;gBACV,MAAM;gBACN,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;aACd,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CACV,6FAA6F,CAC9F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACjF,MAAM,CAAC,GAAG,CACR,yFAAyF,CAC1F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,OAA8B,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,KAAK,CACV,wBAAwB,IAAI,CAAC,OAAO,uBAAuB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAgC,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,KAAK,CACV,4BAA4B,IAAI,CAAC,WAAW,uBAAuB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,IAAI,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,OAA8B,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAgC,CAAC;QAE1D,sEAAsE;QACtE,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,sEAAsE;QACtE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YACzF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,UAAqB,CAAC;QACxD,MAAM,MAAM,GAAG,oBAAoB,CAAC;YAClC,UAAU;YACV,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,IAAI,CAAC,KAAK;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAExC,wEAAwE;QACxE,sEAAsE;QACtE,uEAAuE;QACvE,sDAAsD;QACtD,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,WAAW;gBAAE,OAAO,CAAC,kCAAkC;YAC3D,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3E,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC9D,6EAA6E;YAC7E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEjC,MAAM,CAAC,OAAO,CACZ,UAAU,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,GAAG,CACxG,CAAC;QAEF,MAAM,kBAAkB,GAAG,MAAM,6BAA6B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEnF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAE7C,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YAC1E,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,UAAU,CACd,UAAU,EACV,MAAM,EACN,QAAQ,EACR,QAAwB,EACxB,UAAoB,EACpB,IAAI,EACJ,aAAa,EACb,MAAM,CACP,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,CACb,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAoB,EACpB,IAAI,EACJ,aAAa,EACb,MAAM,CACP,CAAC;YACJ,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CACV,uCAAuC,MAAM,CAAC,MAAM,CAAC,MAAM,+BAA+B,CAC3F,CAAC;oBACF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClC,MAAM,CAAC,GAAG,CACR,OAAO,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,CACrG,CAAC;oBACJ,CAAC;oBACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACpB,MAAM,CAAC,IAAI,CACT,qFAAqF,CACtF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;wBACnE,MAAM,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;wBACpD,MAAM,CAAC,IAAI,CAAC,eAAe,kBAAkB,CAAC,MAAM,4BAA4B,CAAC,CAAC;oBACpF,CAAC;oBACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,GAAG,YAAY,2BAA2B,EAAE,CAAC;gBAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1B,MAAM,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACvD,IAAI,GAAG,YAAY,OAAO,EAAE,CAAC;gBAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,kEAAkE;YAClE,4DAA4D;YAC5D,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CACtB,UAAkB,EAClB,MAA8C,EAC9C,QAAmD,EACnD,UAAkB,EAClB,IAA0B,EAC1B,aAAkC,EAClC,MAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,aAAa,EACb,MAAM,EACN,SAAS,EACT,SAAS,CACV,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC;QACX,UAAU,EAAE,MAAM,CAAC,KAAK;QACxB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;KACjF,CAAC,CAAC;IAEH,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,KAAK,UAAU,MAAM,CACnB,UAAkB,EAClB,MAA8C,EAC9C,QAAmD,EACnD,IAA0B,EAC1B,aAAkC,EAClC,MAAsB;IAEtB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;IAE1D,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,cAAc,GAAY,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACpE,IAAI,KAAK,GAAgB,SAAS,CAAC,UAAU,CAAC,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CACT,4BAA4B,IAAI,CAAC,eAAe,iDAAiD,CAClG,CAAC;YACF,MAAM;QACR,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAExD,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC;YACzC,IAAI;YACJ,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;gBAChB,MAAM,CAAC,GAAG,CACR,MAAM,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,iBAAiB,KAAK,CAAC,CAAC,iBAAiB,GAC9E,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,QAAQ,CAAC,CAAC,CAAC,EACvD,EAAE,CACH,CAAC;YACJ,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;gBAC9C,IAAI,WAAW,IAAI,IAAI,CAAC,eAAe;oBAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;gBAErF,oEAAoE;gBACpE,2DAA2D;gBAC3D,MAAM,YAAY,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBACtD,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;oBAChF,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;wBAC9C,IAAI,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;4BACnE,UAAU,EAAE,CAAC;4BACb,MAAM,CAAC,GAAG,CAAC,aAAa,UAAU,4CAA4C,CAAC,CAAC;4BAChF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;wBAC5B,CAAC;wBAED,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,aAAa,EACb,MAAM,EACN,SAAS,EACT,UAAU,CACX,CAAC;wBACF,cAAc,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;wBACpD,cAAc,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;wBACtD,IAAI,GAAG,CAAC,KAAK;4BAAE,WAAW,EAAE,CAAC;wBAE7B,wEAAwE;wBACxE,IACE,GAAG,CAAC,OAAO,KAAK,kBAAkB;4BAClC,GAAG,CAAC,OAAO,KAAK,SAAS;4BACzB,GAAG,CAAC,OAAO,KAAK,aAAa;4BAC7B,GAAG,CAAC,OAAO,KAAK,SAAS,EACzB,CAAC;4BACD,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;wBACjF,CAAC;wBAED,IAAI,GAAG,CAAC,IAAI;4BAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;wBAC1D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBACD,oEAAoE;gBACpE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,aAAa,EACb,MAAM,EACN,SAAS,EACT,UAAU,CACX,CAAC;gBACF,cAAc,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;gBACpD,cAAc,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;gBACtD,IAAI,GAAG,CAAC,KAAK;oBAAE,WAAW,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,IAAI;oBAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;gBAC1D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC5B,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC;gBACX,UAAU,EAAE,cAAc;gBAC1B,WAAW,EAAE;oBACX,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,MAAM;oBACxC,YAAY,EAAE,aAAa,CAAC,WAAW,CAAC,YAAY;iBACrD;aACF,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,EAAE,aAAa,aAAa,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;YACxF,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEnC,MAAM,CAAC,IAAI,CACT,qBAAqB,WAAW,oBAAoB,KAAK,CAAC,MAAM,yBAAyB,UAAU,GAAG,CACvG,CAAC;IACF,MAAM,CAAC,GAAG,CACR,WAAW,cAAc,CAAC,WAAW,CAAC,cAAc,EAAE,SAAS,cAAc,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAClH,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,KAAK,UAAU,UAAU,CACvB,UAAkB,EAClB,MAA8C,EAC9C,QAAmD,EACnD,QAAsB,EACtB,MAAc,EACd,IAA0B,EAC1B,aAAkC,EAClC,MAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3E,MAAM,CAAC,GAAG,CACR,iBAAiB,IAAI,CAAC,MAAM;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;SAChD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAClD,CAAC;IAEF,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,cAAc,GAAY,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAEpE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,IAAI;QACJ,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;YAChB,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,iBAAiB,KAAK,CAAC,CAAC,iBAAiB,GAC5E,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,QAAQ,CAAC,CAAC,CAAC,EACvD,EAAE,CACH,CAAC;QACJ,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;YAC9C,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAClC,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,aAAa,EACb,MAAM,EACN,SAAS,EACT,UAAU,CACX,CAAC;YACF,cAAc,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YACpD,cAAc,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;YACtD,IAAI,GAAG,CAAC,IAAI;gBAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YAC1D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC;QACX,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC7B,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE;YACtF,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CACT,uBAAuB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,uBACrD,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EACxE,EAAE,CACH,CAAC;IACF,MAAM,CAAC,GAAG,CACR,WAAW,cAAc,CAAC,WAAW,CAAC,cAAc,EAAE,SAAS,cAAc,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAClH,CAAC;IACF,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAcD,KAAK,UAAU,kBAAkB,CAC/B,UAAkB,EAClB,MAA8C,EAC9C,QAAmD,EACnD,UAAkB,EAClB,IAA0B,EAC1B,aAAkC,EAClC,MAAsB,EACtB,SAAiB,EACjB,YAA+C;IAE/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC5E,MAAM,EAAE,IAAI;QACZ,aAAa;QACb,aAAa,EAAE,CAAC,IAAI,CAAC,WAAW;QAChC,gBAAgB,EAAE,CAAC,IAAI,CAAC,cAAc;KACvC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/E,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CACT,GAAG,UAAU,aAAa,QAAQ,CAAC,OAAO,CAAC,MAAM,qDAAqD,CACvG,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,+DAA+D,CAAC,CAAC;IAC5F,CAAC;IAED,cAAc,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAE1D,MAAM,aAAa,GAAG,MAAM,4BAA4B,CACtD,QAAQ,CAAC,QAAQ,EACjB,MAAM,CAAC,eAAe,EACtB,IAAI,CACL,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC;QACtC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,QAAQ,EAAE,aAAa;QACvB,SAAS;QACT,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,aAAa,KAAK,IAAI;QAC3D,YAAY;KACb,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,IAAI,EAAE,aAAa,CAAC,UAAU,KAAK,IAAI;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC;AAWD,KAAK,UAAU,4BAA4B,CACzC,QAAwB,EACxB,eAAuB,EACvB,IAAuC;IAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IACjC,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC9B,kEAAkE;IAClE,uDAAuD;IACvD,IAAI,sBAAsB,CAAC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEvF,IAAI,OAAO,GAA0B,EAAE,GAAG,QAAQ,EAAE,CAAC;IACrD,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7D,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,OAAO;gBACV,OAAO,OAAO,CAAC;YACjB,KAAK,MAAM;gBACT,OAAO,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YAC7C,KAAK,MAAM;gBACT,OAAO,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC/D,KAAK,YAAY;gBACf,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;gBACzC,SAAS;YACX,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,4CAA4C,EAC5C,OAAO,CAAC,SAAS,CAClB,CAAC;gBACF,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;gBAC5C,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAwB,EAAE,eAAuB;IACvE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAEtB,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,QAAQ;QAC1B,CAAC,CAAC,KAAK,CAAC,MAAM;QACd,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM;YAC1B,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACpB,OAAO,CAAC,OAAO,CAAC,aAAa,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IAEnD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK;gBACpB,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;gBACnE,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAC1D,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC7D,IAAI,sBAAsB,CAAC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,GAAG,CACP,sFAAsF,CACvF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE;gBACjE,QAAQ,EAAE,GAAG,QAAQ,CAAC,UAAU,WAAW;gBAC3C,QAAQ,EAAE,GAAG,QAAQ,CAAC,UAAU,aAAa;aAC9C,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CACV,IAAI;iBACD,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;iBACtB,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,MAAwB,EACxB,UAAkB,EAClB,SAA6B;IAE7B,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,6CAA6C,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5F,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CACR,kCAAkC;YAChC,GAAG,SAAS,EAAE;YACd,qFAAqF;YACrF,8DAA8D,UAAU,6BAA6B;YACrG,6GAA6G;YAC7G,iHAAiH,CACpH,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CACR,2BAA2B;YACzB,GAAG,SAAS,EAAE;YACd,qEAAqE,UAAU,GAAG,CACrF,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CACR,wBAAwB,UAAU,uDAAuD,CAC1F,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,kBAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CACR,yDAAyD,UAAU,0BAA0B;YAC3F,6FAA6F,CAChG,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CACR,qCAAqC,UAAU,qCAAqC,CACrF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,MAAwB,EACxB,UAAkB,EAClB,SAA6B;IAE7B,MAAM,KAAK,GACT,MAAM,CAAC,OAAO,KAAK,SAAS;QAC1B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;QACxB,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,aAAa;YAChC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC;YAC7B,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS;gBAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;gBAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,oBAAoB;oBACvC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC;oBAC3C,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,CACR,WAAW,MAAM,CAAC,YAAY,2DAA2D,UAAU,oBAAoB,CACxH,CAAC;IACJ,CAAC;IACD,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CACR,WAAW,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAC9G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB,EAAE,KAAa;IACzD,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACxH,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,IAAI,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1F,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,4BAA4B,CACzC,UAA8B,EAC9B,IAA0B,EAC1B,UAAkB,EAClB,MAA8C;IAE9C,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO,qDAAqD,UAAU,qBAAqB,KAAK,CAAC,MAAM,OAAO,IAAI,mEAAmE,IAAI,CAAC,eAAe,GAAG,CAAC;IAC/M,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,mBAAmB,UAAU,8CAA8C,UAAU,2CAA2C,CAAC;IAC1I,CAAC;IACD,OAAO,mBAAmB,UAAU,OAAO,UAAU,2CAA2C,CAAC;AACnG,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,6BAA6B,CAC1C,UAAkB,EAClB,MAA8C;IAE9C,MAAM,KAAK,GAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,CAAe;IAChC,IAAI,CAAC,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACjC,OAAO,GAAG,CAAC,GAAG,CAAC;AACjB,CAAC"}
package/dist/cli/index.js CHANGED
@@ -15,11 +15,13 @@ import { registerExportCommand } from './commands/export.js';
15
15
  import { registerFeatureCommand } from './commands/feature.js';
16
16
  import { registerGitHubCommand } from './commands/github.js';
17
17
  import { registerInitCommand } from './commands/init.js';
18
+ import { registerLinearCommand } from './commands/linear.js';
18
19
  import { registerPlanCommand } from './commands/plan.js';
19
20
  import { registerQuickCommand } from './commands/quick.js';
20
21
  import { registerRefineCommand } from './commands/refine.js';
21
22
  import { registerReportCommand } from './commands/report.js';
22
23
  import { registerReportLinterCommand } from './commands/report-linter.js';
24
+ import { registerReviseCommand } from './commands/revise.js';
23
25
  import { registerRulesCommand } from './commands/rules.js';
24
26
  import { registerSearchCommand } from './commands/search.js';
25
27
  import { registerSprintCommand } from './commands/sprint.js';
@@ -62,6 +64,7 @@ program.hook('preAction', () => {
62
64
  }
63
65
  });
64
66
  registerInitCommand(program);
67
+ registerLinearCommand(program);
65
68
  registerBacklogCommand(program);
66
69
  registerEpicCommand(program);
67
70
  registerFeatureCommand(program);
@@ -73,6 +76,7 @@ registerRulesCommand(program);
73
76
  registerStatusCommand(program);
74
77
  registerConfigCommand(program);
75
78
  registerRefineCommand(program);
79
+ registerReviseCommand(program);
76
80
  registerEstimateCommand(program);
77
81
  registerExportCommand(program);
78
82
  registerReportCommand(program);