compfn 0.1.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.
Files changed (134) hide show
  1. package/README.md +705 -0
  2. package/cli/dist/commands/attest.d.ts +7 -0
  3. package/cli/dist/commands/attest.d.ts.map +1 -0
  4. package/cli/dist/commands/attest.js +26 -0
  5. package/cli/dist/commands/attest.js.map +1 -0
  6. package/cli/dist/commands/export.d.ts +6 -0
  7. package/cli/dist/commands/export.d.ts.map +1 -0
  8. package/cli/dist/commands/export.js +30 -0
  9. package/cli/dist/commands/export.js.map +1 -0
  10. package/cli/dist/commands/init.d.ts +4 -0
  11. package/cli/dist/commands/init.d.ts.map +1 -0
  12. package/cli/dist/commands/init.js +22 -0
  13. package/cli/dist/commands/init.js.map +1 -0
  14. package/cli/dist/commands/run-checks.d.ts +5 -0
  15. package/cli/dist/commands/run-checks.d.ts.map +1 -0
  16. package/cli/dist/commands/run-checks.js +53 -0
  17. package/cli/dist/commands/run-checks.js.map +1 -0
  18. package/cli/dist/config.d.ts +7 -0
  19. package/cli/dist/config.d.ts.map +1 -0
  20. package/cli/dist/config.js +28 -0
  21. package/cli/dist/config.js.map +1 -0
  22. package/cli/dist/index.d.ts +3 -0
  23. package/cli/dist/index.d.ts.map +1 -0
  24. package/cli/dist/index.js +39 -0
  25. package/cli/dist/index.js.map +1 -0
  26. package/dist/adapters/authfn.d.ts +43 -0
  27. package/dist/adapters/authfn.d.ts.map +1 -0
  28. package/dist/adapters/authfn.js +67 -0
  29. package/dist/adapters/authfn.js.map +1 -0
  30. package/dist/adapters/secfn.d.ts +44 -0
  31. package/dist/adapters/secfn.d.ts.map +1 -0
  32. package/dist/adapters/secfn.js +68 -0
  33. package/dist/adapters/secfn.js.map +1 -0
  34. package/dist/adapters/types.d.ts +46 -0
  35. package/dist/adapters/types.d.ts.map +1 -0
  36. package/dist/adapters/types.js +7 -0
  37. package/dist/adapters/types.js.map +1 -0
  38. package/dist/api.d.ts +72 -0
  39. package/dist/api.d.ts.map +1 -0
  40. package/dist/api.js +5 -0
  41. package/dist/api.js.map +1 -0
  42. package/dist/bundles/loader.d.ts +39 -0
  43. package/dist/bundles/loader.d.ts.map +1 -0
  44. package/dist/bundles/loader.js +80 -0
  45. package/dist/bundles/loader.js.map +1 -0
  46. package/dist/check.d.ts +23 -0
  47. package/dist/check.d.ts.map +1 -0
  48. package/dist/check.js +5 -0
  49. package/dist/check.js.map +1 -0
  50. package/dist/checks/service.d.ts +31 -0
  51. package/dist/checks/service.d.ts.map +1 -0
  52. package/dist/checks/service.js +286 -0
  53. package/dist/checks/service.js.map +1 -0
  54. package/dist/compfn.d.ts +9 -0
  55. package/dist/compfn.d.ts.map +1 -0
  56. package/dist/compfn.js +94 -0
  57. package/dist/compfn.js.map +1 -0
  58. package/dist/constants.d.ts +14 -0
  59. package/dist/constants.d.ts.map +1 -0
  60. package/dist/constants.js +14 -0
  61. package/dist/constants.js.map +1 -0
  62. package/dist/control.d.ts +25 -0
  63. package/dist/control.d.ts.map +1 -0
  64. package/dist/control.js +5 -0
  65. package/dist/control.js.map +1 -0
  66. package/dist/controls/service.d.ts +22 -0
  67. package/dist/controls/service.d.ts.map +1 -0
  68. package/dist/controls/service.js +248 -0
  69. package/dist/controls/service.js.map +1 -0
  70. package/dist/errors.d.ts +23 -0
  71. package/dist/errors.d.ts.map +1 -0
  72. package/dist/errors.js +5 -0
  73. package/dist/errors.js.map +1 -0
  74. package/dist/evidence/service.d.ts +34 -0
  75. package/dist/evidence/service.d.ts.map +1 -0
  76. package/dist/evidence/service.js +218 -0
  77. package/dist/evidence/service.js.map +1 -0
  78. package/dist/evidence.d.ts +30 -0
  79. package/dist/evidence.d.ts.map +1 -0
  80. package/dist/evidence.js +20 -0
  81. package/dist/evidence.js.map +1 -0
  82. package/dist/export/service.d.ts +39 -0
  83. package/dist/export/service.d.ts.map +1 -0
  84. package/dist/export/service.js +108 -0
  85. package/dist/export/service.js.map +1 -0
  86. package/dist/export-types.d.ts +18 -0
  87. package/dist/export-types.d.ts.map +1 -0
  88. package/dist/export-types.js +5 -0
  89. package/dist/export-types.js.map +1 -0
  90. package/dist/framework.d.ts +24 -0
  91. package/dist/framework.d.ts.map +1 -0
  92. package/dist/framework.js +5 -0
  93. package/dist/framework.js.map +1 -0
  94. package/dist/frameworks/service.d.ts +22 -0
  95. package/dist/frameworks/service.d.ts.map +1 -0
  96. package/dist/frameworks/service.js +255 -0
  97. package/dist/frameworks/service.js.map +1 -0
  98. package/dist/http/routes.d.ts +4 -0
  99. package/dist/http/routes.d.ts.map +1 -0
  100. package/dist/http/routes.js +256 -0
  101. package/dist/http/routes.js.map +1 -0
  102. package/dist/index.d.ts +22 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +15 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/logger.d.ts +19 -0
  107. package/dist/logger.d.ts.map +1 -0
  108. package/dist/logger.js +39 -0
  109. package/dist/logger.js.map +1 -0
  110. package/dist/readiness/service.d.ts +34 -0
  111. package/dist/readiness/service.d.ts.map +1 -0
  112. package/dist/readiness/service.js +160 -0
  113. package/dist/readiness/service.js.map +1 -0
  114. package/dist/readiness.d.ts +18 -0
  115. package/dist/readiness.d.ts.map +1 -0
  116. package/dist/readiness.js +5 -0
  117. package/dist/readiness.js.map +1 -0
  118. package/dist/storage/adapter.d.ts +21 -0
  119. package/dist/storage/adapter.d.ts.map +1 -0
  120. package/dist/storage/adapter.js +37 -0
  121. package/dist/storage/adapter.js.map +1 -0
  122. package/dist/storage/schema.d.ts +14 -0
  123. package/dist/storage/schema.d.ts.map +1 -0
  124. package/dist/storage/schema.js +92 -0
  125. package/dist/storage/schema.js.map +1 -0
  126. package/dist/types.d.ts +12 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +5 -0
  129. package/dist/types.js.map +1 -0
  130. package/dist/validation.d.ts +52 -0
  131. package/dist/validation.d.ts.map +1 -0
  132. package/dist/validation.js +550 -0
  133. package/dist/validation.js.map +1 -0
  134. package/package.json +54 -0
