openplanr 0.8.0 → 1.0.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 (227) hide show
  1. package/README.md +142 -52
  2. package/dist/agents/index.d.ts +1 -5
  3. package/dist/agents/index.d.ts.map +1 -1
  4. package/dist/agents/index.js +1 -4
  5. package/dist/agents/index.js.map +1 -1
  6. package/dist/agents/task-parser.d.ts +4 -1
  7. package/dist/agents/task-parser.d.ts.map +1 -1
  8. package/dist/agents/task-parser.js +6 -3
  9. package/dist/agents/task-parser.js.map +1 -1
  10. package/dist/agents/utils.d.ts +0 -4
  11. package/dist/agents/utils.d.ts.map +1 -1
  12. package/dist/agents/utils.js +3 -24
  13. package/dist/agents/utils.js.map +1 -1
  14. package/dist/ai/codebase/context-builder.d.ts +22 -3
  15. package/dist/ai/codebase/context-builder.d.ts.map +1 -1
  16. package/dist/ai/codebase/context-builder.js +202 -14
  17. package/dist/ai/codebase/context-builder.js.map +1 -1
  18. package/dist/ai/codebase/file-reader.d.ts.map +1 -1
  19. package/dist/ai/codebase/file-reader.js +7 -3
  20. package/dist/ai/codebase/file-reader.js.map +1 -1
  21. package/dist/ai/codebase/index.d.ts +3 -1
  22. package/dist/ai/codebase/index.d.ts.map +1 -1
  23. package/dist/ai/codebase/index.js +3 -1
  24. package/dist/ai/codebase/index.js.map +1 -1
  25. package/dist/ai/codebase/pattern-rules.d.ts +28 -0
  26. package/dist/ai/codebase/pattern-rules.d.ts.map +1 -0
  27. package/dist/ai/codebase/pattern-rules.js +186 -0
  28. package/dist/ai/codebase/pattern-rules.js.map +1 -0
  29. package/dist/ai/codebase/rules-reader.d.ts +14 -0
  30. package/dist/ai/codebase/rules-reader.d.ts.map +1 -0
  31. package/dist/ai/codebase/rules-reader.js +25 -0
  32. package/dist/ai/codebase/rules-reader.js.map +1 -0
  33. package/dist/ai/codebase/stack-detector.d.ts.map +1 -1
  34. package/dist/ai/codebase/stack-detector.js +4 -1
  35. package/dist/ai/codebase/stack-detector.js.map +1 -1
  36. package/dist/ai/codebase/tree-generator.d.ts.map +1 -1
  37. package/dist/ai/codebase/tree-generator.js +5 -2
  38. package/dist/ai/codebase/tree-generator.js.map +1 -1
  39. package/dist/ai/errors.js +1 -1
  40. package/dist/ai/errors.js.map +1 -1
  41. package/dist/ai/prompts/prompt-builder.d.ts +12 -0
  42. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  43. package/dist/ai/prompts/prompt-builder.js +45 -3
  44. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  45. package/dist/ai/prompts/system-prompts.d.ts +5 -3
  46. package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
  47. package/dist/ai/prompts/system-prompts.js +74 -13
  48. package/dist/ai/prompts/system-prompts.js.map +1 -1
  49. package/dist/ai/schemas/ai-response-schemas.d.ts +48 -2
  50. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
  51. package/dist/ai/schemas/ai-response-schemas.js +19 -0
  52. package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
  53. package/dist/ai/types.d.ts +4 -2
  54. package/dist/ai/types.d.ts.map +1 -1
  55. package/dist/ai/types.js +3 -1
  56. package/dist/ai/types.js.map +1 -1
  57. package/dist/ai/validation/dependency-chains.d.ts +21 -0
  58. package/dist/ai/validation/dependency-chains.d.ts.map +1 -0
  59. package/dist/ai/validation/dependency-chains.js +114 -0
  60. package/dist/ai/validation/dependency-chains.js.map +1 -0
  61. package/dist/ai/validation/index.d.ts +3 -0
  62. package/dist/ai/validation/index.d.ts.map +1 -0
  63. package/dist/ai/validation/index.js +3 -0
  64. package/dist/ai/validation/index.js.map +1 -0
  65. package/dist/ai/validation/task-validator.d.ts +37 -0
  66. package/dist/ai/validation/task-validator.d.ts.map +1 -0
  67. package/dist/ai/validation/task-validator.js +89 -0
  68. package/dist/ai/validation/task-validator.js.map +1 -0
  69. package/dist/cli/commands/backlog.d.ts +10 -0
  70. package/dist/cli/commands/backlog.d.ts.map +1 -0
  71. package/dist/cli/commands/backlog.js +292 -0
  72. package/dist/cli/commands/backlog.js.map +1 -0
  73. package/dist/cli/commands/checklist.js +4 -4
  74. package/dist/cli/commands/checklist.js.map +1 -1
  75. package/dist/cli/commands/config.js +13 -13
  76. package/dist/cli/commands/config.js.map +1 -1
  77. package/dist/cli/commands/epic.d.ts.map +1 -1
  78. package/dist/cli/commands/epic.js +41 -22
  79. package/dist/cli/commands/epic.js.map +1 -1
  80. package/dist/cli/commands/estimate.d.ts.map +1 -1
  81. package/dist/cli/commands/estimate.js +40 -39
  82. package/dist/cli/commands/estimate.js.map +1 -1
  83. package/dist/cli/commands/export.d.ts +8 -0
  84. package/dist/cli/commands/export.d.ts.map +1 -0
  85. package/dist/cli/commands/export.js +282 -0
  86. package/dist/cli/commands/export.js.map +1 -0
  87. package/dist/cli/commands/feature.js +9 -9
  88. package/dist/cli/commands/feature.js.map +1 -1
  89. package/dist/cli/commands/github.d.ts +8 -0
  90. package/dist/cli/commands/github.d.ts.map +1 -0
  91. package/dist/cli/commands/github.js +415 -0
  92. package/dist/cli/commands/github.js.map +1 -0
  93. package/dist/cli/commands/plan.d.ts.map +1 -1
  94. package/dist/cli/commands/plan.js +104 -50
  95. package/dist/cli/commands/plan.js.map +1 -1
  96. package/dist/cli/commands/quick.d.ts.map +1 -1
  97. package/dist/cli/commands/quick.js +37 -107
  98. package/dist/cli/commands/quick.js.map +1 -1
  99. package/dist/cli/commands/refine.js +21 -21
  100. package/dist/cli/commands/refine.js.map +1 -1
  101. package/dist/cli/commands/search.d.ts.map +1 -1
  102. package/dist/cli/commands/search.js +18 -7
  103. package/dist/cli/commands/search.js.map +1 -1
  104. package/dist/cli/commands/sprint.d.ts +9 -0
  105. package/dist/cli/commands/sprint.d.ts.map +1 -0
  106. package/dist/cli/commands/sprint.js +519 -0
  107. package/dist/cli/commands/sprint.js.map +1 -0
  108. package/dist/cli/commands/status.d.ts.map +1 -1
  109. package/dist/cli/commands/status.js +77 -32
  110. package/dist/cli/commands/status.js.map +1 -1
  111. package/dist/cli/commands/story.js +15 -15
  112. package/dist/cli/commands/story.js.map +1 -1
  113. package/dist/cli/commands/sync.js +11 -7
  114. package/dist/cli/commands/sync.js.map +1 -1
  115. package/dist/cli/commands/task.d.ts +0 -2
  116. package/dist/cli/commands/task.d.ts.map +1 -1
  117. package/dist/cli/commands/task.js +14 -169
  118. package/dist/cli/commands/task.js.map +1 -1
  119. package/dist/cli/commands/template.d.ts +10 -0
  120. package/dist/cli/commands/template.d.ts.map +1 -0
  121. package/dist/cli/commands/template.js +269 -0
  122. package/dist/cli/commands/template.js.map +1 -0
  123. package/dist/cli/helpers/task-creation.d.ts +89 -0
  124. package/dist/cli/helpers/task-creation.d.ts.map +1 -0
  125. package/dist/cli/helpers/task-creation.js +140 -0
  126. package/dist/cli/helpers/task-creation.js.map +1 -0
  127. package/dist/cli/index.js +29 -2
  128. package/dist/cli/index.js.map +1 -1
  129. package/dist/models/schema.d.ts +2 -0
  130. package/dist/models/schema.d.ts.map +1 -1
  131. package/dist/models/schema.js +2 -0
  132. package/dist/models/schema.js.map +1 -1
  133. package/dist/models/types.d.ts +32 -1
  134. package/dist/models/types.d.ts.map +1 -1
  135. package/dist/services/artifact-gathering.d.ts +2 -0
  136. package/dist/services/artifact-gathering.d.ts.map +1 -1
  137. package/dist/services/artifact-gathering.js +26 -7
  138. package/dist/services/artifact-gathering.js.map +1 -1
  139. package/dist/services/artifact-service.d.ts +5 -5
  140. package/dist/services/artifact-service.d.ts.map +1 -1
  141. package/dist/services/artifact-service.js +4 -0
  142. package/dist/services/artifact-service.js.map +1 -1
  143. package/dist/services/config-service.d.ts.map +1 -1
  144. package/dist/services/config-service.js +2 -0
  145. package/dist/services/config-service.js.map +1 -1
  146. package/dist/services/credential-backends.d.ts.map +1 -1
  147. package/dist/services/credential-backends.js +15 -7
  148. package/dist/services/credential-backends.js.map +1 -1
  149. package/dist/services/credentials-service.d.ts.map +1 -1
  150. package/dist/services/credentials-service.js +6 -3
  151. package/dist/services/credentials-service.js.map +1 -1
  152. package/dist/services/github-service.d.ts +83 -0
  153. package/dist/services/github-service.d.ts.map +1 -0
  154. package/dist/services/github-service.js +440 -0
  155. package/dist/services/github-service.js.map +1 -0
  156. package/dist/services/template-service.d.ts +2 -1
  157. package/dist/services/template-service.d.ts.map +1 -1
  158. package/dist/services/template-service.js +3 -1
  159. package/dist/services/template-service.js.map +1 -1
  160. package/dist/templates/backlog/backlog-item.md.hbs +40 -0
  161. package/dist/templates/checklists/agile-checklist.md.hbs +1 -1
  162. package/dist/templates/export/planning-report.html.hbs +230 -0
  163. package/dist/templates/export/planning-report.md.hbs +136 -0
  164. package/dist/templates/quick/quick-task.md.hbs +1 -1
  165. package/dist/templates/rules/claude/CLAUDE.md.hbs +78 -35
  166. package/dist/templates/rules/codex/AGENTS.md.hbs +73 -17
  167. package/dist/templates/rules/cursor/2101-implement-task-list.mdc.hbs +66 -14
  168. package/dist/templates/sprints/sprint.md.hbs +42 -0
  169. package/dist/templates/task-templates/api-integration.json +45 -0
  170. package/dist/templates/task-templates/auth-flow.json +48 -0
  171. package/dist/templates/task-templates/database-migration.json +44 -0
  172. package/dist/templates/task-templates/react-component.json +45 -0
  173. package/dist/templates/task-templates/rest-endpoint.json +53 -0
  174. package/dist/templates/tasks/task-list.md.hbs +1 -1
  175. package/dist/utils/constants.d.ts +4 -0
  176. package/dist/utils/constants.d.ts.map +1 -1
  177. package/dist/utils/constants.js +4 -0
  178. package/dist/utils/constants.js.map +1 -1
  179. package/dist/utils/logger.d.ts +31 -1
  180. package/dist/utils/logger.d.ts.map +1 -1
  181. package/dist/utils/logger.js +92 -9
  182. package/dist/utils/logger.js.map +1 -1
  183. package/dist/utils/markdown.d.ts +3 -2
  184. package/dist/utils/markdown.d.ts.map +1 -1
  185. package/dist/utils/markdown.js +3 -1
  186. package/dist/utils/markdown.js.map +1 -1
  187. package/dist/utils/slugify.d.ts +8 -1
  188. package/dist/utils/slugify.d.ts.map +1 -1
  189. package/dist/utils/slugify.js +18 -2
  190. package/dist/utils/slugify.js.map +1 -1
  191. package/package.json +14 -3
  192. package/dist/agents/agent-factory.d.ts +0 -7
  193. package/dist/agents/agent-factory.d.ts.map +0 -1
  194. package/dist/agents/agent-factory.js +0 -22
  195. package/dist/agents/agent-factory.js.map +0 -1
  196. package/dist/agents/claude-agent.d.ts +0 -18
  197. package/dist/agents/claude-agent.d.ts.map +0 -1
  198. package/dist/agents/claude-agent.js +0 -183
  199. package/dist/agents/claude-agent.js.map +0 -1
  200. package/dist/agents/codex-agent.d.ts +0 -17
  201. package/dist/agents/codex-agent.d.ts.map +0 -1
  202. package/dist/agents/codex-agent.js +0 -124
  203. package/dist/agents/codex-agent.js.map +0 -1
  204. package/dist/agents/cursor-agent.d.ts +0 -14
  205. package/dist/agents/cursor-agent.d.ts.map +0 -1
  206. package/dist/agents/cursor-agent.js +0 -49
  207. package/dist/agents/cursor-agent.js.map +0 -1
  208. package/dist/agents/implementation-bridge.d.ts +0 -30
  209. package/dist/agents/implementation-bridge.d.ts.map +0 -1
  210. package/dist/agents/implementation-bridge.js +0 -256
  211. package/dist/agents/implementation-bridge.js.map +0 -1
  212. package/dist/agents/progress.d.ts +0 -62
  213. package/dist/agents/progress.d.ts.map +0 -1
  214. package/dist/agents/progress.js +0 -155
  215. package/dist/agents/progress.js.map +0 -1
  216. package/dist/agents/prompt-composer.d.ts +0 -30
  217. package/dist/agents/prompt-composer.d.ts.map +0 -1
  218. package/dist/agents/prompt-composer.js +0 -81
  219. package/dist/agents/prompt-composer.js.map +0 -1
  220. package/dist/agents/types.d.ts +0 -25
  221. package/dist/agents/types.d.ts.map +0 -1
  222. package/dist/agents/types.js +0 -8
  223. package/dist/agents/types.js.map +0 -1
  224. package/dist/utils/error-context.d.ts +0 -23
  225. package/dist/utils/error-context.d.ts.map +0 -1
  226. package/dist/utils/error-context.js +0 -94
  227. package/dist/utils/error-context.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `planr github` command.
