@formthefog/stratus 2026.2.20 → 2026.3.19

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 (76) hide show
  1. package/.github/sentinel/action.yml +100 -0
  2. package/.github/sentinel/dist/codebase.d.ts +3 -0
  3. package/.github/sentinel/dist/codebase.d.ts.map +1 -0
  4. package/.github/sentinel/dist/context.d.ts +6 -0
  5. package/.github/sentinel/dist/context.d.ts.map +1 -0
  6. package/.github/sentinel/dist/fixer.d.ts +6 -0
  7. package/.github/sentinel/dist/fixer.d.ts.map +1 -0
  8. package/.github/sentinel/dist/index.d.ts +1 -0
  9. package/.github/sentinel/dist/index.d.ts.map +1 -0
  10. package/.github/sentinel/dist/index.js +68808 -0
  11. package/.github/sentinel/dist/index.js.map +1 -0
  12. package/.github/sentinel/dist/licenses.txt +1152 -0
  13. package/.github/sentinel/dist/models/anthropic.d.ts +26 -0
  14. package/.github/sentinel/dist/models/anthropic.d.ts.map +1 -0
  15. package/.github/sentinel/dist/models/openai.d.ts +26 -0
  16. package/.github/sentinel/dist/models/openai.d.ts.map +1 -0
  17. package/.github/sentinel/dist/models/openrouter.d.ts +31 -0
  18. package/.github/sentinel/dist/models/openrouter.d.ts.map +1 -0
  19. package/.github/sentinel/dist/models/types.d.ts +37 -0
  20. package/.github/sentinel/dist/models/types.d.ts.map +1 -0
  21. package/.github/sentinel/dist/orchestrator.d.ts +3 -0
  22. package/.github/sentinel/dist/orchestrator.d.ts.map +1 -0
  23. package/.github/sentinel/dist/policy.d.ts +15 -0
  24. package/.github/sentinel/dist/policy.d.ts.map +1 -0
  25. package/.github/sentinel/dist/reporter.d.ts +8 -0
  26. package/.github/sentinel/dist/reporter.d.ts.map +1 -0
  27. package/.github/sentinel/dist/responder.d.ts +6 -0
  28. package/.github/sentinel/dist/responder.d.ts.map +1 -0
  29. package/.github/sentinel/dist/router.d.ts +2 -0
  30. package/.github/sentinel/dist/router.d.ts.map +1 -0
  31. package/.github/sentinel/dist/schemas/config.d.ts +195 -0
  32. package/.github/sentinel/dist/schemas/config.d.ts.map +1 -0
  33. package/.github/sentinel/dist/schemas/fix.d.ts +130 -0
  34. package/.github/sentinel/dist/schemas/fix.d.ts.map +1 -0
  35. package/.github/sentinel/dist/schemas/review.d.ts +275 -0
  36. package/.github/sentinel/dist/schemas/review.d.ts.map +1 -0
  37. package/.github/sentinel/dist/sourcemap-register.js +1 -0
  38. package/.github/sentinel/dist/subway.d.ts +31 -0
  39. package/.github/sentinel/dist/subway.d.ts.map +1 -0
  40. package/.github/sentinel/dist/types.d.ts +210 -0
  41. package/.github/sentinel/dist/types.d.ts.map +1 -0
  42. package/.github/sentinel/package-lock.json +2389 -0
  43. package/.github/sentinel/package.json +29 -0
  44. package/.github/sentinel/src/codebase.ts +265 -0
  45. package/.github/sentinel/src/context.ts +182 -0
  46. package/.github/sentinel/src/fixer.ts +353 -0
  47. package/.github/sentinel/src/index.ts +263 -0
  48. package/.github/sentinel/src/models/anthropic.ts +244 -0
  49. package/.github/sentinel/src/models/openai.ts +242 -0
  50. package/.github/sentinel/src/models/openrouter.ts +319 -0
  51. package/.github/sentinel/src/models/types.ts +35 -0
  52. package/.github/sentinel/src/orchestrator.ts +287 -0
  53. package/.github/sentinel/src/policy.ts +133 -0
  54. package/.github/sentinel/src/reporter.ts +666 -0
  55. package/.github/sentinel/src/responder.ts +156 -0
  56. package/.github/sentinel/src/router.ts +308 -0
  57. package/.github/sentinel/src/schemas/config.ts +84 -0
  58. package/.github/sentinel/src/schemas/fix.ts +44 -0
  59. package/.github/sentinel/src/schemas/review.ts +73 -0
  60. package/.github/sentinel/src/subway.ts +250 -0
  61. package/.github/sentinel/src/types.ts +234 -0
  62. package/.github/sentinel/tsconfig.json +19 -0
  63. package/.github/sentinel.yml +34 -0
  64. package/.github/workflows/publish.yml +28 -0
  65. package/.github/workflows/sentinel.yml +55 -0
  66. package/README.md +90 -41
  67. package/SECURITY.md +85 -0
  68. package/TROUBLESHOOTING.md +2 -2
  69. package/index.ts +219 -109
  70. package/openclaw.plugin.json +50 -26
  71. package/package.json +1 -1
  72. package/skills/stratus-info/SKILL.md +70 -10
  73. package/src/client.ts +78 -18
  74. package/src/config.ts +29 -8
  75. package/src/setup.ts +53 -61
  76. package/src/types.ts +11 -0
