sentinelayer-cli 0.1.1 → 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.
- package/README.md +996 -996
- package/bin/create-sentinelayer.js +5 -5
- package/bin/sentinelayer-cli.js +4 -4
- package/bin/sl.js +5 -5
- package/package.json +62 -54
- package/src/agents/jules/config/definition.js +209 -209
- package/src/agents/jules/config/system-prompt.js +175 -175
- package/src/agents/jules/error-intake.js +51 -51
- package/src/agents/jules/fix-cycle.js +377 -377
- package/src/agents/jules/loop.js +367 -367
- package/src/agents/jules/pulse.js +319 -319
- package/src/agents/jules/stream.js +186 -186
- package/src/agents/jules/swarm/file-scanner.js +74 -74
- package/src/agents/jules/swarm/index.js +11 -11
- package/src/agents/jules/swarm/orchestrator.js +362 -362
- package/src/agents/jules/swarm/pattern-hunter.js +123 -123
- package/src/agents/jules/swarm/sub-agent.js +308 -308
- package/src/agents/jules/tools/auth-audit.js +226 -222
- package/src/agents/jules/tools/dispatch.js +327 -327
- package/src/agents/jules/tools/file-edit.js +180 -180
- package/src/agents/jules/tools/file-read.js +100 -100
- package/src/agents/jules/tools/frontend-analyze.js +570 -570
- package/src/agents/jules/tools/glob.js +168 -168
- package/src/agents/jules/tools/grep.js +228 -228
- package/src/agents/jules/tools/index.js +29 -29
- package/src/agents/jules/tools/path-guards.js +161 -161
- package/src/agents/jules/tools/runtime-audit.js +493 -493
- package/src/agents/jules/tools/shell.js +383 -383
- package/src/ai/aidenid.js +972 -945
- package/src/ai/client.js +508 -508
- package/src/ai/domain-target-store.js +268 -268
- package/src/ai/identity-store.js +270 -270
- package/src/ai/site-store.js +145 -145
- package/src/audit/agents/architecture.js +180 -180
- package/src/audit/agents/compliance.js +179 -179
- package/src/audit/agents/documentation.js +165 -165
- package/src/audit/agents/performance.js +145 -145
- package/src/audit/agents/security.js +215 -215
- package/src/audit/agents/testing.js +172 -172
- package/src/audit/orchestrator.js +557 -557
- package/src/audit/package.js +204 -204
- package/src/audit/registry.js +284 -284
- package/src/audit/replay.js +103 -103
- package/src/auth/http.js +113 -113
- package/src/auth/service.js +891 -848
- package/src/auth/session-store.js +359 -345
- package/src/cli.js +252 -252
- package/src/commands/ai/identity-lifecycle.js +1338 -1337
- package/src/commands/ai/provision-governance.js +1272 -1246
- package/src/commands/ai/shared.js +147 -147
- package/src/commands/ai.js +11 -11
- package/src/commands/apply.js +12 -12
- package/src/commands/audit.js +1166 -1147
- package/src/commands/auth.js +375 -366
- package/src/commands/chat.js +191 -191
- package/src/commands/config.js +184 -184
- package/src/commands/cost.js +311 -311
- package/src/commands/daemon/core.js +850 -850
- package/src/commands/daemon/extended.js +1048 -1048
- package/src/commands/daemon/shared.js +213 -213
- package/src/commands/daemon.js +11 -11
- package/src/commands/guide.js +174 -174
- package/src/commands/ingest.js +58 -58
- package/src/commands/init.js +55 -55
- package/src/commands/legacy-args.js +10 -10
- package/src/commands/mcp.js +461 -404
- package/src/commands/omargate.js +15 -15
- package/src/commands/persona.js +20 -20
- package/src/commands/plugin.js +260 -260
- package/src/commands/policy.js +132 -132
- package/src/commands/prompt.js +238 -238
- package/src/commands/review.js +704 -704
- package/src/commands/scan.js +866 -788
- package/src/commands/spec.js +716 -716
- package/src/commands/swarm.js +651 -651
- package/src/commands/telemetry.js +202 -202
- package/src/commands/watch.js +510 -510
- package/src/config/agent-dictionary.js +182 -182
- package/src/config/io.js +56 -56
- package/src/config/paths.js +18 -18
- package/src/config/schema.js +55 -55
- package/src/config/service.js +184 -184
- package/src/cost/budget.js +235 -235
- package/src/cost/history.js +188 -188
- package/src/cost/tracker.js +171 -171
- package/src/daemon/artifact-lineage.js +534 -534
- package/src/daemon/assignment-ledger.js +770 -770
- package/src/daemon/ast-parser-layer.js +258 -258
- package/src/daemon/budget-governor.js +633 -633
- package/src/daemon/callgraph-overlay.js +646 -646
- package/src/daemon/error-worker.js +626 -626
- package/src/daemon/hybrid-mapper.js +929 -929
- package/src/daemon/ingest-refresh.js +195 -0
- package/src/daemon/jira-lifecycle.js +632 -632
- package/src/daemon/operator-control.js +657 -657
- package/src/daemon/reliability-lane.js +471 -471
- package/src/daemon/watchdog.js +971 -971
- package/src/guide/generator.js +316 -316
- package/src/ingest/engine.js +918 -918
- package/src/interactive/action-menu.js +132 -0
- package/src/interactive/auto-ingest.js +111 -0
- package/src/interactive/index.js +95 -0
- package/src/interactive/workspace.js +92 -0
- package/src/legacy-cli.js +2548 -2435
- package/src/mcp/registry.js +695 -695
- package/src/memory/blackboard.js +301 -301
- package/src/memory/retrieval.js +581 -581
- package/src/plugin/manifest.js +553 -553
- package/src/policy/packs.js +144 -144
- package/src/prompt/generator.js +118 -106
- package/src/review/ai-review.js +669 -669
- package/src/review/local-review.js +1284 -1284
- package/src/review/replay.js +235 -235
- package/src/review/report.js +664 -664
- package/src/review/spec-binding.js +487 -487
- package/src/scaffold/generator.js +67 -0
- package/src/scaffold/templates.js +150 -0
- package/src/scan/generator.js +418 -351
- package/src/scan/gh-secrets.js +107 -0
- package/src/spec/generator.js +519 -519
- package/src/spec/regenerate.js +237 -237
- package/src/spec/templates.js +91 -91
- package/src/swarm/dashboard.js +247 -247
- package/src/swarm/factory.js +363 -363
- package/src/swarm/pentest.js +934 -934
- package/src/swarm/registry.js +419 -419
- package/src/swarm/report.js +158 -158
- package/src/swarm/runtime.js +576 -576
- package/src/swarm/scenario-dsl.js +272 -272
- package/src/telemetry/ledger.js +302 -302
- package/src/telemetry/session-tracker.js +118 -0
- package/src/telemetry/sync.js +190 -0
- package/src/ui/markdown.js +220 -220
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
import { JulesSubAgent } from "./sub-agent.js";
|
|
2
|
-
|
|
3
|
-
const HUNTER_PROMPTS = {
|
|
4
|
-
xss: `You are an XSS PatternHunter working for Jules Tanaka.
|
|
5
|
-
Search the codebase for Cross-Site Scripting vulnerabilities:
|
|
6
|
-
- dangerouslySetInnerHTML with user-controlled input
|
|
7
|
-
- innerHTML assignments
|
|
8
|
-
- v-html directives (Vue)
|
|
9
|
-
- dynamic code execution (the eval function) with user input
|
|
10
|
-
- document write injection
|
|
11
|
-
- javascript: URLs in href
|
|
12
|
-
- template literal injection in HTML contexts
|
|
13
|
-
|
|
14
|
-
Use Grep and FrontendAnalyze('find_security_sinks') to find all matches.
|
|
15
|
-
For each match, determine if the input is user-controlled or sanitized.
|
|
16
|
-
Return findings as JSON array: [{ "file", "line", "type", "severity", "userControlled", "sanitized", "evidence" }]`,
|
|
17
|
-
|
|
18
|
-
state: `You are a State Management PatternHunter working for Jules Tanaka.
|
|
19
|
-
Search for React state anti-patterns:
|
|
20
|
-
- Components with 16+ useState calls (god components)
|
|
21
|
-
- useEffect with empty deps that references state (stale closures)
|
|
22
|
-
- useEffect without cleanup return (subscription/timer leaks)
|
|
23
|
-
- State updates in loops (N re-renders)
|
|
24
|
-
- Object/array in useEffect dependency array (new reference each render)
|
|
25
|
-
- Derived state stored in useState (should be computed)
|
|
26
|
-
|
|
27
|
-
Use Grep and FrontendAnalyze('count_state_hooks', 'find_missing_cleanup', 'find_stale_closures').
|
|
28
|
-
Return findings as JSON array: [{ "file", "line", "type", "severity", "pattern", "evidence" }]`,
|
|
29
|
-
|
|
30
|
-
hydration: `You are a Hydration Safety PatternHunter working for Jules Tanaka.
|
|
31
|
-
Search for SSR/CSR hydration mismatch risks:
|
|
32
|
-
- window/document/localStorage access during initial render (outside useEffect)
|
|
33
|
-
- Date.now() or Math.random() in render path (non-deterministic)
|
|
34
|
-
- suppressHydrationWarning without justification
|
|
35
|
-
- useLayoutEffect in server components
|
|
36
|
-
- Dynamic imports crossing server/client boundaries
|
|
37
|
-
- Locale/theme/auth state that can differ server vs client
|
|
38
|
-
|
|
39
|
-
Use Grep to find these patterns in .tsx/.jsx files.
|
|
40
|
-
Return findings as JSON array: [{ "file", "line", "type", "severity", "pattern", "evidence" }]`,
|
|
41
|
-
|
|
42
|
-
a11y: `You are an Accessibility PatternHunter working for Jules Tanaka.
|
|
43
|
-
Search for WCAG AA accessibility violations:
|
|
44
|
-
- Images without alt text
|
|
45
|
-
- Form inputs without labels (no <label> or aria-label)
|
|
46
|
-
- Buttons/links without accessible text
|
|
47
|
-
- Missing keyboard handlers on interactive divs (onClick without onKeyDown)
|
|
48
|
-
- tabIndex=-1 removing elements from tab order
|
|
49
|
-
- Missing focus management in modals/drawers
|
|
50
|
-
- Poor color contrast indicators (hardcoded light gray text)
|
|
51
|
-
- Missing skip navigation link
|
|
52
|
-
- aria-hidden on interactive elements
|
|
53
|
-
|
|
54
|
-
Use Grep and FrontendAnalyze('check_accessibility').
|
|
55
|
-
Return findings as JSON array: [{ "file", "line", "type", "severity", "wcag", "userImpact", "evidence" }]`,
|
|
56
|
-
|
|
57
|
-
perf: `You are a Performance PatternHunter working for Jules Tanaka.
|
|
58
|
-
Search for frontend performance anti-patterns:
|
|
59
|
-
- Large bundle imports (moment, lodash full import, d3 full import)
|
|
60
|
-
- Images without explicit dimensions (CLS risk)
|
|
61
|
-
- Fonts without font-display strategy
|
|
62
|
-
- Third-party scripts on critical render path
|
|
63
|
-
- Missing React.memo on list item components
|
|
64
|
-
- Inline arrow functions in map() JSX
|
|
65
|
-
- Large lists without virtualization
|
|
66
|
-
- Blocking script tags without async/defer
|
|
67
|
-
|
|
68
|
-
Use Grep, FrontendAnalyze('check_image_optimization', 'check_font_loading', 'find_third_party_scripts').
|
|
69
|
-
Return findings as JSON array: [{ "file", "line", "type", "severity", "impact", "evidence" }]`,
|
|
70
|
-
|
|
71
|
-
security: `You are a Frontend Security PatternHunter working for Jules Tanaka.
|
|
72
|
-
Search for frontend-specific security issues:
|
|
73
|
-
- API keys in NEXT_PUBLIC_/VITE_/REACT_APP_ env vars (especially _KEY, _SECRET, _TOKEN)
|
|
74
|
-
- Missing Content-Security-Policy headers
|
|
75
|
-
- Missing X-Frame-Options / frame-ancestors
|
|
76
|
-
- CORS * wildcard on sensitive endpoints
|
|
77
|
-
- Tokens stored in localStorage (vs httpOnly cookies)
|
|
78
|
-
- Missing CSRF protection on state-changing forms
|
|
79
|
-
- Source maps enabled in production build config
|
|
80
|
-
|
|
81
|
-
Use Grep, FrontendAnalyze('find_env_exposure', 'check_security_headers').
|
|
82
|
-
Return findings as JSON array: [{ "file", "line", "type", "severity", "cwe", "evidence" }]`,
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Create a PatternHunter sub-agent for a specific issue class.
|
|
87
|
-
*
|
|
88
|
-
* @param {object} config
|
|
89
|
-
* @param {"xss"|"state"|"hydration"|"a11y"|"perf"|"security"} config.huntType
|
|
90
|
-
* @param {string} config.rootPath - Codebase root to search
|
|
91
|
-
* @param {object} config.budget
|
|
92
|
-
* @param {object} config.blackboard
|
|
93
|
-
* @param {object} [config.provider]
|
|
94
|
-
* @param {AbortController} [config.parentAbort]
|
|
95
|
-
* @param {function} [config.onEvent]
|
|
96
|
-
*/
|
|
97
|
-
export function createPatternHunter(config) {
|
|
98
|
-
const prompt = HUNTER_PROMPTS[config.huntType];
|
|
99
|
-
if (!prompt) {
|
|
100
|
-
throw new Error(`Unknown hunt type: ${config.huntType}. Valid: ${Object.keys(HUNTER_PROMPTS).join(", ")}`);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return new JulesSubAgent({
|
|
104
|
-
id: `hunter-${config.huntType}-${Date.now()}`,
|
|
105
|
-
role: `PatternHunter-${config.huntType}`,
|
|
106
|
-
systemPrompt: prompt,
|
|
107
|
-
allowedTools: ["Grep", "Glob", "FrontendAnalyze", "FileRead"],
|
|
108
|
-
scope: { patterns: [config.huntType], rootPath: config.rootPath },
|
|
109
|
-
budget: config.budget || {
|
|
110
|
-
maxCostUsd: 0.3,
|
|
111
|
-
maxOutputTokens: 2000,
|
|
112
|
-
maxRuntimeMs: 60000,
|
|
113
|
-
maxToolCalls: 20,
|
|
114
|
-
},
|
|
115
|
-
blackboard: config.blackboard,
|
|
116
|
-
maxTurns: 5,
|
|
117
|
-
provider: config.provider,
|
|
118
|
-
parentAbort: config.parentAbort,
|
|
119
|
-
onEvent: config.onEvent,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export const HUNT_TYPES = Object.keys(HUNTER_PROMPTS);
|
|
1
|
+
import { JulesSubAgent } from "./sub-agent.js";
|
|
2
|
+
|
|
3
|
+
const HUNTER_PROMPTS = {
|
|
4
|
+
xss: `You are an XSS PatternHunter working for Jules Tanaka.
|
|
5
|
+
Search the codebase for Cross-Site Scripting vulnerabilities:
|
|
6
|
+
- dangerouslySetInnerHTML with user-controlled input
|
|
7
|
+
- innerHTML assignments
|
|
8
|
+
- v-html directives (Vue)
|
|
9
|
+
- dynamic code execution (the eval function) with user input
|
|
10
|
+
- document write injection
|
|
11
|
+
- javascript: URLs in href
|
|
12
|
+
- template literal injection in HTML contexts
|
|
13
|
+
|
|
14
|
+
Use Grep and FrontendAnalyze('find_security_sinks') to find all matches.
|
|
15
|
+
For each match, determine if the input is user-controlled or sanitized.
|
|
16
|
+
Return findings as JSON array: [{ "file", "line", "type", "severity", "userControlled", "sanitized", "evidence" }]`,
|
|
17
|
+
|
|
18
|
+
state: `You are a State Management PatternHunter working for Jules Tanaka.
|
|
19
|
+
Search for React state anti-patterns:
|
|
20
|
+
- Components with 16+ useState calls (god components)
|
|
21
|
+
- useEffect with empty deps that references state (stale closures)
|
|
22
|
+
- useEffect without cleanup return (subscription/timer leaks)
|
|
23
|
+
- State updates in loops (N re-renders)
|
|
24
|
+
- Object/array in useEffect dependency array (new reference each render)
|
|
25
|
+
- Derived state stored in useState (should be computed)
|
|
26
|
+
|
|
27
|
+
Use Grep and FrontendAnalyze('count_state_hooks', 'find_missing_cleanup', 'find_stale_closures').
|
|
28
|
+
Return findings as JSON array: [{ "file", "line", "type", "severity", "pattern", "evidence" }]`,
|
|
29
|
+
|
|
30
|
+
hydration: `You are a Hydration Safety PatternHunter working for Jules Tanaka.
|
|
31
|
+
Search for SSR/CSR hydration mismatch risks:
|
|
32
|
+
- window/document/localStorage access during initial render (outside useEffect)
|
|
33
|
+
- Date.now() or Math.random() in render path (non-deterministic)
|
|
34
|
+
- suppressHydrationWarning without justification
|
|
35
|
+
- useLayoutEffect in server components
|
|
36
|
+
- Dynamic imports crossing server/client boundaries
|
|
37
|
+
- Locale/theme/auth state that can differ server vs client
|
|
38
|
+
|
|
39
|
+
Use Grep to find these patterns in .tsx/.jsx files.
|
|
40
|
+
Return findings as JSON array: [{ "file", "line", "type", "severity", "pattern", "evidence" }]`,
|
|
41
|
+
|
|
42
|
+
a11y: `You are an Accessibility PatternHunter working for Jules Tanaka.
|
|
43
|
+
Search for WCAG AA accessibility violations:
|
|
44
|
+
- Images without alt text
|
|
45
|
+
- Form inputs without labels (no <label> or aria-label)
|
|
46
|
+
- Buttons/links without accessible text
|
|
47
|
+
- Missing keyboard handlers on interactive divs (onClick without onKeyDown)
|
|
48
|
+
- tabIndex=-1 removing elements from tab order
|
|
49
|
+
- Missing focus management in modals/drawers
|
|
50
|
+
- Poor color contrast indicators (hardcoded light gray text)
|
|
51
|
+
- Missing skip navigation link
|
|
52
|
+
- aria-hidden on interactive elements
|
|
53
|
+
|
|
54
|
+
Use Grep and FrontendAnalyze('check_accessibility').
|
|
55
|
+
Return findings as JSON array: [{ "file", "line", "type", "severity", "wcag", "userImpact", "evidence" }]`,
|
|
56
|
+
|
|
57
|
+
perf: `You are a Performance PatternHunter working for Jules Tanaka.
|
|
58
|
+
Search for frontend performance anti-patterns:
|
|
59
|
+
- Large bundle imports (moment, lodash full import, d3 full import)
|
|
60
|
+
- Images without explicit dimensions (CLS risk)
|
|
61
|
+
- Fonts without font-display strategy
|
|
62
|
+
- Third-party scripts on critical render path
|
|
63
|
+
- Missing React.memo on list item components
|
|
64
|
+
- Inline arrow functions in map() JSX
|
|
65
|
+
- Large lists without virtualization
|
|
66
|
+
- Blocking script tags without async/defer
|
|
67
|
+
|
|
68
|
+
Use Grep, FrontendAnalyze('check_image_optimization', 'check_font_loading', 'find_third_party_scripts').
|
|
69
|
+
Return findings as JSON array: [{ "file", "line", "type", "severity", "impact", "evidence" }]`,
|
|
70
|
+
|
|
71
|
+
security: `You are a Frontend Security PatternHunter working for Jules Tanaka.
|
|
72
|
+
Search for frontend-specific security issues:
|
|
73
|
+
- API keys in NEXT_PUBLIC_/VITE_/REACT_APP_ env vars (especially _KEY, _SECRET, _TOKEN)
|
|
74
|
+
- Missing Content-Security-Policy headers
|
|
75
|
+
- Missing X-Frame-Options / frame-ancestors
|
|
76
|
+
- CORS * wildcard on sensitive endpoints
|
|
77
|
+
- Tokens stored in localStorage (vs httpOnly cookies)
|
|
78
|
+
- Missing CSRF protection on state-changing forms
|
|
79
|
+
- Source maps enabled in production build config
|
|
80
|
+
|
|
81
|
+
Use Grep, FrontendAnalyze('find_env_exposure', 'check_security_headers').
|
|
82
|
+
Return findings as JSON array: [{ "file", "line", "type", "severity", "cwe", "evidence" }]`,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Create a PatternHunter sub-agent for a specific issue class.
|
|
87
|
+
*
|
|
88
|
+
* @param {object} config
|
|
89
|
+
* @param {"xss"|"state"|"hydration"|"a11y"|"perf"|"security"} config.huntType
|
|
90
|
+
* @param {string} config.rootPath - Codebase root to search
|
|
91
|
+
* @param {object} config.budget
|
|
92
|
+
* @param {object} config.blackboard
|
|
93
|
+
* @param {object} [config.provider]
|
|
94
|
+
* @param {AbortController} [config.parentAbort]
|
|
95
|
+
* @param {function} [config.onEvent]
|
|
96
|
+
*/
|
|
97
|
+
export function createPatternHunter(config) {
|
|
98
|
+
const prompt = HUNTER_PROMPTS[config.huntType];
|
|
99
|
+
if (!prompt) {
|
|
100
|
+
throw new Error(`Unknown hunt type: ${config.huntType}. Valid: ${Object.keys(HUNTER_PROMPTS).join(", ")}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return new JulesSubAgent({
|
|
104
|
+
id: `hunter-${config.huntType}-${Date.now()}`,
|
|
105
|
+
role: `PatternHunter-${config.huntType}`,
|
|
106
|
+
systemPrompt: prompt,
|
|
107
|
+
allowedTools: ["Grep", "Glob", "FrontendAnalyze", "FileRead"],
|
|
108
|
+
scope: { patterns: [config.huntType], rootPath: config.rootPath },
|
|
109
|
+
budget: config.budget || {
|
|
110
|
+
maxCostUsd: 0.3,
|
|
111
|
+
maxOutputTokens: 2000,
|
|
112
|
+
maxRuntimeMs: 60000,
|
|
113
|
+
maxToolCalls: 20,
|
|
114
|
+
},
|
|
115
|
+
blackboard: config.blackboard,
|
|
116
|
+
maxTurns: 5,
|
|
117
|
+
provider: config.provider,
|
|
118
|
+
parentAbort: config.parentAbort,
|
|
119
|
+
onEvent: config.onEvent,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export const HUNT_TYPES = Object.keys(HUNTER_PROMPTS);
|