@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.
Files changed (65) hide show
  1. package/dist/index.js +53 -4
  2. package/dist/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/scripts/upload-evidence.sh +55 -1
  5. package/sdlc/files/_common/0-project-setup.md +10 -4
  6. package/sdlc/files/_common/Periodic_Security_Review_Schedule.md +5 -5
  7. package/sdlc/files/_common/README_TEMPLATE.md +8 -8
  8. package/sdlc/files/_common/Test_Architecture.md +15 -15
  9. package/sdlc/files/_common/Test_Plan_TEMPLATE.md +13 -13
  10. package/sdlc/files/_common/Test_Policy.md +2 -2
  11. package/sdlc/files/_common/Test_Strategy.md +10 -10
  12. package/sdlc/files/_common/governance/ai-disclosure.md.template +3 -3
  13. package/sdlc/files/_common/governance/dpia.md.template +3 -3
  14. package/sdlc/files/_common/governance/incident-report.md.template +3 -3
  15. package/sdlc/files/_common/governance/nil-incident-report.md.template +1 -1
  16. package/sdlc/files/_common/governance/periodic-review.md.template +3 -3
  17. package/sdlc/files/_common/governance/risk-register.md.template +1 -1
  18. package/sdlc/files/_common/governance/ropa.md.template +2 -2
  19. package/sdlc/files/_common/joining-an-existing-project.md +4 -4
  20. package/sdlc/files/_common/scripts/check-host-deployment.sh +107 -0
  21. package/sdlc/files/_common/scripts/check-host-deployment.test.sh +119 -0
  22. package/sdlc/files/_common/scripts/check-release-pr-scope.sh +95 -0
  23. package/sdlc/files/_common/scripts/check-release-pr-scope.test.sh +137 -0
  24. package/sdlc/files/_common/scripts/close-out-release.sh +175 -54
  25. package/sdlc/files/_common/scripts/close-out-release.test.sh +90 -0
  26. package/sdlc/files/_common/scripts/extract-release-metadata.sh +27 -0
  27. package/sdlc/files/_common/scripts/extract-release-metadata.test.sh +13 -1
  28. package/sdlc/files/_common/scripts/generate-bundled-changes.sh +302 -64
  29. package/sdlc/files/_common/scripts/generate-bundled-changes.test.sh +128 -82
  30. package/sdlc/files/_common/scripts/generate-housekeeping-release-ticket.sh +18 -9
  31. package/sdlc/files/_common/scripts/generate-housekeeping-release-ticket.test.sh +66 -0
  32. package/sdlc/files/_common/scripts/generate-security-summary.sh +14 -5
  33. package/sdlc/files/_common/scripts/generate-security-summary.test.sh +57 -0
  34. package/sdlc/files/_common/scripts/prepare-release-pr.sh +44 -4
  35. package/sdlc/files/_common/scripts/render-test-cycles.sh +227 -0
  36. package/sdlc/files/_common/scripts/render-test-cycles.test.sh +107 -0
  37. package/sdlc/files/_common/scripts/report-test-cycle.sh +344 -0
  38. package/sdlc/files/_common/scripts/submit-bundle-manifest.sh +100 -0
  39. package/sdlc/files/_common/scripts/submit-bundle-manifest.test.sh +138 -0
  40. package/sdlc/files/_common/scripts/upload-evidence.sh +24 -0
  41. package/sdlc/files/_common/scripts/validate-compliance-artifacts.sh +16 -0
  42. package/sdlc/files/_common/scripts/validate-compliance-artifacts.test.sh +14 -0
  43. package/sdlc/files/_common/scripts/validate-test-summary.test.sh +4 -4
  44. package/sdlc/files/_common/skills/adr-author/SKILL.md +2 -2
  45. package/sdlc/files/_common/skills/e2e-test-engineer/SKILL.md +2 -2
  46. package/sdlc/files/_common/skills/e2e-test-engineer/references/bootstrap.md +5 -5
  47. package/sdlc/files/_common/skills/governance-doc-author/references/incident-classification.md +1 -1
  48. package/sdlc/files/_common/skills/requirements-aligner/SKILL.md +4 -4
  49. package/sdlc/files/_common/skills/sdlc-implementer/SKILL.md +21 -2
  50. package/sdlc/files/_common/skills/sdlc-implementer/references/change-request-loop.md +1 -1
  51. package/sdlc/files/_common/skills/sdlc-implementer/references/compliance-constraints.md +7 -14
  52. package/sdlc/files/ci/ci.yml.template +82 -28
  53. package/sdlc/files/ci/close-out-release.yml.template +7 -4
  54. package/sdlc/files/ci/compliance-evidence.yml.template +204 -20
  55. package/sdlc/files/ci/feature-e2e.yml.template +84 -1
  56. package/sdlc/files/ci/post-deploy-prod.yml.template +59 -4
  57. package/sdlc/files/ci/python/ci.yml.template +60 -12
  58. package/sdlc/files/ci/quality-gates-provenance.yml.template +123 -28
  59. package/sdlc/package.json +1 -1
  60. package/sdlc/src/bin/devaudit-sdlc.js +44 -2
  61. package/sdlc/src/blueprints/1-plan-requirement.raw.md +6 -1
  62. package/sdlc/src/blueprints/2-implement-and-test.raw.md +1 -1
  63. package/sdlc/src/blueprints/3-compile-evidence.raw.md +34 -20
  64. package/sdlc/src/blueprints/4-submit-for-review.raw.md +2 -2
  65. 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.12"};
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 (opts.testCycleId) form.set("testCycleId", opts.testCycleId);
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
- ...opts.testCycleId ? { testCycleId: opts.testCycleId } : {},
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 } : {},