@metasession.co/devaudit-cli 0.3.12 → 0.3.13
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/dist/index.js +53 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/scripts/upload-evidence.sh +55 -1
- package/sdlc/files/_common/0-project-setup.md +10 -4
- package/sdlc/files/_common/Periodic_Security_Review_Schedule.md +5 -5
- package/sdlc/files/_common/README_TEMPLATE.md +8 -8
- package/sdlc/files/_common/Test_Architecture.md +15 -15
- package/sdlc/files/_common/Test_Plan_TEMPLATE.md +13 -13
- package/sdlc/files/_common/Test_Policy.md +2 -2
- package/sdlc/files/_common/Test_Strategy.md +10 -10
- package/sdlc/files/_common/governance/ai-disclosure.md.template +3 -3
- package/sdlc/files/_common/governance/dpia.md.template +3 -3
- package/sdlc/files/_common/governance/incident-report.md.template +3 -3
- package/sdlc/files/_common/governance/nil-incident-report.md.template +1 -1
- package/sdlc/files/_common/governance/periodic-review.md.template +3 -3
- package/sdlc/files/_common/governance/risk-register.md.template +1 -1
- package/sdlc/files/_common/governance/ropa.md.template +2 -2
- package/sdlc/files/_common/joining-an-existing-project.md +4 -4
- package/sdlc/files/_common/scripts/check-host-deployment.sh +107 -0
- package/sdlc/files/_common/scripts/check-host-deployment.test.sh +119 -0
- package/sdlc/files/_common/scripts/check-release-pr-scope.sh +95 -0
- package/sdlc/files/_common/scripts/check-release-pr-scope.test.sh +137 -0
- package/sdlc/files/_common/scripts/close-out-release.sh +175 -54
- package/sdlc/files/_common/scripts/close-out-release.test.sh +90 -0
- package/sdlc/files/_common/scripts/extract-release-metadata.sh +27 -0
- package/sdlc/files/_common/scripts/extract-release-metadata.test.sh +13 -1
- package/sdlc/files/_common/scripts/generate-bundled-changes.sh +302 -64
- package/sdlc/files/_common/scripts/generate-bundled-changes.test.sh +128 -82
- package/sdlc/files/_common/scripts/generate-housekeeping-release-ticket.sh +18 -9
- package/sdlc/files/_common/scripts/generate-housekeeping-release-ticket.test.sh +66 -0
- package/sdlc/files/_common/scripts/generate-security-summary.sh +14 -5
- package/sdlc/files/_common/scripts/generate-security-summary.test.sh +57 -0
- package/sdlc/files/_common/scripts/prepare-release-pr.sh +44 -4
- package/sdlc/files/_common/scripts/render-test-cycles.sh +227 -0
- package/sdlc/files/_common/scripts/render-test-cycles.test.sh +107 -0
- package/sdlc/files/_common/scripts/report-test-cycle.sh +344 -0
- package/sdlc/files/_common/scripts/submit-bundle-manifest.sh +100 -0
- package/sdlc/files/_common/scripts/submit-bundle-manifest.test.sh +138 -0
- package/sdlc/files/_common/scripts/upload-evidence.sh +24 -0
- package/sdlc/files/_common/scripts/validate-compliance-artifacts.sh +16 -0
- package/sdlc/files/_common/scripts/validate-compliance-artifacts.test.sh +14 -0
- package/sdlc/files/_common/scripts/validate-test-summary.test.sh +4 -4
- package/sdlc/files/_common/skills/adr-author/SKILL.md +2 -2
- package/sdlc/files/_common/skills/e2e-test-engineer/SKILL.md +2 -2
- package/sdlc/files/_common/skills/e2e-test-engineer/references/bootstrap.md +5 -5
- package/sdlc/files/_common/skills/governance-doc-author/references/incident-classification.md +1 -1
- package/sdlc/files/_common/skills/requirements-aligner/SKILL.md +4 -4
- package/sdlc/files/_common/skills/sdlc-implementer/SKILL.md +21 -2
- package/sdlc/files/_common/skills/sdlc-implementer/references/change-request-loop.md +1 -1
- package/sdlc/files/_common/skills/sdlc-implementer/references/compliance-constraints.md +7 -14
- package/sdlc/files/ci/ci.yml.template +82 -28
- package/sdlc/files/ci/close-out-release.yml.template +7 -4
- package/sdlc/files/ci/compliance-evidence.yml.template +204 -20
- package/sdlc/files/ci/feature-e2e.yml.template +84 -1
- package/sdlc/files/ci/post-deploy-prod.yml.template +59 -4
- package/sdlc/files/ci/python/ci.yml.template +60 -12
- package/sdlc/files/ci/quality-gates-provenance.yml.template +123 -28
- package/sdlc/package.json +1 -1
- package/sdlc/src/bin/devaudit-sdlc.js +44 -2
- package/sdlc/src/blueprints/1-plan-requirement.raw.md +6 -1
- package/sdlc/src/blueprints/2-implement-and-test.raw.md +1 -1
- package/sdlc/src/blueprints/3-compile-evidence.raw.md +34 -20
- package/sdlc/src/blueprints/4-submit-for-review.raw.md +2 -2
- package/sdlc/src/blueprints/5-deploy-main.raw.md +2 -2
package/dist/index.js
CHANGED
|
@@ -56,7 +56,7 @@ function emitJsonResult(payload) {
|
|
|
56
56
|
|
|
57
57
|
// package.json
|
|
58
58
|
var package_default = {
|
|
59
|
-
version: "0.3.
|
|
59
|
+
version: "0.3.13"};
|
|
60
60
|
|
|
61
61
|
// src/lib/version.ts
|
|
62
62
|
var CLI_VERSION = package_default.version;
|
|
@@ -595,6 +595,23 @@ async function runStatus(options) {
|
|
|
595
595
|
log.warn(`${missingFiles.length} framework file(s) missing. Re-sync with \`devaudit update <version> <path>\` to refresh.`);
|
|
596
596
|
}
|
|
597
597
|
}
|
|
598
|
+
|
|
599
|
+
// src/lib/release-lineage-contract.ts
|
|
600
|
+
function renderEvidenceLineageFields(input, capabilities) {
|
|
601
|
+
if (input.testCycleRecordId && input.evidenceScope !== "cycle") {
|
|
602
|
+
throw new Error("testCycleRecordId requires cycle evidenceScope");
|
|
603
|
+
}
|
|
604
|
+
if (!capabilities.supportsFirstClassCycleApi) {
|
|
605
|
+
return input.testCycleId ? { testCycleId: input.testCycleId } : {};
|
|
606
|
+
}
|
|
607
|
+
return {
|
|
608
|
+
...input.evidenceScope ? { evidenceScope: input.evidenceScope } : {},
|
|
609
|
+
...input.testCycleRecordId ? { testCycleRecordId: input.testCycleRecordId } : {},
|
|
610
|
+
...input.testCycleId ? { testCycleId: input.testCycleId } : {}
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// src/lib/ci-upload.ts
|
|
598
615
|
var RETRYABLE_STATUSES = /* @__PURE__ */ new Set([429, 500, 502, 503, 504]);
|
|
599
616
|
var DEFAULT_MAX_ATTEMPTS = 5;
|
|
600
617
|
var DEFAULT_UPLOAD_MAX_TIME_SECONDS = 120;
|
|
@@ -689,6 +706,14 @@ function buildUploadForm(file, source, opts) {
|
|
|
689
706
|
...opts.metadata ?? {},
|
|
690
707
|
...opts.commitTimestamp ? { commitTimestamp: opts.commitTimestamp } : {}
|
|
691
708
|
};
|
|
709
|
+
const lineageFields = renderEvidenceLineageFields(
|
|
710
|
+
{
|
|
711
|
+
evidenceScope: opts.evidenceScope,
|
|
712
|
+
testCycleRecordId: opts.testCycleRecordId,
|
|
713
|
+
testCycleId: opts.testCycleId
|
|
714
|
+
},
|
|
715
|
+
opts.lineageCapabilities ?? { supportsFirstClassCycleApi: true }
|
|
716
|
+
);
|
|
692
717
|
const form = new FormData();
|
|
693
718
|
form.set("file", source.blob, basename(file));
|
|
694
719
|
form.set("projectSlug", opts.projectSlug);
|
|
@@ -705,7 +730,9 @@ function buildUploadForm(file, source, opts) {
|
|
|
705
730
|
if (opts.changeType) form.set("changeType", opts.changeType);
|
|
706
731
|
if (opts.gateStatus) form.set("gateStatus", opts.gateStatus);
|
|
707
732
|
if (opts.sdlcStage) form.set("sdlcStage", opts.sdlcStage);
|
|
708
|
-
if (
|
|
733
|
+
if (lineageFields.testCycleId) form.set("testCycleId", lineageFields.testCycleId);
|
|
734
|
+
if (lineageFields.evidenceScope) form.set("evidenceScope", lineageFields.evidenceScope);
|
|
735
|
+
if (lineageFields.testCycleRecordId) form.set("testCycleRecordId", lineageFields.testCycleRecordId);
|
|
709
736
|
if (opts.sentinelContent) form.set("sentinelContent", opts.sentinelContent);
|
|
710
737
|
if (opts.commitTimestamp) form.set("commitTimestamp", opts.commitTimestamp);
|
|
711
738
|
return form;
|
|
@@ -796,6 +823,14 @@ async function uploadPresigned(file, source, opts) {
|
|
|
796
823
|
...opts.metadata ?? {},
|
|
797
824
|
...opts.commitTimestamp ? { commitTimestamp: opts.commitTimestamp } : {}
|
|
798
825
|
};
|
|
826
|
+
const lineageFields = renderEvidenceLineageFields(
|
|
827
|
+
{
|
|
828
|
+
evidenceScope: opts.evidenceScope,
|
|
829
|
+
testCycleRecordId: opts.testCycleRecordId,
|
|
830
|
+
testCycleId: opts.testCycleId
|
|
831
|
+
},
|
|
832
|
+
opts.lineageCapabilities ?? { supportsFirstClassCycleApi: true }
|
|
833
|
+
);
|
|
799
834
|
let uploadUrl = "";
|
|
800
835
|
let evidenceId = "";
|
|
801
836
|
let attempt = 1;
|
|
@@ -828,7 +863,9 @@ async function uploadPresigned(file, source, opts) {
|
|
|
828
863
|
...opts.releaseSummary ? { releaseSummary: opts.releaseSummary } : {},
|
|
829
864
|
...opts.changeType ? { changeType: opts.changeType } : {},
|
|
830
865
|
...opts.sdlcStage ? { sdlcStage: opts.sdlcStage } : {},
|
|
831
|
-
...
|
|
866
|
+
...lineageFields.testCycleId ? { testCycleId: lineageFields.testCycleId } : {},
|
|
867
|
+
...lineageFields.evidenceScope ? { evidenceScope: lineageFields.evidenceScope } : {},
|
|
868
|
+
...lineageFields.testCycleRecordId ? { testCycleRecordId: lineageFields.testCycleRecordId } : {},
|
|
832
869
|
...opts.sentinelContent ? { sentinelContent: opts.sentinelContent } : {},
|
|
833
870
|
...opts.commitTimestamp ? { commitTimestamp: opts.commitTimestamp } : {}
|
|
834
871
|
}),
|
|
@@ -1020,6 +1057,12 @@ function validateOptions(options) {
|
|
|
1020
1057
|
for (const kv of options.metaKeys ?? []) {
|
|
1021
1058
|
if (!kv.includes("=")) return `--meta-key requires key=value (got: ${kv})`;
|
|
1022
1059
|
}
|
|
1060
|
+
if (options.evidenceScope !== void 0 && !["release", "stage", "cycle", "approval"].includes(options.evidenceScope)) {
|
|
1061
|
+
return "--evidence-scope must be one of: release, stage, cycle, approval";
|
|
1062
|
+
}
|
|
1063
|
+
if (options.testCycleRecordId && options.evidenceScope !== "cycle") {
|
|
1064
|
+
return "--test-cycle-record-id requires --evidence-scope cycle";
|
|
1065
|
+
}
|
|
1023
1066
|
return null;
|
|
1024
1067
|
}
|
|
1025
1068
|
async function runDryRun(options, baseUrl) {
|
|
@@ -1100,6 +1143,8 @@ async function runPush(options) {
|
|
|
1100
1143
|
...options.gateStatus !== void 0 ? { gateStatus: options.gateStatus } : {},
|
|
1101
1144
|
...options.sdlcStage !== void 0 ? { sdlcStage: options.sdlcStage } : {},
|
|
1102
1145
|
...options.testCycleId !== void 0 ? { testCycleId: options.testCycleId } : {},
|
|
1146
|
+
...options.evidenceScope !== void 0 ? { evidenceScope: options.evidenceScope } : {},
|
|
1147
|
+
...options.testCycleRecordId !== void 0 ? { testCycleRecordId: options.testCycleRecordId } : {},
|
|
1103
1148
|
...sentinelContent !== void 0 ? { sentinelContent } : {},
|
|
1104
1149
|
...commitTimestamp !== void 0 ? { commitTimestamp } : {},
|
|
1105
1150
|
metadata
|
|
@@ -2486,6 +2531,8 @@ async function syncCiTemplates(ctx) {
|
|
|
2486
2531
|
const tokens = {
|
|
2487
2532
|
PROJECT_SLUG: cfg.project_slug,
|
|
2488
2533
|
PRODUCTION_URL_SECRET: cfg.production_url_secret,
|
|
2534
|
+
INTEGRATION_BRANCH: cfg.integration_branch ?? "develop",
|
|
2535
|
+
RELEASE_BRANCH: cfg.release_branch ?? "main",
|
|
2489
2536
|
NODE_VERSION: String(cfg.node_version ?? ""),
|
|
2490
2537
|
PYTHON_VERSION: String(cfg.python_version ?? ""),
|
|
2491
2538
|
WORKING_DIRECTORY: workingDirectory || ".",
|
|
@@ -3427,7 +3474,7 @@ async function main(argv) {
|
|
|
3427
3474
|
...globals.dryRun !== void 0 ? { dryRun: Boolean(globals.dryRun) } : {}
|
|
3428
3475
|
});
|
|
3429
3476
|
});
|
|
3430
|
-
program.command("push <project-slug> <requirement-id> <evidence-type> <file>").description("Upload evidence file(s) to DevAudit (port of scripts/upload-evidence.sh)").option("--release <version>", "release version (e.g. v1.0.0)").option("--create-release-if-missing", "auto-create the release as 'draft' if absent").option("--environment <env>", "uat | production").option("--category <cat>", "ci_pipeline | local_dev | planning | test_report | security_scan | release_artifact").option("--git-sha <sha>", "attached to metadata.gitSha").option("--ci-run-id <id>", "attached to metadata.ciRunId").option("--branch <name>", "git branch \u2014 sent as releaseBranch + metadata.branch").option("--release-title <text>", "human title for the release row (releaseTitle; portal no-clobbers)").option("--release-summary <text>", "reviewer-facing short description (releaseSummary; portal no-clobbers)").option("--change-type <type>", "conventional-commit prefix for the release row (changeType)").option("--gate-status <status>", "passed | failed | skipped (gateStatus)").option("--sdlc-stage <stage>", "SDLC stage 1-5 (sdlcStage)").option("--test-cycle <id>", "test cycle identifier (typically the CI run ID)").option(
|
|
3477
|
+
program.command("push <project-slug> <requirement-id> <evidence-type> <file>").description("Upload evidence file(s) to DevAudit (port of scripts/upload-evidence.sh)").option("--release <version>", "release version (e.g. v1.0.0)").option("--create-release-if-missing", "auto-create the release as 'draft' if absent").option("--environment <env>", "uat | production").option("--category <cat>", "ci_pipeline | local_dev | planning | test_report | security_scan | release_artifact").option("--git-sha <sha>", "attached to metadata.gitSha").option("--ci-run-id <id>", "attached to metadata.ciRunId").option("--branch <name>", "git branch \u2014 sent as releaseBranch + metadata.branch").option("--release-title <text>", "human title for the release row (releaseTitle; portal no-clobbers)").option("--release-summary <text>", "reviewer-facing short description (releaseSummary; portal no-clobbers)").option("--change-type <type>", "conventional-commit prefix for the release row (changeType)").option("--gate-status <status>", "passed | failed | skipped (gateStatus)").option("--sdlc-stage <stage>", "SDLC stage 1-5 (sdlcStage)").option("--test-cycle <id>", "test cycle identifier (typically the CI run ID)").option("--evidence-scope <scope>", "release | stage | cycle | approval (evidenceScope)").option("--test-cycle-record-id <id>", "first-class portal cycle UUID (requires --evidence-scope cycle)").option(
|
|
3431
3478
|
"--meta-key <pair>",
|
|
3432
3479
|
"repeatable key=value merged into the metadata JSON",
|
|
3433
3480
|
(val, acc) => [...acc, val],
|
|
@@ -3453,6 +3500,8 @@ async function main(argv) {
|
|
|
3453
3500
|
...opts.gateStatus !== void 0 ? { gateStatus: opts.gateStatus } : {},
|
|
3454
3501
|
...opts.sdlcStage !== void 0 ? { sdlcStage: opts.sdlcStage } : {},
|
|
3455
3502
|
...opts.testCycle !== void 0 ? { testCycleId: opts.testCycle } : {},
|
|
3503
|
+
...opts.evidenceScope !== void 0 ? { evidenceScope: opts.evidenceScope } : {},
|
|
3504
|
+
...opts.testCycleRecordId !== void 0 ? { testCycleRecordId: opts.testCycleRecordId } : {},
|
|
3456
3505
|
...opts.metaKey !== void 0 && opts.metaKey.length > 0 ? { metaKeys: opts.metaKey } : {},
|
|
3457
3506
|
...opts.baseUrl !== void 0 ? { baseUrl: opts.baseUrl } : {},
|
|
3458
3507
|
...opts.apiKey !== void 0 ? { apiKey: opts.apiKey } : {},
|