@odavl/guardian 2.0.0 → 2.0.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.
- package/CHANGELOG.md +210 -210
- package/LICENSE +21 -21
- package/README.md +297 -184
- package/bin/guardian.js +2242 -2221
- package/config/README.md +59 -59
- package/config/guardian.config.json +54 -54
- package/config/guardian.policy.json +12 -12
- package/config/profiles/docs.yaml +18 -18
- package/config/profiles/ecommerce.yaml +17 -17
- package/config/profiles/landing-demo.yaml +16 -16
- package/config/profiles/marketing.yaml +18 -18
- package/config/profiles/saas.yaml +21 -21
- package/flows/example-login-flow.json +36 -36
- package/flows/example-signup-flow.json +44 -44
- package/package.json +124 -116
- package/policies/enterprise.json +12 -12
- package/policies/landing-demo.json +22 -22
- package/policies/saas.json +12 -12
- package/policies/startup.json +12 -12
- package/src/enterprise/audit-logger.js +166 -166
- package/src/enterprise/pdf-exporter.js +267 -267
- package/src/enterprise/rbac-gate.js +142 -142
- package/src/enterprise/rbac.js +239 -239
- package/src/enterprise/site-manager.js +180 -180
- package/src/founder/feedback-system.js +156 -156
- package/src/founder/founder-tracker.js +213 -213
- package/src/founder/usage-signals.js +141 -141
- package/src/guardian/action-hints.js +439 -439
- package/src/guardian/alert-ledger.js +121 -121
- package/src/guardian/artifact-sanitizer.js +56 -56
- package/src/guardian/attempt-engine.js +1069 -1029
- package/src/guardian/attempt-registry.js +267 -267
- package/src/guardian/attempt-relevance.js +106 -106
- package/src/guardian/attempt-reporter.js +513 -507
- package/src/guardian/attempt.js +274 -273
- package/src/guardian/attempts-filter.js +63 -63
- package/src/guardian/auto-attempt-builder.js +283 -283
- package/src/guardian/baseline-registry.js +177 -177
- package/src/guardian/baseline-reporter.js +143 -143
- package/src/guardian/baseline-storage.js +285 -285
- package/src/guardian/baseline.js +535 -534
- package/src/guardian/behavioral-signals.js +261 -261
- package/src/guardian/breakage-intelligence.js +224 -224
- package/src/guardian/browser-pool.js +131 -131
- package/src/guardian/browser.js +119 -119
- package/src/guardian/canonical-truth.js +308 -308
- package/src/guardian/ci-cli.js +121 -121
- package/src/guardian/ci-gate.js +96 -96
- package/src/guardian/ci-mode.js +15 -15
- package/src/guardian/ci-output.js +55 -38
- package/src/guardian/cli-summary.js +102 -102
- package/src/guardian/confidence-signals.js +251 -251
- package/src/guardian/config-loader.js +161 -161
- package/src/guardian/config-validator.js +285 -283
- package/src/guardian/coverage-model.js +239 -239
- package/src/guardian/coverage-packs.js +58 -58
- package/src/guardian/crawler.js +142 -142
- package/src/guardian/data-guardian-detector.js +189 -189
- package/src/guardian/decision-authority.js +746 -725
- package/src/guardian/detection-layers.js +271 -271
- package/src/guardian/determinism.js +146 -146
- package/src/guardian/discovery-engine.js +661 -661
- package/src/guardian/drift-detector.js +100 -100
- package/src/guardian/enhanced-html-reporter.js +522 -522
- package/src/guardian/env-guard.js +128 -127
- package/src/guardian/error-clarity.js +399 -399
- package/src/guardian/export-contract.js +196 -196
- package/src/guardian/fail-safe.js +212 -212
- package/src/guardian/failure-intelligence.js +173 -173
- package/src/guardian/failure-taxonomy.js +169 -169
- package/src/guardian/final-outcome.js +206 -206
- package/src/guardian/first-run-profile.js +89 -89
- package/src/guardian/first-run.js +65 -67
- package/src/guardian/flag-validator.js +111 -111
- package/src/guardian/flow-executor.js +641 -639
- package/src/guardian/flow-registry.js +67 -67
- package/src/guardian/honesty.js +394 -394
- package/src/guardian/html-reporter.js +416 -416
- package/src/guardian/human-intent-resolver.js +296 -296
- package/src/guardian/human-interaction-model.js +351 -351
- package/src/guardian/human-journey-context.js +184 -184
- package/src/guardian/human-navigator.js +544 -544
- package/src/guardian/human-reporter.js +435 -431
- package/src/guardian/index.js +226 -221
- package/src/guardian/init-command.js +143 -143
- package/src/guardian/intent-detector.js +148 -146
- package/src/guardian/journey-definitions.js +132 -132
- package/src/guardian/journey-scan-cli.js +142 -145
- package/src/guardian/journey-scanner.js +583 -583
- package/src/guardian/junit-reporter.js +281 -281
- package/src/guardian/language-detection.js +99 -99
- package/src/guardian/live-alert.js +56 -56
- package/src/guardian/live-baseline-compare.js +146 -146
- package/src/guardian/live-cli.js +95 -95
- package/src/guardian/live-guardian.js +210 -210
- package/src/guardian/live-scheduler-runner.js +137 -137
- package/src/guardian/live-scheduler-state.js +167 -168
- package/src/guardian/live-scheduler.js +146 -146
- package/src/guardian/live-state.js +110 -110
- package/src/guardian/market-criticality.js +335 -335
- package/src/guardian/market-reporter.js +577 -577
- package/src/guardian/network-trace.js +178 -178
- package/src/guardian/obs-logger.js +110 -110
- package/src/guardian/observed-capabilities.js +427 -427
- package/src/guardian/output-contract.js +154 -0
- package/src/guardian/output-readability.js +264 -264
- package/src/guardian/parallel-executor.js +116 -116
- package/src/guardian/path-safety.js +56 -56
- package/src/guardian/pattern-analyzer.js +348 -348
- package/src/guardian/policy.js +432 -434
- package/src/guardian/prelaunch-gate.js +193 -193
- package/src/guardian/prerequisite-checker.js +101 -101
- package/src/guardian/preset-loader.js +152 -157
- package/src/guardian/profile-loader.js +96 -96
- package/src/guardian/reality.js +3025 -2826
- package/src/guardian/realworld-scenarios.js +94 -94
- package/src/guardian/reporter.js +167 -167
- package/src/guardian/retry-policy.js +123 -123
- package/src/guardian/root-cause-analysis.js +171 -171
- package/src/guardian/rules-engine.js +558 -558
- package/src/guardian/run-artifacts.js +212 -212
- package/src/guardian/run-cleanup.js +207 -207
- package/src/guardian/run-export.js +522 -522
- package/src/guardian/run-latest.js +90 -90
- package/src/guardian/run-list.js +211 -211
- package/src/guardian/run-summary.js +20 -20
- package/src/guardian/runtime-root.js +246 -246
- package/src/guardian/safety.js +248 -248
- package/src/guardian/scan-presets.js +133 -149
- package/src/guardian/screenshot.js +152 -152
- package/src/guardian/secret-hygiene.js +44 -44
- package/src/guardian/selector-fallbacks.js +394 -394
- package/src/guardian/semantic-contact-detection.js +255 -255
- package/src/guardian/semantic-contact-finder.js +201 -201
- package/src/guardian/semantic-targets.js +234 -234
- package/src/guardian/site-intelligence.js +588 -588
- package/src/guardian/site-introspection.js +257 -257
- package/src/guardian/sitemap.js +225 -225
- package/src/guardian/smoke.js +283 -258
- package/src/guardian/snapshot-schema.js +177 -290
- package/src/guardian/snapshot.js +430 -397
- package/src/guardian/stability-scorer.js +169 -169
- package/src/guardian/success-evaluator.js +214 -214
- package/src/guardian/template-command.js +184 -184
- package/src/guardian/text-formatters.js +426 -426
- package/src/guardian/timeout-profiles.js +57 -57
- package/src/guardian/truth/attempt.contract.js +158 -0
- package/src/guardian/truth/decision.contract.js +275 -0
- package/src/guardian/truth/snapshot.contract.js +363 -0
- package/src/guardian/validators.js +323 -323
- package/src/guardian/verdict-card.js +474 -474
- package/src/guardian/verdict-clarity.js +298 -298
- package/src/guardian/verdict-policy.js +363 -363
- package/src/guardian/verdict.js +333 -333
- package/src/guardian/verdicts.js +79 -74
- package/src/guardian/visual-diff.js +247 -247
- package/src/guardian/wait-for-outcome.js +119 -119
- package/src/guardian/watch-runner.js +181 -181
- package/src/guardian/watchdog-diff.js +167 -167
- package/src/guardian/webhook.js +206 -206
- package/src/payments/stripe-checkout.js +169 -169
- package/src/plans/plan-definitions.js +148 -148
- package/src/plans/plan-manager.js +211 -211
- package/src/plans/usage-tracker.js +210 -210
- package/src/recipes/recipe-engine.js +188 -188
- package/src/recipes/recipe-failure-analysis.js +159 -159
- package/src/recipes/recipe-registry.js +134 -134
- package/src/recipes/recipe-runtime.js +507 -507
- package/src/recipes/recipe-store.js +410 -410
- package/SECURITY.md +0 -77
- package/VERSIONING.md +0 -100
- package/guardian-contract-v1.md +0 -502
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Attempt Relevance Decision Engine
|
|
3
|
-
* Determines which attempts should run based on site introspection.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Relevance rules mapping attempt IDs to required introspection flags
|
|
8
|
-
*/
|
|
9
|
-
const RELEVANCE_RULES = {
|
|
10
|
-
'contact_form': { requires: 'hasContactForm', reason: 'No contact form detected' },
|
|
11
|
-
'language_switch': { requires: 'hasLanguageSwitch', reason: 'No language switch detected' },
|
|
12
|
-
'signup': { requires: 'hasSignup', reason: 'No signup elements detected' },
|
|
13
|
-
'login': { requires: 'hasLogin', reason: 'No login elements detected' },
|
|
14
|
-
'checkout': { requires: 'hasCheckout', reason: 'No checkout elements detected' },
|
|
15
|
-
'newsletter_signup': { requires: 'hasNewsletter', reason: 'No newsletter signup detected' }
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Filter attempts based on site introspection
|
|
20
|
-
*
|
|
21
|
-
* @param {Array} attempts - Array of attempt objects with {id, ...}
|
|
22
|
-
* @param {Object} introspection - Result from inspectSite()
|
|
23
|
-
* @returns {Object} { toRun: Array, toSkip: Array }
|
|
24
|
-
*/
|
|
25
|
-
function filterAttempts(attempts, introspection) {
|
|
26
|
-
const toRun = [];
|
|
27
|
-
const toSkip = [];
|
|
28
|
-
|
|
29
|
-
for (const attempt of attempts) {
|
|
30
|
-
const rule = RELEVANCE_RULES[attempt.id];
|
|
31
|
-
|
|
32
|
-
if (!rule) {
|
|
33
|
-
// No rule defined: always run (universal attempts)
|
|
34
|
-
toRun.push(attempt);
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Check if introspection flag is true
|
|
39
|
-
const flagValue = introspection[rule.requires];
|
|
40
|
-
|
|
41
|
-
if (flagValue === true) {
|
|
42
|
-
toRun.push(attempt);
|
|
43
|
-
} else {
|
|
44
|
-
toSkip.push({
|
|
45
|
-
attempt: attempt.id,
|
|
46
|
-
reason: rule.reason
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return { toRun, toSkip };
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Check if an attempt should be skipped
|
|
56
|
-
*
|
|
57
|
-
* @param {string} attemptId - The attempt ID
|
|
58
|
-
* @param {Object} introspection - Result from inspectSite()
|
|
59
|
-
* @returns {Object|null} Skip info {reason} or null if should run
|
|
60
|
-
*/
|
|
61
|
-
function shouldSkipAttempt(attemptId, introspection) {
|
|
62
|
-
const rule = RELEVANCE_RULES[attemptId];
|
|
63
|
-
|
|
64
|
-
if (!rule) {
|
|
65
|
-
// No rule: never skip
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const flagValue = introspection[rule.requires];
|
|
70
|
-
|
|
71
|
-
if (flagValue === true) {
|
|
72
|
-
return null; // Should run
|
|
73
|
-
} else {
|
|
74
|
-
return { reason: rule.reason };
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Get human-readable summary of introspection results
|
|
80
|
-
*
|
|
81
|
-
* @param {Object} introspection - Result from inspectSite()
|
|
82
|
-
* @returns {string} Summary text
|
|
83
|
-
*/
|
|
84
|
-
function summarizeIntrospection(introspection) {
|
|
85
|
-
const detected = [];
|
|
86
|
-
|
|
87
|
-
if (introspection.hasLogin) detected.push('login');
|
|
88
|
-
if (introspection.hasSignup) detected.push('signup');
|
|
89
|
-
if (introspection.hasCheckout) detected.push('checkout');
|
|
90
|
-
if (introspection.hasNewsletter) detected.push('newsletter');
|
|
91
|
-
if (introspection.hasContactForm) detected.push('contact form');
|
|
92
|
-
if (introspection.hasLanguageSwitch) detected.push('language switch');
|
|
93
|
-
|
|
94
|
-
if (detected.length === 0) {
|
|
95
|
-
return 'No specific capabilities detected';
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return `Detected: ${detected.join(', ')}`;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
module.exports = {
|
|
102
|
-
RELEVANCE_RULES,
|
|
103
|
-
filterAttempts,
|
|
104
|
-
shouldSkipAttempt,
|
|
105
|
-
summarizeIntrospection
|
|
106
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Attempt Relevance Decision Engine
|
|
3
|
+
* Determines which attempts should run based on site introspection.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Relevance rules mapping attempt IDs to required introspection flags
|
|
8
|
+
*/
|
|
9
|
+
const RELEVANCE_RULES = {
|
|
10
|
+
'contact_form': { requires: 'hasContactForm', reason: 'No contact form detected' },
|
|
11
|
+
'language_switch': { requires: 'hasLanguageSwitch', reason: 'No language switch detected' },
|
|
12
|
+
'signup': { requires: 'hasSignup', reason: 'No signup elements detected' },
|
|
13
|
+
'login': { requires: 'hasLogin', reason: 'No login elements detected' },
|
|
14
|
+
'checkout': { requires: 'hasCheckout', reason: 'No checkout elements detected' },
|
|
15
|
+
'newsletter_signup': { requires: 'hasNewsletter', reason: 'No newsletter signup detected' }
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Filter attempts based on site introspection
|
|
20
|
+
*
|
|
21
|
+
* @param {Array} attempts - Array of attempt objects with {id, ...}
|
|
22
|
+
* @param {Object} introspection - Result from inspectSite()
|
|
23
|
+
* @returns {Object} { toRun: Array, toSkip: Array }
|
|
24
|
+
*/
|
|
25
|
+
function filterAttempts(attempts, introspection) {
|
|
26
|
+
const toRun = [];
|
|
27
|
+
const toSkip = [];
|
|
28
|
+
|
|
29
|
+
for (const attempt of attempts) {
|
|
30
|
+
const rule = RELEVANCE_RULES[attempt.id];
|
|
31
|
+
|
|
32
|
+
if (!rule) {
|
|
33
|
+
// No rule defined: always run (universal attempts)
|
|
34
|
+
toRun.push(attempt);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Check if introspection flag is true
|
|
39
|
+
const flagValue = introspection[rule.requires];
|
|
40
|
+
|
|
41
|
+
if (flagValue === true) {
|
|
42
|
+
toRun.push(attempt);
|
|
43
|
+
} else {
|
|
44
|
+
toSkip.push({
|
|
45
|
+
attempt: attempt.id,
|
|
46
|
+
reason: rule.reason
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return { toRun, toSkip };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Check if an attempt should be skipped
|
|
56
|
+
*
|
|
57
|
+
* @param {string} attemptId - The attempt ID
|
|
58
|
+
* @param {Object} introspection - Result from inspectSite()
|
|
59
|
+
* @returns {Object|null} Skip info {reason} or null if should run
|
|
60
|
+
*/
|
|
61
|
+
function shouldSkipAttempt(attemptId, introspection) {
|
|
62
|
+
const rule = RELEVANCE_RULES[attemptId];
|
|
63
|
+
|
|
64
|
+
if (!rule) {
|
|
65
|
+
// No rule: never skip
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const flagValue = introspection[rule.requires];
|
|
70
|
+
|
|
71
|
+
if (flagValue === true) {
|
|
72
|
+
return null; // Should run
|
|
73
|
+
} else {
|
|
74
|
+
return { reason: rule.reason };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Get human-readable summary of introspection results
|
|
80
|
+
*
|
|
81
|
+
* @param {Object} introspection - Result from inspectSite()
|
|
82
|
+
* @returns {string} Summary text
|
|
83
|
+
*/
|
|
84
|
+
function summarizeIntrospection(introspection) {
|
|
85
|
+
const detected = [];
|
|
86
|
+
|
|
87
|
+
if (introspection.hasLogin) detected.push('login');
|
|
88
|
+
if (introspection.hasSignup) detected.push('signup');
|
|
89
|
+
if (introspection.hasCheckout) detected.push('checkout');
|
|
90
|
+
if (introspection.hasNewsletter) detected.push('newsletter');
|
|
91
|
+
if (introspection.hasContactForm) detected.push('contact form');
|
|
92
|
+
if (introspection.hasLanguageSwitch) detected.push('language switch');
|
|
93
|
+
|
|
94
|
+
if (detected.length === 0) {
|
|
95
|
+
return 'No specific capabilities detected';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return `Detected: ${detected.join(', ')}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
module.exports = {
|
|
102
|
+
RELEVANCE_RULES,
|
|
103
|
+
filterAttempts,
|
|
104
|
+
shouldSkipAttempt,
|
|
105
|
+
summarizeIntrospection
|
|
106
|
+
};
|