@fantasticit/sumi 0.7.5 → 0.8.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 (173) hide show
  1. package/README.md +28 -25
  2. package/dist/adapters.d.ts +26 -3
  3. package/dist/adapters.js +117 -16
  4. package/dist/adapters.js.map +1 -1
  5. package/dist/agent-hooks.d.ts +7 -1
  6. package/dist/agent-hooks.js +207 -11
  7. package/dist/agent-hooks.js.map +1 -1
  8. package/dist/agents.js +36 -3
  9. package/dist/agents.js.map +1 -1
  10. package/dist/cli.d.ts +3 -1
  11. package/dist/cli.js +45 -6
  12. package/dist/cli.js.map +1 -1
  13. package/dist/context.d.ts +27 -0
  14. package/dist/context.js +31 -13
  15. package/dist/context.js.map +1 -1
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.js +2 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/instructions.js +7 -5
  20. package/dist/instructions.js.map +1 -1
  21. package/dist/task.d.ts +1 -0
  22. package/dist/task.js +170 -0
  23. package/dist/task.js.map +1 -0
  24. package/dist/visualize-page.d.ts +1 -0
  25. package/dist/visualize-page.js +49 -0
  26. package/dist/visualize-page.js.map +1 -0
  27. package/dist/visualize.d.ts +5 -0
  28. package/dist/visualize.js +132 -0
  29. package/dist/visualize.js.map +1 -0
  30. package/node_modules/@sumi/create/dist/scaffold.js +6 -0
  31. package/node_modules/@sumi/create/dist/scaffold.js.map +1 -1
  32. package/node_modules/@sumi/create/package.json +1 -1
  33. package/node_modules/@sumi/create/template/AGENTS.md +2 -0
  34. package/node_modules/@sumi/create/template/control/config.yaml +2 -0
  35. package/node_modules/@sumi/create/template/control/flows/change.flow.yaml +6 -0
  36. package/node_modules/@sumi/create/template/control/flows/check.flow.yaml +8 -0
  37. package/node_modules/@sumi/create/template/control/rubrics/business-impact.yaml +6 -0
  38. package/node_modules/@sumi/create/template/control/rules/development.md +61 -0
  39. package/node_modules/@sumi/create/template/init/AGENTS.md +2 -0
  40. package/node_modules/@sumi/create/template/init/control/flows/check.flow.yaml +2 -0
  41. package/node_modules/@sumi/kernel/dist/brief.d.ts +1 -0
  42. package/node_modules/@sumi/kernel/dist/brief.js +1 -0
  43. package/node_modules/@sumi/kernel/dist/brief.js.map +1 -1
  44. package/node_modules/@sumi/kernel/dist/engine.js +1 -0
  45. package/node_modules/@sumi/kernel/dist/engine.js.map +1 -1
  46. package/node_modules/@sumi/kernel/package.json +2 -2
  47. package/node_modules/@sumi/plugin-sdk/README.md +39 -20
  48. package/node_modules/@sumi/plugin-sdk/dist/index.d.ts +2 -0
  49. package/node_modules/@sumi/plugin-sdk/dist/index.js +2 -0
  50. package/node_modules/@sumi/plugin-sdk/dist/index.js.map +1 -1
  51. package/node_modules/@sumi/plugin-sdk/dist/protocol.d.ts +59 -1
  52. package/node_modules/@sumi/plugin-sdk/dist/protocol.js.map +1 -1
  53. package/node_modules/@sumi/plugin-sdk/dist/rules.d.ts +1 -4
  54. package/node_modules/@sumi/plugin-sdk/dist/rules.js.map +1 -1
  55. package/node_modules/@sumi/plugin-sdk/dist/session-context.d.ts +7 -0
  56. package/node_modules/@sumi/plugin-sdk/dist/session-context.js +62 -0
  57. package/node_modules/@sumi/plugin-sdk/dist/session-context.js.map +1 -0
  58. package/node_modules/@sumi/plugin-sdk/dist/trace.d.ts +16 -0
  59. package/node_modules/@sumi/plugin-sdk/dist/trace.js +48 -0
  60. package/node_modules/@sumi/plugin-sdk/dist/trace.js.map +1 -0
  61. package/node_modules/@sumi/plugin-sdk/dist/validate.js +62 -2
  62. package/node_modules/@sumi/plugin-sdk/dist/validate.js.map +1 -1
  63. package/node_modules/@sumi/plugin-sdk/package.json +1 -1
  64. package/node_modules/@sumi/plugins-core/dist/agent-rules.d.ts +5 -0
  65. package/node_modules/@sumi/plugins-core/dist/agent-rules.js +66 -0
  66. package/node_modules/@sumi/plugins-core/dist/agent-rules.js.map +1 -0
  67. package/node_modules/@sumi/plugins-core/dist/commands/agent-rules-before-edit.d.ts +1 -0
  68. package/node_modules/@sumi/plugins-core/dist/commands/agent-rules-before-edit.js +10 -0
  69. package/node_modules/@sumi/plugins-core/dist/commands/agent-rules-before-edit.js.map +1 -0
  70. package/node_modules/@sumi/plugins-core/dist/commands/agent-rules-prompt.d.ts +1 -0
  71. package/node_modules/@sumi/plugins-core/dist/commands/agent-rules-prompt.js +8 -0
  72. package/node_modules/@sumi/plugins-core/dist/commands/agent-rules-prompt.js.map +1 -0
  73. package/node_modules/@sumi/plugins-core/dist/plugins/agent-rules.d.ts +1 -0
  74. package/node_modules/@sumi/plugins-core/dist/plugins/agent-rules.js +19 -0
  75. package/node_modules/@sumi/plugins-core/dist/plugins/agent-rules.js.map +1 -0
  76. package/node_modules/@sumi/plugins-core/instructions/bugfix.md +9 -0
  77. package/node_modules/@sumi/plugins-core/instructions/feature.md +9 -0
  78. package/node_modules/@sumi/plugins-core/package.json +2 -2
  79. package/node_modules/@sumi/plugins-core/sumi-plugins.yaml +22 -1
  80. package/node_modules/@sumi/plugins-governance/README.md +3 -3
  81. package/node_modules/@sumi/plugins-governance/dist/checkout.d.ts +2 -0
  82. package/node_modules/@sumi/plugins-governance/dist/checkout.js.map +1 -1
  83. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report-check.js +2 -0
  84. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report-check.js.map +1 -1
  85. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js +2 -3
  86. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js.map +1 -1
  87. package/node_modules/@sumi/plugins-governance/dist/pr-report-sections.d.ts +6 -0
  88. package/node_modules/@sumi/plugins-governance/dist/pr-report-sections.js +11 -0
  89. package/node_modules/@sumi/plugins-governance/dist/pr-report-sections.js.map +1 -0
  90. package/node_modules/@sumi/plugins-governance/dist/pr-report-status.d.ts +1 -0
  91. package/node_modules/@sumi/plugins-governance/dist/pr-report-status.js +15 -12
  92. package/node_modules/@sumi/plugins-governance/dist/pr-report-status.js.map +1 -1
  93. package/node_modules/@sumi/plugins-governance/instructions/push.md +1 -1
  94. package/node_modules/@sumi/plugins-governance/package.json +2 -2
  95. package/node_modules/@sumi/plugins-openspec/dist/impact-consistency.d.ts +11 -0
  96. package/node_modules/@sumi/plugins-openspec/dist/impact-consistency.js +67 -0
  97. package/node_modules/@sumi/plugins-openspec/dist/impact-consistency.js.map +1 -0
  98. package/node_modules/@sumi/plugins-openspec/dist/plugins/impact-consistency.d.ts +1 -0
  99. package/node_modules/@sumi/plugins-openspec/dist/plugins/impact-consistency.js +63 -0
  100. package/node_modules/@sumi/plugins-openspec/dist/plugins/impact-consistency.js.map +1 -0
  101. package/node_modules/@sumi/plugins-openspec/package.json +4 -2
  102. package/node_modules/@sumi/plugins-openspec/sumi-plugins.yaml +6 -0
  103. package/node_modules/@sumi/plugins-precedent/README.md +6 -0
  104. package/node_modules/@sumi/plugins-precedent/dist/after-edit-context.d.ts +2 -0
  105. package/node_modules/@sumi/plugins-precedent/dist/after-edit-context.js +89 -77
  106. package/node_modules/@sumi/plugins-precedent/dist/after-edit-context.js.map +1 -1
  107. package/node_modules/@sumi/plugins-precedent/dist/candidates.d.ts +1 -0
  108. package/node_modules/@sumi/plugins-precedent/dist/commands/before-edit-context.d.ts +1 -0
  109. package/node_modules/@sumi/plugins-precedent/dist/commands/before-edit-context.js +10 -0
  110. package/node_modules/@sumi/plugins-precedent/dist/commands/before-edit-context.js.map +1 -0
  111. package/node_modules/@sumi/plugins-precedent/dist/commands/context.js +21 -5
  112. package/node_modules/@sumi/plugins-precedent/dist/commands/context.js.map +1 -1
  113. package/node_modules/@sumi/plugins-precedent/dist/commands/impact-submit.d.ts +1 -0
  114. package/node_modules/@sumi/plugins-precedent/dist/commands/impact-submit.js +21 -0
  115. package/node_modules/@sumi/plugins-precedent/dist/commands/impact-submit.js.map +1 -0
  116. package/node_modules/@sumi/plugins-precedent/dist/commands/on-prompt-context.d.ts +1 -0
  117. package/node_modules/@sumi/plugins-precedent/dist/commands/on-prompt-context.js +55 -0
  118. package/node_modules/@sumi/plugins-precedent/dist/commands/on-prompt-context.js.map +1 -0
  119. package/node_modules/@sumi/plugins-precedent/dist/impact-candidates.d.ts +6 -0
  120. package/node_modules/@sumi/plugins-precedent/dist/impact-candidates.js +51 -0
  121. package/node_modules/@sumi/plugins-precedent/dist/impact-candidates.js.map +1 -0
  122. package/node_modules/@sumi/plugins-precedent/dist/impact-state.d.ts +14 -0
  123. package/node_modules/@sumi/plugins-precedent/dist/impact-state.js +60 -0
  124. package/node_modules/@sumi/plugins-precedent/dist/impact-state.js.map +1 -0
  125. package/node_modules/@sumi/plugins-precedent/dist/impact.d.ts +52 -0
  126. package/node_modules/@sumi/plugins-precedent/dist/impact.js +253 -0
  127. package/node_modules/@sumi/plugins-precedent/dist/impact.js.map +1 -0
  128. package/node_modules/@sumi/plugins-precedent/dist/index.d.ts +2 -0
  129. package/node_modules/@sumi/plugins-precedent/dist/index.js +2 -0
  130. package/node_modules/@sumi/plugins-precedent/dist/index.js.map +1 -1
  131. package/node_modules/@sumi/plugins-precedent/dist/model.d.ts +2 -0
  132. package/node_modules/@sumi/plugins-precedent/dist/model.js.map +1 -1
  133. package/node_modules/@sumi/plugins-precedent/dist/plugins/harvest.js +31 -5
  134. package/node_modules/@sumi/plugins-precedent/dist/plugins/harvest.js.map +1 -1
  135. package/node_modules/@sumi/plugins-precedent/dist/plugins/impact.d.ts +1 -0
  136. package/node_modules/@sumi/plugins-precedent/dist/plugins/impact.js +60 -0
  137. package/node_modules/@sumi/plugins-precedent/dist/plugins/impact.js.map +1 -0
  138. package/node_modules/@sumi/plugins-precedent/package.json +3 -3
  139. package/node_modules/@sumi/plugins-precedent/sumi-plugins.yaml +34 -1
  140. package/node_modules/@sumi/plugins-review/README.md +27 -8
  141. package/node_modules/@sumi/plugins-review/dist/commands/context.js +18 -3
  142. package/node_modules/@sumi/plugins-review/dist/commands/context.js.map +1 -1
  143. package/node_modules/@sumi/plugins-review/dist/commands/host-model-hook.d.ts +1 -0
  144. package/node_modules/@sumi/plugins-review/dist/commands/host-model-hook.js +12 -0
  145. package/node_modules/@sumi/plugins-review/dist/commands/host-model-hook.js.map +1 -0
  146. package/node_modules/@sumi/plugins-review/dist/commands/model-recheck.d.ts +1 -0
  147. package/node_modules/@sumi/plugins-review/dist/commands/model-recheck.js +56 -0
  148. package/node_modules/@sumi/plugins-review/dist/commands/model-recheck.js.map +1 -0
  149. package/node_modules/@sumi/plugins-review/dist/commands/submit.js +25 -67
  150. package/node_modules/@sumi/plugins-review/dist/commands/submit.js.map +1 -1
  151. package/node_modules/@sumi/plugins-review/dist/model-execution.d.ts +29 -0
  152. package/node_modules/@sumi/plugins-review/dist/model-execution.js +157 -0
  153. package/node_modules/@sumi/plugins-review/dist/model-execution.js.map +1 -0
  154. package/node_modules/@sumi/plugins-review/dist/model-independence.d.ts +10 -0
  155. package/node_modules/@sumi/plugins-review/dist/model-independence.js +14 -0
  156. package/node_modules/@sumi/plugins-review/dist/model-independence.js.map +1 -0
  157. package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.d.ts +1 -0
  158. package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js +88 -0
  159. package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js.map +1 -0
  160. package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js +44 -7
  161. package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js.map +1 -1
  162. package/node_modules/@sumi/plugins-review/dist/recheck.d.ts +48 -0
  163. package/node_modules/@sumi/plugins-review/dist/recheck.js +130 -0
  164. package/node_modules/@sumi/plugins-review/dist/recheck.js.map +1 -0
  165. package/node_modules/@sumi/plugins-review/dist/review.d.ts +8 -0
  166. package/node_modules/@sumi/plugins-review/dist/review.js +33 -4
  167. package/node_modules/@sumi/plugins-review/dist/review.js.map +1 -1
  168. package/node_modules/@sumi/plugins-review/dist/submission.d.ts +11 -0
  169. package/node_modules/@sumi/plugins-review/dist/submission.js +77 -0
  170. package/node_modules/@sumi/plugins-review/dist/submission.js.map +1 -0
  171. package/node_modules/@sumi/plugins-review/package.json +4 -3
  172. package/node_modules/@sumi/plugins-review/sumi-plugins.yaml +15 -0
  173. package/package.json +10 -10
