@xera-ai/core 0.1.7 → 0.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 (210) hide show
  1. package/dist/bin/internal.js +1932 -623
  2. package/dist/{adapter → core/src/adapter}/types.d.ts +1 -1
  3. package/dist/core/src/adapter/types.d.ts.map +1 -0
  4. package/dist/core/src/artifact/hash.d.ts.map +1 -0
  5. package/dist/core/src/artifact/meta.d.ts.map +1 -0
  6. package/dist/core/src/artifact/paths.d.ts.map +1 -0
  7. package/dist/core/src/artifact/status.d.ts.map +1 -0
  8. package/dist/core/src/auth/encrypt.d.ts.map +1 -0
  9. package/dist/core/src/auth/key.d.ts.map +1 -0
  10. package/dist/core/src/auth/refresh.d.ts.map +1 -0
  11. package/dist/core/src/auth/state.d.ts.map +1 -0
  12. package/dist/core/src/bin-internal/doctor.d.ts +5 -0
  13. package/dist/core/src/bin-internal/doctor.d.ts.map +1 -0
  14. package/dist/core/src/bin-internal/eval-deterministic.d.ts +5 -0
  15. package/dist/core/src/bin-internal/eval-deterministic.d.ts.map +1 -0
  16. package/dist/core/src/bin-internal/eval-prepare.d.ts +7 -0
  17. package/dist/core/src/bin-internal/eval-prepare.d.ts.map +1 -0
  18. package/dist/core/src/bin-internal/eval-report.d.ts +5 -0
  19. package/dist/core/src/bin-internal/eval-report.d.ts.map +1 -0
  20. package/dist/core/src/bin-internal/exec.d.ts.map +1 -0
  21. package/dist/core/src/bin-internal/fetch.d.ts.map +1 -0
  22. package/dist/core/src/bin-internal/heal-prepare.d.ts +19 -0
  23. package/dist/core/src/bin-internal/heal-prepare.d.ts.map +1 -0
  24. package/dist/core/src/bin-internal/index.d.ts.map +1 -0
  25. package/dist/core/src/bin-internal/lint.d.ts.map +1 -0
  26. package/dist/core/src/bin-internal/normalize.d.ts.map +1 -0
  27. package/dist/core/src/bin-internal/post.d.ts.map +1 -0
  28. package/dist/core/src/bin-internal/promote.d.ts.map +1 -0
  29. package/dist/core/src/bin-internal/report.d.ts.map +1 -0
  30. package/dist/core/src/bin-internal/status-cmd.d.ts.map +1 -0
  31. package/dist/core/src/bin-internal/typecheck.d.ts.map +1 -0
  32. package/dist/core/src/bin-internal/unlock.d.ts.map +1 -0
  33. package/dist/core/src/bin-internal/validate-feature.d.ts.map +1 -0
  34. package/dist/core/src/bin-internal/verify-prompts.d.ts +7 -0
  35. package/dist/core/src/bin-internal/verify-prompts.d.ts.map +1 -0
  36. package/dist/core/src/classifier/aggregate.d.ts.map +1 -0
  37. package/dist/core/src/classifier/history.d.ts.map +1 -0
  38. package/dist/core/src/classifier/types.d.ts.map +1 -0
  39. package/dist/core/src/config/define.d.ts.map +1 -0
  40. package/dist/core/src/config/load.d.ts.map +1 -0
  41. package/dist/{config → core/src/config}/schema.d.ts.map +1 -1
  42. package/dist/core/src/eval/paths.d.ts +15 -0
  43. package/dist/core/src/eval/paths.d.ts.map +1 -0
  44. package/dist/core/src/eval/run-id.d.ts +6 -0
  45. package/dist/core/src/eval/run-id.d.ts.map +1 -0
  46. package/dist/core/src/eval/types.d.ts +551 -0
  47. package/dist/core/src/eval/types.d.ts.map +1 -0
  48. package/dist/core/src/index.d.ts.map +1 -0
  49. package/dist/core/src/jira/client.d.ts.map +1 -0
  50. package/dist/core/src/jira/fields.d.ts.map +1 -0
  51. package/dist/core/src/jira/mcp-backend.d.ts.map +1 -0
  52. package/dist/core/src/jira/rest-backend.d.ts.map +1 -0
  53. package/dist/core/src/jira/retry.d.ts.map +1 -0
  54. package/dist/core/src/jira/types.d.ts.map +1 -0
  55. package/dist/core/src/lock/file-lock.d.ts.map +1 -0
  56. package/dist/core/src/logging/ndjson-logger.d.ts.map +1 -0
  57. package/dist/core/src/reporter/jira-comment.d.ts.map +1 -0
  58. package/dist/core/src/reporter/status-writer.d.ts.map +1 -0
  59. package/dist/src/index.js +19 -12
  60. package/dist/web/src/adapter.d.ts +3 -0
  61. package/dist/web/src/adapter.d.ts.map +1 -0
  62. package/dist/web/src/auth-setup/define.d.ts +16 -0
  63. package/dist/web/src/auth-setup/define.d.ts.map +1 -0
  64. package/dist/web/src/auth-setup/playwright-state.d.ts +2 -0
  65. package/dist/web/src/auth-setup/playwright-state.d.ts.map +1 -0
  66. package/dist/web/src/auth-setup/runner.d.ts +12 -0
  67. package/dist/web/src/auth-setup/runner.d.ts.map +1 -0
  68. package/dist/web/src/executor/index.d.ts +18 -0
  69. package/dist/web/src/executor/index.d.ts.map +1 -0
  70. package/dist/web/src/executor/playwright-args.d.ts +7 -0
  71. package/dist/web/src/executor/playwright-args.d.ts.map +1 -0
  72. package/dist/web/src/generator/gherkin-validate.d.ts +9 -0
  73. package/dist/web/src/generator/gherkin-validate.d.ts.map +1 -0
  74. package/dist/web/src/generator/lint.d.ts +9 -0
  75. package/dist/web/src/generator/lint.d.ts.map +1 -0
  76. package/dist/web/src/generator/pom-scan.d.ts +6 -0
  77. package/dist/web/src/generator/pom-scan.d.ts.map +1 -0
  78. package/dist/web/src/generator/promote.d.ts +7 -0
  79. package/dist/web/src/generator/promote.d.ts.map +1 -0
  80. package/dist/web/src/generator/selector-rules.d.ts +10 -0
  81. package/dist/web/src/generator/selector-rules.d.ts.map +1 -0
  82. package/dist/web/src/generator/typecheck.d.ts +11 -0
  83. package/dist/web/src/generator/typecheck.d.ts.map +1 -0
  84. package/dist/web/src/index.d.ts +18 -0
  85. package/dist/web/src/index.d.ts.map +1 -0
  86. package/dist/web/src/trace-normalizer/normalize.d.ts +7 -0
  87. package/dist/web/src/trace-normalizer/normalize.d.ts.map +1 -0
  88. package/dist/web/src/trace-normalizer/parse.d.ts +37 -0
  89. package/dist/web/src/trace-normalizer/parse.d.ts.map +1 -0
  90. package/dist/web/src/trace-normalizer/scrub-rules.d.ts +12 -0
  91. package/dist/web/src/trace-normalizer/scrub-rules.d.ts.map +1 -0
  92. package/dist/web/src/trace-normalizer/scrub.d.ts +29 -0
  93. package/dist/web/src/trace-normalizer/scrub.d.ts.map +1 -0
  94. package/dist/web/src/trace-normalizer/unzip.d.ts +6 -0
  95. package/dist/web/src/trace-normalizer/unzip.d.ts.map +1 -0
  96. package/package.json +3 -2
  97. package/src/adapter/types.ts +5 -2
  98. package/src/artifact/meta.ts +1 -1
  99. package/src/artifact/status.ts +1 -1
  100. package/src/auth/encrypt.ts +2 -2
  101. package/src/auth/key.ts +1 -2
  102. package/src/auth/refresh.ts +4 -1
  103. package/src/auth/state.ts +2 -2
  104. package/src/bin-internal/doctor.ts +133 -0
  105. package/src/bin-internal/eval-deterministic.ts +149 -0
  106. package/src/bin-internal/eval-prepare.ts +214 -0
  107. package/src/bin-internal/eval-report.ts +177 -0
  108. package/src/bin-internal/exec.ts +28 -15
  109. package/src/bin-internal/fetch.ts +21 -10
  110. package/src/bin-internal/heal-prepare.ts +230 -0
  111. package/src/bin-internal/index.ts +25 -11
  112. package/src/bin-internal/lint.ts +11 -4
  113. package/src/bin-internal/normalize.ts +23 -9
  114. package/src/bin-internal/post.ts +10 -4
  115. package/src/bin-internal/report.ts +3 -3
  116. package/src/bin-internal/status-cmd.ts +11 -3
  117. package/src/bin-internal/typecheck.ts +9 -3
  118. package/src/bin-internal/unlock.ts +12 -4
  119. package/src/bin-internal/validate-feature.ts +14 -5
  120. package/src/bin-internal/verify-prompts.ts +59 -0
  121. package/src/classifier/aggregate.ts +13 -6
  122. package/src/config/define.ts +3 -1
  123. package/src/config/load.ts +1 -1
  124. package/src/config/schema.ts +43 -37
  125. package/src/eval/paths.ts +32 -0
  126. package/src/eval/run-id.ts +30 -0
  127. package/src/eval/types.ts +101 -0
  128. package/src/jira/client.ts +4 -2
  129. package/src/jira/fields.ts +4 -2
  130. package/src/jira/mcp-backend.ts +1 -1
  131. package/src/jira/rest-backend.ts +17 -5
  132. package/src/jira/retry.ts +2 -2
  133. package/src/lock/file-lock.ts +2 -2
  134. package/src/logging/ndjson-logger.ts +2 -2
  135. package/src/reporter/jira-comment.ts +13 -7
  136. package/src/reporter/status-writer.ts +2 -2
  137. package/dist/adapter/types.d.ts.map +0 -1
  138. package/dist/artifact/hash.d.ts.map +0 -1
  139. package/dist/artifact/meta.d.ts.map +0 -1
  140. package/dist/artifact/paths.d.ts.map +0 -1
  141. package/dist/artifact/status.d.ts.map +0 -1
  142. package/dist/auth/encrypt.d.ts.map +0 -1
  143. package/dist/auth/key.d.ts.map +0 -1
  144. package/dist/auth/refresh.d.ts.map +0 -1
  145. package/dist/auth/state.d.ts.map +0 -1
  146. package/dist/bin-internal/exec.d.ts.map +0 -1
  147. package/dist/bin-internal/fetch.d.ts.map +0 -1
  148. package/dist/bin-internal/index.d.ts.map +0 -1
  149. package/dist/bin-internal/lint.d.ts.map +0 -1
  150. package/dist/bin-internal/normalize.d.ts.map +0 -1
  151. package/dist/bin-internal/post.d.ts.map +0 -1
  152. package/dist/bin-internal/promote.d.ts.map +0 -1
  153. package/dist/bin-internal/report.d.ts.map +0 -1
  154. package/dist/bin-internal/status-cmd.d.ts.map +0 -1
  155. package/dist/bin-internal/typecheck.d.ts.map +0 -1
  156. package/dist/bin-internal/unlock.d.ts.map +0 -1
  157. package/dist/bin-internal/validate-feature.d.ts.map +0 -1
  158. package/dist/classifier/aggregate.d.ts.map +0 -1
  159. package/dist/classifier/history.d.ts.map +0 -1
  160. package/dist/classifier/types.d.ts.map +0 -1
  161. package/dist/config/define.d.ts.map +0 -1
  162. package/dist/config/load.d.ts.map +0 -1
  163. package/dist/index.d.ts.map +0 -1
  164. package/dist/jira/client.d.ts.map +0 -1
  165. package/dist/jira/fields.d.ts.map +0 -1
  166. package/dist/jira/mcp-backend.d.ts.map +0 -1
  167. package/dist/jira/rest-backend.d.ts.map +0 -1
  168. package/dist/jira/retry.d.ts.map +0 -1
  169. package/dist/jira/types.d.ts.map +0 -1
  170. package/dist/lock/file-lock.d.ts.map +0 -1
  171. package/dist/logging/ndjson-logger.d.ts.map +0 -1
  172. package/dist/reporter/jira-comment.d.ts.map +0 -1
  173. package/dist/reporter/status-writer.d.ts.map +0 -1
  174. /package/dist/{artifact → core/src/artifact}/hash.d.ts +0 -0
  175. /package/dist/{artifact → core/src/artifact}/meta.d.ts +0 -0
  176. /package/dist/{artifact → core/src/artifact}/paths.d.ts +0 -0
  177. /package/dist/{artifact → core/src/artifact}/status.d.ts +0 -0
  178. /package/dist/{auth → core/src/auth}/encrypt.d.ts +0 -0
  179. /package/dist/{auth → core/src/auth}/key.d.ts +0 -0
  180. /package/dist/{auth → core/src/auth}/refresh.d.ts +0 -0
  181. /package/dist/{auth → core/src/auth}/state.d.ts +0 -0
  182. /package/dist/{bin-internal → core/src/bin-internal}/exec.d.ts +0 -0
  183. /package/dist/{bin-internal → core/src/bin-internal}/fetch.d.ts +0 -0
  184. /package/dist/{bin-internal → core/src/bin-internal}/index.d.ts +0 -0
  185. /package/dist/{bin-internal → core/src/bin-internal}/lint.d.ts +0 -0
  186. /package/dist/{bin-internal → core/src/bin-internal}/normalize.d.ts +0 -0
  187. /package/dist/{bin-internal → core/src/bin-internal}/post.d.ts +0 -0
  188. /package/dist/{bin-internal → core/src/bin-internal}/promote.d.ts +0 -0
  189. /package/dist/{bin-internal → core/src/bin-internal}/report.d.ts +0 -0
  190. /package/dist/{bin-internal → core/src/bin-internal}/status-cmd.d.ts +0 -0
  191. /package/dist/{bin-internal → core/src/bin-internal}/typecheck.d.ts +0 -0
  192. /package/dist/{bin-internal → core/src/bin-internal}/unlock.d.ts +0 -0
  193. /package/dist/{bin-internal → core/src/bin-internal}/validate-feature.d.ts +0 -0
  194. /package/dist/{classifier → core/src/classifier}/aggregate.d.ts +0 -0
  195. /package/dist/{classifier → core/src/classifier}/history.d.ts +0 -0
  196. /package/dist/{classifier → core/src/classifier}/types.d.ts +0 -0
  197. /package/dist/{config → core/src/config}/define.d.ts +0 -0
  198. /package/dist/{config → core/src/config}/load.d.ts +0 -0
  199. /package/dist/{config → core/src/config}/schema.d.ts +0 -0
  200. /package/dist/{index.d.ts → core/src/index.d.ts} +0 -0
  201. /package/dist/{jira → core/src/jira}/client.d.ts +0 -0
  202. /package/dist/{jira → core/src/jira}/fields.d.ts +0 -0
  203. /package/dist/{jira → core/src/jira}/mcp-backend.d.ts +0 -0
  204. /package/dist/{jira → core/src/jira}/rest-backend.d.ts +0 -0
  205. /package/dist/{jira → core/src/jira}/retry.d.ts +0 -0
  206. /package/dist/{jira → core/src/jira}/types.d.ts +0 -0
  207. /package/dist/{lock → core/src/lock}/file-lock.d.ts +0 -0
  208. /package/dist/{logging → core/src/logging}/ndjson-logger.d.ts +0 -0
  209. /package/dist/{reporter → core/src/reporter}/jira-comment.d.ts +0 -0
  210. /package/dist/{reporter → core/src/reporter}/status-writer.d.ts +0 -0