@@ -0,0 +1,100 @@
1
+ name: "Sentinel"
2
+ description: "Dual-model AI review bot for pull requests and issues using Anthropic + OpenAI"
3
+ author: "hathbanger"
4
+
5
+ branding:
6
+ icon: "shield"
7
+ color: "blue"
8
+
9
+ inputs:
10
+ anthropic_api_key:
11
+ description: "Anthropic API key for Claude (optional if openrouter_api_key is set)"
12
+ required: false
13
+ openai_api_key:
14
+ description: "OpenAI API key for GPT (optional if openrouter_api_key is set)"
15
+ required: false
16
+ github_token:
17
+ description: "GitHub token for API access"
18
+ required: false
19
+ default: ${{ github.token }}
20
+ config_path:
21
+ description: "Path to sentinel.yml config file"
22
+ required: false
23
+ default: ".github/sentinel.yml"
24
+ mode:
25
+ description: "Override mode: review, review_and_suggest, review_and_patch, issue_triage, manual_only"
26
+ required: false
27
+ anthropic_model:
28
+ description: "Anthropic model to use"
29
+ required: false
30
+ default: "claude-sonnet-4-20250514"
31
+ openai_model:
32
+ description: "OpenAI model to use"
33
+ required: false
34
+ default: "gpt-4o"
35
+ trigger_label:
36
+ description: "Label required to trigger reviews/fixes. Leave unset to defer to sentinel.yml (default in config: agent, set to '' to run on every PR)"
37
+ required: false
38
+ bot_name:
39
+ description: "Bot name for @mention detection (default: sentinel)"
40
+ required: false
41
+ default: "sentinel"
42
+ fix_mode:
43
+ description: "Issue fix mode: propose_only, propose_and_pr, yolo"
44
+ required: false
45
+ default: "propose_and_pr"
46
+ openrouter_api_key:
47
+ description: "OpenRouter API key — used as fallback when Anthropic or OpenAI keys are missing"
48
+ required: false
49
+ openrouter_anthropic_model:
50
+ description: "OpenRouter model for the Anthropic (architect) role"
51
+ required: false
52
+ default: "anthropic/claude-sonnet-4-20250514"
53
+ openrouter_openai_model:
54
+ description: "OpenRouter model for the OpenAI (engineer) role"
55
+ required: false
56
+ default: "openai/gpt-4o"
57
+ debug:
58
+ description: "Enable debug logging"
59
+ required: false
60
+ default: "false"
61
+ subway_bridge_url:
62
+ description: "Subway bridge base URL for agent notifications"
63
+ required: false
64
+ default: "https://relay.subway.dev"
65
+ subway_notify:
66
+ description: "Notify the agent registered in .subway/pr-contact when review completes"
67
+ required: false
68
+ default: "true"
69
+
70
+ outputs:
71
+ review_json:
72
+ description: "Full review result as JSON (v2: includes quality_score, model_agreement, dimensions)"
73
+ findings_count:
74
+ description: "Number of findings"
75
+ action:
76
+ description: "Decision taken (comment_only, request_changes, etc.)"
77
+ quality_score:
78
+ description: "Overall code quality score 0.0-1.0 (1.0 = no findings)"
79
+ model_agreement:
80
+ description: "Cross-model agreement ratio 0.0-1.0 (1.0 = full agreement)"
81
+ findings_critical:
82
+ description: "Critical finding count"
83
+ findings_high:
84
+ description: "High finding count"
85
+ findings_medium:
86
+ description: "Medium finding count"
87
+ findings_low:
88
+ description: "Low finding count"
89
+ dim_correctness:
90
+ description: "Correctness dimension 0.0-1.0 (penalized by bug/security findings)"
91
+ dim_coverage:
92
+ description: "Coverage dimension 0.0-1.0 (penalized by test_gap findings)"
93
+ dim_architecture:
94
+ description: "Architecture dimension 0.0-1.0 (penalized by architecture findings)"
95
+ dim_value:
96
+ description: "Value dimension 0.0-1.0 (penalized by performance/maintainability findings)"
97
+
98
+ runs:
99
+ using: "node20"
100
+ main: "dist/index.js"
@@ -0,0 +1,3 @@
1
+ import type { CodeContext } from "./types";
2
+ export declare function analyzeCodebase(keywords: string[], maxFiles?: number): Promise<CodeContext>;
3
+ export declare function extractKeywords(title: string, body: string): string[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/andrewhathaway/code/goose/jfl/jfl-pr-sentinel/src/codebase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAU1C,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,GAAE,MAA0B,GACnC,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBrE"}
@@ -0,0 +1,6 @@
1
+ import * as github from "@actions/github";
2
+ import type { ReviewContext } from "./types";
3
+ type Octokit = ReturnType<typeof github.getOctokit>;
4
+ export declare function buildPRContext(ctx: ReviewContext, octokit: Octokit): Promise<ReviewContext>;
5
+ export declare function buildIssueContext(ctx: ReviewContext, octokit: Octokit): Promise<ReviewContext>;
6
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/andrewhathaway/code/goose/jfl/jfl-pr-sentinel/src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,EAAE,aAAa,EAA6B,MAAM,SAAS,CAAA;AAEvE,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAA;AAEnD,wBAAsB,cAAc,CAClC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CA6BxB;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAQxB"}
@@ -0,0 +1,6 @@
1
+ import * as github from "@actions/github";
2
+ import type { ModelClient } from "./models/types";
3
+ import type { ReviewContext, FixMode, FixResult } from "./types";
4
+ type Octokit = ReturnType<typeof github.getOctokit>;
5
+ export declare function fixIssue(ctx: ReviewContext, anthropic: ModelClient | null, openai: ModelClient | null, octokit: Octokit, mode: FixMode, confidenceThreshold: number): Promise<FixResult>;
6
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/andrewhathaway/code/goose/jfl/jfl-pr-sentinel/src/fixer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAGzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAW,SAAS,EAAe,MAAM,SAAS,CAAA;AAItF,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAA;AAqDnD,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,WAAW,GAAG,IAAI,EAC7B,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,EACb,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,SAAS,CAAC,CAuFpB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/andrewhathaway/code/goose/jfl/jfl-pr-sentinel/src/index.ts"],"names":[],"mappings":""}