@htekdev/actions-debugger 1.0.26 → 1.0.27

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 (42) hide show
  1. package/README.md +45 -4
  2. package/dist/cli/commands/categories.d.ts +6 -0
  3. package/dist/cli/commands/categories.d.ts.map +1 -0
  4. package/dist/cli/commands/categories.js +26 -0
  5. package/dist/cli/commands/categories.js.map +1 -0
  6. package/dist/cli/commands/diagnose.d.ts +6 -0
  7. package/dist/cli/commands/diagnose.d.ts.map +1 -0
  8. package/dist/cli/commands/diagnose.js +56 -0
  9. package/dist/cli/commands/diagnose.js.map +1 -0
  10. package/dist/cli/commands/lookup.d.ts +6 -0
  11. package/dist/cli/commands/lookup.d.ts.map +1 -0
  12. package/dist/cli/commands/lookup.js +27 -0
  13. package/dist/cli/commands/lookup.js.map +1 -0
  14. package/dist/cli/commands/search.d.ts +6 -0
  15. package/dist/cli/commands/search.d.ts.map +1 -0
  16. package/dist/cli/commands/search.js +33 -0
  17. package/dist/cli/commands/search.js.map +1 -0
  18. package/dist/cli/commands/suggest.d.ts +6 -0
  19. package/dist/cli/commands/suggest.d.ts.map +1 -0
  20. package/dist/cli/commands/suggest.js +27 -0
  21. package/dist/cli/commands/suggest.js.map +1 -0
  22. package/dist/cli/main.d.ts +5 -0
  23. package/dist/cli/main.d.ts.map +1 -0
  24. package/dist/cli/main.js +20 -0
  25. package/dist/cli/main.js.map +1 -0
  26. package/dist/cli/output.d.ts +17 -0
  27. package/dist/cli/output.d.ts.map +1 -0
  28. package/dist/cli/output.js +311 -0
  29. package/dist/cli/output.js.map +1 -0
  30. package/dist/entry.d.ts +12 -0
  31. package/dist/entry.d.ts.map +1 -0
  32. package/dist/entry.js +30 -0
  33. package/dist/entry.js.map +1 -0
  34. package/dist/index.d.ts +4 -5
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +5 -30
  37. package/dist/index.js.map +1 -1
  38. package/dist/mcp.d.ts +11 -0
  39. package/dist/mcp.d.ts.map +1 -0
  40. package/dist/mcp.js +25 -0
  41. package/dist/mcp.js.map +1 -0
  42. package/package.json +11 -6
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![npm](https://img.shields.io/npm/v/@htekdev/actions-debugger)](https://www.npmjs.com/package/@htekdev/actions-debugger)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
6
 
7
- > 65+ real GitHub Actions errors, queryable by agents. MCP server + Copilot skills + error database.
7
+ > 65+ real GitHub Actions errors, queryable by agents. CLI + MCP server + Copilot skills + error database.
8
8
 
9
9
  **Stop debugging the same CI failures over and over.** This repo packages 65+ real-world GitHub Actions error scenarios — with regex-matchable patterns, root causes, and copy-paste fixes — into formats that both humans and AI agents can consume.
10
10
 
@@ -12,13 +12,54 @@
12
12
 
13
13
  ```
14
14
  errors/ → Structured YAML error database (65+ entries)
15
- src/ → MCP server (TypeScript + @modelcontextprotocol/sdk)
15
+ src/ → CLI + MCP server (TypeScript)
16
16
  .github/skills/ → Copilot CLI skills for CI debugging
17
17
  .github/agents/ → Copilot agent definition
18
18
  ```
19
19
 
20
20
  ## Quick Start
21
21
 
22
+ ### CLI (Zero Install)
23
+
24
+ ```bash
25
+ # Look up an error
26
+ npx @htekdev/actions-debugger lookup "Permission to org/repo.git denied"
27
+
28
+ # Search by keyword
29
+ npx @htekdev/actions-debugger search "OIDC" --category permissions-auth
30
+
31
+ # Diagnose a workflow file
32
+ npx @htekdev/actions-debugger diagnose .github/workflows/ci.yml
33
+
34
+ # Get fix suggestions
35
+ npx @htekdev/actions-debugger suggest-fix "artifact upload fails intermittently"
36
+
37
+ # List all categories
38
+ npx @htekdev/actions-debugger categories
39
+ ```
40
+
41
+ #### Output Formats
42
+
43
+ ```bash
44
+ # Text (default for TTY)
45
+ npx @htekdev/actions-debugger lookup "error message"
46
+
47
+ # JSON (default when piped, or explicit)
48
+ npx @htekdev/actions-debugger lookup "error message" --format json
49
+
50
+ # Markdown
51
+ npx @htekdev/actions-debugger lookup "error message" --format md
52
+ ```
53
+
54
+ #### Exit Codes
55
+
56
+ | Code | Meaning |
57
+ |------|---------|
58
+ | 0 | Success / matches found |
59
+ | 1 | No matches found |
60
+ | 2 | Invalid input / parse error |
61
+ | 3 | Database load error |
62
+
22
63
  ### As an MCP Server (Claude Desktop, Copilot CLI, Cursor, etc.)
23
64
 
24
65
  ```bash
@@ -47,10 +88,10 @@ Add to your MCP client config:
47
88
 
48
89
  ### As a Copilot CLI Skill (No MCP Required)
49
90
 
50
- Copy `.github/skills/actions-debugging/SKILL.md` to your repo's `.github/skills/` directory. Reference it in your agent:
91
+ Copy `.github/skills/actions-debugging-cli/SKILL.md` to your repo's `.github/skills/` directory. Any agent with shell access can use the CLI — no MCP config needed.
51
92
 
52
93
  ```markdown
53
- > **Skill reference:** For CI debugging, use the `actions-debugging` skill.
94
+ > **Skill reference:** For CI debugging, use the `actions-debugging-cli` skill.
54
95
  ```
55
96
 
56
97
  ### Programmatic (npm Package)
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI command: categories — list all error categories.
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerCategoriesCommand(program: Command): void;
6
+ //# sourceMappingURL=categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/categories.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiBhE"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * CLI command: categories — list all error categories.
3
+ */
4
+ import { loadErrorDatabase } from "../../db/loader.js";
5
+ import { listCategories } from "../../tools/list-categories.js";
6
+ import { detectFormat, formatCategoriesOutput } from "../output.js";
7
+ export function registerCategoriesCommand(program) {
8
+ program
9
+ .command("categories")
10
+ .description("List all error categories with counts")
11
+ .option("--format <fmt>", "Output format: text, json, md")
12
+ .action(async (opts) => {
13
+ try {
14
+ const db = await loadErrorDatabase();
15
+ const categories = listCategories(db);
16
+ const format = detectFormat(opts.format);
17
+ console.log(formatCategoriesOutput(categories, format));
18
+ process.exit(0);
19
+ }
20
+ catch (err) {
21
+ console.error(`Error: ${err.message}`);
22
+ process.exit(3);
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../../src/cli/commands/categories.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI command: diagnose — analyze a workflow YAML file for common issues.
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerDiagnoseCommand(program: Command): void;
6
+ //# sourceMappingURL=diagnose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diagnose.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+B9D"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * CLI command: diagnose — analyze a workflow YAML file for common issues.
3
+ */
4
+ import { readFileSync } from "node:fs";
5
+ import { loadErrorDatabase } from "../../db/loader.js";
6
+ import { diagnoseWorkflow } from "../../tools/diagnose-workflow.js";
7
+ import { detectFormat, formatDiagnoseOutput } from "../output.js";
8
+ export function registerDiagnoseCommand(program) {
9
+ program
10
+ .command("diagnose <file>")
11
+ .description("Analyze a workflow YAML file for common issues")
12
+ .option("--format <fmt>", "Output format: text, json, md")
13
+ .action(async (file, opts) => {
14
+ try {
15
+ let yaml;
16
+ if (file === "-") {
17
+ // Read from stdin
18
+ yaml = await readStdin();
19
+ }
20
+ else {
21
+ try {
22
+ yaml = readFileSync(file, "utf-8");
23
+ }
24
+ catch {
25
+ console.error(`Error: Cannot read file '${file}'`);
26
+ process.exit(2);
27
+ }
28
+ }
29
+ const db = await loadErrorDatabase();
30
+ const findings = diagnoseWorkflow(db, yaml);
31
+ const format = detectFormat(opts.format);
32
+ console.log(formatDiagnoseOutput(findings, format));
33
+ process.exit(findings.length > 0 ? 0 : 0); // 0 even if findings (analysis success)
34
+ }
35
+ catch (err) {
36
+ console.error(`Error: ${err.message}`);
37
+ process.exit(3);
38
+ }
39
+ });
40
+ }
41
+ /**
42
+ * Read all data from stdin.
43
+ */
44
+ function readStdin() {
45
+ return new Promise((resolve, reject) => {
46
+ const chunks = [];
47
+ process.stdin.on("data", (chunk) => chunks.push(chunk));
48
+ process.stdin.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
49
+ process.stdin.on("error", reject);
50
+ // If stdin is a TTY (no pipe), show a hint and wait briefly
51
+ if (process.stdin.isTTY) {
52
+ console.error("Reading workflow YAML from stdin... (Ctrl+D to end)");
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../../src/cli/commands/diagnose.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAElE,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,IAAI,IAAY,CAAC;YAEjB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,kBAAkB;gBAClB,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACrC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;oBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,MAAM,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wCAAwC;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAElC,4DAA4D;QAC5D,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI command: lookup — match error message against known issues.
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerLookupCommand(program: Command): void;
6
+ //# sourceMappingURL=lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/lookup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB5D"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * CLI command: lookup — match error message against known issues.
3
+ */
4
+ import { loadErrorDatabase } from "../../db/loader.js";
5
+ import { lookupError } from "../../tools/lookup-error.js";
6
+ import { detectFormat, formatLookupOutput } from "../output.js";
7
+ export function registerLookupCommand(program) {
8
+ program
9
+ .command("lookup <error_message>")
10
+ .description("Match an error message against known issues")
11
+ .option("--max-results <n>", "Maximum number of results to return", "3")
12
+ .option("--format <fmt>", "Output format: text, json, md")
13
+ .action(async (errorMessage, opts) => {
14
+ try {
15
+ const db = await loadErrorDatabase();
16
+ const results = lookupError(db, errorMessage, parseInt(opts.maxResults, 10));
17
+ const format = detectFormat(opts.format);
18
+ console.log(formatLookupOutput(results, format));
19
+ process.exit(results.length > 0 ? 0 : 1);
20
+ }
21
+ catch (err) {
22
+ console.error(`Error: ${err.message}`);
23
+ process.exit(3);
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../src/cli/commands/lookup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,GAAG,CAAC;SACvE,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,IAA6C,EAAE,EAAE;QACpF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI command: search — full-text search across the error database.
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerSearchCommand(program: Command): void;
6
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB5D"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CLI command: search — full-text search across the error database.
3
+ */
4
+ import { loadErrorDatabase } from "../../db/loader.js";
5
+ import { searchErrors } from "../../tools/search-errors.js";
6
+ import { detectFormat, formatSearchOutput } from "../output.js";
7
+ export function registerSearchCommand(program) {
8
+ program
9
+ .command("search <query>")
10
+ .description("Search error database by keyword")
11
+ .option("--category <cat>", "Filter by category")
12
+ .option("--severity <sev>", "Filter by severity (error, warning, silent-failure, limitation)")
13
+ .option("--max-results <n>", "Maximum number of results to return", "10")
14
+ .option("--format <fmt>", "Output format: text, json, md")
15
+ .action(async (query, opts) => {
16
+ try {
17
+ const db = await loadErrorDatabase();
18
+ const results = searchErrors(db, query, {
19
+ category: opts.category,
20
+ severity: opts.severity,
21
+ maxResults: parseInt(opts.maxResults, 10),
22
+ });
23
+ const format = detectFormat(opts.format);
24
+ console.log(formatSearchOutput(results, format));
25
+ process.exit(results.length > 0 ? 0 : 1);
26
+ }
27
+ catch (err) {
28
+ console.error(`Error: ${err.message}`);
29
+ process.exit(3);
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CAAC,kBAAkB,EAAE,iEAAiE,CAAC;SAC7F,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,IAAI,CAAC;SACxE,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAmF,EAAE,EAAE;QACnH,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE;gBACtC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;aAC1C,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI command: suggest-fix — contextual fix suggestions.
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function registerSuggestCommand(program: Command): void;
6
+ //# sourceMappingURL=suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB7D"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * CLI command: suggest-fix — contextual fix suggestions.
3
+ */
4
+ import { loadErrorDatabase } from "../../db/loader.js";
5
+ import { suggestFix } from "../../tools/suggest-fix.js";
6
+ import { detectFormat, formatSuggestOutput } from "../output.js";
7
+ export function registerSuggestCommand(program) {
8
+ program
9
+ .command("suggest-fix <error_context>")
10
+ .description("Get contextual fix suggestions for an error")
11
+ .option("--category <cat>", "Narrow search to a specific category")
12
+ .option("--format <fmt>", "Output format: text, json, md")
13
+ .action(async (errorContext, opts) => {
14
+ try {
15
+ const db = await loadErrorDatabase();
16
+ const results = suggestFix(db, errorContext, opts.category);
17
+ const format = detectFormat(opts.format);
18
+ console.log(formatSuggestOutput(results, format));
19
+ process.exit(results.length > 0 ? 0 : 1);
20
+ }
21
+ catch (err) {
22
+ console.error(`Error: ${err.message}`);
23
+ process.exit(3);
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,6BAA6B,CAAC;SACtC,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,kBAAkB,EAAE,sCAAsC,CAAC;SAClE,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,IAA4C,EAAE,EAAE;QACnF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLI main — commander program setup and command registration.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CLI main — commander program setup and command registration.
3
+ */
4
+ import { Command } from "commander";
5
+ import { registerLookupCommand } from "./commands/lookup.js";
6
+ import { registerSearchCommand } from "./commands/search.js";
7
+ import { registerDiagnoseCommand } from "./commands/diagnose.js";
8
+ import { registerSuggestCommand } from "./commands/suggest.js";
9
+ import { registerCategoriesCommand } from "./commands/categories.js";
10
+ const program = new Command()
11
+ .name("actions-debugger")
12
+ .description("65+ real GitHub Actions errors, queryable from your terminal")
13
+ .version("1.1.0");
14
+ registerLookupCommand(program);
15
+ registerSearchCommand(program);
16
+ registerDiagnoseCommand(program);
17
+ registerSuggestCommand(program);
18
+ registerCategoriesCommand(program);
19
+ program.parse();
20
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAEnC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Output formatters for CLI commands.
3
+ * Supports text (human-friendly), json (machine-parseable), and md (markdown).
4
+ */
5
+ import type { ErrorEntry, DiagnosticFinding, CategoryInfo } from "../db/types.js";
6
+ export type OutputFormat = "text" | "json" | "md";
7
+ /**
8
+ * Detect the appropriate output format.
9
+ * TTY → text, piped → json, or explicit user choice.
10
+ */
11
+ export declare function detectFormat(explicit?: string): OutputFormat;
12
+ export declare function formatLookupOutput(results: ErrorEntry[], format: OutputFormat): string;
13
+ export declare function formatSearchOutput(results: ErrorEntry[], format: OutputFormat): string;
14
+ export declare function formatDiagnoseOutput(findings: DiagnosticFinding[], format: OutputFormat): string;
15
+ export declare function formatSuggestOutput(results: ErrorEntry[], format: OutputFormat): string;
16
+ export declare function formatCategoriesOutput(categories: CategoryInfo[], format: OutputFormat): string;
17
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAElF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAElD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAG5D;AAID,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQtF;AAuFD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQtF;AA8BD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQhG;AAuCD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQvF;AAqED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAc/F"}
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Output formatters for CLI commands.
3
+ * Supports text (human-friendly), json (machine-parseable), and md (markdown).
4
+ */
5
+ /**
6
+ * Detect the appropriate output format.
7
+ * TTY → text, piped → json, or explicit user choice.
8
+ */
9
+ export function detectFormat(explicit) {
10
+ if (explicit && explicit !== "auto")
11
+ return explicit;
12
+ return process.stdout.isTTY ? "text" : "json";
13
+ }
14
+ // ─── Lookup ─────────────────────────────────────────────────────────────────
15
+ export function formatLookupOutput(results, format) {
16
+ if (format === "json") {
17
+ return JSON.stringify({ matches: results.map(entryToJson) }, null, 2);
18
+ }
19
+ if (format === "md") {
20
+ return formatLookupMd(results);
21
+ }
22
+ return formatLookupText(results);
23
+ }
24
+ function formatLookupText(results) {
25
+ if (results.length === 0) {
26
+ return "No matching errors found.\n\nTry `actions-debugger search <keyword>` for broader results.";
27
+ }
28
+ return results.map((entry) => {
29
+ const lines = [
30
+ `✓ Match: ${entry.title}`,
31
+ ` Category: ${entry.category} | Severity: ${entry.severity}`,
32
+ "",
33
+ ` Root Cause: ${entry.root_cause.trim()}`,
34
+ "",
35
+ ` Fix: ${entry.fix.trim()}`,
36
+ ];
37
+ if (entry.fix_code?.length) {
38
+ lines.push("");
39
+ for (const fc of entry.fix_code) {
40
+ lines.push(` ${fc.label || fc.language}:`);
41
+ for (const line of fc.code.trim().split("\n")) {
42
+ lines.push(` ${line}`);
43
+ }
44
+ }
45
+ }
46
+ if (entry.prevention?.length) {
47
+ lines.push("", " Prevention:");
48
+ for (const p of entry.prevention) {
49
+ lines.push(` - ${p}`);
50
+ }
51
+ }
52
+ if (entry.docs?.length) {
53
+ lines.push("", " Docs:");
54
+ for (const d of entry.docs) {
55
+ lines.push(` - ${d.label}: ${d.url}`);
56
+ }
57
+ }
58
+ return lines.join("\n");
59
+ }).join("\n\n---\n\n");
60
+ }
61
+ function formatLookupMd(results) {
62
+ if (results.length === 0) {
63
+ return "No matching errors found.";
64
+ }
65
+ return results.map((entry, i) => {
66
+ const lines = [
67
+ `## ${i > 0 ? `Match ${i + 1}: ` : ""}${entry.title}`,
68
+ "",
69
+ `**Category:** ${entry.category} | **Severity:** ${entry.severity}`,
70
+ "",
71
+ `**Root Cause:** ${entry.root_cause.trim()}`,
72
+ "",
73
+ `**Fix:** ${entry.fix.trim()}`,
74
+ ];
75
+ if (entry.fix_code?.length) {
76
+ for (const fc of entry.fix_code) {
77
+ lines.push("", `\`\`\`${fc.language}`, fc.code.trim(), "```");
78
+ }
79
+ }
80
+ if (entry.prevention?.length) {
81
+ lines.push("", "**Prevention:**");
82
+ for (const p of entry.prevention) {
83
+ lines.push(`- ${p}`);
84
+ }
85
+ }
86
+ if (entry.docs?.length) {
87
+ lines.push("", "**Docs:**");
88
+ for (const d of entry.docs) {
89
+ lines.push(`- [${d.label}](${d.url})`);
90
+ }
91
+ }
92
+ return lines.join("\n");
93
+ }).join("\n\n---\n\n");
94
+ }
95
+ // ─── Search ─────────────────────────────────────────────────────────────────
96
+ export function formatSearchOutput(results, format) {
97
+ if (format === "json") {
98
+ return JSON.stringify({ matches: results.map(entryToJson) }, null, 2);
99
+ }
100
+ if (format === "md") {
101
+ return formatSearchMd(results);
102
+ }
103
+ return formatSearchText(results);
104
+ }
105
+ function formatSearchText(results) {
106
+ if (results.length === 0) {
107
+ return "No results found. Try different keywords or browse with `actions-debugger categories`.";
108
+ }
109
+ const lines = [`Found ${results.length} result(s):`, ""];
110
+ for (const entry of results) {
111
+ lines.push(` ${entry.title}`);
112
+ lines.push(` ${entry.category} | ${entry.severity} | ${entry.root_cause.trim().split("\n")[0]}`);
113
+ lines.push("");
114
+ }
115
+ return lines.join("\n");
116
+ }
117
+ function formatSearchMd(results) {
118
+ if (results.length === 0)
119
+ return "No results found.";
120
+ const lines = [`## Search Results (${results.length})`, ""];
121
+ for (const entry of results) {
122
+ lines.push(`### ${entry.title}`);
123
+ lines.push(`**Category:** ${entry.category} | **Severity:** ${entry.severity}`);
124
+ lines.push("", entry.root_cause.trim().split("\n")[0], "");
125
+ }
126
+ return lines.join("\n");
127
+ }
128
+ // ─── Diagnose ───────────────────────────────────────────────────────────────
129
+ export function formatDiagnoseOutput(findings, format) {
130
+ if (format === "json") {
131
+ return JSON.stringify({ findings }, null, 2);
132
+ }
133
+ if (format === "md") {
134
+ return formatDiagnoseMd(findings);
135
+ }
136
+ return formatDiagnoseText(findings);
137
+ }
138
+ function formatDiagnoseText(findings) {
139
+ if (findings.length === 0) {
140
+ return "✅ No issues found. Workflow looks good!";
141
+ }
142
+ const lines = [`Found ${findings.length} issue(s):`, ""];
143
+ const icons = { critical: "🔴", high: "🟠", medium: "🟡", low: "🔵" };
144
+ for (const f of findings) {
145
+ lines.push(` ${icons[f.severity] || "•"} [${f.severity}] ${f.message}`);
146
+ lines.push(` Fix: ${f.fix}`);
147
+ if (f.fix_code) {
148
+ for (const line of f.fix_code.split("\n")) {
149
+ lines.push(` ${line}`);
150
+ }
151
+ }
152
+ lines.push("");
153
+ }
154
+ return lines.join("\n");
155
+ }
156
+ function formatDiagnoseMd(findings) {
157
+ if (findings.length === 0)
158
+ return "✅ No issues found.";
159
+ const lines = [`## Workflow Analysis — ${findings.length} issue(s)`, ""];
160
+ for (const f of findings) {
161
+ lines.push(`- **[${f.severity}]** ${f.message}`);
162
+ lines.push(` - Fix: ${f.fix}`);
163
+ if (f.fix_code) {
164
+ lines.push(" ```", ` ${f.fix_code}`, " ```");
165
+ }
166
+ }
167
+ return lines.join("\n");
168
+ }
169
+ // ─── Suggest ────────────────────────────────────────────────────────────────
170
+ export function formatSuggestOutput(results, format) {
171
+ if (format === "json") {
172
+ return JSON.stringify({ suggestions: results.map(entryToJson) }, null, 2);
173
+ }
174
+ if (format === "md") {
175
+ return formatSuggestMd(results);
176
+ }
177
+ return formatSuggestText(results);
178
+ }
179
+ function formatSuggestText(results) {
180
+ if (results.length === 0) {
181
+ return "No matching suggestions. Try `actions-debugger lookup <exact error message>` for better results.";
182
+ }
183
+ const best = results[0];
184
+ const lines = [
185
+ `✓ Suggested Fix: ${best.title}`,
186
+ ` Category: ${best.category} | Severity: ${best.severity}`,
187
+ "",
188
+ ` Root Cause: ${best.root_cause.trim()}`,
189
+ "",
190
+ ` Fix: ${best.fix.trim()}`,
191
+ ];
192
+ if (best.fix_code?.length) {
193
+ lines.push("");
194
+ for (const fc of best.fix_code) {
195
+ lines.push(` ${fc.label || fc.language}:`);
196
+ for (const line of fc.code.trim().split("\n")) {
197
+ lines.push(` ${line}`);
198
+ }
199
+ }
200
+ }
201
+ if (results.length > 1) {
202
+ lines.push("", " Other possible matches:");
203
+ for (const entry of results.slice(1)) {
204
+ lines.push(` - ${entry.title} (${entry.category})`);
205
+ }
206
+ }
207
+ return lines.join("\n");
208
+ }
209
+ function formatSuggestMd(results) {
210
+ if (results.length === 0)
211
+ return "No matching suggestions.";
212
+ const best = results[0];
213
+ const lines = [
214
+ `## Suggested Fix: ${best.title}`,
215
+ "",
216
+ `**Category:** ${best.category} | **Severity:** ${best.severity}`,
217
+ "",
218
+ `**Root Cause:** ${best.root_cause.trim()}`,
219
+ "",
220
+ `**Fix:** ${best.fix.trim()}`,
221
+ ];
222
+ if (best.fix_code?.length) {
223
+ for (const fc of best.fix_code) {
224
+ lines.push("", `\`\`\`${fc.language}`, fc.code.trim(), "```");
225
+ }
226
+ }
227
+ if (results.length > 1) {
228
+ lines.push("", "**Other possible matches:**");
229
+ for (const entry of results.slice(1)) {
230
+ lines.push(`- ${entry.title} (${entry.category})`);
231
+ }
232
+ }
233
+ return lines.join("\n");
234
+ }
235
+ // ─── Categories ─────────────────────────────────────────────────────────────
236
+ export function formatCategoriesOutput(categories, format) {
237
+ if (format === "json") {
238
+ return JSON.stringify({
239
+ categories: categories.map((c) => ({
240
+ name: c.name,
241
+ count: c.count,
242
+ severities: c.severities,
243
+ })),
244
+ }, null, 2);
245
+ }
246
+ if (format === "md") {
247
+ return formatCategoriesMd(categories);
248
+ }
249
+ return formatCategoriesText(categories);
250
+ }
251
+ function formatCategoriesText(categories) {
252
+ const total = categories.reduce((sum, c) => sum + c.count, 0);
253
+ const nameWidth = Math.max(...categories.map((c) => c.name.length), 10);
254
+ const lines = [
255
+ `Error Categories (${total} total errors)`,
256
+ "",
257
+ `${"Category".padEnd(nameWidth)} Count Severities`,
258
+ "─".repeat(nameWidth + 40),
259
+ ];
260
+ for (const cat of categories) {
261
+ const sevParts = [];
262
+ if (cat.severities.error)
263
+ sevParts.push(`${cat.severities.error} error`);
264
+ if (cat.severities.warning)
265
+ sevParts.push(`${cat.severities.warning} warning`);
266
+ if (cat.severities["silent-failure"])
267
+ sevParts.push(`${cat.severities["silent-failure"]} silent`);
268
+ if (cat.severities.limitation)
269
+ sevParts.push(`${cat.severities.limitation} limitation`);
270
+ lines.push(`${cat.name.padEnd(nameWidth)} ${String(cat.count).padStart(5)} ${sevParts.join(", ")}`);
271
+ }
272
+ return lines.join("\n");
273
+ }
274
+ function formatCategoriesMd(categories) {
275
+ const total = categories.reduce((sum, c) => sum + c.count, 0);
276
+ const lines = [
277
+ `## Error Categories (${total} total)`,
278
+ "",
279
+ "| Category | Count | Severities |",
280
+ "|----------|-------|------------|",
281
+ ];
282
+ for (const cat of categories) {
283
+ const sevParts = [];
284
+ if (cat.severities.error)
285
+ sevParts.push(`${cat.severities.error} error`);
286
+ if (cat.severities.warning)
287
+ sevParts.push(`${cat.severities.warning} warning`);
288
+ if (cat.severities["silent-failure"])
289
+ sevParts.push(`${cat.severities["silent-failure"]} silent`);
290
+ if (cat.severities.limitation)
291
+ sevParts.push(`${cat.severities.limitation} limitation`);
292
+ lines.push(`| \`${cat.name}\` | ${cat.count} | ${sevParts.join(", ")} |`);
293
+ }
294
+ return lines.join("\n");
295
+ }
296
+ // ─── Helpers ────────────────────────────────────────────────────────────────
297
+ function entryToJson(entry) {
298
+ return {
299
+ id: entry.id,
300
+ title: entry.title,
301
+ category: entry.category,
302
+ severity: entry.severity,
303
+ root_cause: entry.root_cause.trim(),
304
+ fix: entry.fix.trim(),
305
+ fix_code: entry.fix_code?.map((fc) => ({ language: fc.language, code: fc.code.trim() })),
306
+ prevention: entry.prevention,
307
+ docs: entry.docs,
308
+ tags: entry.tags,
309
+ };
310
+ }
311
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Unified entry point for @htekdev/actions-debugger.
4
+ *
5
+ * Detection logic:
6
+ * - Known subcommand (lookup, search, diagnose, suggest-fix, categories) → CLI mode
7
+ * - --help, --version, or flag starting with - → CLI mode (commander handles it)
8
+ * - No args or --mcp → MCP server mode (backward compatible)
9
+ * - Unknown arg → MCP server mode (fallback)
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
package/dist/entry.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Unified entry point for @htekdev/actions-debugger.
4
+ *
5
+ * Detection logic:
6
+ * - Known subcommand (lookup, search, diagnose, suggest-fix, categories) → CLI mode
7
+ * - --help, --version, or flag starting with - → CLI mode (commander handles it)
8
+ * - No args or --mcp → MCP server mode (backward compatible)
9
+ * - Unknown arg → MCP server mode (fallback)
10
+ */
11
+ const CLI_COMMANDS = ["lookup", "search", "diagnose", "suggest-fix", "categories"];
12
+ const firstArg = process.argv[2];
13
+ if (!firstArg || firstArg === "--mcp") {
14
+ // MCP server mode — dynamic import to keep startup fast for CLI
15
+ import("./mcp.js");
16
+ }
17
+ else if (CLI_COMMANDS.includes(firstArg) ||
18
+ firstArg === "--help" ||
19
+ firstArg === "-h" ||
20
+ firstArg === "--version" ||
21
+ firstArg === "-V") {
22
+ // CLI mode
23
+ import("./cli/main.js");
24
+ }
25
+ else {
26
+ // Unknown arg — fallback to MCP for backward compat
27
+ import("./mcp.js");
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;AAEnF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEjC,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;IACtC,gEAAgE;IAChE,MAAM,CAAC,UAAU,CAAC,CAAC;AACrB,CAAC;KAAM,IACL,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/B,QAAQ,KAAK,QAAQ;IACrB,QAAQ,KAAK,IAAI;IACjB,QAAQ,KAAK,WAAW;IACxB,QAAQ,KAAK,IAAI,EACjB,CAAC;IACD,WAAW;IACX,MAAM,CAAC,eAAe,CAAC,CAAC;AAC1B,CAAC;KAAM,CAAC;IACN,oDAAoD;IACpD,MAAM,CAAC,UAAU,CAAC,CAAC;AACrB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,11 @@
1
- #!/usr/bin/env node
2
1
  /**
3
- * @htekdev/actions-debugger — MCP server entry point.
2
+ * @htekdev/actions-debugger — Programmatic API exports.
4
3
  *
5
4
  * 65+ real GitHub Actions errors, queryable by agents.
6
- * Runs as a stdio MCP server for Claude Desktop, Copilot CLI, Cursor, etc.
7
5
  *
8
- * Usage:
9
- * npx @htekdev/actions-debugger
6
+ * For MCP server: import from "@htekdev/actions-debugger/mcp"
7
+ * For CLI: npx @htekdev/actions-debugger <command>
8
+ * For library: import { lookupError, searchErrors } from "@htekdev/actions-debugger"
10
9
  *
11
10
  * Source: https://htek.dev/articles/github-actions-debugging-guide
12
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,YAAY,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,44 +1,19 @@
1
- #!/usr/bin/env node
2
1
  /**
3
- * @htekdev/actions-debugger — MCP server entry point.
2
+ * @htekdev/actions-debugger — Programmatic API exports.
4
3
  *
5
4
  * 65+ real GitHub Actions errors, queryable by agents.
6
- * Runs as a stdio MCP server for Claude Desktop, Copilot CLI, Cursor, etc.
7
5
  *
8
- * Usage:
9
- * npx @htekdev/actions-debugger
6
+ * For MCP server: import from "@htekdev/actions-debugger/mcp"
7
+ * For CLI: npx @htekdev/actions-debugger <command>
8
+ * For library: import { lookupError, searchErrors } from "@htekdev/actions-debugger"
10
9
  *
11
10
  * Source: https://htek.dev/articles/github-actions-debugging-guide
12
11
  */
13
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
14
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
- import { loadErrorDatabase } from "./db/loader.js";
16
- import { registerTools } from "./server.js";
17
- // Re-export programmatic API
12
+ // Core API exports
18
13
  export { loadErrorDatabase } from "./db/loader.js";
19
14
  export { lookupError } from "./tools/lookup-error.js";
20
15
  export { diagnoseWorkflow } from "./tools/diagnose-workflow.js";
21
16
  export { suggestFix } from "./tools/suggest-fix.js";
22
17
  export { listCategories } from "./tools/list-categories.js";
23
18
  export { searchErrors } from "./tools/search-errors.js";
24
- /**
25
- * Start the MCP server if running as CLI.
26
- */
27
- async function main() {
28
- const db = await loadErrorDatabase();
29
- const server = new Server({ name: "actions-debugger", version: "1.0.0" }, { capabilities: { tools: {} } });
30
- registerTools(server, db);
31
- const transport = new StdioServerTransport();
32
- await server.connect(transport);
33
- }
34
- // Only start server when running as CLI (not when imported as library)
35
- const isMainModule = process.argv[1] &&
36
- (process.argv[1].endsWith("index.js") ||
37
- process.argv[1].endsWith("actions-debugger"));
38
- if (isMainModule) {
39
- main().catch((err) => {
40
- console.error("Fatal error:", err);
41
- process.exit(1);
42
- });
43
- }
44
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6BAA6B;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWxD;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,uEAAuE;AACvE,MAAM,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAElD,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,mBAAmB;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server entry point.
4
+ * Starts the stdio MCP server for Claude Desktop, Copilot CLI, Cursor, etc.
5
+ *
6
+ * Usage:
7
+ * npx @htekdev/actions-debugger (no subcommand → MCP mode)
8
+ * node dist/mcp.js
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
package/dist/mcp.js ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server entry point.
4
+ * Starts the stdio MCP server for Claude Desktop, Copilot CLI, Cursor, etc.
5
+ *
6
+ * Usage:
7
+ * npx @htekdev/actions-debugger (no subcommand → MCP mode)
8
+ * node dist/mcp.js
9
+ */
10
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
11
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12
+ import { loadErrorDatabase } from "./db/loader.js";
13
+ import { registerTools } from "./server.js";
14
+ async function main() {
15
+ const db = await loadErrorDatabase();
16
+ const server = new Server({ name: "actions-debugger", version: "1.1.0" }, { capabilities: { tools: {} } });
17
+ registerTools(server, db);
18
+ const transport = new StdioServerTransport();
19
+ await server.connect(transport);
20
+ }
21
+ main().catch((err) => {
22
+ console.error("Fatal error:", err);
23
+ process.exit(1);
24
+ });
25
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.26",
4
- "description": "65+ real GitHub Actions errors, queryable by agents. MCP server + Copilot skills + error database.",
3
+ "version": "1.0.27",
4
+ "description": "65+ real GitHub Actions errors, queryable by agents. CLI + MCP server + Copilot skills + error database.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "bin": {
9
- "actions-debugger": "./dist/index.js"
9
+ "actions-debugger": "./dist/entry.js"
10
10
  },