@@ -21,6 +21,8 @@ interface ContextData {
21
21
  export declare function editedPaths(root: string, input: string): string[];
22
22
  export declare function queryContext(root: string, paths: string[], timeout?: number): ContextData | null;
23
23
  export declare function acknowledgeContext(root: string, input: string): void;
24
+ /** 只在明确送达约束且状态可记录时,请求编辑工具拒绝一次。 */
25
+ export declare function beforeEditContext(root: string, input: string, query?: (paths: string[]) => ContextData | null): string | null;
24
26
  /** 插件层的提示策略;查询函数可替换以测试失败、超时和异常。 */
25
27
  export declare function afterEditContext(root: string, input: string, query?: (paths: string[]) => ContextData | null): AfterEditResult | null;
26
28
  export {};
@@ -1,7 +1,6 @@
1
- import { createHash, randomUUID } from 'node:crypto';
2
- import { mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
1
+ import { readFileSync, realpathSync } from 'node:fs';
3
2
  import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
4
- import { configFile, PROJECT_SUMI, spawnCommandSync } from '@sumi/plugin-sdk';
3
+ import { configFile, PROJECT_SUMI, readContextSession, saveContextSession, spawnCommandSync, } from '@sumi/plugin-sdk';
5
4
  import { parse } from 'yaml';
6
5
  const LIMIT = 2500;
7
6
  const QUERY_TIMEOUT = 8000;
@@ -68,6 +67,15 @@ function enabled(root) {
68
67
  const data = parse(readFileSync(join(root, file), 'utf8'));
69
68
  return data?.agentContext?.afterEdit !== false;
70
69
  }
70
+ function beforeEnabled(root) {
71
+ if (process.env.SUMI_BEFORE_EDIT === 'off')
72
+ return false;
73
+ const file = configFile(root);
74
+ if (!file)
75
+ return false;
76
+ const data = parse(readFileSync(join(root, file), 'utf8'));
77
+ return data?.agentContext?.beforeEdit === undefined || ['inject-once', 'inject_once'].includes(data.agentContext.beforeEdit);
78
+ }
71
79
  export function queryContext(root, paths, timeout = QUERY_TIMEOUT) {
72
80
  const launcher = process.env.SUMI_BIN || join(root, 'control/bin/sumi.cjs');
73
81
  const result = spawnCommandSync(process.execPath, [launcher, 'context', ...paths, '--json'], {
@@ -76,6 +84,7 @@ export function queryContext(root, paths, timeout = QUERY_TIMEOUT) {
76
84
  timeout,
77
85
  maxBuffer: 1024 * 1024,
78
86
  windowsHide: true,
87
+ env: Object.fromEntries(Object.entries(process.env).filter(([name]) => name !== 'SUMI_SESSION_ID')),
79
88
  });
80
89
  if (result.status !== 0 || result.error)
81
90
  return null;
@@ -84,56 +93,90 @@ export function queryContext(root, paths, timeout = QUERY_TIMEOUT) {
84
93
  ? value
85
94
  : null;
86
95
  }
87
- function stateFile(root, session) {
88
- const key = createHash('sha256').update(session).digest('hex');
89
- return join(root, '.sumi/after-edit-context', `${key}.json`);
90
- }
91
96
  function previous(root, session) {
92
- if (!session)
93
- return new Set();
97
+ return new Set(session ? (readContextSession(root, session)?.keys ?? []) : []);
98
+ }
99
+ export function acknowledgeContext(root, input) {
94
100
  try {
95
- const value = JSON.parse(readFileSync(stateFile(root, session), 'utf8'));
96
- return new Set(Array.isArray(value) ? value.filter((v) => typeof v === 'string') : []);
101
+ const value = JSON.parse(input);
102
+ const session = sessionId(value.originalInput ?? '');
103
+ if (session && Array.isArray(value.keys) && value.keys.every((key) => typeof key === 'string'))
104
+ saveContextSession(root, session, value.keys, undefined, true);
97
105
  }
98
106
  catch {
99
- return new Set();
107
+ /* 送达回执不可影响编辑操作 */
100
108
  }
101
109
  }
102
- function save(root, session, keys) {
103
- try {
104
- const file = stateFile(root, session);
105
- const dir = join(root, '.sumi/after-edit-context');
106
- mkdirSync(dir, { recursive: true });
107
- const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
108
- for (const name of readdirSync(dir)) {
109
- if (!name.endsWith('.json'))
110
- continue;
111
- const stale = join(dir, name);
112
- try {
113
- if (statSync(stale).mtimeMs < cutoff)
114
- unlinkSync(stale);
115
- }
116
- catch {
117
- /* 去重状态清理是尽力而为 */
118
- }
119
- }
120
- const temporary = `${file}.${randomUUID()}.tmp`;
121
- writeFileSync(temporary, JSON.stringify([...new Set([...previous(root, session), ...keys])]));
122
- renameSync(temporary, file);
123
- }
124
- catch {
125
- // 会话去重只是体验优化;状态不可写时仍放行编辑。
110
+ function contextRows(context) {
111
+ const itemRow = (i) => ({ key: `item:${i.ref}`, text: `- [${i.ref}] ${i.text}${i.source ? `(来源:${i.source})` : ''}` });
112
+ const ruleRow = (r) => ({ key: `rule:${r.file}:${r.line}`, text: `- ${r.file}:${r.line} ${r.text}` });
113
+ const pluginRow = (p) => ({
114
+ key: `plugin:${p.id}`,
115
+ text: `- 机械门 ${p.id}${p.description ? `:${p.description}` : ''}`,
116
+ });
117
+ return [
118
+ ...context.items.filter((i) => !i.global).map(itemRow),
119
+ ...context.rules.map(ruleRow),
120
+ ...context.plugins.filter((p) => !p.global).map(pluginRow),
121
+ ].map((row) => ({ ...row, text: row.text.length > 220 ? `${row.text.slice(0, 219)}…` : row.text }));
122
+ }
123
+ function renderContext(paths, rows, before = false, session) {
124
+ if (!rows.length)
125
+ return null;
126
+ const command = `${PROJECT_SUMI} context ${session ? `--session ${JSON.stringify(session)} ` : ''}${paths.map((p) => JSON.stringify(p)).join(' ')}`;
127
+ const footer = before ? `\n约束已送达,请据此重新执行该编辑;完整原文见 ${command}` : `\n原文:${command}`;
128
+ const budget = before ? LIMIT - BEFORE_PREFIX.length : LIMIT;
129
+ let body = '本次编辑命中的项目约束(请核对原文):';
130
+ const deliveryKeys = [];
131
+ for (const row of rows) {
132
+ if (body.length + row.text.length + footer.length + 20 > budget)
133
+ break;
134
+ body += `\n${row.text}`;
135
+ deliveryKeys.push(row.key);
126
136
  }
137
+ if (!deliveryKeys.length)
138
+ return { additionalContext: `${body}\n内容过长,已截断。${footer}`.slice(0, budget) };
139
+ if (deliveryKeys.length < rows.length)
140
+ body += '\n其余条目已截断;';
141
+ return { additionalContext: `${body}${footer}`.slice(0, budget), deliveryKeys };
127
142
  }
128
- export function acknowledgeContext(root, input) {
143
+ const BEFORE_PREFIX = '约束送达,不是失败;请阅读后重试同一编辑。\n';
144
+ /** 用命中条目的所属集合而非目标文件组成稳定范围键。 */
145
+ function scopeOwners(context) {
146
+ const owners = [
147
+ ...context.items.filter((item) => !item.global).map((item) => `item:${item.ref.split('#')[0]}`),
148
+ ...context.rules.map((rule) => `rule:${rule.file}`),
149
+ ...context.plugins.filter((plugin) => !plugin.global).map((plugin) => `plugin:${plugin.id}`),
150
+ ];
151
+ return [...new Set(owners)].sort();
152
+ }
153
+ /** 只在明确送达约束且状态可记录时,请求编辑工具拒绝一次。 */
154
+ export function beforeEditContext(root, input, query = (paths) => queryContext(root, paths)) {
129
155
  try {
130
- const value = JSON.parse(input);
131
- const session = sessionId(value.originalInput ?? '');
132
- if (session && Array.isArray(value.keys) && value.keys.every((key) => typeof key === 'string'))
133
- save(root, session, value.keys);
156
+ if (!beforeEnabled(root))
157
+ return null;
158
+ const session = sessionId(input);
159
+ if (!session)
160
+ return null;
161
+ const paths = editedPaths(root, input);
162
+ if (!paths.length)
163
+ return null;
164
+ const state = readContextSession(root, session);
165
+ if (!state)
166
+ return null;
167
+ const context = query(paths);
168
+ if (!context)
169
+ return null;
170
+ const owners = scopeOwners(context);
171
+ if (!owners.length || owners.every((owner) => state.deniedScopes.includes(owner)))
172
+ return null;
173
+ const result = renderContext(paths, contextRows(context).filter((row) => !state.keys.includes(row.key)), true, session);
174
+ if (!result?.deliveryKeys?.length)
175
+ return null;
176
+ return saveContextSession(root, session, result.deliveryKeys, owners) ? `${BEFORE_PREFIX}${result.additionalContext}` : null;
134
177
  }
135
178
  catch {
136
- /* 送达回执不可影响编辑操作 */
179
+ return null;
137
180
  }
138
181
  }
139
182
  /** 插件层的提示策略;查询函数可替换以测试失败、超时和异常。 */
@@ -148,42 +191,11 @@ export function afterEditContext(root, input, query = (paths) => queryContext(ro
148
191
  if (!context)
149
192
  return null;
150
193
  const session = sessionId(input);
194
+ if (session && !readContextSession(root, session))
195
+ saveContextSession(root, session, [], undefined, true);
151
196
  const seen = previous(root, session);
152
- const itemRow = (i) => ({
153
- key: `item:${i.ref}`,
154
- text: `- [${i.ref}] ${i.text}${i.source ? `(来源:${i.source})` : ''}`,
155
- });
156
- const ruleRow = (r) => ({ key: `rule:${r.file}:${r.line}`, text: `- ${r.file}:${r.line} ${r.text}` });
157
- const pluginRow = (p) => ({
158
- key: `plugin:${p.id}`,
159
- text: `- 机械门 ${p.id}${p.description ? `:${p.description}` : ''}`,
160
- });
161
- const rows = [
162
- ...context.items.filter((i) => !i.global).map(itemRow),
163
- ...context.rules.map(ruleRow),
164
- ...context.plugins.filter((p) => !p.global).map(pluginRow),
165
- ]
166
- .map((row) => ({ ...row, text: row.text.length > 220 ? `${row.text.slice(0, 219)}…` : row.text }))
167
- .filter((row) => !seen.has(row.key));
168
- if (!rows.length)
169
- return null;
170
- const footer = `\n原文:${PROJECT_SUMI} context ${paths.map((p) => JSON.stringify(p)).join(' ')}`;
171
- let body = '本次编辑命中的项目约束(请核对原文):';
172
- let count = 0;
173
- const deliveryKeys = [];
174
- for (const row of rows) {
175
- if (body.length + row.text.length + footer.length + 20 > LIMIT)
176
- break;
177
- body += `\n${row.text}`;
178
- deliveryKeys.push(row.key);
179
- count += 1;
180
- }
181
- if (!count)
182
- return { additionalContext: `${body}\n内容过长,已截断。${footer}`.slice(0, LIMIT) };
183
- if (count < rows.length)
184
- body += '\n其余条目已截断;';
185
- body += footer;
186
- return session ? { additionalContext: body.slice(0, LIMIT), deliveryKeys } : { additionalContext: body.slice(0, LIMIT) };
197
+ const result = renderContext(paths, contextRows(context).filter((row) => !seen.has(row.key)));
198
+ return result && session ? result : result ? { additionalContext: result.additionalContext } : null;
187
199
  }
188
200
  catch {
189
201
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"after-edit-context.js","sourceRoot":"","sources":["../src/after-edit-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"after-edit-context.js","sourceRoot":"","sources":["../src/after-edit-context.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export interface Candidate {
6
6
  spec?: string;
7
7
  change?: string;
8
8
  adr?: string;
9
+ impact?: string;
9
10
  };
10
11
  decision?: 'promoted' | 'rejected';
11
12
  precedent?: string;
@@ -0,0 +1,10 @@
1
+ import { beforeEditContext } from '../after-edit-context.js';
2
+ let input = '';
3
+ for await (const chunk of process.stdin)
4
+ input += chunk;
5
+ const message = beforeEditContext(process.env.SUMI_ROOT ?? process.cwd(), input);
6
+ if (message) {
7
+ process.stderr.write(`${message}\n`);
8
+ process.exitCode = 2;
9
+ }
10
+ //# sourceMappingURL=before-edit-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"before-edit-context.js","sourceRoot":"","sources":["../../src/commands/before-edit-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;IAAE,KAAK,IAAI,KAAK,CAAC;AACxD,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;AACjF,IAAI,OAAO,EAAE,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -1,23 +1,39 @@
1
1
  import { readContextInput } from '@sumi/plugin-sdk';
2
2
  import picomatch from 'picomatch';
3
+ import { impactWiringWarning } from '../impact.js';
3
4
  import { activeIds, readPrecedent, readRegistry } from '../model.js';
4
5
  /** 约束查询:触发条件命中给定路径的 active 判例(没有触发条件的判例对所有路径生效)。 */
5
- const { repoRoot, paths } = await readContextInput();
6
+ const { repoRoot, paths, select, catalog: wantCatalog } = await readContextInput();
6
7
  const items = [];
8
+ const catalog = [];
9
+ if (wantCatalog) {
10
+ const warning = impactWiringWarning(repoRoot);
11
+ if (warning)
12
+ catalog.push({ id: 'workflow:business-constraint-impact', description: '业务约束影响检查接线', warning });
13
+ }
7
14
  for (const id of activeIds(readRegistry(repoRoot))) {
8
15
  const p = readPrecedent(repoRoot, id);
9
16
  if (!p)
10
17
  continue;
11
- const hit = p.triggers?.length ? paths.some((f) => picomatch(p.triggers, { dot: true })(f)) : true;
18
+ const ref = `prec:${id}`;
19
+ if (wantCatalog)
20
+ catalog.push({
21
+ id: ref,
22
+ description: p.statement,
23
+ ...(p.symptoms ? { symptoms: Array.isArray(p.symptoms) ? p.symptoms.join(';') : p.symptoms } : {}),
24
+ source: `precedents/${id}/precedent.yaml`,
25
+ ...(!p.symptoms || (Array.isArray(p.symptoms) && !p.symptoms.length) ? { warning: '判例缺少 symptoms 现象摘要' } : {}),
26
+ });
27
+ const hit = select ? select.includes(ref) : p.triggers?.length ? paths.some((f) => picomatch(p.triggers, { dot: true })(f)) : true;
12
28
  if (!hit)
13
29
  continue;
14
30
  const source = p.source.adr ?? (p.source.spec ? `openspec ${p.source.spec}` : undefined);
15
31
  items.push({
16
- ref: `prec:${id}`,
32
+ ref,
17
33
  text: `${p.statement}(${p.severity === 'error' ? '违反即拦截' : '告警'})`,
18
34
  ...(source ? { source } : {}),
19
- global: !p.triggers?.length,
35
+ global: !p.triggers?.length || p.triggers.includes('**'),
20
36
  });
21
37
  }
22
- process.stdout.write(JSON.stringify({ items }));
38
+ process.stdout.write(JSON.stringify({ items, ...(wantCatalog ? { catalog } : {}) }));
23
39
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAsB,MAAM,kBAAkB,CAAC;AACxE,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErE,oDAAoD;AACpD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;AACrD,MAAM,KAAK,GAA2B,EAAE,CAAC;AACzC,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,SAAS;IACjB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,QAAS,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpG,IAAI,CAAC,GAAG;QAAE,SAAS;IACnB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC;QACT,GAAG,EAAE,QAAQ,EAAE,EAAE;QACjB,IAAI,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG;QAClE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;KAC5B,CAAC,CAAC;AACL,CAAC;AACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAA0B,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { guardCommandArgs } from '@sumi/plugin-sdk';
2
+ import { acceptImpact } from '../impact-state.js';
3
+ const root = process.env.SUMI_ROOT ?? process.cwd();
4
+ const args = process.argv.slice(2);
5
+ guardCommandArgs(args, { usage: '用法:sumi impact-submit <run-id> <step-id> --ticket <ticket>', options: ['ticket'] });
6
+ const index = args.indexOf('--ticket');
7
+ const ticket = index >= 0 ? args[index + 1] : undefined;
8
+ const [runId, stepId] = args.filter((_, i) => i !== index && i !== index + 1);
9
+ if (!runId || !stepId || !ticket) {
10
+ process.stderr.write('用法:sumi impact-submit <run-id> <step-id> --ticket <ticket>\n');
11
+ process.exit(1);
12
+ }
13
+ try {
14
+ acceptImpact(root, runId, stepId, ticket);
15
+ process.stdout.write('业务约束影响记录已接受,请重新运行检查\n');
16
+ }
17
+ catch (error) {
18
+ process.stderr.write(`影响记录未接受:${error.message}\n`);
19
+ process.exitCode = 1;
20
+ }
21
+ //# sourceMappingURL=impact-submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-submit.js","sourceRoot":"","sources":["../../src/commands/impact-submit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AACpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,gBAAgB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,4DAA4D,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrH,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACvC,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9E,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,CAAC;IACH,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;AAChD,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAY,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { configFile, readContextSession, saveContextSession, spawnCommandSync } from '@sumi/plugin-sdk';
4
+ import { parse } from 'yaml';
5
+ /** 只送目录;由宿主模型决定后续 --select。任何故障都静默放行。 */
6
+ try {
7
+ const root = process.env.SUMI_ROOT;
8
+ if (!root)
9
+ process.exit(0);
10
+ if (process.env.SUMI_PROMPT_DELIVERED === '1') {
11
+ let receipt = '';
12
+ for await (const chunk of process.stdin)
13
+ receipt += chunk;
14
+ const value = JSON.parse(receipt);
15
+ const session = JSON.parse(value.originalInput ?? '{}');
16
+ if (typeof session.session_id === 'string' && Array.isArray(value.keys) && value.keys.every((key) => typeof key === 'string'))
17
+ saveContextSession(root, session.session_id, value.keys);
18
+ process.exit(0);
19
+ }
20
+ if (process.env.SUMI_ON_PROMPT === 'off')
21
+ process.exit(0);
22
+ const config = configFile(root);
23
+ if (!config)
24
+ process.exit(0);
25
+ const value = parse(readFileSync(join(root, config), 'utf8'));
26
+ if (value?.agentContext?.onPrompt !== undefined && value.agentContext.onPrompt !== 'inject')
27
+ process.exit(0);
28
+ let raw = '';
29
+ for await (const chunk of process.stdin)
30
+ raw += chunk;
31
+ const payload = JSON.parse(raw);
32
+ if (typeof payload.session_id === 'string' && readContextSession(root, payload.session_id)?.keys.includes('catalog:complete'))
33
+ process.exit(0);
34
+ const launcher = process.env.SUMI_BIN || join(root, 'control/bin/sumi.cjs');
35
+ // 目录不需要提示词原文;不经 argv 或 context 提供者传播用户输入。
36
+ const argv = [launcher, 'task', '--json', '--no-record'];
37
+ if (typeof payload.session_id === 'string' && payload.session_id)
38
+ argv.push('--session', payload.session_id);
39
+ const result = spawnCommandSync(process.execPath, argv, {
40
+ cwd: root,
41
+ encoding: 'utf8',
42
+ timeout: 8000,
43
+ maxBuffer: 1024 * 1024,
44
+ windowsHide: true,
45
+ });
46
+ if (result.status === 0 && !result.error) {
47
+ const parsed = JSON.parse(result.stdout);
48
+ if (typeof parsed.text === 'string' && typeof parsed.count === 'number' && parsed.count > 0)
49
+ process.stdout.write(JSON.stringify({ additionalContext: parsed.text, deliveryKeys: parsed.deliveryKeys }));
50
+ }
51
+ }
52
+ catch {
53
+ /* 用户提示词 hook 故障开放 */
54
+ }
55
+ //# sourceMappingURL=on-prompt-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-prompt-context.js","sourceRoot":"","sources":["../../src/commands/on-prompt-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Finding } from '@sumi/plugin-sdk';
2
+ import { type ImpactRecord } from './impact.js';
3
+ import { type Candidate } from './candidates.js';
4
+ import type { Registry } from './model.js';
5
+ export declare function impactCandidates(root: string, base: string | null, files: string[], change: string, deletionBase?: string | null): Candidate[];
6
+ export declare function impactLifecycleFindings(impact: ImpactRecord | null, registry: Registry): Finding[];
@@ -0,0 +1,51 @@
1
+ import { impactKey, readImpact } from './impact-state.js';
2
+ import { impactScope } from './impact.js';
3
+ import { shortHash } from './candidates.js';
4
+ export function impactCandidates(root, base, files, change, deletionBase = base) {
5
+ const scope = impactScope(root, base, files, deletionBase);
6
+ const impact = scope ? readImpact(root, scope) : null;
7
+ if (!impact || !scope)
8
+ return [];
9
+ const key = impactKey(scope);
10
+ return impact.items.flatMap((item, index) => item.kind === 'none'
11
+ ? []
12
+ : [
13
+ {
14
+ id: `i-${shortHash(`${change}#${index + 1}\0${item.kind}\0${item.statement}\0${item.paths.join('\0')}`)}`,
15
+ summary: `业务约束${item.kind}:${item.statement}`,
16
+ source: {
17
+ impact: `${key}#${index + 1}`,
18
+ change,
19
+ ...(item.spec ? { spec: item.spec } : {}),
20
+ ...(item.adr ? { adr: item.adr } : {}),
21
+ },
22
+ },
23
+ ]);
24
+ }
25
+ export function impactLifecycleFindings(impact, registry) {
26
+ if (!impact)
27
+ return [];
28
+ const active = new Set(registry.precedents.filter((p) => p.status === 'active').map((p) => p.id));
29
+ const findings = [];
30
+ for (const [index, item] of impact.items.entries()) {
31
+ if (item.kind !== 'removed' && item.kind !== 'superseded')
32
+ continue;
33
+ const old = item.previous?.precedent;
34
+ if (!old)
35
+ continue;
36
+ const entry = registry.precedents.find((p) => p.id === old);
37
+ const expected = item.kind === 'removed' ? 'retired' : 'superseded';
38
+ if (entry?.status !== expected ||
39
+ !entry.reason ||
40
+ (expected === 'superseded' && (!entry.supersededBy || entry.supersededBy !== item.precedent || !active.has(entry.supersededBy))))
41
+ findings.push({
42
+ id: `F${findings.length + 1}`,
43
+ rule: 'impact-old-precedent',
44
+ severity: 'error',
45
+ message: `影响项 ${index + 1} 的旧判例 ${old} 尚未完成 ${expected} 登记、原因或有效替代链`,
46
+ file: 'precedents/registry.yaml',
47
+ });
48
+ }
49
+ return findings;
50
+ }
51
+ //# sourceMappingURL=impact-candidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-candidates.js","sourceRoot":"","sources":["../src/impact-candidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ImpactRecord, type ImpactScope } from './impact.js';
2
+ export interface ImpactTicket {
3
+ id: string;
4
+ runId: string;
5
+ stepId: string;
6
+ scope: ImpactScope;
7
+ resultPath: string;
8
+ used: boolean;
9
+ }
10
+ export declare function impactKey(scope: ImpactScope): string;
11
+ export declare function readImpact(root: string, scope: ImpactScope): ImpactRecord | null;
12
+ export declare function createImpactTicket(root: string, runId: string, stepId: string, scope: ImpactScope, resultPath: string): ImpactTicket;
13
+ /** Sumi 命令专用:结果必须仍属于同一次运行、同一受检范围。 */
14
+ export declare function acceptImpact(root: string, runId: string, stepId: string, ticketId: string): ImpactRecord;
@@ -0,0 +1,60 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { stateDir } from '@sumi/plugins-governance';
5
+ import { impactProblems, impactScope } from './impact.js';
6
+ export function impactKey(scope) {
7
+ return createHash('sha256').update(JSON.stringify(scope)).digest('hex');
8
+ }
9
+ function impactDir(root) {
10
+ const dir = join(stateDir(root), 'impacts');
11
+ mkdirSync(dir, { recursive: true });
12
+ return dir;
13
+ }
14
+ function ticketDir(root) {
15
+ const dir = join(stateDir(root), 'impact-tickets');
16
+ mkdirSync(dir, { recursive: true });
17
+ return dir;
18
+ }
19
+ export function readImpact(root, scope) {
20
+ const path = join(impactDir(root), `${impactKey(scope)}.json`);
21
+ if (!existsSync(path))
22
+ return null;
23
+ try {
24
+ const value = JSON.parse(readFileSync(path, 'utf8'));
25
+ return impactProblems(root, scope, value).length ? null : value;
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ export function createImpactTicket(root, runId, stepId, scope, resultPath) {
32
+ const ticket = { id: randomBytes(4).toString('hex'), runId, stepId, scope, resultPath, used: false };
33
+ writeFileSync(join(ticketDir(root), `${ticket.id}.json`), JSON.stringify(ticket, null, 2));
34
+ return ticket;
35
+ }
36
+ /** Sumi 命令专用:结果必须仍属于同一次运行、同一受检范围。 */
37
+ export function acceptImpact(root, runId, stepId, ticketId) {
38
+ if (!/^[a-f0-9]{8}$/.test(ticketId))
39
+ throw new Error('ticket 格式无效');
40
+ const ticketPath = join(ticketDir(root), `${ticketId}.json`);
41
+ if (!existsSync(ticketPath))
42
+ throw new Error('ticket 不存在');
43
+ const ticket = JSON.parse(readFileSync(ticketPath, 'utf8'));
44
+ if (ticket.id !== ticketId || ticket.runId !== runId || ticket.stepId !== stepId || ticket.used)
45
+ throw new Error('ticket 与运行不匹配或已使用');
46
+ if (!existsSync(ticket.resultPath))
47
+ throw new Error(`结果文件不存在:${ticket.resultPath}`);
48
+ const current = impactScope(root, ticket.scope.base, ticket.scope.files.map((f) => f.path));
49
+ if (!current || impactKey(current) !== impactKey(ticket.scope))
50
+ throw new Error('受检范围已变化,请重新运行检查');
51
+ const value = JSON.parse(readFileSync(ticket.resultPath, 'utf8'));
52
+ const problems = impactProblems(root, ticket.scope, value);
53
+ if (problems.length)
54
+ throw new Error(problems.join(';'));
55
+ const record = value;
56
+ writeFileSync(join(impactDir(root), `${impactKey(ticket.scope)}.json`), JSON.stringify(record, null, 2));
57
+ writeFileSync(ticketPath, JSON.stringify({ ...ticket, used: true }, null, 2));
58
+ return record;
59
+ }
60
+ //# sourceMappingURL=impact-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-state.js","sourceRoot":"","sources":["../src/impact-state.ts"],"names":[],"mappings":"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"}