3
+ *
4
+ * Push planning artifacts to GitHub Issues and sync status bi-directionally.
5
+ */
6
+ import type { Command } from 'commander';
7
+ export declare function registerGitHubCommand(program: Command): void;
8
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/github.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4KzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAsUrD"}
@@ -0,0 +1,415 @@
1
+ /**
2
+ * `planr github` command.
3
+ *
4
+ * Push planning artifacts to GitHub Issues and sync status bi-directionally.
5
+ */
6
+ import chalk from 'chalk';
7
+ import { findArtifactTypeById, listArtifacts, readArtifact, readArtifactRaw, updateArtifact, } from '../../services/artifact-service.js';
8
+ import { loadConfig } from '../../services/config-service.js';
9
+ import { buildIssueBody, cleanTitle, createIssue, ensureLabel, ensureMilestone, getIssue, getLabelForType, issueStateToStatus, statusToIssueState, updateIssue, verifyGitHubRepo, } from '../../services/github-service.js';
10
+ import { promptSelect } from '../../services/prompt-service.js';
11
+ import { display, logger } from '../../utils/logger.js';
12
+ import { parseMarkdown, toMarkdownWithFrontmatter } from '../../utils/markdown.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Helpers
15
+ // ---------------------------------------------------------------------------
16
+ /** Inject or update a `githubIssue` field in raw artifact frontmatter. */
17
+ function setFrontmatterField(raw, field, value) {
18
+ const escaped = field.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
19
+ const fieldRegex = new RegExp(`^${escaped}:.*\\n`, 'm');
20
+ if (fieldRegex.test(raw)) {
21
+ return raw.replace(fieldRegex, `${field}: ${value}\n`);
22
+ }
23
+ // Insert before closing ---
24
+ const closingIdx = raw.indexOf('\n---', raw.indexOf('---') + 3);
25
+ if (closingIdx !== -1) {
26
+ return `${raw.slice(0, closingIdx)}\n${field}: ${value}${raw.slice(closingIdx)}`;
27
+ }
28
+ return raw;
29
+ }
30
+ /** Push a single artifact to GitHub as an issue. */
31
+ async function pushSingleArtifact(projectDir, config, artifactId, opts) {
32
+ const type = findArtifactTypeById(artifactId);
33
+ if (!type) {
34
+ logger.error(`Cannot determine artifact type from ID: ${artifactId}`);
35
+ return null;
36
+ }
37
+ const artifact = await readArtifact(projectDir, config, type, artifactId);
38
+ if (!artifact) {
39
+ logger.error(`Artifact not found: ${artifactId}`);
40
+ return null;
41
+ }
42
+ const raw = await readArtifactRaw(projectDir, config, type, artifactId);
43
+ if (!raw)
44
+ return null;
45
+ const title = cleanTitle(artifactId, artifact.data.title);
46
+ const body = buildIssueBody(raw, artifactId, type, artifact.data);
47
+ // Ensure label exists
48
+ const label = getLabelForType(type);
49
+ if (label)
50
+ await ensureLabel(label);
51
+ const labels = label ? [label] : [];
52
+ const existingIssueNumber = artifact.data.githubIssue;
53
+ let issueNumber;
54
+ let issueUrl;
55
+ let action;
56
+ if (existingIssueNumber) {
57
+ // Try to update existing issue — fall back to create if deleted on GitHub
58
+ try {
59
+ const currentIssue = await getIssue(existingIssueNumber);
60
+ await updateIssue(existingIssueNumber, { title, body });
61
+ const status = artifact.data.status || 'pending';
62
+ const targetState = statusToIssueState(status);
63
+ if (currentIssue.state !== targetState) {
64
+ await updateIssue(existingIssueNumber, { state: targetState });
65
+ }
66
+ issueNumber = existingIssueNumber;
67
+ issueUrl = currentIssue.url;
68
+ action = 'updated';
69
+ }
70
+ catch (err) {
71
+ logger.debug('Failed to update existing GitHub issue, creating new one', err);
72
+ // Issue was deleted on GitHub — create a fresh one
73
+ const result = await createIssue(title, body, labels, opts.milestone);
74
+ issueNumber = result.number;
75
+ issueUrl = result.url;
76
+ action = 'created';
77
+ const updatedRaw = setFrontmatterField(raw, 'githubIssue', issueNumber);
78
+ await updateArtifact(projectDir, config, type, artifactId, updatedRaw);
79
+ }
80
+ }
81
+ else {
82
+ // Create new issue
83
+ const result = await createIssue(title, body, labels, opts.milestone);
84
+ issueNumber = result.number;
85
+ issueUrl = result.url;
86
+ action = 'created';
87
+ // Store issue number in artifact frontmatter
88
+ const updatedRaw = setFrontmatterField(raw, 'githubIssue', issueNumber);
89
+ await updateArtifact(projectDir, config, type, artifactId, updatedRaw);
90
+ }
91
+ return { issueNumber, issueUrl, action };
92
+ }
93
+ /** Collect all artifact IDs under an epic. */
94
+ async function collectEpicArtifacts(projectDir, config, epicId) {
95
+ const ids = [epicId];
96
+ const features = await listArtifacts(projectDir, config, 'feature');
97
+ const stories = await listArtifacts(projectDir, config, 'story');
98
+ const tasks = await listArtifacts(projectDir, config, 'task');
99
+ const epicFeatureIds = new Set();
100
+ for (const f of features) {
101
+ const data = await readArtifact(projectDir, config, 'feature', f.id);
102
+ if (data?.data.epicId === epicId) {
103
+ epicFeatureIds.add(f.id);
104
+ ids.push(f.id);
105
+ }
106
+ }
107
+ const epicStoryIds = new Set();
108
+ for (const s of stories) {
109
+ const data = await readArtifact(projectDir, config, 'story', s.id);
110
+ if (data?.data.featureId && epicFeatureIds.has(data.data.featureId)) {
111
+ epicStoryIds.add(s.id);
112
+ ids.push(s.id);
113
+ }
114
+ }
115
+ for (const t of tasks) {
116
+ const data = await readArtifact(projectDir, config, 'task', t.id);
117
+ const parentStory = data?.data.storyId;
118
+ const parentFeature = data?.data.featureId;
119
+ if ((parentStory && epicStoryIds.has(parentStory)) ||
120
+ (parentFeature && epicFeatureIds.has(parentFeature))) {
121
+ ids.push(t.id);
122
+ }
123
+ }
124
+ return ids;
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Command registration
128
+ // ---------------------------------------------------------------------------
129
+ export function registerGitHubCommand(program) {
130
+ const github = program
131
+ .command('github')
132
+ .description('Sync planning artifacts with GitHub Issues');
133
+ // --- planr github push ---
134
+ github
135
+ .command('push')
136
+ .description('Push artifacts to GitHub Issues')
137
+ .argument('[artifactId]', 'artifact ID to push (e.g., TASK-001)')
138
+ .option('--epic <epicId>', 'push all artifacts under an epic')
139
+ .option('--all', 'push all artifacts across all types')
140
+ .action(async (artifactId, opts) => {
141
+ const projectDir = program.opts().projectDir;
142
+ const config = await loadConfig(projectDir);
143
+ // Verify GitHub repo
144
+ let repoInfo;
145
+ try {
146
+ repoInfo = await verifyGitHubRepo();
147
+ }
148
+ catch (e) {
149
+ logger.error(e.message);
150
+ process.exit(1);
151
+ }
152
+ logger.heading(`GitHub Push — ${repoInfo.owner}/${repoInfo.repo}`);
153
+ display.blank();
154
+ let artifactIds = [];
155
+ if (opts.all) {
156
+ // Push everything
157
+ const types = ['epic', 'feature', 'story', 'task', 'quick'];
158
+ for (const type of types) {
159
+ const artifacts = await listArtifacts(projectDir, config, type);
160
+ for (const a of artifacts)
161
+ artifactIds.push(a.id);
162
+ }
163
+ }
164
+ else if (opts.epic) {
165
+ // Push all under epic, create milestone
166
+ const epic = await readArtifact(projectDir, config, 'epic', opts.epic);
167
+ if (!epic) {
168
+ logger.error(`Epic not found: ${opts.epic}`);
169
+ process.exit(1);
170
+ }
171
+ const milestoneTitle = `${opts.epic}: ${epic.data.title}`;
172
+ try {
173
+ await ensureMilestone(milestoneTitle);
174
+ logger.success(`Milestone: ${milestoneTitle}`);
175
+ }
176
+ catch (err) {
177
+ logger.debug('Failed to create milestone', err);
178
+ logger.warn('Could not create milestone, pushing without it');
179
+ }
180
+ artifactIds = await collectEpicArtifacts(projectDir, config, opts.epic);
181
+ }
182
+ else if (artifactId) {
183
+ artifactIds = [artifactId];
184
+ }
185
+ else {
186
+ logger.error('Provide an artifact ID, --epic, or --all');
187
+ logger.dim('Usage: planr github push TASK-001');
188
+ logger.dim(' planr github push --epic EPIC-001');
189
+ logger.dim(' planr github push --all');
190
+ process.exit(1);
191
+ }
192
+ if (artifactIds.length === 0) {
193
+ logger.warn('No artifacts found to push');
194
+ return;
195
+ }
196
+ logger.dim(`Pushing ${artifactIds.length} artifact${artifactIds.length !== 1 ? 's' : ''}...`);
197
+ display.blank();
198
+ let created = 0;
199
+ let updated = 0;
200
+ const milestoneTitle = opts.epic
201
+ ? `${opts.epic}: ${(await readArtifact(projectDir, config, 'epic', opts.epic))?.data.title}`
202
+ : undefined;
203
+ for (const id of artifactIds) {
204
+ try {
205
+ const result = await pushSingleArtifact(projectDir, config, id, {
206
+ milestone: milestoneTitle,
207
+ });
208
+ if (result) {
209
+ const icon = result.action === 'created' ? chalk.green('+') : chalk.yellow('~');
210
+ display.line(` ${icon} ${id} → #${result.issueNumber} (${result.action})`);
211
+ if (result.action === 'created')
212
+ created++;
213
+ else
214
+ updated++;
215
+ }
216
+ }
217
+ catch (e) {
218
+ logger.error(` Failed to push ${id}: ${e.message}`);
219
+ }
220
+ }
221
+ display.blank();
222
+ logger.success(`Done: ${created} created, ${updated} updated`);
223
+ });
224
+ // --- planr github sync ---
225
+ github
226
+ .command('sync')
227
+ .description('Sync artifact status with GitHub Issues (bi-directional)')
228
+ .option('--direction <dir>', 'sync direction: pull (GitHub→local), push (local→GitHub), or both', 'both')
229
+ .action(async (opts) => {
230
+ const projectDir = program.opts().projectDir;
231
+ const config = await loadConfig(projectDir);
232
+ let repoInfo;
233
+ try {
234
+ repoInfo = await verifyGitHubRepo();
235
+ }
236
+ catch (e) {
237
+ logger.error(e.message);
238
+ process.exit(1);
239
+ }
240
+ logger.heading(`GitHub Sync — ${repoInfo.owner}/${repoInfo.repo}`);
241
+ display.blank();
242
+ // Find all artifacts with githubIssue field
243
+ const types = ['epic', 'feature', 'story', 'task', 'quick'];
244
+ const linkedArtifacts = [];
245
+ for (const type of types) {
246
+ const artifacts = await listArtifacts(projectDir, config, type);
247
+ for (const a of artifacts) {
248
+ const data = await readArtifact(projectDir, config, type, a.id);
249
+ if (data?.data.githubIssue) {
250
+ linkedArtifacts.push({
251
+ id: a.id,
252
+ type,
253
+ issueNumber: data.data.githubIssue,
254
+ status: data.data.status || 'pending',
255
+ });
256
+ }
257
+ }
258
+ }
259
+ if (linkedArtifacts.length === 0) {
260
+ logger.warn('No artifacts linked to GitHub Issues. Run `planr github push` first.');
261
+ return;
262
+ }
263
+ logger.dim(`Found ${linkedArtifacts.length} linked artifact${linkedArtifacts.length !== 1 ? 's' : ''}`);
264
+ display.blank();
265
+ let synced = 0;
266
+ const conflicts = [];
267
+ for (const artifact of linkedArtifacts) {
268
+ try {
269
+ const issue = await getIssue(artifact.issueNumber);
270
+ const remoteStatus = issueStateToStatus(issue.state);
271
+ const localStatus = artifact.status;
272
+ if (remoteStatus === localStatus) {
273
+ // Already in sync
274
+ continue;
275
+ }
276
+ if (opts.direction === 'pull') {
277
+ // GitHub → local
278
+ await updateLocalStatus(projectDir, config, artifact.type, artifact.id, remoteStatus);
279
+ display.line(` ${chalk.blue('←')} ${artifact.id}: ${chalk.dim(localStatus)} → ${chalk.green(remoteStatus)} (from #${artifact.issueNumber})`);
280
+ synced++;
281
+ }
282
+ else if (opts.direction === 'push') {
283
+ // Local → GitHub
284
+ const targetState = statusToIssueState(localStatus);
285
+ if (issue.state !== targetState) {
286
+ await updateIssue(artifact.issueNumber, { state: targetState });
287
+ }
288
+ display.line(` ${chalk.yellow('→')} ${artifact.id}: #${artifact.issueNumber} ${chalk.dim(issue.state)} → ${chalk.green(targetState)}`);
289
+ synced++;
290
+ }
291
+ else {
292
+ // Both — detect conflicts
293
+ conflicts.push({
294
+ id: artifact.id,
295
+ localStatus,
296
+ remoteState: issue.state,
297
+ issueNumber: artifact.issueNumber,
298
+ });
299
+ }
300
+ }
301
+ catch (e) {
302
+ logger.error(` Failed to sync ${artifact.id}: ${e.message}`);
303
+ }
304
+ }
305
+ // Handle conflicts for bi-directional sync
306
+ if (conflicts.length > 0) {
307
+ display.blank();
308
+ logger.heading('Conflicts detected');
309
+ display.blank();
310
+ for (const conflict of conflicts) {
311
+ const remoteStatus = issueStateToStatus(conflict.remoteState);
312
+ display.line(` ${chalk.red('!')} ${conflict.id} — local: ${chalk.yellow(conflict.localStatus)}, GitHub #${conflict.issueNumber}: ${chalk.cyan(conflict.remoteState)} (${remoteStatus})`);
313
+ const action = await promptSelect(` Resolve ${conflict.id}:`, [
314
+ {
315
+ name: `Use GitHub status (${remoteStatus})`,
316
+ value: 'pull',
317
+ },
318
+ {
319
+ name: `Use local status (${conflict.localStatus})`,
320
+ value: 'push',
321
+ },
322
+ { name: 'Skip', value: 'skip' },
323
+ ]);
324
+ if (action === 'pull') {
325
+ await updateLocalStatus(projectDir, config, findArtifactTypeById(conflict.id) || 'task', conflict.id, remoteStatus);
326
+ display.line(` ${chalk.blue('←')} Updated local to ${remoteStatus}`);
327
+ synced++;
328
+ }
329
+ else if (action === 'push') {
330
+ const targetState = statusToIssueState(conflict.localStatus);
331
+ await updateIssue(conflict.issueNumber, { state: targetState });
332
+ display.line(` ${chalk.yellow('→')} Updated GitHub to ${targetState}`);
333
+ synced++;
334
+ }
335
+ else {
336
+ display.line(` ${chalk.dim('Skipped')}`);
337
+ }
338
+ }
339
+ }
340
+ display.blank();
341
+ if (synced > 0) {
342
+ logger.success(`Synced ${synced} artifact${synced !== 1 ? 's' : ''}`);
343
+ }
344
+ else {
345
+ logger.success('All artifacts are in sync');
346
+ }
347
+ });
348
+ // --- planr github status ---
349
+ github
350
+ .command('status')
351
+ .description('Show sync status of all linked artifacts')
352
+ .action(async () => {
353
+ const projectDir = program.opts().projectDir;
354
+ const config = await loadConfig(projectDir);
355
+ try {
356
+ await verifyGitHubRepo();
357
+ }
358
+ catch (e) {
359
+ logger.error(e.message);
360
+ process.exit(1);
361
+ }
362
+ logger.heading('GitHub Sync Status');
363
+ display.blank();
364
+ const types = ['epic', 'feature', 'story', 'task', 'quick'];
365
+ let linked = 0;
366
+ let unlinked = 0;
367
+ display.line(` ${chalk.dim('Artifact'.padEnd(14))} ${chalk.dim('Status'.padEnd(14))} ${chalk.dim('Issue'.padEnd(10))} ${chalk.dim('State')}`);
368
+ display.tableSeparator(50);
369
+ for (const type of types) {
370
+ const artifacts = await listArtifacts(projectDir, config, type);
371
+ for (const a of artifacts) {
372
+ const data = await readArtifact(projectDir, config, type, a.id);
373
+ const status = data?.data.status || 'pending';
374
+ const issueNumber = data?.data.githubIssue;
375
+ if (issueNumber) {
376
+ let issueState = '';
377
+ try {
378
+ const issue = await getIssue(issueNumber);
379
+ issueState = issue.state;
380
+ }
381
+ catch (err) {
382
+ logger.debug('Failed to fetch GitHub issue state', err);
383
+ issueState = 'error';
384
+ }
385
+ const inSync = issueStateToStatus(issueState) === status ||
386
+ statusToIssueState(status) === issueState;
387
+ const syncIcon = inSync ? chalk.green('✓') : chalk.red('✗');
388
+ display.line(` ${a.id.padEnd(14)} ${status.padEnd(14)} #${String(issueNumber).padEnd(8)} ${issueState} ${syncIcon}`);
389
+ linked++;
390
+ }
391
+ else {
392
+ display.line(` ${a.id.padEnd(14)} ${status.padEnd(14)} ${chalk.dim('—'.padEnd(10))} ${chalk.dim('not linked')}`);
393
+ unlinked++;
394
+ }
395
+ }
396
+ }
397
+ display.tableSeparator(50);
398
+ display.blank();
399
+ display.line(` Linked: ${linked}, Unlinked: ${unlinked}`);
400
+ });
401
+ }
402
+ // ---------------------------------------------------------------------------
403
+ // Local status update
404
+ // ---------------------------------------------------------------------------
405
+ async function updateLocalStatus(projectDir, config, type, id, newStatus) {
406
+ const raw = await readArtifactRaw(projectDir, config, type, id);
407
+ if (!raw)
408
+ return;
409
+ const { data, content } = parseMarkdown(raw);
410
+ data.status = newStatus;
411
+ data.updated = new Date().toISOString().split('T')[0];
412
+ const updated = toMarkdownWithFrontmatter(data, content);
413
+ await updateArtifact(projectDir, config, type, id, updated);
414
+ }
415
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/cli/commands/github.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,cAAc,GACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,UAAU,EACV,WAAW,EACX,WAAW,EACX,eAAe,EACf,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,0EAA0E;AAC1E,SAAS,mBAAmB,CAAC,GAAW,EAAE,KAAa,EAAE,KAAsB;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,QAAQ,EAAE,GAAG,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,4BAA4B;IAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;IACnF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oDAAoD;AACpD,KAAK,UAAU,kBAAkB,CAC/B,UAAkB,EAClB,MAAuB,EACvB,UAAkB,EAClB,IAA4B;IAE5B,MAAM,IAAI,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAElE,sBAAsB;IACtB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK;QAAE,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAiC,CAAC;IAE5E,IAAI,WAAmB,CAAC;IACxB,IAAI,QAAgB,CAAC;IACrB,IAAI,MAA6B,CAAC;IAElC,IAAI,mBAAmB,EAAE,CAAC;QACxB,0EAA0E;QAC1E,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YACzD,MAAM,WAAW,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAExD,MAAM,MAAM,GAAI,QAAQ,CAAC,IAAI,CAAC,MAAiB,IAAI,SAAS,CAAC;YAC7D,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;gBACvC,MAAM,WAAW,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,WAAW,GAAG,mBAAmB,CAAC;YAClC,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC;YAC5B,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,0DAA0D,EAAE,GAAG,CAAC,CAAC;YAC9E,mDAAmD;YACnD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACtE,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;YAC5B,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;YACtB,MAAM,GAAG,SAAS,CAAC;YAEnB,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACtE,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;QACtB,MAAM,GAAG,SAAS,CAAC;QAEnB,6CAA6C;QAC7C,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QACxE,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED,8CAA8C;AAC9C,KAAK,UAAU,oBAAoB,CACjC,UAAkB,EAClB,MAAuB,EACvB,MAAc;IAEd,MAAM,GAAG,GAAa,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACjC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAmB,CAAC,EAAE,CAAC;YAC9E,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,EAAE,IAAI,CAAC,OAA6B,CAAC;QAC7D,MAAM,aAAa,GAAG,IAAI,EAAE,IAAI,CAAC,SAA+B,CAAC;QACjE,IACE,CAAC,WAAW,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC9C,CAAC,aAAa,IAAI,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EACpD,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC,CAAC;IAE7D,4BAA4B;IAC5B,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iCAAiC,CAAC;SAC9C,QAAQ,CAAC,cAAc,EAAE,sCAAsC,CAAC;SAChE,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;SAC7D,MAAM,CAAC,OAAO,EAAE,qCAAqC,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,IAAsC,EAAE,EAAE;QACvF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,qBAAqB;QACrB,IAAI,QAAyC,CAAC;QAC9C,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,iBAAiB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,WAAW,GAAa,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,kBAAkB;YAClB,MAAM,KAAK,GAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBAChE,KAAK,MAAM,CAAC,IAAI,SAAS;oBAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,wCAAwC;YACxC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAe,EAAE,CAAC;YACpE,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;gBACtC,MAAM,CAAC,OAAO,CAAC,cAAc,cAAc,EAAE,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAChE,CAAC;YAED,WAAW,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,WAAW,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,MAAM,YAAY,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI;YAC9B,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAe,EAAE;YACtG,CAAC,CAAC,SAAS,CAAC;QAEd,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC9D,SAAS,EAAE,cAAc;iBAC1B,CAAC,CAAC;gBACH,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAChF,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,OAAO,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;wBAAE,OAAO,EAAE,CAAC;;wBACtC,OAAO,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,SAAS,OAAO,aAAa,OAAO,UAAU,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEL,4BAA4B;IAC5B,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CACL,mBAAmB,EACnB,mEAAmE,EACnE,MAAM,CACP;SACA,MAAM,CAAC,KAAK,EAAE,IAA2B,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,IAAI,QAAyC,CAAC;QAC9C,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,iBAAiB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,4CAA4C;QAC5C,MAAM,KAAK,GAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5E,MAAM,eAAe,GAKhB,EAAE,CAAC;QAER,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAChE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChE,IAAI,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC3B,eAAe,CAAC,IAAI,CAAC;wBACnB,EAAE,EAAE,CAAC,CAAC,EAAE;wBACR,IAAI;wBACJ,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAqB;wBAC5C,MAAM,EAAG,IAAI,CAAC,IAAI,CAAC,MAAiB,IAAI,SAAS;qBAClD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QAED,MAAM,CAAC,GAAG,CACR,SAAS,eAAe,CAAC,MAAM,mBAAmB,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5F,CAAC;QACF,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,SAAS,GAKV,EAAE,CAAC;QAER,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACnD,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAEpC,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;oBACjC,kBAAkB;oBAClB,SAAS;gBACX,CAAC;gBAED,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;oBAC9B,iBAAiB;oBACjB,MAAM,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;oBACtF,OAAO,CAAC,IAAI,CACV,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,QAAQ,CAAC,WAAW,GAAG,CAChI,CAAC;oBACF,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;oBACrC,iBAAiB;oBACjB,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBACpD,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;wBAChC,MAAM,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;oBAClE,CAAC;oBACD,OAAO,CAAC,IAAI,CACV,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE,MAAM,QAAQ,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAC1H,CAAC;oBACF,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,0BAA0B;oBAC1B,SAAS,CAAC,IAAI,CAAC;wBACb,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,WAAW;wBACX,WAAW,EAAE,KAAK,CAAC,KAAK;wBACxB,WAAW,EAAE,QAAQ,CAAC,WAAW;qBAClC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,EAAE,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACrC,OAAO,CAAC,KAAK,EAAE,CAAC;YAEhB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CACV,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE,aAAa,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,QAAQ,CAAC,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,YAAY,GAAG,CAC5K,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAS,aAAa,QAAQ,CAAC,EAAE,GAAG,EAAE;oBACrE;wBACE,IAAI,EAAE,sBAAsB,YAAY,GAAG;wBAC3C,KAAK,EAAE,MAAM;qBACd;oBACD;wBACE,IAAI,EAAE,qBAAqB,QAAQ,CAAC,WAAW,GAAG;wBAClD,KAAK,EAAE,MAAM;qBACd;oBACD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;iBAChC,CAAC,CAAC;gBAEH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,MAAM,iBAAiB,CACrB,UAAU,EACV,MAAM,EACN,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,EAC3C,QAAQ,CAAC,EAAE,EACX,YAAY,CACb,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;oBACxE,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC7B,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;oBAC7D,MAAM,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;oBAChE,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;oBAC1E,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,OAAO,CAAC,UAAU,MAAM,YAAY,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,8BAA8B;IAC9B,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACrC,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,MAAM,KAAK,GAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,OAAO,CAAC,IAAI,CACV,KAAK,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CACjI,CAAC;QACF,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAChE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChE,MAAM,MAAM,GAAI,IAAI,EAAE,IAAI,CAAC,MAAiB,IAAI,SAAS,CAAC;gBAC1D,MAAM,WAAW,GAAG,IAAI,EAAE,IAAI,CAAC,WAAiC,CAAC;gBAEjE,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,UAAU,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;wBAC1C,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;oBAC3B,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;wBACxD,UAAU,GAAG,OAAO,CAAC;oBACvB,CAAC;oBAED,MAAM,MAAM,GACV,kBAAkB,CAAC,UAAU,CAAC,KAAK,MAAM;wBACzC,kBAAkB,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC;oBAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAE5D,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,IAAI,QAAQ,EAAE,CACxG,CAAC;oBACF,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CACpG,CAAC;oBACF,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,aAAa,MAAM,eAAe,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,KAAK,UAAU,iBAAiB,CAC9B,UAAkB,EAClB,MAAuB,EACvB,IAAkB,EAClB,EAAU,EACV,SAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA2CnD"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA2CnD"}