11
11
  "exports": {
12
12
  ".": {
13
13
  "import": "./dist/index.js",
14
14
  "types": "./dist/index.d.ts"
15
- }
15
+ },
16
+ "./mcp": "./dist/mcp.js"
16
17
  },
17
18
  "files": [
18
19
  "dist",
@@ -27,7 +28,9 @@
27
28
  "test:watch": "vitest",
28
29
  "lint": "tsc --noEmit",
29
30
  "validate-errors": "node --import tsx scripts/validate-errors.ts",
30
- "start": "node dist/index.js",
31
+ "start": "node dist/mcp.js",
32
+ "start:mcp": "node dist/mcp.js",
33
+ "start:cli": "node dist/entry.js",
31
34
  "prepublishOnly": "npm run build"
32
35
  },
33
36
  "publishConfig": {
@@ -40,7 +43,8 @@
40
43
  "model-context-protocol",
41
44
  "copilot",
42
45
  "ci-cd",
43
- "error-database"
46
+ "error-database",
47
+ "cli"
44
48
  ],
45
49
  "author": "Hector Flores <hector.flores@htek.dev> (https://htek.dev)",
46
50
  "license": "MIT",
@@ -54,6 +58,7 @@
54
58
  },
55
59
  "dependencies": {
56
60
  "@modelcontextprotocol/sdk": "^1.12.0",
61
+ "commander": "^15.0.0",
57
62
  "glob": "^11.0.0",
58
63
  "js-yaml": "^4.1.0"
59
64
  },