redlinegate 0.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/LICENSE +21 -0
- package/README.md +188 -0
- package/commands/redline-init.md +54 -0
- package/commands/redline-verify.md +69 -0
- package/dist/bin/redline.js +605 -0
- package/dist/bin/redline.js.map +1 -0
- package/dist/commands/exempt.js +45 -0
- package/dist/commands/exempt.js.map +1 -0
- package/dist/commands/init.js +615 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/policy.js +25 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/remove.js +427 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/review.js +72 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/sync.js +42 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/verify.js +478 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config/redline-json.js +187 -0
- package/dist/config/redline-json.js.map +1 -0
- package/dist/core/errors.js +25 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/git.js +152 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/log.js +22 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/severity.js +16 -0
- package/dist/core/severity.js.map +1 -0
- package/dist/core/version.js +15 -0
- package/dist/core/version.js.map +1 -0
- package/dist/detect/scan.js +79 -0
- package/dist/detect/scan.js.map +1 -0
- package/dist/detect/stack.js +71 -0
- package/dist/detect/stack.js.map +1 -0
- package/dist/enforce/ladder.js +148 -0
- package/dist/enforce/ladder.js.map +1 -0
- package/dist/exempt/parse.js +86 -0
- package/dist/exempt/parse.js.map +1 -0
- package/dist/metrics/options.js +257 -0
- package/dist/metrics/options.js.map +1 -0
- package/dist/metrics/run.js +72 -0
- package/dist/metrics/run.js.map +1 -0
- package/dist/platforms/azure/client.js +53 -0
- package/dist/platforms/azure/client.js.map +1 -0
- package/dist/platforms/azure/index.js +69 -0
- package/dist/platforms/azure/index.js.map +1 -0
- package/dist/platforms/azure/install.js +917 -0
- package/dist/platforms/azure/install.js.map +1 -0
- package/dist/platforms/azure/policy-types.js +70 -0
- package/dist/platforms/azure/policy-types.js.map +1 -0
- package/dist/platforms/azure/verify.js +309 -0
- package/dist/platforms/azure/verify.js.map +1 -0
- package/dist/platforms/detect.js +40 -0
- package/dist/platforms/detect.js.map +1 -0
- package/dist/platforms/github/client.js +49 -0
- package/dist/platforms/github/client.js.map +1 -0
- package/dist/platforms/github/index.js +54 -0
- package/dist/platforms/github/index.js.map +1 -0
- package/dist/platforms/github/install.js +558 -0
- package/dist/platforms/github/install.js.map +1 -0
- package/dist/platforms/github/push.js +102 -0
- package/dist/platforms/github/push.js.map +1 -0
- package/dist/platforms/github/remote.js +36 -0
- package/dist/platforms/github/remote.js.map +1 -0
- package/dist/platforms/github/verify.js +366 -0
- package/dist/platforms/github/verify.js.map +1 -0
- package/dist/platforms/http.js +58 -0
- package/dist/platforms/http.js.map +1 -0
- package/dist/platforms/pull-request-templates.js +157 -0
- package/dist/platforms/pull-request-templates.js.map +1 -0
- package/dist/platforms/remote.js +21 -0
- package/dist/platforms/remote.js.map +1 -0
- package/dist/platforms/resolve.js +69 -0
- package/dist/platforms/resolve.js.map +1 -0
- package/dist/platforms/shape.js +19 -0
- package/dist/platforms/shape.js.map +1 -0
- package/dist/platforms/types.js +24 -0
- package/dist/platforms/types.js.map +1 -0
- package/dist/policy/checks.js +91 -0
- package/dist/policy/checks.js.map +1 -0
- package/dist/policy/diff.js +50 -0
- package/dist/policy/diff.js.map +1 -0
- package/dist/registry/discover.js +74 -0
- package/dist/registry/discover.js.map +1 -0
- package/dist/registry/serialize.js +41 -0
- package/dist/registry/serialize.js.map +1 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/remove/host.js +294 -0
- package/dist/remove/host.js.map +1 -0
- package/dist/render/commands.js +139 -0
- package/dist/render/commands.js.map +1 -0
- package/dist/render/manifest.js +82 -0
- package/dist/render/manifest.js.map +1 -0
- package/dist/render/markers.js +166 -0
- package/dist/render/markers.js.map +1 -0
- package/dist/render/profile.js +23 -0
- package/dist/render/profile.js.map +1 -0
- package/dist/render/standards.js +169 -0
- package/dist/render/standards.js.map +1 -0
- package/dist/render/vendors.js +199 -0
- package/dist/render/vendors.js.map +1 -0
- package/dist/review/engines/api.js +95 -0
- package/dist/review/engines/api.js.map +1 -0
- package/dist/review/engines/embedded.js +20 -0
- package/dist/review/engines/embedded.js.map +1 -0
- package/dist/review/engines/types.js +2 -0
- package/dist/review/engines/types.js.map +1 -0
- package/dist/review/glob.js +29 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/prompt.js +45 -0
- package/dist/review/prompt.js.map +1 -0
- package/dist/review/rules.js +25 -0
- package/dist/review/rules.js.map +1 -0
- package/dist/review/schema.js +84 -0
- package/dist/review/schema.js.map +1 -0
- package/dist/review/scope.js +27 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/sarif/map.js +58 -0
- package/dist/sarif/map.js.map +1 -0
- package/dist/sarif/parse.js +88 -0
- package/dist/sarif/parse.js.map +1 -0
- package/dist/sarif/types.js +2 -0
- package/dist/sarif/types.js.map +1 -0
- package/dist/sync/host.js +21 -0
- package/dist/sync/host.js.map +1 -0
- package/dist/sync/plan.js +47 -0
- package/dist/sync/plan.js.map +1 -0
- package/dist/sync/render.js +57 -0
- package/dist/sync/render.js.map +1 -0
- package/dist/sync/run.js +118 -0
- package/dist/sync/run.js.map +1 -0
- package/dist/verify/host.js +52 -0
- package/dist/verify/host.js.map +1 -0
- package/dist/verify/remote.js +146 -0
- package/dist/verify/remote.js.map +1 -0
- package/package.json +52 -0
- package/platforms/azure/gate-template.yml +105 -0
- package/rulesets/redline-org-ruleset.json +46 -0
- package/rulesets/redline-ruleset.json +49 -0
- package/scripts/assign-rule-ids.mjs +129 -0
- package/scripts/build-baseline.mjs +124 -0
- package/scripts/build-correlation.mjs +74 -0
- package/scripts/build-dashboard.mjs +584 -0
- package/scripts/build-digest.mjs +164 -0
- package/scripts/build-inbox.mjs +133 -0
- package/scripts/build-registry.mjs +42 -0
- package/scripts/build-roi.mjs +181 -0
- package/scripts/check-pins.mjs +88 -0
- package/scripts/collect-telemetry.mjs +300 -0
- package/scripts/lib/__tests__/baseline.test.mjs +132 -0
- package/scripts/lib/__tests__/correlate.test.mjs +131 -0
- package/scripts/lib/__tests__/dora.test.mjs +110 -0
- package/scripts/lib/__tests__/exemptions.test.mjs +85 -0
- package/scripts/lib/__tests__/metrics-scanner.test.mjs +65 -0
- package/scripts/lib/__tests__/sarif.test.mjs +125 -0
- package/scripts/lib/__tests__/spend.test.mjs +64 -0
- package/scripts/lib/baseline.mjs +156 -0
- package/scripts/lib/correlate.mjs +125 -0
- package/scripts/lib/dora.mjs +133 -0
- package/scripts/lib/exemptions.mjs +79 -0
- package/scripts/lib/metrics.mjs +172 -0
- package/scripts/lib/rules.mjs +107 -0
- package/scripts/lib/sarif.mjs +108 -0
- package/scripts/lib/spend.mjs +69 -0
- package/scripts/measure-context.mjs +101 -0
- package/scripts/render-self.mjs +18 -0
- package/scripts/score-seeds.mjs +294 -0
- package/scripts/validate.mjs +394 -0
- package/standards/core.md +124 -0
- package/standards/manifest.json +214 -0
- package/standards/stacks/csharp.md +29 -0
- package/standards/stacks/go.md +30 -0
- package/standards/stacks/java.md +30 -0
- package/standards/stacks/javascript.md +42 -0
- package/standards/stacks/kotlin.md +27 -0
- package/standards/stacks/microservices.md +37 -0
- package/standards/stacks/nodejs.md +34 -0
- package/standards/stacks/python.md +29 -0
- package/standards/stacks/react-native.md +29 -0
- package/standards/stacks/react.md +46 -0
- package/standards/stacks/swift.md +26 -0
- package/standards/stacks/terraform.md +27 -0
- package/templates/CODEOWNERS +29 -0
- package/templates/azure/pull_request_template.md +72 -0
- package/templates/github/pull_request_template.md +72 -0
- package/templates/redline.yml +35 -0
- package/templates/repo-context.md +64 -0
- package/workflows/dashboard.yml +119 -0
- package/workflows/inbox.yml +97 -0
- package/workflows/redline-collect.yml +61 -0
- package/workflows/redline-gate.yml +301 -0
- package/workflows/redline-sync.yml +79 -0
- package/workflows/seed-canary.yml +231 -0
- package/workflows/verify-onboarding.yml +115 -0
- package/workflows/weekly-digest.yml +78 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { RedlineError } from "../../core/errors.js";
|
|
3
|
+
import { createHttp } from "../http.js";
|
|
4
|
+
export const DEFAULT_API_VERSION = '7.1';
|
|
5
|
+
const AZURE_DEVOPS_RESOURCE = '499b84ac-1321-427f-aa17-267ca6975798';
|
|
6
|
+
const readAzTokenFromCli = () => {
|
|
7
|
+
const raw = execFileSync('az', ['account', 'get-access-token', '--resource', AZURE_DEVOPS_RESOURCE, '--query', 'accessToken', '-o', 'tsv'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
8
|
+
return raw.trim();
|
|
9
|
+
};
|
|
10
|
+
export function resolveAzureCredential(env, readAzToken = readAzTokenFromCli) {
|
|
11
|
+
const pat = env['AZURE_DEVOPS_EXT_PAT'];
|
|
12
|
+
if (pat)
|
|
13
|
+
return { scheme: 'Basic', value: Buffer.from(`:${pat}`, 'utf8').toString('base64') };
|
|
14
|
+
const system = env['SYSTEM_ACCESSTOKEN'];
|
|
15
|
+
if (system)
|
|
16
|
+
return { scheme: 'Bearer', value: system };
|
|
17
|
+
try {
|
|
18
|
+
const token = readAzToken();
|
|
19
|
+
if (token)
|
|
20
|
+
return { scheme: 'Bearer', value: token };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// The az CLI's own error (missing binary, not logged in, etc.) is never
|
|
24
|
+
// surfaced here — it could carry account or environment details. Fall
|
|
25
|
+
// through to the generic, actionable error below.
|
|
26
|
+
}
|
|
27
|
+
throw new RedlineError('permission', 'no Azure DevOps credentials found — set AZURE_DEVOPS_EXT_PAT, or run: az login', 'set AZURE_DEVOPS_EXT_PAT, or run: az login');
|
|
28
|
+
}
|
|
29
|
+
export function createAzureClient(org, opts = {}) {
|
|
30
|
+
const env = opts.env ?? process.env;
|
|
31
|
+
const credential = opts.credential ?? resolveAzureCredential(env);
|
|
32
|
+
const headers = {
|
|
33
|
+
authorization: `${credential.scheme} ${credential.value}`,
|
|
34
|
+
accept: 'application/json',
|
|
35
|
+
'user-agent': 'redlinegate',
|
|
36
|
+
};
|
|
37
|
+
const httpOptions = {
|
|
38
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
39
|
+
...(opts.sleep ? { sleep: opts.sleep } : {}),
|
|
40
|
+
};
|
|
41
|
+
const hosts = {
|
|
42
|
+
core: createHttp(`https://dev.azure.com/${org}`, headers, httpOptions),
|
|
43
|
+
advsec: createHttp(`https://advsec.dev.azure.com/${org}`, headers, httpOptions),
|
|
44
|
+
};
|
|
45
|
+
return {
|
|
46
|
+
request(method, path, body, requestOpts = {}) {
|
|
47
|
+
const version = requestOpts.apiVersion ?? DEFAULT_API_VERSION;
|
|
48
|
+
const separator = path.includes('?') ? '&' : '?';
|
|
49
|
+
return hosts[requestOpts.host ?? 'core'].request(method, `${path}${separator}api-version=${version}`, body);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../cli/platforms/azure/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { RedlineError } from "../../core/errors.js";
|
|
2
|
+
import { createGit } from "../../core/git.js";
|
|
3
|
+
import { parseRemote } from "../detect.js";
|
|
4
|
+
import { isNonNullObject } from "../shape.js";
|
|
5
|
+
import { createAzureInstall } from "./install.js";
|
|
6
|
+
import { createAzureVerify } from "./verify.js";
|
|
7
|
+
export function createAzurePlatform(opts) {
|
|
8
|
+
const gitFor = opts.gitFor ?? ((cwd) => createGit(cwd));
|
|
9
|
+
const install = createAzureInstall(opts.client, gitFor);
|
|
10
|
+
const verify = createAzureVerify(opts.client);
|
|
11
|
+
return {
|
|
12
|
+
host: 'azure',
|
|
13
|
+
// `git.defaultBranch()` falls back to the literal 'main' when
|
|
14
|
+
// refs/remotes/origin/HEAD is not set (a shallow or freshly-created
|
|
15
|
+
// clone), so the branch below is a guess, not a fact. Nothing on the
|
|
16
|
+
// dry-run path reads it today; anything added that does must resolve it
|
|
17
|
+
// properly or report that it could not, rather than inherit the fiction.
|
|
18
|
+
localRef(cwd) {
|
|
19
|
+
const git = gitFor(cwd);
|
|
20
|
+
const identity = parseRemote(git.remoteUrl());
|
|
21
|
+
if (!identity.project) {
|
|
22
|
+
throw new RedlineError('usage', 'could not read the Azure DevOps project from the git remote');
|
|
23
|
+
}
|
|
24
|
+
// No repoId: it only exists on the host. Nothing that writes may be
|
|
25
|
+
// handed this ref — see Platform.localRef.
|
|
26
|
+
return {
|
|
27
|
+
host: 'azure',
|
|
28
|
+
org: identity.org,
|
|
29
|
+
project: identity.project,
|
|
30
|
+
repo: identity.repo,
|
|
31
|
+
defaultBranch: git.defaultBranch(),
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
async repoRef(cwd) {
|
|
35
|
+
const identity = parseRemote(gitFor(cwd).remoteUrl());
|
|
36
|
+
if (!identity.project) {
|
|
37
|
+
throw new RedlineError('usage', 'could not read the Azure DevOps project from the git remote');
|
|
38
|
+
}
|
|
39
|
+
const path = `/${identity.project}/_apis/git/repositories/${identity.repo}`;
|
|
40
|
+
const repo = await opts.client.request('GET', path);
|
|
41
|
+
if (repo.status === 401 || repo.status === 403) {
|
|
42
|
+
// Same decision as the GitHub adapter: a token-scope failure exits 3,
|
|
43
|
+
// a host failure exits 4.
|
|
44
|
+
throw new RedlineError('permission', `Azure DevOps returned HTTP ${repo.status} reading ${path}`, 'check the AZURE_DEVOPS_EXT_PAT scopes, or run: az login');
|
|
45
|
+
}
|
|
46
|
+
if (repo.status < 200 || repo.status >= 300) {
|
|
47
|
+
throw new RedlineError('host', `Azure DevOps returned HTTP ${repo.status} reading ${path}`);
|
|
48
|
+
}
|
|
49
|
+
if (!isNonNullObject(repo.body) || typeof repo.body['id'] !== 'string') {
|
|
50
|
+
throw new RedlineError('host', `Azure DevOps returned an unexpected shape for ${path}`);
|
|
51
|
+
}
|
|
52
|
+
const defaultBranch = repo.body['defaultBranch'];
|
|
53
|
+
if (defaultBranch !== undefined && typeof defaultBranch !== 'string') {
|
|
54
|
+
throw new RedlineError('host', `Azure DevOps returned an unexpected shape for ${path}`);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
host: 'azure',
|
|
58
|
+
org: identity.org,
|
|
59
|
+
project: identity.project,
|
|
60
|
+
repo: identity.repo,
|
|
61
|
+
repoId: repo.body['id'],
|
|
62
|
+
defaultBranch: (defaultBranch ?? 'refs/heads/main').replace('refs/heads/', ''),
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
...install,
|
|
66
|
+
...verify,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../cli/platforms/azure/index.ts"],"names":[],"mappings":"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"}
|