@@ -0,0 +1,59 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+
4
+ export interface CheckResult {
5
+ ok: boolean;
6
+ message: string;
7
+ }
8
+
9
+ const IN_SCOPE_PROMPTS = [
10
+ 'feature-from-story.md',
11
+ 'script-from-feature.md',
12
+ 'heal-locator.md',
13
+ ] as const;
14
+
15
+ const REQUIRED_SECTION_HEADING = '## Handling untrusted input';
16
+
17
+ const REQUIRED_KEYWORDS = ['UNTRUSTED', 'injection-follow', '<XR_'] as const;
18
+
19
+ export function verifyPrompts(repoRoot: string): CheckResult[] {
20
+ const promptsDir = join(repoRoot, 'packages/prompts');
21
+ const results: CheckResult[] = [];
22
+ for (const filename of IN_SCOPE_PROMPTS) {
23
+ const path = join(promptsDir, filename);
24
+ if (!existsSync(path)) {
25
+ results.push({
26
+ ok: false,
27
+ message: `${filename}: file missing at packages/prompts/${filename}`,
28
+ });
29
+ continue;
30
+ }
31
+ const text = readFileSync(path, 'utf8');
32
+ if (!text.includes(REQUIRED_SECTION_HEADING)) {
33
+ results.push({
34
+ ok: false,
35
+ message: `${filename}: missing required section "${REQUIRED_SECTION_HEADING}"`,
36
+ });
37
+ continue;
38
+ }
39
+ for (const keyword of REQUIRED_KEYWORDS) {
40
+ if (!text.includes(keyword)) {
41
+ results.push({
42
+ ok: false,
43
+ message: `${filename}: missing required keyword "${keyword}" (expected in "${REQUIRED_SECTION_HEADING}" section)`,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ return results;
49
+ }
50
+
51
+ export async function verifyPromptsCmd(_argv: string[]): Promise<number> {
52
+ const results = verifyPrompts(process.cwd());
53
+ if (results.length === 0) {
54
+ console.log('[xera:verify-prompts] ok');
55
+ return 0;
56
+ }
57
+ for (const r of results) console.error(`[xera:verify-prompts] ${r.message}`);
58
+ return 1;
59
+ }
@@ -1,7 +1,11 @@
1
- import type { ClassifyOutput, ScenarioClassification, Confidence } from './types';
1
+ import type { ClassifyOutput, Confidence, ScenarioClassification } from './types';
2
2
 
3
3
  const CLASS_PRIORITY: Array<ClassifyOutput['overall']> = [
4
- 'REAL_BUG', 'TEST_BUG', 'SELECTOR_DRIFT', 'FLAKY', 'PASS',
4
+ 'REAL_BUG',
5
+ 'TEST_BUG',
6
+ 'SELECTOR_DRIFT',
7
+ 'FLAKY',
8
+ 'PASS',
5
9
  ];
6
10
 
7
11
  const CONF_RANK: Record<Confidence, number> = { low: 1, medium: 2, high: 3 };
@@ -10,16 +14,19 @@ export function aggregateScenarios(scenarios: ScenarioClassification[]): Classif
10
14
  if (scenarios.length === 0) {
11
15
  return { overall: 'PASS', overallConfidence: 'low', scenarios: [] };
12
16
  }
13
- if (scenarios.every(s => s.outcome === 'PASS')) {
17
+ if (scenarios.every((s) => s.outcome === 'PASS')) {
14
18
  return { overall: 'PASS', overallConfidence: 'high', scenarios };
15
19
  }
16
20
  let chosen: ClassifyOutput['overall'] = 'PASS';
17
21
  for (const cls of CLASS_PRIORITY) {
18
- if (scenarios.some(s => s.class === cls)) { chosen = cls; break; }
22
+ if (scenarios.some((s) => s.class === cls)) {
23
+ chosen = cls;
24
+ break;
25
+ }
19
26
  }
20
- const matching = scenarios.filter(s => s.class === chosen);
27
+ const matching = scenarios.filter((s) => s.class === chosen);
21
28
  const minConf = matching.reduce<Confidence>(
22
- (acc, s) => CONF_RANK[s.confidence] < CONF_RANK[acc] ? s.confidence : acc,
29
+ (acc, s) => (CONF_RANK[s.confidence] < CONF_RANK[acc] ? s.confidence : acc),
23
30
  'high',
24
31
  );
25
32
  return { overall: chosen, overallConfidence: minConf, scenarios };
@@ -1,2 +1,4 @@
1
1
  import type { XeraConfig } from './schema';
2
- export function defineConfig(config: XeraConfig): XeraConfig { return config; }
2
+ export function defineConfig(config: XeraConfig): XeraConfig {
3
+ return config;
4
+ }
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { pathToFileURL } from 'node:url';
4
- import { XeraConfigSchema, type XeraConfig } from './schema';
4
+ import { type XeraConfig, XeraConfigSchema } from './schema';
5
5
 
6
6
  export async function loadConfig(cwd: string): Promise<XeraConfig> {
7
7
  const path = join(cwd, 'xera.config.ts');
@@ -13,21 +13,23 @@ const AuthSchema = z.object({
13
13
  roles: z.record(z.string(), AuthRoleSchema).default({}),
14
14
  });
15
15
 
16
- const WebSchema = z.object({
17
- baseUrl: z.record(z.string(), z.string().url()).refine(m => Object.keys(m).length > 0, {
18
- message: 'baseUrl must have at least one environment',
19
- }),
20
- defaultEnv: z.string(),
21
- auth: AuthSchema.default({}),
22
- testData: z
23
- .object({
24
- users: z.record(z.string(), z.object({ fromAuth: z.string() })).default({}),
25
- })
26
- .default({ users: {} }),
27
- }).refine(w => w.baseUrl[w.defaultEnv] !== undefined, {
28
- message: 'defaultEnv must exist in baseUrl map',
29
- path: ['defaultEnv'],
30
- });
16
+ const WebSchema = z
17
+ .object({
18
+ baseUrl: z.record(z.string(), z.string().url()).refine((m) => Object.keys(m).length > 0, {
19
+ message: 'baseUrl must have at least one environment',
20
+ }),
21
+ defaultEnv: z.string(),
22
+ auth: AuthSchema.default({}),
23
+ testData: z
24
+ .object({
25
+ users: z.record(z.string(), z.object({ fromAuth: z.string() })).default({}),
26
+ })
27
+ .default({ users: {} }),
28
+ })
29
+ .refine((w) => w.baseUrl[w.defaultEnv] !== undefined, {
30
+ message: 'defaultEnv must exist in baseUrl map',
31
+ path: ['defaultEnv'],
32
+ });
31
33
 
32
34
  const JiraSchema = z.object({
33
35
  baseUrl: z.string().url(),
@@ -39,29 +41,33 @@ const JiraSchema = z.object({
39
41
  }),
40
42
  });
41
43
 
42
- const AISchema = z.object({
43
- livePageSnapshot: z.boolean().default(true),
44
- confidenceThreshold: z.enum(['low', 'medium', 'high']).default('medium'),
45
- maxRetries: z
46
- .object({
47
- typecheck: z.number().int().min(0).max(5).default(2),
48
- lint: z.number().int().min(0).max(5).default(2),
49
- validateFeature: z.number().int().min(0).max(5).default(2),
50
- })
51
- .default({}),
52
- }).default({});
44
+ const AISchema = z
45
+ .object({
46
+ livePageSnapshot: z.boolean().default(true),
47
+ confidenceThreshold: z.enum(['low', 'medium', 'high']).default('medium'),
48
+ maxRetries: z
49
+ .object({
50
+ typecheck: z.number().int().min(0).max(5).default(2),
51
+ lint: z.number().int().min(0).max(5).default(2),
52
+ validateFeature: z.number().int().min(0).max(5).default(2),
53
+ })
54
+ .default({}),
55
+ })
56
+ .default({});
53
57
 
54
- const ReportingSchema = z.object({
55
- language: z.enum(['en', 'vi']).default('en'),
56
- postToJira: z.boolean().default(true),
57
- transition: z
58
- .object({
59
- onPass: z.string().nullable().default(null),
60
- onFail: z.string().nullable().default(null),
61
- })
62
- .default({}),
63
- artifactLinks: z.enum(['git', 'local']).default('git'),
64
- }).default({});
58
+ const ReportingSchema = z
59
+ .object({
60
+ language: z.enum(['en', 'vi']).default('en'),
61
+ postToJira: z.boolean().default(true),
62
+ transition: z
63
+ .object({
64
+ onPass: z.string().nullable().default(null),
65
+ onFail: z.string().nullable().default(null),
66
+ })
67
+ .default({}),
68
+ artifactLinks: z.enum(['git', 'local']).default('git'),
69
+ })
70
+ .default({});
65
71
 
66
72
  export const XeraConfigSchema = z.object({
67
73
  jira: JiraSchema,
@@ -0,0 +1,32 @@
1
+ import { join } from 'node:path';
2
+
3
+ export interface EvalPaths {
4
+ root: string;
5
+ manifest: string;
6
+ lock: string;
7
+ deterministicScores: string;
8
+ judgeScores: string;
9
+ report: string;
10
+ summary: string;
11
+ inputsDir: string;
12
+ actualDir: string;
13
+ ticketInputsDir(ticket: string): string;
14
+ ticketActualDir(ticket: string): string;
15
+ }
16
+
17
+ export function resolveEvalPaths(cwd: string, runId: string): EvalPaths {
18
+ const root = join(cwd, '.xera', 'eval', runId);
19
+ return {
20
+ root,
21
+ manifest: join(root, 'manifest.json'),
22
+ lock: join(root, '.lock'),
23
+ deterministicScores: join(root, 'deterministic-scores.json'),
24
+ judgeScores: join(root, 'judge-scores.json'),
25
+ report: join(root, 'report.md'),
26
+ summary: join(root, 'summary.json'),
27
+ inputsDir: join(root, 'inputs'),
28
+ actualDir: join(root, 'actual'),
29
+ ticketInputsDir: (ticket: string) => join(root, 'inputs', ticket),
30
+ ticketActualDir: (ticket: string) => join(root, 'actual', ticket),
31
+ };
32
+ }
@@ -0,0 +1,30 @@
1
+ import { execSync } from 'node:child_process';
2
+
3
+ export interface RunIdOpts {
4
+ getGitSha?: () => string | null;
5
+ now?: () => Date;
6
+ }
7
+
8
+ function defaultGetGitSha(): string | null {
9
+ try {
10
+ return execSync('git rev-parse HEAD', { stdio: ['ignore', 'pipe', 'ignore'] })
11
+ .toString()
12
+ .trim();
13
+ } catch {
14
+ return null;
15
+ }
16
+ }
17
+
18
+ function pad(n: number): string {
19
+ return n.toString().padStart(2, '0');
20
+ }
21
+
22
+ export function generateRunId(opts: RunIdOpts = {}): string {
23
+ const getGitSha = opts.getGitSha ?? defaultGetGitSha;
24
+ const now = (opts.now ?? (() => new Date()))();
25
+ const date = `${now.getUTCFullYear()}${pad(now.getUTCMonth() + 1)}${pad(now.getUTCDate())}`;
26
+ const time = `${pad(now.getUTCHours())}${pad(now.getUTCMinutes())}${pad(now.getUTCSeconds())}`;
27
+ const sha = getGitSha();
28
+ const short = sha ? sha.slice(0, 7) : 'nogit';
29
+ return `${date}-${time}-${short}`;
30
+ }
@@ -0,0 +1,101 @@
1
+ import { z } from 'zod';
2
+
3
+ export const STAGES = ['feature-from-story', 'script-from-feature', 'diagnose-failure'] as const;
4
+ export const StageSchema = z.enum(STAGES);
5
+ export type Stage = z.infer<typeof StageSchema>;
6
+
7
+ export const VerdictSchema = z.enum(['PASS', 'FAIL', 'NA']);
8
+ export type Verdict = z.infer<typeof VerdictSchema>;
9
+
10
+ export const PromptVersionsSchema = z.object({
11
+ 'feature-from-story': z.string(),
12
+ 'script-from-feature': z.string(),
13
+ 'diagnose-failure': z.string(),
14
+ 'eval-rubric': z.string(),
15
+ });
16
+ export type PromptVersions = z.infer<typeof PromptVersionsSchema>;
17
+
18
+ export const ManifestSchema = z.object({
19
+ run_id: z.string(),
20
+ started_at: z.string(),
21
+ git_sha: z.string(),
22
+ tickets: z.array(z.string()).min(1),
23
+ stages: z.array(StageSchema).min(1),
24
+ ticket_stages: z.record(z.string(), z.array(StageSchema).min(1)),
25
+ prompt_versions: PromptVersionsSchema,
26
+ flags: z.object({
27
+ force: z.boolean(),
28
+ only_prompt: StageSchema.nullable(),
29
+ only_ticket: z.string().nullable(),
30
+ judge_only: z.boolean(),
31
+ }),
32
+ });
33
+ export type Manifest = z.infer<typeof ManifestSchema>;
34
+
35
+ export const DimensionSchema = z.object({
36
+ name: z.string(),
37
+ verdict: VerdictSchema,
38
+ notes: z.string(),
39
+ });
40
+ export type Dimension = z.infer<typeof DimensionSchema>;
41
+
42
+ export const JudgmentSchema = z.object({
43
+ stage: StageSchema,
44
+ ticket: z.string(),
45
+ dimensions: z.array(DimensionSchema).min(1),
46
+ });
47
+ export type Judgment = z.infer<typeof JudgmentSchema>;
48
+
49
+ export const JudgeScoresSchema = z.object({
50
+ run_id: z.string(),
51
+ judgments: z.array(JudgmentSchema),
52
+ });
53
+ export type JudgeScores = z.infer<typeof JudgeScoresSchema>;
54
+
55
+ export const DeterministicEntrySchema = z.object({
56
+ ticket: z.string(),
57
+ stage: StageSchema,
58
+ passed: z.boolean(),
59
+ checks: z.array(z.string()),
60
+ error: z.string().optional(),
61
+ });
62
+ export type DeterministicEntry = z.infer<typeof DeterministicEntrySchema>;
63
+
64
+ export const DeterministicScoresSchema = z.object({
65
+ run_id: z.string(),
66
+ entries: z.array(DeterministicEntrySchema),
67
+ });
68
+ export type DeterministicScores = z.infer<typeof DeterministicScoresSchema>;
69
+
70
+ export const ResultSchema = z.object({
71
+ ticket: z.string(),
72
+ stage: StageSchema,
73
+ deterministic: z.object({
74
+ passed: z.boolean(),
75
+ checks: z.array(z.string()),
76
+ error: z.string().optional(),
77
+ }),
78
+ judge: z
79
+ .object({
80
+ passed: z.boolean(),
81
+ dimensions: z.array(DimensionSchema),
82
+ score: z.number().min(0).max(1),
83
+ })
84
+ .nullable(),
85
+ skipped: z.boolean().optional(),
86
+ });
87
+ export type Result = z.infer<typeof ResultSchema>;
88
+
89
+ export const SummarySchema = z.object({
90
+ run_id: z.string(),
91
+ git_sha: z.string(),
92
+ prompt_versions: PromptVersionsSchema,
93
+ results: z.array(ResultSchema),
94
+ overall: z.object({
95
+ passed: z.number().int().nonnegative(),
96
+ failed: z.number().int().nonnegative(),
97
+ total: z.number().int().nonnegative(),
98
+ score: z.number().min(0).max(1),
99
+ }),
100
+ });
101
+ export type Summary = z.infer<typeof SummarySchema>;
@@ -1,6 +1,6 @@
1
- import type { JiraClient } from './types';
2
1
  import { createMcpBackend } from './mcp-backend';
3
2
  import { createRestBackend } from './rest-backend';
3
+ import type { JiraClient } from './types';
4
4
 
5
5
  export interface CreateJiraClientOptions {
6
6
  baseUrl: string;
@@ -14,7 +14,9 @@ export async function createJiraClient(opts: CreateJiraClientOptions): Promise<J
14
14
  if (mcp) return mcp;
15
15
  }
16
16
  if (!opts.rest) {
17
- throw new Error('Atlassian MCP not connected and no REST credentials provided (JIRA_EMAIL + JIRA_API_TOKEN).');
17
+ throw new Error(
18
+ 'Atlassian MCP not connected and no REST credentials provided (JIRA_EMAIL + JIRA_API_TOKEN).',
19
+ );
18
20
  }
19
21
  return createRestBackend(opts.baseUrl, opts.rest);
20
22
  }
@@ -8,8 +8,10 @@ export interface JiraFieldInfo {
8
8
 
9
9
  export function rankStoryCandidates(fields: JiraFieldInfo[]): JiraFieldInfo[] {
10
10
  return fields
11
- .filter(f => f.hasContent)
12
- .filter(f => !['attachment', 'comment', 'created', 'updated', 'reporter', 'creator'].includes(f.id))
11
+ .filter((f) => f.hasContent)
12
+ .filter(
13
+ (f) => !['attachment', 'comment', 'created', 'updated', 'reporter', 'creator'].includes(f.id),
14
+ )
13
15
  .sort((a, b) => {
14
16
  const ai = PREFERRED_STORY_IDS.indexOf(a.id);
15
17
  const bi = PREFERRED_STORY_IDS.indexOf(b.id);
@@ -1,4 +1,4 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { join } from 'node:path';
4
4
  import type { JiraClient, JiraTicket } from './types';
@@ -1,6 +1,9 @@
1
1
  import type { JiraClient, JiraFieldMap, JiraTicket } from './types';
2
2
 
3
- interface RestCreds { email: string; apiToken: string; }
3
+ interface RestCreds {
4
+ email: string;
5
+ apiToken: string;
6
+ }
4
7
 
5
8
  export function createRestBackend(baseUrl: string, creds: RestCreds): JiraClient {
6
9
  const authHeader = `Basic ${Buffer.from(`${creds.email}:${creds.apiToken}`).toString('base64')}`;
@@ -17,7 +20,9 @@ export function createRestBackend(baseUrl: string, creds: RestCreds): JiraClient
17
20
  },
18
21
  });
19
22
  if (!r.ok && r.status !== 201) {
20
- throw new Error(`Jira REST ${init?.method ?? 'GET'} ${path} failed: ${r.status} ${await r.text()}`);
23
+ throw new Error(
24
+ `Jira REST ${init?.method ?? 'GET'} ${path} failed: ${r.status} ${await r.text()}`,
25
+ );
21
26
  }
22
27
  return r;
23
28
  }
@@ -32,7 +37,10 @@ export function createRestBackend(baseUrl: string, creds: RestCreds): JiraClient
32
37
  const json = (await r.json()) as { key: string; fields: Record<string, unknown> };
33
38
  const f = json.fields;
34
39
  const attachments = Array.isArray(f.attachment)
35
- ? (f.attachment as Array<{ filename: string; content: string }>).map(a => ({ filename: a.filename, url: a.content }))
40
+ ? (f.attachment as Array<{ filename: string; content: string }>).map((a) => ({
41
+ filename: a.filename,
42
+ url: a.content,
43
+ }))
36
44
  : [];
37
45
  const ticket: JiraTicket = {
38
46
  key: json.key,
@@ -50,7 +58,11 @@ export function createRestBackend(baseUrl: string, creds: RestCreds): JiraClient
50
58
  const r = await req(`/rest/api/3/issue/${encodeURIComponent(key)}/comment`, {
51
59
  method: 'POST',
52
60
  body: JSON.stringify({
53
- body: { type: 'doc', version: 1, content: [{ type: 'paragraph', content: [{ type: 'text', text: body }] }] },
61
+ body: {
62
+ type: 'doc',
63
+ version: 1,
64
+ content: [{ type: 'paragraph', content: [{ type: 'text', text: body }] }],
65
+ },
54
66
  }),
55
67
  });
56
68
  const json = (await r.json()) as { id: string };
@@ -59,7 +71,7 @@ export function createRestBackend(baseUrl: string, creds: RestCreds): JiraClient
59
71
  async transitionStatus(key, statusName) {
60
72
  const tr = await req(`/rest/api/3/issue/${encodeURIComponent(key)}/transitions`);
61
73
  const json = (await tr.json()) as { transitions: Array<{ id: string; name: string }> };
62
- const t = json.transitions.find(x => x.name === statusName);
74
+ const t = json.transitions.find((x) => x.name === statusName);
63
75
  if (!t) throw new Error(`No transition named "${statusName}" available for ${key}`);
64
76
  await req(`/rest/api/3/issue/${encodeURIComponent(key)}/transitions`, {
65
77
  method: 'POST',
package/src/jira/retry.ts CHANGED
@@ -16,8 +16,8 @@ export async function withRetry<T>(fn: () => Promise<T>, opts: RetryOptions): Pr
16
16
  if (opts.shouldRetry && !opts.shouldRetry(err)) throw err;
17
17
  attempt++;
18
18
  if (attempt >= opts.maxAttempts) break;
19
- const delay = opts.baseMs * Math.pow(opts.factor, attempt - 1);
20
- await new Promise(r => setTimeout(r, delay));
19
+ const delay = opts.baseMs * opts.factor ** (attempt - 1);
20
+ await new Promise((r) => setTimeout(r, delay));
21
21
  }
22
22
  }
23
23
  throw lastErr;
@@ -1,6 +1,6 @@
1
- import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
2
- import { dirname } from 'node:path';
1
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
3
2
  import { hostname } from 'node:os';
3
+ import { dirname } from 'node:path';
4
4
 
5
5
  export interface LockData {
6
6
  pid: number;
@@ -1,4 +1,4 @@
1
- import { appendFileSync, mkdirSync, existsSync, readFileSync } from 'node:fs';
1
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
2
2
  import { dirname } from 'node:path';
3
3
 
4
4
  export interface LogEntry {
@@ -20,6 +20,6 @@ export class NdjsonLogger {
20
20
  if (!existsSync(path)) return [];
21
21
  const txt = readFileSync(path, 'utf8').trim();
22
22
  if (!txt) return [];
23
- return txt.split('\n').map(line => JSON.parse(line) as LogEntry);
23
+ return txt.split('\n').map((line) => JSON.parse(line) as LogEntry);
24
24
  }
25
25
  }
@@ -8,24 +8,30 @@ export interface JiraCommentInput extends ClassifyOutput {
8
8
  }
9
9
 
10
10
  export function buildJiraComment(input: JiraCommentInput): string {
11
- const passed = input.scenarios.filter(s => s.outcome === 'PASS').length;
11
+ const passed = input.scenarios.filter((s) => s.outcome === 'PASS').length;
12
12
  const total = input.scenarios.length;
13
13
  const icon = input.overall === 'PASS' ? '🟢' : '🔴';
14
14
  const header = `## ${icon} xera test ${input.overall === 'PASS' ? 'PASSED' : 'FAILED'} — ${input.ticket} (run ${input.runId})`;
15
15
  const meta = `**Classification:** ${input.overall} (confidence: ${input.overallConfidence})\n**Scenarios:** ${passed} / ${total} passed`;
16
16
 
17
17
  const failingBlocks = input.scenarios
18
- .filter(s => s.outcome === 'FAIL')
19
- .map(s => `### Scenario: ${s.name}\n- **Classification:** ${s.class} (confidence: ${s.confidence})\n- **Diagnosis:** ${s.rationale}`)
18
+ .filter((s) => s.outcome === 'FAIL')
19
+ .map(
20
+ (s) =>
21
+ `### Scenario: ${s.name}\n- **Classification:** ${s.class} (confidence: ${s.confidence})\n- **Diagnosis:** ${s.rationale}`,
22
+ )
20
23
  .join('\n\n');
21
24
 
22
25
  const reproduce = `### Reproduce locally\n\n\`\`\`\nbunx xera-internal exec ${input.ticket} --replay=${input.runId}\n\`\`\``;
23
26
 
24
- const next = input.overall === 'PASS'
25
- ? ''
26
- : `### Suggested next action\n- Review the failing scenarios above.\n- Re-run after changes: open Claude Code and run \`/xera-run ${input.ticket}\`.\n\n`;
27
+ const next =
28
+ input.overall === 'PASS'
29
+ ? ''
30
+ : `### Suggested next action\n- Review the failing scenarios above.\n- Re-run after changes: open Claude Code and run \`/xera-run ${input.ticket}\`.\n\n`;
27
31
 
28
32
  const footer = `---\nxera v${input.xeraVersion} • prompts v${input.promptsVersion}`;
29
33
 
30
- return [header, '', meta, '', failingBlocks, '', next, reproduce, '', footer].filter(Boolean).join('\n');
34
+ return [header, '', meta, '', failingBlocks, '', next, reproduce, '', footer]
35
+ .filter(Boolean)
36
+ .join('\n');
31
37
  }
@@ -1,6 +1,6 @@
1
- import type { ClassifyOutput } from '../classifier/types';
2
1
  import { existsSync } from 'node:fs';
3
- import { readStatus, writeStatus, appendHistory, type StatusJson } from '../artifact/status';
2
+ import { type StatusJson, appendHistory, readStatus, writeStatus } from '../artifact/status';
3
+ import type { ClassifyOutput } from '../classifier/types';
4
4
 
5
5
  export interface StatusWriterInput {
6
6
  ticket: string;
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,gBAAgB,CAAC,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC1E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IAC/E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxD,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;CACjC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/artifact/hash.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/artifact/meta.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAazB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAGtD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAG5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAQ3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/artifact/paths.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC;CACtC;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CA6BpF;AAED,wBAAgB,aAAa,CAAC,GAAG,GAAE,IAAiB,GAAG,MAAM,CAE5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/artifact/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,kBAAkB,wEAAsE,CAAC;AAI/F,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIhE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAG1D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAGlE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,UAAU,CAQ3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/auth/encrypt.ts"],"names":[],"mappings":"AAQA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAQD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAYlE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/auth/key.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAE5C,wBAAgB,cAAc,IAAI,MAAM,CAYvC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/auth/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;CAAE;AAEtE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,GAAG,IAAI,EAC5B,MAAM,EAAE,aAAa,EACrB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAST"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAMlE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAI3E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAMlF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/bin-internal/exec.ts"],"names":[],"mappings":"AAWA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuG7D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/bin-internal/fetch.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAAG,GAAG,CAAC,EAAE,MAAM,CAAC;CAAE;AAE/C,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CvF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin-internal/index.ts"],"names":[],"mappings":"AA0BA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAYzD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/bin-internal/lint.ts"],"names":[],"mappings":"AAGA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ7D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/bin-internal/normalize.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAclE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/bin-internal/post.ts"],"names":[],"mappings":"AAOA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B7D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/bin-internal/promote.ts"],"names":[],"mappings":"AAEA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAShE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/bin-internal/report.ts"],"names":[],"mappings":"AAcA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC/D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-cmd.d.ts","sourceRoot":"","sources":["../../src/bin-internal/status-cmd.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"typecheck.d.ts","sourceRoot":"","sources":["../../src/bin-internal/typecheck.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"unlock.d.ts","sourceRoot":"","sources":["../../src/bin-internal/unlock.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAc/D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-feature.d.ts","sourceRoot":"","sources":["../../src/bin-internal/validate-feature.ts"],"names":[],"mappings":"AAIA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CASxE"}