javi-forge 1.6.0 → 1.6.1

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 (231) hide show
  1. package/dist/commands/analyze.d.ts +1 -1
  2. package/dist/commands/analyze.js +15 -15
  3. package/dist/commands/atlassian-mcp.d.ts +42 -0
  4. package/dist/commands/atlassian-mcp.js +98 -0
  5. package/dist/commands/ci.d.ts +3 -3
  6. package/dist/commands/ci.js +185 -147
  7. package/dist/commands/crash-recovery.d.ts +34 -0
  8. package/dist/commands/crash-recovery.js +123 -0
  9. package/dist/commands/doctor.d.ts +2 -2
  10. package/dist/commands/doctor.js +113 -61
  11. package/dist/commands/harness-audit.d.ts +35 -0
  12. package/dist/commands/harness-audit.js +277 -0
  13. package/dist/commands/init.d.ts +1 -1
  14. package/dist/commands/init.js +384 -141
  15. package/dist/commands/llmstxt.d.ts +1 -1
  16. package/dist/commands/llmstxt.js +36 -34
  17. package/dist/commands/parallel-batch.d.ts +42 -0
  18. package/dist/commands/parallel-batch.js +90 -0
  19. package/dist/commands/plugin.d.ts +10 -1
  20. package/dist/commands/plugin.js +92 -47
  21. package/dist/commands/secret-scanner.d.ts +30 -0
  22. package/dist/commands/secret-scanner.js +272 -0
  23. package/dist/commands/security-analysis.d.ts +74 -0
  24. package/dist/commands/security-analysis.js +487 -0
  25. package/dist/commands/security.d.ts +11 -5
  26. package/dist/commands/security.js +216 -76
  27. package/dist/commands/skill-scanner.d.ts +63 -0
  28. package/dist/commands/skill-scanner.js +383 -0
  29. package/dist/commands/skills.d.ts +62 -5
  30. package/dist/commands/skills.js +439 -54
  31. package/dist/commands/supply-chain.d.ts +23 -0
  32. package/dist/commands/supply-chain.js +126 -0
  33. package/dist/commands/tdd-pipeline.d.ts +17 -0
  34. package/dist/commands/tdd-pipeline.js +144 -0
  35. package/dist/commands/tdd.d.ts +1 -1
  36. package/dist/commands/tdd.js +21 -18
  37. package/dist/commands/team-presets.d.ts +53 -0
  38. package/dist/commands/team-presets.js +201 -0
  39. package/dist/commands/workflow.d.ts +23 -0
  40. package/dist/commands/workflow.js +114 -0
  41. package/dist/constants.d.ts +15 -1
  42. package/dist/constants.js +161 -122
  43. package/dist/index.js +308 -98
  44. package/dist/lib/agent-skills.d.ts +36 -1
  45. package/dist/lib/agent-skills.js +168 -19
  46. package/dist/lib/auto-skill-install.d.ts +37 -0
  47. package/dist/lib/auto-skill-install.js +92 -0
  48. package/dist/lib/auto-wire.d.ts +20 -0
  49. package/dist/lib/auto-wire.js +240 -0
  50. package/dist/lib/claudemd.d.ts +13 -1
  51. package/dist/lib/claudemd.js +174 -24
  52. package/dist/lib/codex-export.d.ts +1 -1
  53. package/dist/lib/codex-export.js +29 -31
  54. package/dist/lib/common.d.ts +1 -1
  55. package/dist/lib/common.js +52 -44
  56. package/dist/lib/context.d.ts +17 -2
  57. package/dist/lib/context.js +142 -13
  58. package/dist/lib/docker.d.ts +1 -1
  59. package/dist/lib/docker.js +141 -112
  60. package/dist/lib/frontmatter.d.ts +1 -1
  61. package/dist/lib/frontmatter.js +29 -15
  62. package/dist/lib/plugin.d.ts +9 -3
  63. package/dist/lib/plugin.js +128 -69
  64. package/dist/lib/skill-publish.d.ts +40 -0
  65. package/dist/lib/skill-publish.js +146 -0
  66. package/dist/lib/stack-detector.d.ts +38 -0
  67. package/dist/lib/stack-detector.js +207 -0
  68. package/dist/lib/template.d.ts +16 -1
  69. package/dist/lib/template.js +46 -17
  70. package/dist/lib/workflow/discovery.d.ts +19 -0
  71. package/dist/lib/workflow/discovery.js +68 -0
  72. package/dist/lib/workflow/index.d.ts +5 -0
  73. package/dist/lib/workflow/index.js +5 -0
  74. package/dist/lib/workflow/parser.d.ts +16 -0
  75. package/dist/lib/workflow/parser.js +198 -0
  76. package/dist/lib/workflow/renderer.d.ts +9 -0
  77. package/dist/lib/workflow/renderer.js +152 -0
  78. package/dist/lib/workflow/validator.d.ts +10 -0
  79. package/dist/lib/workflow/validator.js +189 -0
  80. package/dist/tasks/index.d.ts +4 -0
  81. package/dist/tasks/index.js +4 -0
  82. package/dist/tasks/scaffold-tasks.d.ts +3 -0
  83. package/dist/tasks/scaffold-tasks.js +14 -0
  84. package/dist/tasks/task-id.d.ts +30 -0
  85. package/dist/tasks/task-id.js +55 -0
  86. package/dist/tasks/task-tracker.d.ts +15 -0
  87. package/dist/tasks/task-tracker.js +81 -0
  88. package/dist/types/index.d.ts +134 -6
  89. package/dist/types/index.js +11 -1
  90. package/dist/ui/AnalyzeUI.d.ts +1 -1
  91. package/dist/ui/AnalyzeUI.js +38 -39
  92. package/dist/ui/App.d.ts +5 -3
  93. package/dist/ui/App.js +86 -46
  94. package/dist/ui/AutoSkills.d.ts +9 -0
  95. package/dist/ui/AutoSkills.js +124 -0
  96. package/dist/ui/CI.d.ts +2 -2
  97. package/dist/ui/CI.js +24 -26
  98. package/dist/ui/CIContext.d.ts +1 -1
  99. package/dist/ui/CIContext.js +3 -2
  100. package/dist/ui/CISelector.d.ts +2 -2
  101. package/dist/ui/CISelector.js +23 -15
  102. package/dist/ui/Doctor.d.ts +1 -1
  103. package/dist/ui/Doctor.js +35 -29
  104. package/dist/ui/Header.d.ts +1 -1
  105. package/dist/ui/Header.js +14 -14
  106. package/dist/ui/HookProfileSelector.d.ts +9 -0
  107. package/dist/ui/HookProfileSelector.js +54 -0
  108. package/dist/ui/LlmsTxt.d.ts +1 -1
  109. package/dist/ui/LlmsTxt.js +31 -22
  110. package/dist/ui/MemorySelector.d.ts +2 -2
  111. package/dist/ui/MemorySelector.js +28 -16
  112. package/dist/ui/NameInput.d.ts +1 -1
  113. package/dist/ui/NameInput.js +21 -21
  114. package/dist/ui/OptionSelector.d.ts +6 -2
  115. package/dist/ui/OptionSelector.js +83 -32
  116. package/dist/ui/Plugin.d.ts +4 -3
  117. package/dist/ui/Plugin.js +78 -35
  118. package/dist/ui/Progress.d.ts +3 -3
  119. package/dist/ui/Progress.js +23 -22
  120. package/dist/ui/Skills.d.ts +2 -2
  121. package/dist/ui/Skills.js +61 -32
  122. package/dist/ui/StackSelector.d.ts +2 -2
  123. package/dist/ui/StackSelector.js +26 -16
  124. package/dist/ui/Summary.d.ts +3 -3
  125. package/dist/ui/Summary.js +60 -50
  126. package/dist/ui/Welcome.d.ts +1 -1
  127. package/dist/ui/Welcome.js +15 -16
  128. package/dist/ui/theme.d.ts +1 -1
  129. package/dist/ui/theme.js +6 -6
  130. package/package.json +9 -6
  131. package/templates/common/atlassian/mcp-atlassian-snippet.json +16 -0
  132. package/templates/common/repoforge/mcp-repoforge-snippet.json +11 -0
  133. package/templates/common/repoforge/repoforge.yaml +34 -0
  134. package/templates/github/deploy-docker-zero-downtime.yml +140 -0
  135. package/templates/github/repoforge-graph.yml +45 -0
  136. package/templates/gitlab/deploy-docker-zero-downtime.yml +57 -0
  137. package/templates/local-ai/.env.example +17 -0
  138. package/templates/local-ai/docker-compose.yml +95 -0
  139. package/templates/security-hooks/claude-settings-security.json +30 -0
  140. package/templates/security-hooks/commit-msg-signing +29 -0
  141. package/templates/security-hooks/pre-commit-permissions +74 -0
  142. package/templates/security-hooks/pre-commit-secrets +74 -0
  143. package/templates/security-hooks/pre-push-branch-protection +62 -0
  144. package/templates/security-hooks/pre-push-deps +83 -0
  145. package/templates/security-hooks/pre-push-signing +67 -0
  146. package/templates/woodpecker/deploy-docker-zero-downtime.yml +50 -0
  147. package/templates/workflows/ci-pipeline.dot +15 -0
  148. package/templates/workflows/feature-flow.dot +21 -0
  149. package/templates/workflows/release.dot +16 -0
  150. package/dist/__integration__/helpers.d.ts +0 -20
  151. package/dist/__integration__/helpers.d.ts.map +0 -1
  152. package/dist/__integration__/helpers.js +0 -31
  153. package/dist/__integration__/helpers.js.map +0 -1
  154. package/dist/commands/analyze.d.ts.map +0 -1
  155. package/dist/commands/analyze.js.map +0 -1
  156. package/dist/commands/ci.d.ts.map +0 -1
  157. package/dist/commands/ci.js.map +0 -1
  158. package/dist/commands/doctor.d.ts.map +0 -1
  159. package/dist/commands/doctor.js.map +0 -1
  160. package/dist/commands/init.d.ts.map +0 -1
  161. package/dist/commands/init.js.map +0 -1
  162. package/dist/commands/llmstxt.d.ts.map +0 -1
  163. package/dist/commands/llmstxt.js.map +0 -1
  164. package/dist/commands/plugin.d.ts.map +0 -1
  165. package/dist/commands/plugin.js.map +0 -1
  166. package/dist/commands/security.d.ts.map +0 -1
  167. package/dist/commands/security.js.map +0 -1
  168. package/dist/commands/skills.d.ts.map +0 -1
  169. package/dist/commands/skills.js.map +0 -1
  170. package/dist/commands/tdd.d.ts.map +0 -1
  171. package/dist/commands/tdd.js.map +0 -1
  172. package/dist/constants.d.ts.map +0 -1
  173. package/dist/constants.js.map +0 -1
  174. package/dist/index.d.ts.map +0 -1
  175. package/dist/index.js.map +0 -1
  176. package/dist/lib/agent-skills.d.ts.map +0 -1
  177. package/dist/lib/agent-skills.js.map +0 -1
  178. package/dist/lib/claudemd.d.ts.map +0 -1
  179. package/dist/lib/claudemd.js.map +0 -1
  180. package/dist/lib/codex-export.d.ts.map +0 -1
  181. package/dist/lib/codex-export.js.map +0 -1
  182. package/dist/lib/common.d.ts.map +0 -1
  183. package/dist/lib/common.js.map +0 -1
  184. package/dist/lib/context.d.ts.map +0 -1
  185. package/dist/lib/context.js.map +0 -1
  186. package/dist/lib/docker.d.ts.map +0 -1
  187. package/dist/lib/docker.js.map +0 -1
  188. package/dist/lib/frontmatter.d.ts.map +0 -1
  189. package/dist/lib/frontmatter.js.map +0 -1
  190. package/dist/lib/plugin.d.ts.map +0 -1
  191. package/dist/lib/plugin.js.map +0 -1
  192. package/dist/lib/template.d.ts.map +0 -1
  193. package/dist/lib/template.js.map +0 -1
  194. package/dist/types/index.d.ts.map +0 -1
  195. package/dist/types/index.js.map +0 -1
  196. package/dist/ui/AnalyzeUI.d.ts.map +0 -1
  197. package/dist/ui/AnalyzeUI.js.map +0 -1
  198. package/dist/ui/App.d.ts.map +0 -1
  199. package/dist/ui/App.js.map +0 -1
  200. package/dist/ui/CI.d.ts.map +0 -1
  201. package/dist/ui/CI.js.map +0 -1
  202. package/dist/ui/CIContext.d.ts.map +0 -1
  203. package/dist/ui/CIContext.js.map +0 -1
  204. package/dist/ui/CISelector.d.ts.map +0 -1
  205. package/dist/ui/CISelector.js.map +0 -1
  206. package/dist/ui/Doctor.d.ts.map +0 -1
  207. package/dist/ui/Doctor.js.map +0 -1
  208. package/dist/ui/Header.d.ts.map +0 -1
  209. package/dist/ui/Header.js.map +0 -1
  210. package/dist/ui/LlmsTxt.d.ts.map +0 -1
  211. package/dist/ui/LlmsTxt.js.map +0 -1
  212. package/dist/ui/MemorySelector.d.ts.map +0 -1
  213. package/dist/ui/MemorySelector.js.map +0 -1
  214. package/dist/ui/NameInput.d.ts.map +0 -1
  215. package/dist/ui/NameInput.js.map +0 -1
  216. package/dist/ui/OptionSelector.d.ts.map +0 -1
  217. package/dist/ui/OptionSelector.js.map +0 -1
  218. package/dist/ui/Plugin.d.ts.map +0 -1
  219. package/dist/ui/Plugin.js.map +0 -1
  220. package/dist/ui/Progress.d.ts.map +0 -1
  221. package/dist/ui/Progress.js.map +0 -1
  222. package/dist/ui/Skills.d.ts.map +0 -1
  223. package/dist/ui/Skills.js.map +0 -1
  224. package/dist/ui/StackSelector.d.ts.map +0 -1
  225. package/dist/ui/StackSelector.js.map +0 -1
  226. package/dist/ui/Summary.d.ts.map +0 -1
  227. package/dist/ui/Summary.js.map +0 -1
  228. package/dist/ui/Welcome.d.ts.map +0 -1
  229. package/dist/ui/Welcome.js.map +0 -1
  230. package/dist/ui/theme.d.ts.map +0 -1
  231. package/dist/ui/theme.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import type { InitStep } from '../types/index.js';