@@ -0,0 +1,26 @@
1
+ import { loadConfig } from "../config.js";
2
+ import { compFn } from "@superfunctions/compfn";
3
+ export async function attestCommand(options) {
4
+ try {
5
+ const config = await loadConfig(options.config);
6
+ const api = compFn(config);
7
+ const outcome = options.outcome ?? "pass";
8
+ const evidenceResult = await api.evidence.create({
9
+ controlId: options.controlId,
10
+ type: "manual_attestation",
11
+ actorId: options.actorId,
12
+ outcome,
13
+ });
14
+ if (!evidenceResult.ok) {
15
+ console.error(`Error creating attestation: ${evidenceResult.error.message}`);
16
+ process.exit(1);
17
+ }
18
+ console.log(`Attestation created: ${evidenceResult.result.id}`);
19
+ process.exit(0);
20
+ }
21
+ catch (error) {
22
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ //# sourceMappingURL=attest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attest.js","sourceRoot":"","sources":["../../src/commands/attest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAKnC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;QAE1C,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,+BAA+B,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function exportCommand(options: {
2
+ frameworkId?: string;
3
+ output?: string;
4
+ config?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BhB"}
@@ -0,0 +1,30 @@
1
+ import { writeFileSync } from "fs";
2
+ import { loadConfig } from "../config.js";
3
+ import { compFn } from "@superfunctions/compfn";
4
+ export async function exportCommand(options) {
5
+ try {
6
+ const config = await loadConfig(options.config);
7
+ const api = compFn(config);
8
+ const exportResult = await api.export.auditorPack({
9
+ frameworkId: options.frameworkId,
10
+ });
11
+ if (!exportResult.ok) {
12
+ console.error(`Error exporting auditor pack: ${exportResult.error.message}`);
13
+ process.exit(1);
14
+ }
15
+ const json = JSON.stringify(exportResult.result, null, 2);
16
+ if (options.output) {
17
+ writeFileSync(options.output, json, "utf-8");
18
+ console.log(`Auditor pack exported to ${options.output}`);
19
+ }
20
+ else {
21
+ console.log(json);
22
+ }
23
+ process.exit(0);
24
+ }
25
+ catch (error) {
26
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
27
+ process.exit(1);
28
+ }
29
+ }
30
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAInC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;YAChD,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,iCAAiC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function initCommand(options: {
2
+ config?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB7E"}
@@ -0,0 +1,22 @@
1
+ import { loadConfig } from "../config.js";
2
+ import { createSchemaIfSupported } from "@superfunctions/compfn";
3
+ export async function initCommand(options) {
4
+ try {
5
+ const config = await loadConfig(options.config);
6
+ const result = await createSchemaIfSupported(config.database, {
7
+ namespace: config.namespace,
8
+ });
9
+ if (!result.success) {
10
+ console.error("Schema creation/migration failed:");
11
+ result.errors?.forEach((err) => console.error(` - ${err}`));
12
+ process.exit(1);
13
+ }
14
+ console.log("CompFn initialized successfully.");
15
+ process.exit(0);
16
+ }
17
+ catch (error) {
18
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
19
+ process.exit(1);
20
+ }
21
+ }
22
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAU,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC5D,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function runChecksCommand(options: {
2
+ checkId?: string;
3
+ config?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=run-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-checks.d.ts","sourceRoot":"","sources":["../../src/commands/run-checks.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDpG"}
@@ -0,0 +1,53 @@
1
+ import { loadConfig } from "../config.js";
2
+ import { compFn } from "@superfunctions/compfn";
3
+ export async function runChecksCommand(options) {
4
+ try {
5
+ const config = await loadConfig(options.config);
6
+ const api = compFn(config);
7
+ let checksToRun = [];
8
+ if (options.checkId) {
9
+ checksToRun = [options.checkId];
10
+ }
11
+ else {
12
+ const listResult = await api.checks.list();
13
+ if (!listResult.ok) {
14
+ console.error(`Error listing checks: ${listResult.error.message}`);
15
+ process.exit(1);
16
+ }
17
+ checksToRun = listResult.result.map((check) => check.id);
18
+ }
19
+ if (checksToRun.length === 0) {
20
+ console.log("No checks to run.");
21
+ process.exit(0);
22
+ }
23
+ let passCount = 0;
24
+ let failCount = 0;
25
+ let unknownCount = 0;
26
+ for (const checkId of checksToRun) {
27
+ const runResult = await api.checks.run(checkId);
28
+ if (!runResult.ok) {
29
+ console.error(`Error running check ${checkId}: ${runResult.error.message}`);
30
+ failCount++;
31
+ continue;
32
+ }
33
+ const outcome = runResult.result.outcome;
34
+ if (outcome === "pass") {
35
+ passCount++;
36
+ }
37
+ else if (outcome === "fail") {
38
+ failCount++;
39
+ }
40
+ else {
41
+ unknownCount++;
42
+ }
43
+ }
44
+ const total = checksToRun.length;
45
+ console.log(`Ran ${total} check${total !== 1 ? "s" : ""}: ${passCount} pass, ${failCount} fail${unknownCount > 0 ? `, ${unknownCount} unknown` : ""}`);
46
+ process.exit(0);
47
+ }
48
+ catch (error) {
49
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
50
+ process.exit(1);
51
+ }
52
+ }
53
+ //# sourceMappingURL=run-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-checks.js","sourceRoot":"","sources":["../../src/commands/run-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA8C;IACnF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,WAAW,GAAa,EAAE,CAAC;QAE/B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,WAAW,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,yBAAyB,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,uBAAuB,OAAO,KAAK,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC5E,SAAS,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YACzC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACvB,SAAS,EAAE,CAAC;YACd,CAAC;iBAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC9B,SAAS,EAAE,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,UAAU,SAAS,QAAQ,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Adapter } from "@superfunctions/db";
2
+ import type { CompFnConfig } from "@superfunctions/compfn";
3
+ export interface CliConfig extends Omit<CompFnConfig, 'database'> {
4
+ database: Adapter;
5
+ }
6
+ export declare function loadConfig(configPath?: string): Promise<CliConfig>;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;IAC/D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA2BxE"}
@@ -0,0 +1,28 @@
1
+ import { readFileSync } from "fs";
2
+ import { resolve } from "path";
3
+ export async function loadConfig(configPath) {
4
+ const path = configPath ?? process.env.COMPFN_CONFIG ?? "compfn.config.json";
5
+ const resolvedPath = resolve(path);
6
+ const content = readFileSync(resolvedPath, "utf-8");
7
+ const parsed = JSON.parse(content);
8
+ const databaseType = parsed.database?.type ?? "memory";
9
+ let database;
10
+ if (databaseType === "memory") {
11
+ const { memoryAdapter } = await import("@superfunctions/db/adapters");
12
+ database = memoryAdapter({});
13
+ }
14
+ else {
15
+ throw new Error(`Unsupported database type: ${databaseType}. Please implement adapter loading for ${databaseType}`);
16
+ }
17
+ return {
18
+ database,
19
+ namespace: parsed.namespace,
20
+ systemActorId: parsed.systemActorId,
21
+ readinessWindowDays: parsed.readinessWindowDays,
22
+ evidencePayloadMaxBytes: parsed.evidencePayloadMaxBytes,
23
+ retentionDays: parsed.retentionDays,
24
+ exportMaxBytes: parsed.exportMaxBytes,
25
+ adapters: parsed.adapters,
26
+ };
27
+ }
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAQ/B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB;IAClD,MAAM,IAAI,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,oBAAoB,CAAC;IAC7E,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC;IAEvD,IAAI,QAAiB,CAAC;IACtB,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACtE,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,0CAA0C,YAAY,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;QACvD,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { initCommand } from "./commands/init.js";
4
+ import { runChecksCommand } from "./commands/run-checks.js";
5
+ import { exportCommand } from "./commands/export.js";
6
+ import { attestCommand } from "./commands/attest.js";
7
+ const program = new Command();
8
+ program
9
+ .name("compfn")
10
+ .description("CompFn CLI: compliance automation tool")
11
+ .version("0.1.0");
12
+ program
13
+ .command("init")
14
+ .description("Initialize config and DB schema")
15
+ .option("-c, --config <path>", "Path to config file")
16
+ .action(initCommand);
17
+ program
18
+ .command("run-checks")
19
+ .description("Run checks (all or one)")
20
+ .option("--check-id <id>", "Run a specific check by ID")
21
+ .option("-c, --config <path>", "Path to config file")
22
+ .action(runChecksCommand);
23
+ program
24
+ .command("export")
25
+ .description("Export auditor pack")
26
+ .option("--framework-id <id>", "Framework ID to export")
27
+ .option("--output <path>", "Output file path (default: stdout)")
28
+ .option("-c, --config <path>", "Path to config file")
29
+ .action(exportCommand);
30
+ program
31
+ .command("attest")
32
+ .description("Create manual attestation evidence")
33
+ .requiredOption("--control-id <id>", "Control ID")
34
+ .requiredOption("--actor-id <id>", "Actor ID")
35
+ .option("--outcome <pass|fail>", "Outcome (default: pass)")
36
+ .option("-c, --config <path>", "Path to config file")
37
+ .action(attestCommand);
38
+ program.parse(process.argv);
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;KACvD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,cAAc,CAAC,mBAAmB,EAAE,YAAY,CAAC;KACjD,cAAc,CAAC,iBAAiB,EAAE,UAAU,CAAC;KAC7C,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAAC;KAC1D,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Authfn evidence adapter: calls authfn (or mock client) for MFA/session/user info;
3
+ * returns AdapterEvidence with type "automated_authfn".
4
+ */
5
+ import type { EvidenceAdapter } from "./types.js";
6
+ /**
7
+ * Minimal authfn client interface for the adapter. Implementations may call real authfn
8
+ * APIs; tests can pass a mock that returns fixed data.
9
+ */
10
+ export interface AuthfnClient {
11
+ getMfaStatus?(options?: {
12
+ method?: string;
13
+ customConfig?: Record<string, unknown>;
14
+ }): Promise<{
15
+ enforced: boolean;
16
+ summary?: string;
17
+ }>;
18
+ getSessionPolicy?(options?: {
19
+ method?: string;
20
+ customConfig?: Record<string, unknown>;
21
+ }): Promise<{
22
+ maxSessionAge?: number;
23
+ policy?: string;
24
+ }>;
25
+ getUserInfo?(options?: {
26
+ method?: string;
27
+ customConfig?: Record<string, unknown>;
28
+ }): Promise<{
29
+ count?: number;
30
+ mfaCoverage?: number;
31
+ }>;
32
+ }
33
+ export interface AuthfnAdapterConfig {
34
+ /** Authfn client (real or mock). Required for runCheck to produce evidence. */
35
+ client: AuthfnClient;
36
+ }
37
+ /**
38
+ * Authfn evidence adapter. runCheck() calls the configured client (e.g. getMfaStatus,
39
+ * getSessionPolicy based on input.method) and maps the result to AdapterEvidence
40
+ * with type "automated_authfn".
41
+ */
42
+ export declare function createAuthfnAdapter(config: AuthfnAdapterConfig): EvidenceAdapter;
43
+ //# sourceMappingURL=authfn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authfn.d.ts","sourceRoot":"","sources":["../../src/adapters/authfn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,YAAY,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvI,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/I,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxI;AAED,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,MAAM,EAAE,YAAY,CAAC;CACtB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,eAAe,CAwDhF"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Authfn evidence adapter: calls authfn (or mock client) for MFA/session/user info;
3
+ * returns AdapterEvidence with type "automated_authfn".
4
+ */
5
+ const ADAPTER_NAME = "authfn";
6
+ /**
7
+ * Authfn evidence adapter. runCheck() calls the configured client (e.g. getMfaStatus,
8
+ * getSessionPolicy based on input.method) and maps the result to AdapterEvidence
9
+ * with type "automated_authfn".
10
+ */
11
+ export function createAuthfnAdapter(config) {
12
+ const { client } = config;
13
+ return {
14
+ name: ADAPTER_NAME,
15
+ async runCheck(input) {
16
+ const method = input.method ?? "getMfaStatus";
17
+ const opts = { method: input.method, customConfig: input.customConfig };
18
+ try {
19
+ if (method === "getSessionPolicy" && client.getSessionPolicy) {
20
+ const policy = await client.getSessionPolicy(opts);
21
+ return {
22
+ type: "automated_authfn",
23
+ outcome: "unknown",
24
+ timestamp: Date.now(),
25
+ payload: { sessionPolicy: policy, method },
26
+ };
27
+ }
28
+ if (method === "getUserInfo" && client.getUserInfo) {
29
+ const info = await client.getUserInfo(opts);
30
+ return {
31
+ type: "automated_authfn",
32
+ outcome: "unknown",
33
+ timestamp: Date.now(),
34
+ payload: { userInfo: info, method },
35
+ };
36
+ }
37
+ // Default: getMfaStatus
38
+ if (client.getMfaStatus) {
39
+ const mfaResult = await client.getMfaStatus(opts);
40
+ const outcome = mfaResult.enforced === true ? "pass" : mfaResult.enforced === false ? "fail" : "unknown";
41
+ return {
42
+ type: "automated_authfn",
43
+ outcome,
44
+ timestamp: Date.now(),
45
+ payload: { mfa: mfaResult, method },
46
+ };
47
+ }
48
+ return {
49
+ type: "automated_authfn",
50
+ outcome: "unknown",
51
+ timestamp: Date.now(),
52
+ payload: { reason: "no client method available", method },
53
+ };
54
+ }
55
+ catch (err) {
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ return {
58
+ type: "automated_authfn",
59
+ outcome: "fail",
60
+ timestamp: Date.now(),
61
+ payload: { error: message, method },
62
+ };
63
+ }
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=authfn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authfn.js","sourceRoot":"","sources":["../../src/adapters/authfn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,KAAK,CAAC,QAAQ,CAAC,KAAwB;YACrC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,cAAc,CAAC;YAC9C,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;YAExE,IAAI,CAAC;gBACH,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC7D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBACnD,OAAO;wBACL,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,SAAS;wBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE;qBAC3C,CAAC;gBACJ,CAAC;gBACD,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC5C,OAAO;wBACL,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,SAAS;wBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;qBACpC,CAAC;gBACJ,CAAC;gBACD,wBAAwB;gBACxB,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBACxB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBAClD,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;oBACzG,OAAO;wBACL,IAAI,EAAE,kBAAkB;wBACxB,OAAO;wBACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE;qBACpC,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,SAAS;oBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,OAAO,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE;iBAC1D,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO;oBACL,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,MAAM;oBACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;iBACpC,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Secfn evidence adapter: calls secfn (or mock client) for RBAC status, secret-scan
3
+ * summary, or security events; returns AdapterEvidence with type "automated_secfn".
4
+ */
5
+ import type { EvidenceAdapter } from "./types.js";
6
+ /**
7
+ * Minimal secfn client interface for the adapter. Implementations may call real secfn
8
+ * APIs; tests can pass a mock that returns fixed data.
9
+ */
10
+ export interface SecfnClient {
11
+ getRbacStatus?(options?: {
12
+ method?: string;
13
+ customConfig?: Record<string, unknown>;
14
+ }): Promise<{
15
+ enabled: boolean;
16
+ summary?: string;
17
+ }>;
18
+ getSecretScanSummary?(options?: {
19
+ method?: string;
20
+ customConfig?: Record<string, unknown>;
21
+ }): Promise<{
22
+ lastScanAt?: number;
23
+ findings?: number;
24
+ status?: string;
25
+ }>;
26
+ getSecurityEvents?(options?: {
27
+ method?: string;
28
+ customConfig?: Record<string, unknown>;
29
+ }): Promise<{
30
+ count?: number;
31
+ recent?: unknown[];
32
+ }>;
33
+ }
34
+ export interface SecfnAdapterConfig {
35
+ /** Secfn client (real or mock). Required for runCheck to produce evidence. */
36
+ client: SecfnClient;
37
+ }
38
+ /**
39
+ * Secfn evidence adapter. runCheck() calls the configured client (e.g. getRbacStatus,
40
+ * getSecretScanSummary, or getSecurityEvents based on input.method) and maps the
41
+ * result to AdapterEvidence with type "automated_secfn".
42
+ */
43
+ export declare function createSecfnAdapter(config: SecfnAdapterConfig): EvidenceAdapter;
44
+ //# sourceMappingURL=secfn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secfn.d.ts","sourceRoot":"","sources":["../../src/adapters/secfn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,YAAY,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvI,oBAAoB,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnK,iBAAiB,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5I;AAED,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,MAAM,EAAE,WAAW,CAAC;CACrB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe,CAyD9E"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Secfn evidence adapter: calls secfn (or mock client) for RBAC status, secret-scan
3
+ * summary, or security events; returns AdapterEvidence with type "automated_secfn".
4
+ */
5
+ const ADAPTER_NAME = "secfn";
6
+ /**
7
+ * Secfn evidence adapter. runCheck() calls the configured client (e.g. getRbacStatus,
8
+ * getSecretScanSummary, or getSecurityEvents based on input.method) and maps the
9
+ * result to AdapterEvidence with type "automated_secfn".
10
+ */
11
+ export function createSecfnAdapter(config) {
12
+ const { client } = config;
13
+ return {
14
+ name: ADAPTER_NAME,
15
+ async runCheck(input) {
16
+ const method = input.method ?? "getRbacStatus";
17
+ const opts = { method: input.method, customConfig: input.customConfig };
18
+ try {
19
+ if (method === "getSecretScanSummary" && client.getSecretScanSummary) {
20
+ const summary = await client.getSecretScanSummary(opts);
21
+ const outcome = summary.findings === 0 ? "pass" : summary.findings != null && summary.findings > 0 ? "fail" : "unknown";
22
+ return {
23
+ type: "automated_secfn",
24
+ outcome,
25
+ timestamp: summary.lastScanAt ?? Date.now(),
26
+ payload: { summary, method },
27
+ };
28
+ }
29
+ if (method === "getSecurityEvents" && client.getSecurityEvents) {
30
+ const events = await client.getSecurityEvents(opts);
31
+ return {
32
+ type: "automated_secfn",
33
+ outcome: "unknown",
34
+ timestamp: Date.now(),
35
+ payload: { count: events.count, method },
36
+ };
37
+ }
38
+ // Default: getRbacStatus
39
+ if (client.getRbacStatus) {
40
+ const rbacResult = await client.getRbacStatus(opts);
41
+ const outcome = rbacResult.enabled === true ? "pass" : rbacResult.enabled === false ? "fail" : "unknown";
42
+ return {
43
+ type: "automated_secfn",
44
+ outcome,
45
+ timestamp: Date.now(),
46
+ payload: { rbac: rbacResult, method },
47
+ };
48
+ }
49
+ return {
50
+ type: "automated_secfn",
51
+ outcome: "unknown",
52
+ timestamp: Date.now(),
53
+ payload: { reason: "no client method available", method },
54
+ };
55
+ }
56
+ catch (err) {
57
+ const message = err instanceof Error ? err.message : String(err);
58
+ return {
59
+ type: "automated_secfn",
60
+ outcome: "fail",
61
+ timestamp: Date.now(),
62
+ payload: { error: message, method },
63
+ };
64
+ }
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=secfn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secfn.js","sourceRoot":"","sources":["../../src/adapters/secfn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Evidence adapter contract: types and interface for pluggable evidence adapters.
3
+ * Adapters translate external systems (secfn, authfn, etc.) into AdapterEvidence
4
+ * which CompFn persists via evidence.create() when checks.run() is invoked.
5
+ */
6
+ import type { EvidenceType } from "../evidence.js";
7
+ /**
8
+ * Input passed to EvidenceAdapter.runCheck() when a check is run.
9
+ * checkId and controlId come from the CheckDefinition; method and customConfig
10
+ * are optional and may be used by the adapter to select behavior.
11
+ */
12
+ export interface AdapterCheckInput {
13
+ checkId: string;
14
+ controlId: string;
15
+ /** From CheckDefinition.adapterMethod (e.g. "getRbacStatus", "getMfaStatus"). */
16
+ method?: string;
17
+ /** From CheckDefinition.customConfig. */
18
+ customConfig?: Record<string, unknown>;
19
+ }
20
+ /**
21
+ * Evidence-shaped result returned by an adapter. CompFn sets controlId, sourceId,
22
+ * and actorId when persisting; the adapter supplies type, outcome, and optional
23
+ * timestamp, payload, artifactRef, frameworkRequirementId.
24
+ */
25
+ export interface AdapterEvidence {
26
+ type: EvidenceType;
27
+ outcome: "pass" | "fail" | "unknown";
28
+ timestamp?: number;
29
+ payload?: Record<string, unknown>;
30
+ artifactRef?: string;
31
+ frameworkRequirementId?: string;
32
+ }
33
+ /**
34
+ * Evidence adapter contract. Implementations must have:
35
+ * - name: string (e.g. "secfn", "authfn")
36
+ * - runCheck(input): Promise<AdapterEvidence>
37
+ *
38
+ * When a check with adapterName is run, config.adapters[adapterName] is looked up;
39
+ * if present, runCheck({ checkId, controlId, method, customConfig }) is called.
40
+ * The returned AdapterEvidence is persisted as one evidence record via evidence.create().
41
+ */
42
+ export interface EvidenceAdapter {
43
+ name: string;
44
+ runCheck(input: AdapterCheckInput): Promise<AdapterEvidence>;
45
+ }
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC9D"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Evidence adapter contract: types and interface for pluggable evidence adapters.
3
+ * Adapters translate external systems (secfn, authfn, etc.) into AdapterEvidence
4
+ * which CompFn persists via evidence.create() when checks.run() is invoked.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}