@formthefog/stratus 2026.2.24 → 2026.3.20
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.
- package/.github/sentinel/action.yml +100 -0
- package/.github/sentinel/dist/codebase.d.ts +3 -0
- package/.github/sentinel/dist/codebase.d.ts.map +1 -0
- package/.github/sentinel/dist/context.d.ts +6 -0
- package/.github/sentinel/dist/context.d.ts.map +1 -0
- package/.github/sentinel/dist/fixer.d.ts +6 -0
- package/.github/sentinel/dist/fixer.d.ts.map +1 -0
- package/.github/sentinel/dist/index.d.ts +1 -0
- package/.github/sentinel/dist/index.d.ts.map +1 -0
- package/.github/sentinel/dist/index.js +68808 -0
- package/.github/sentinel/dist/index.js.map +1 -0
- package/.github/sentinel/dist/licenses.txt +1152 -0
- package/.github/sentinel/dist/models/anthropic.d.ts +26 -0
- package/.github/sentinel/dist/models/anthropic.d.ts.map +1 -0
- package/.github/sentinel/dist/models/openai.d.ts +26 -0
- package/.github/sentinel/dist/models/openai.d.ts.map +1 -0
- package/.github/sentinel/dist/models/openrouter.d.ts +31 -0
- package/.github/sentinel/dist/models/openrouter.d.ts.map +1 -0
- package/.github/sentinel/dist/models/types.d.ts +37 -0
- package/.github/sentinel/dist/models/types.d.ts.map +1 -0
- package/.github/sentinel/dist/orchestrator.d.ts +3 -0
- package/.github/sentinel/dist/orchestrator.d.ts.map +1 -0
- package/.github/sentinel/dist/policy.d.ts +15 -0
- package/.github/sentinel/dist/policy.d.ts.map +1 -0
- package/.github/sentinel/dist/reporter.d.ts +8 -0
- package/.github/sentinel/dist/reporter.d.ts.map +1 -0
- package/.github/sentinel/dist/responder.d.ts +6 -0
- package/.github/sentinel/dist/responder.d.ts.map +1 -0
- package/.github/sentinel/dist/router.d.ts +2 -0
- package/.github/sentinel/dist/router.d.ts.map +1 -0
- package/.github/sentinel/dist/schemas/config.d.ts +195 -0
- package/.github/sentinel/dist/schemas/config.d.ts.map +1 -0
- package/.github/sentinel/dist/schemas/fix.d.ts +130 -0
- package/.github/sentinel/dist/schemas/fix.d.ts.map +1 -0
- package/.github/sentinel/dist/schemas/review.d.ts +275 -0
- package/.github/sentinel/dist/schemas/review.d.ts.map +1 -0
- package/.github/sentinel/dist/sourcemap-register.js +1 -0
- package/.github/sentinel/dist/subway.d.ts +31 -0
- package/.github/sentinel/dist/subway.d.ts.map +1 -0
- package/.github/sentinel/dist/types.d.ts +210 -0
- package/.github/sentinel/dist/types.d.ts.map +1 -0
- package/.github/sentinel/package-lock.json +2389 -0
- package/.github/sentinel/package.json +29 -0
- package/.github/sentinel/src/codebase.ts +265 -0
- package/.github/sentinel/src/context.ts +182 -0
- package/.github/sentinel/src/fixer.ts +353 -0
- package/.github/sentinel/src/index.ts +263 -0
- package/.github/sentinel/src/models/anthropic.ts +244 -0
- package/.github/sentinel/src/models/openai.ts +242 -0
- package/.github/sentinel/src/models/openrouter.ts +319 -0
- package/.github/sentinel/src/models/types.ts +35 -0
- package/.github/sentinel/src/orchestrator.ts +287 -0
- package/.github/sentinel/src/policy.ts +133 -0
- package/.github/sentinel/src/reporter.ts +666 -0
- package/.github/sentinel/src/responder.ts +156 -0
- package/.github/sentinel/src/router.ts +308 -0
- package/.github/sentinel/src/schemas/config.ts +84 -0
- package/.github/sentinel/src/schemas/fix.ts +44 -0
- package/.github/sentinel/src/schemas/review.ts +73 -0
- package/.github/sentinel/src/subway.ts +250 -0
- package/.github/sentinel/src/types.ts +234 -0
- package/.github/sentinel/tsconfig.json +19 -0
- package/.github/sentinel.yml +34 -0
- package/.github/workflows/sentinel.yml +55 -0
- package/README.md +88 -102
- package/SECURITY.md +21 -10
- package/TROUBLESHOOTING.md +2 -2
- package/index.ts +255 -114
- package/openclaw.plugin.json +50 -26
- package/package.json +1 -1
- package/skills/stratus-info/SKILL.md +70 -10
- package/src/client.ts +78 -18
- package/src/config.ts +29 -8
- package/src/setup.ts +82 -61
- 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 @@
|
|
|
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":""}
|