1
+ import type { InitStep } from "../types/index.js";
2
2
  type StepCallback = (step: InitStep) => void;
3
3
  /**
4
4
  * Run repoforge skills analysis on a project directory.
@@ -1,5 +1,5 @@
1
- import { execFile } from 'child_process';
2
- import { promisify } from 'util';
1
+ import { execFile } from "child_process";
2
+ import { promisify } from "util";
3
3
  const execFileAsync = promisify(execFile);
4
4
  function report(onStep, id, label, status, detail) {
5
5
  onStep({ id, label, status, detail });
@@ -7,7 +7,7 @@ function report(onStep, id, label, status, detail) {
7
7
  /** Check if a binary is available in PATH */
8
8
  async function which(bin) {
9
9
  try {
10
- await execFileAsync('which', [bin]);
10
+ await execFileAsync("which", [bin]);
11
11
  return true;
12
12
  }
13
13
  catch {
@@ -19,37 +19,37 @@ async function which(bin) {
19
19
  * This is a thin wrapper that delegates to the repoforge CLI.
20
20
  */
21
21
  export async function runAnalyze(projectDir, dryRun, onStep) {
22
- const stepId = 'analyze-repoforge';
23
- report(onStep, stepId, 'Run repoforge skills analysis', 'running');
22
+ const stepId = "analyze-repoforge";
23
+ report(onStep, stepId, "Run repoforge skills analysis", "running");
24
24
  try {
25
25
  // Check if repoforge is installed
26
- const hasRepoforge = await which('repoforge');
26
+ const hasRepoforge = await which("repoforge");
27
27
  if (!hasRepoforge) {
28
- report(onStep, stepId, 'Run repoforge skills analysis', 'error', 'repoforge not found. Install with: pip install repoforge');
28
+ report(onStep, stepId, "Run repoforge skills analysis", "error", "repoforge not found. Install with: pip install repoforge");
29
29
  return;
30
30
  }
31
- const args = ['skills', '-w', projectDir];
31
+ const args = ["skills", "-w", projectDir];
32
32
  if (dryRun) {
33
- args.push('--dry-run');
33
+ args.push("--dry-run");
34
34
  }
35
- const { stdout, stderr } = await execFileAsync('repoforge', args, {
35
+ const { stdout, stderr } = await execFileAsync("repoforge", args, {
36
36
  cwd: projectDir,
37
37
  timeout: 300_000, // 5 min — analysis can take a while on large repos
38
38
  });
39
39
  if (stdout) {
40
- report(onStep, stepId, 'Run repoforge skills analysis', 'done', stdout.trim().split('\n').pop() ?? 'complete');
40
+ report(onStep, stepId, "Run repoforge skills analysis", "done", stdout.trim().split("\n").pop() ?? "complete");
41
41
  }
42
42
  else {
43
- report(onStep, stepId, 'Run repoforge skills analysis', 'done', dryRun ? 'dry-run complete' : 'complete');
43
+ report(onStep, stepId, "Run repoforge skills analysis", "done", dryRun ? "dry-run complete" : "complete");
44
44
  }
45
45
  if (stderr) {
46
- const warnId = 'analyze-warnings';
47
- report(onStep, warnId, 'Analysis warnings', 'skipped', stderr.trim().split('\n').pop() ?? '');
46
+ const warnId = "analyze-warnings";
47
+ report(onStep, warnId, "Analysis warnings", "skipped", stderr.trim().split("\n").pop() ?? "");
48
48
  }
49
49
  }
50
50
  catch (e) {
51
51
  const msg = e instanceof Error ? e.message : String(e);
52
- report(onStep, stepId, 'Run repoforge skills analysis', 'error', msg);
52
+ report(onStep, stepId, "Run repoforge skills analysis", "error", msg);
53
53
  }
54
54
  }
55
55
  //# sourceMappingURL=analyze.js.map
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Atlassian MCP pre-config — generates MCP server configuration
3
+ * for Jira and Confluence integration in scaffolded projects.
4
+ *
5
+ * Produces a config snippet that can be merged into .claude/settings.json
6
+ * or any AI agent's MCP configuration.
7
+ */
8
+ export interface AtlassianConfig {
9
+ confluenceUrl: string;
10
+ confluenceUsername: string;
11
+ jiraUrl: string;
12
+ jiraUsername: string;
13
+ }
14
+ export interface McpSnippet {
15
+ mcpServers: Record<string, {
16
+ command: string;
17
+ args: string[];
18
+ env: Record<string, string>;
19
+ }>;
20
+ }
21
+ /**
22
+ * Generate Atlassian MCP config snippet with user-provided values.
23
+ * Token placeholders remain as env vars for security.
24
+ */
25
+ export declare function generateAtlassianMcpConfig(config: AtlassianConfig): McpSnippet;
26
+ /**
27
+ * Generate a template snippet with placeholders (no user input needed).
28
+ */
29
+ export declare function generateTemplateMcpConfig(): McpSnippet;
30
+ /**
31
+ * Write the Atlassian MCP snippet to a project directory.
32
+ */
33
+ export declare function writeAtlassianMcpSnippet(projectDir: string, config?: AtlassianConfig): Promise<string>;
34
+ /**
35
+ * Merge Atlassian MCP config into an existing settings.json or MCP config file.
36
+ */
37
+ export declare function mergeIntoSettings(settingsPath: string, config: AtlassianConfig): Promise<void>;
38
+ /**
39
+ * Copy the template snippet from templates/common/atlassian/.
40
+ */
41
+ export declare function copyTemplateSnippet(projectDir: string): Promise<string | null>;
42
+ //# sourceMappingURL=atlassian-mcp.d.ts.map
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Atlassian MCP pre-config — generates MCP server configuration
3
+ * for Jira and Confluence integration in scaffolded projects.
4
+ *
5
+ * Produces a config snippet that can be merged into .claude/settings.json
6
+ * or any AI agent's MCP configuration.
7
+ */
8
+ import fs from "fs-extra";
9
+ import path from "path";
10
+ import { fileURLToPath } from "url";
11
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
12
+ const TEMPLATES_DIR = path.resolve(__dirname, "../../templates");
13
+ /**
14
+ * Generate Atlassian MCP config snippet with user-provided values.
15
+ * Token placeholders remain as env vars for security.
16
+ */
17
+ export function generateAtlassianMcpConfig(config) {
18
+ return {
19
+ mcpServers: {
20
+ atlassian: {
21
+ command: "uvx",
22
+ args: ["mcp-atlassian"],
23
+ env: {
24
+ CONFLUENCE_URL: config.confluenceUrl,
25
+ CONFLUENCE_USERNAME: config.confluenceUsername,
26
+ CONFLUENCE_API_TOKEN: "${CONFLUENCE_API_TOKEN}",
27
+ JIRA_URL: config.jiraUrl,
28
+ JIRA_USERNAME: config.jiraUsername,
29
+ JIRA_API_TOKEN: "${JIRA_API_TOKEN}",
30
+ },
31
+ },
32
+ },
33
+ };
34
+ }
35
+ /**
36
+ * Generate a template snippet with placeholders (no user input needed).
37
+ */
38
+ export function generateTemplateMcpConfig() {
39
+ return {
40
+ mcpServers: {
41
+ atlassian: {
42
+ command: "uvx",
43
+ args: ["mcp-atlassian"],
44
+ env: {
45
+ CONFLUENCE_URL: "__CONFLUENCE_URL__",
46
+ CONFLUENCE_USERNAME: "__CONFLUENCE_USERNAME__",
47
+ CONFLUENCE_API_TOKEN: "__CONFLUENCE_API_TOKEN__",
48
+ JIRA_URL: "__JIRA_URL__",
49
+ JIRA_USERNAME: "__JIRA_USERNAME__",
50
+ JIRA_API_TOKEN: "__JIRA_API_TOKEN__",
51
+ },
52
+ },
53
+ },
54
+ };
55
+ }
56
+ /**
57
+ * Write the Atlassian MCP snippet to a project directory.
58
+ */
59
+ export async function writeAtlassianMcpSnippet(projectDir, config) {
60
+ const snippet = config
61
+ ? generateAtlassianMcpConfig(config)
62
+ : generateTemplateMcpConfig();
63
+ const destDir = path.join(projectDir, ".atlassian");
64
+ await fs.ensureDir(destDir);
65
+ const destFile = path.join(destDir, "mcp-config-snippet.json");
66
+ await fs.writeJson(destFile, snippet, { spaces: 2 });
67
+ return destFile;
68
+ }
69
+ /**
70
+ * Merge Atlassian MCP config into an existing settings.json or MCP config file.
71
+ */
72
+ export async function mergeIntoSettings(settingsPath, config) {
73
+ const snippet = generateAtlassianMcpConfig(config);
74
+ let existing = {};
75
+ if (await fs.pathExists(settingsPath)) {
76
+ existing = await fs.readJson(settingsPath);
77
+ }
78
+ const existingServers = existing.mcpServers ?? {};
79
+ existing.mcpServers = {
80
+ ...existingServers,
81
+ ...snippet.mcpServers,
82
+ };
83
+ await fs.writeJson(settingsPath, existing, { spaces: 2 });
84
+ }
85
+ /**
86
+ * Copy the template snippet from templates/common/atlassian/.
87
+ */
88
+ export async function copyTemplateSnippet(projectDir) {
89
+ const srcFile = path.join(TEMPLATES_DIR, "common", "atlassian", "mcp-atlassian-snippet.json");
90
+ if (!(await fs.pathExists(srcFile)))
91
+ return null;
92
+ const destDir = path.join(projectDir, ".atlassian");
93
+ await fs.ensureDir(destDir);
94
+ const destFile = path.join(destDir, "mcp-config-snippet.json");
95
+ await fs.copy(srcFile, destFile, { overwrite: true });
96
+ return destFile;
97
+ }
98
+ //# sourceMappingURL=atlassian-mcp.js.map
@@ -1,5 +1,5 @@
1
- import type { Stack } from '../types/index.js';
2
- export type CIMode = 'full' | 'quick' | 'shell' | 'detect';
1
+ import type { Stack } from "../types/index.js";
2
+ export type CIMode = "full" | "quick" | "shell" | "detect";
3
3
  export interface CIOptions {
4
4
  projectDir?: string;
5
5
  mode?: CIMode;
@@ -12,7 +12,7 @@ export interface CIOptions {
12
12
  /** Timeout in seconds for each Docker step (default: 600) */
13
13
  timeout?: number;
14
14
  }
15
- export type CIStepStatus = 'pending' | 'running' | 'done' | 'error' | 'skipped';
15
+ export type CIStepStatus = "pending" | "running" | "done" | "error" | "skipped";
16
16
  export interface CIStep {
17
17
  id: string;
18
18
  label: string;