@shiftleftpt/sbd-toe-mcp 0.1.0 → 0.5.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 (47) hide show
  1. package/.env.example +0 -3
  2. package/README.md +133 -257
  3. package/dist/config.js +0 -3
  4. package/dist/config.js.map +1 -1
  5. package/dist/tools/structured-tools.js +0 -1
  6. package/dist/tools/structured-tools.js.map +1 -1
  7. package/dist/types.d.ts +0 -3
  8. package/dist/validators/ai-disclosure.js +2 -4
  9. package/dist/validators/ai-disclosure.js.map +1 -1
  10. package/package.json +32 -6
  11. package/dist/backend/semantic-index-gateway.test.d.ts +0 -1
  12. package/dist/backend/semantic-index-gateway.test.js +0 -384
  13. package/dist/backend/semantic-index-gateway.test.js.map +0 -1
  14. package/dist/bootstrap/checkout-backend.d.ts +0 -31
  15. package/dist/bootstrap/checkout-backend.js +0 -136
  16. package/dist/bootstrap/checkout-backend.js.map +0 -1
  17. package/dist/bootstrap/checkout-backend.test.d.ts +0 -1
  18. package/dist/bootstrap/checkout-backend.test.js +0 -158
  19. package/dist/bootstrap/checkout-backend.test.js.map +0 -1
  20. package/dist/bootstrap/release-checkout.d.ts +0 -8
  21. package/dist/bootstrap/release-checkout.js +0 -168
  22. package/dist/bootstrap/release-checkout.js.map +0 -1
  23. package/dist/bootstrap/release-checkout.test.d.ts +0 -1
  24. package/dist/bootstrap/release-checkout.test.js +0 -137
  25. package/dist/bootstrap/release-checkout.test.js.map +0 -1
  26. package/dist/resources/sbd-toe-resources.test.d.ts +0 -1
  27. package/dist/resources/sbd-toe-resources.test.js +0 -134
  28. package/dist/resources/sbd-toe-resources.test.js.map +0 -1
  29. package/dist/test-utils.d.ts +0 -153
  30. package/dist/test-utils.js +0 -176
  31. package/dist/test-utils.js.map +0 -1
  32. package/dist/tools/generate-document.test.d.ts +0 -1
  33. package/dist/tools/generate-document.test.js +0 -189
  34. package/dist/tools/generate-document.test.js.map +0 -1
  35. package/dist/tools/map-review-scope.test.d.ts +0 -1
  36. package/dist/tools/map-review-scope.test.js +0 -204
  37. package/dist/tools/map-review-scope.test.js.map +0 -1
  38. package/dist/tools/plan-repo-governance.test.d.ts +0 -1
  39. package/dist/tools/plan-repo-governance.test.js +0 -237
  40. package/dist/tools/plan-repo-governance.test.js.map +0 -1
  41. package/dist/tools/structured-tools.test.d.ts +0 -1
  42. package/dist/tools/structured-tools.test.js +0 -459
  43. package/dist/tools/structured-tools.test.js.map +0 -1
  44. package/dist/validators/ai-disclosure.test.d.ts +0 -1
  45. package/dist/validators/ai-disclosure.test.js +0 -244
  46. package/dist/validators/ai-disclosure.test.js.map +0 -1
  47. package/smithery.yaml +0 -44
@@ -1,134 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { buildSkillTemplateMarkdown, buildChapterApplicabilityJson, buildSetupAgentPrompt } from "./sbd-toe-resources.js";
3
- describe("buildSkillTemplateMarkdown", () => {
4
- it("L1 with projectRole returns non-empty string containing L1 and Cap.", () => {
5
- const result = buildSkillTemplateMarkdown("L1", "mcp-wrapper");
6
- expect(result).toBeTruthy();
7
- expect(result).toContain("L1");
8
- expect(result).toContain("Cap.");
9
- expect(result).toContain("mcp-wrapper");
10
- });
11
- it("L2 with projectRole returns non-empty string containing L2", () => {
12
- const result = buildSkillTemplateMarkdown("L2", "api-service");
13
- expect(result.length).toBeGreaterThan(0);
14
- expect(result).toContain("L2");
15
- expect(result).toContain("api-service");
16
- });
17
- it("L3 with projectRole returns non-empty string containing L3", () => {
18
- const result = buildSkillTemplateMarkdown("L3", "platform-service");
19
- expect(result.length).toBeGreaterThan(0);
20
- expect(result).toContain("L3");
21
- });
22
- it("invalid riskLevel L9 throws Error mentioning L9", () => {
23
- expect(() => buildSkillTemplateMarkdown("L9", "x")).toThrow(Error);
24
- expect(() => buildSkillTemplateMarkdown("L9", "x")).toThrow("L9");
25
- });
26
- it("output contains all required sections", () => {
27
- const result = buildSkillTemplateMarkdown("L1", "mcp-wrapper");
28
- expect(result).toContain("# SbD-ToE Skill Template");
29
- expect(result).toContain("## Classificação de Risco");
30
- expect(result).toContain("## Capítulos Activos");
31
- expect(result).toContain("## Capítulos Condicionais");
32
- expect(result).toContain("## Triggers de Consulta");
33
- expect(result).toContain("## Requisitos Base");
34
- });
35
- it("L1 active chapters are all present in output", () => {
36
- const result = buildSkillTemplateMarkdown("L1", "x");
37
- expect(result).toContain("Cap. 01");
38
- expect(result).toContain("Cap. 02");
39
- expect(result).toContain("Cap. 06");
40
- expect(result).toContain("Cap. 10");
41
- });
42
- it("L2 has wider active list than L1", () => {
43
- const r1 = buildSkillTemplateMarkdown("L1", "x");
44
- const r2 = buildSkillTemplateMarkdown("L2", "x");
45
- // L2 has Cap. 03 and Cap. 04 active; they are only conditional in L1
46
- expect(r2).toContain("Cap. 03");
47
- expect(r2).toContain("Cap. 04");
48
- // L1 lists Cap. 03 as conditional
49
- expect(r1).toContain("Cap. 03");
50
- });
51
- });
52
- describe("buildChapterApplicabilityJson", () => {
53
- it("L1 returns object with riskLevel and active/conditional/excluded as arrays", () => {
54
- const result = buildChapterApplicabilityJson("L1");
55
- expect(result["riskLevel"]).toBe("L1");
56
- expect(Array.isArray(result["active"])).toBe(true);
57
- expect(Array.isArray(result["conditional"])).toBe(true);
58
- expect(Array.isArray(result["excluded"])).toBe(true);
59
- expect(result["active"].length).toBeGreaterThan(0);
60
- });
61
- it("L2 returns object with riskLevel and all arrays", () => {
62
- const result = buildChapterApplicabilityJson("L2");
63
- expect(result["riskLevel"]).toBe("L2");
64
- expect(Array.isArray(result["active"])).toBe(true);
65
- expect(Array.isArray(result["conditional"])).toBe(true);
66
- expect(Array.isArray(result["excluded"])).toBe(true);
67
- expect(result["active"].length).toBeGreaterThan(0);
68
- });
69
- it("L3 returns object with riskLevel and all arrays; excluded is empty", () => {
70
- const result = buildChapterApplicabilityJson("L3");
71
- expect(result["riskLevel"]).toBe("L3");
72
- expect(Array.isArray(result["active"])).toBe(true);
73
- expect(Array.isArray(result["conditional"])).toBe(true);
74
- expect(Array.isArray(result["excluded"])).toBe(true);
75
- expect(result["excluded"].length).toBe(0);
76
- });
77
- it("invalid riskLevel X throws Error mentioning X", () => {
78
- expect(() => buildChapterApplicabilityJson("X")).toThrow(Error);
79
- expect(() => buildChapterApplicabilityJson("X")).toThrow("X");
80
- });
81
- it("L1 active list contains expected chapters from docs/sbd-toe-applicability.md", () => {
82
- const result = buildChapterApplicabilityJson("L1");
83
- expect(result.active).toContain("Cap. 01");
84
- expect(result.active).toContain("Cap. 02");
85
- expect(result.active).toContain("Cap. 05");
86
- expect(result.active).toContain("Cap. 06");
87
- expect(result.active).toContain("Cap. 07");
88
- expect(result.active).toContain("Cap. 10");
89
- });
90
- it("L1 conditional list contains Cap. 03, Cap. 04, Cap. 11, Cap. 12, Cap. 14", () => {
91
- const result = buildChapterApplicabilityJson("L1");
92
- expect(result.conditional).toContain("Cap. 03");
93
- expect(result.conditional).toContain("Cap. 04");
94
- expect(result.conditional).toContain("Cap. 11");
95
- expect(result.conditional).toContain("Cap. 12");
96
- expect(result.conditional).toContain("Cap. 14");
97
- });
98
- });
99
- describe("buildSetupAgentPrompt", () => {
100
- it("L1 returns non-empty string containing L1 and Cap. 01", () => {
101
- const result = buildSetupAgentPrompt("L1");
102
- expect(result.length).toBeGreaterThan(0);
103
- expect(result).toContain("L1");
104
- expect(result).toContain("Cap. 01");
105
- });
106
- it("L1 with projectRole includes projectRole in text", () => {
107
- const result = buildSetupAgentPrompt("L1", "mcp-wrapper");
108
- expect(result).toContain("mcp-wrapper");
109
- });
110
- it("L1 without projectRole still contains mandatory rules", () => {
111
- const result = buildSetupAgentPrompt("L1");
112
- expect(result).toContain("Cap. 01 → Cap. 02");
113
- expect(result).toContain("search_sbd_toe_manual");
114
- });
115
- it("L2 includes L2 active chapters", () => {
116
- const result = buildSetupAgentPrompt("L2");
117
- expect(result).toContain("L2");
118
- expect(result).toContain("Cap. 03");
119
- expect(result).toContain("Cap. 04");
120
- });
121
- it("L3 has no conditional chapters", () => {
122
- const result = buildSetupAgentPrompt("L3");
123
- expect(result).toContain("L3");
124
- expect(result).toContain("nenhum");
125
- });
126
- it("invalid L4 riskLevel throws Error mentioning L4", () => {
127
- expect(() => buildSetupAgentPrompt("L4")).toThrow(Error);
128
- expect(() => buildSetupAgentPrompt("L4")).toThrow("L4");
129
- });
130
- it("invalid empty string riskLevel throws Error", () => {
131
- expect(() => buildSetupAgentPrompt("")).toThrow(Error);
132
- });
133
- });
134
- //# sourceMappingURL=sbd-toe-resources.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sbd-toe-resources.test.js","sourceRoot":"","sources":["../../src/resources/sbd-toe-resources.test.ts"],"names":[],"mappings":"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"}
@@ -1,153 +0,0 @@
1
- import type { SnapshotPayload } from "./types.js";
2
- /**
3
- * Mock de um snapshot com items vazios.
4
- */
5
- export declare const emptySnapshotPayload: SnapshotPayload;
6
- /**
7
- * Mock de um snapshot con items comuns para testes.
8
- */
9
- export declare const mockSnapshotPayload: SnapshotPayload;
10
- /**
11
- * Mock com campos vazios/undefined para testes de edge cases.
12
- */
13
- export declare const edgeCaseSnapshotPayload: SnapshotPayload;
14
- /**
15
- * Mock do backend checkout de testes.
16
- */
17
- export declare const mockBackendCheckout: {
18
- schemaVersion: string;
19
- checkedOutAt: string;
20
- upstreamRepoPath: string;
21
- contractFiles: {
22
- docsSnapshot: string;
23
- entitiesSnapshot: string;
24
- docsEnrichedSnapshot: string;
25
- entitiesEnrichedSnapshot: string;
26
- indexSettings: string;
27
- runManifest: string;
28
- };
29
- runManifest: {
30
- runId: string;
31
- generatedAt: string;
32
- branch: string;
33
- commitSha: string;
34
- repoUrl: string;
35
- };
36
- indices: {
37
- docs: {
38
- indexName: string;
39
- recordFamily: string;
40
- settings: {};
41
- };
42
- entities: {
43
- indexName: string;
44
- recordFamily: string;
45
- settings: {};
46
- };
47
- };
48
- };
49
- /**
50
- * Helper para criar um record normalizado mock para testes de score e intent.
51
- */
52
- export declare function createMockNormalizedRecord(overrides?: Record<string, unknown>): {
53
- citationId: string;
54
- source: "docs";
55
- indexName: string;
56
- objectID: string;
57
- title: string;
58
- excerpt: string;
59
- chapter: string;
60
- section: string;
61
- role: string;
62
- phase: string;
63
- action: string;
64
- artefact: string;
65
- url: string;
66
- pageLabel: string;
67
- documentPath: string;
68
- chapterPath: string;
69
- documentTitle: string;
70
- tags: string[];
71
- aliases_pt_en: undefined;
72
- intent_topics: undefined;
73
- canonical_control_ids: undefined;
74
- artifact_ids: undefined;
75
- authority_level: undefined;
76
- algoliaRank: number;
77
- localScore: number;
78
- raw: {
79
- objectID: string;
80
- title: string;
81
- content: string;
82
- };
83
- };
84
- /**
85
- * Helper para criar um record com intent topics específicos.
86
- */
87
- export declare function createMockRecordWithIntentTopics(intent: string, overrides?: Record<string, unknown>): {
88
- citationId: string;
89
- source: "docs";
90
- indexName: string;
91
- objectID: string;
92
- title: string;
93
- excerpt: string;
94
- chapter: string;
95
- section: string;
96
- role: string;
97
- phase: string;
98
- action: string;
99
- artefact: string;
100
- url: string;
101
- pageLabel: string;
102
- documentPath: string;
103
- chapterPath: string;
104
- documentTitle: string;
105
- tags: string[];
106
- aliases_pt_en: undefined;
107
- intent_topics: undefined;
108
- canonical_control_ids: undefined;
109
- artifact_ids: undefined;
110
- authority_level: undefined;
111
- algoliaRank: number;
112
- localScore: number;
113
- raw: {
114
- objectID: string;
115
- title: string;
116
- content: string;
117
- };
118
- };
119
- /**
120
- * Helper para criar um record com aliases.
121
- */
122
- export declare function createMockRecordWithAliases(aliases: string[], overrides?: Record<string, unknown>): {
123
- citationId: string;
124
- source: "docs";
125
- indexName: string;
126
- objectID: string;
127
- title: string;
128
- excerpt: string;
129
- chapter: string;
130
- section: string;
131
- role: string;
132
- phase: string;
133
- action: string;
134
- artefact: string;
135
- url: string;
136
- pageLabel: string;
137
- documentPath: string;
138
- chapterPath: string;
139
- documentTitle: string;
140
- tags: string[];
141
- aliases_pt_en: undefined;
142
- intent_topics: undefined;
143
- canonical_control_ids: undefined;
144
- artifact_ids: undefined;
145
- authority_level: undefined;
146
- algoliaRank: number;
147
- localScore: number;
148
- raw: {
149
- objectID: string;
150
- title: string;
151
- content: string;
152
- };
153
- };
@@ -1,176 +0,0 @@
1
- /**
2
- * Mock de um snapshot com items vazios.
3
- */
4
- export const emptySnapshotPayload = {
5
- run_id: "test-run-001",
6
- items: []
7
- };
8
- /**
9
- * Mock de um snapshot con items comuns para testes.
10
- */
11
- export const mockSnapshotPayload = {
12
- run_id: "test-run-001",
13
- items: [
14
- {
15
- objectID: "doc-001",
16
- title: "Como fazer bootstrap do repositório",
17
- content: "Instruções para bootstrap inicial",
18
- chapter_title: "Cap. 01",
19
- section_title: "Bootstrap",
20
- tags: ["bootstrap", "setup"],
21
- aliases_pt_en: ["repository initialization", "initial setup"],
22
- intent_topics: ["bootstrap"],
23
- canonical_control_ids: ["REQ-001"],
24
- artifact_ids: ["ART-001"],
25
- authority_level: "canonical"
26
- },
27
- {
28
- objectID: "doc-002",
29
- title: "Dependências de segurança",
30
- content: "Gestão de dependências com SBOM e SCA",
31
- chapter_title: "Cap. 05",
32
- section_title: "Dependências",
33
- tags: ["dependencies", "sbom", "sca"],
34
- aliases_pt_en: ["dependency management", "package security"],
35
- intent_topics: ["dependency_governance"],
36
- canonical_control_ids: ["REQ-002"],
37
- artifact_ids: ["ART-002"],
38
- authority_level: "guidance"
39
- },
40
- {
41
- objectID: "doc-003",
42
- title: "CI/CD Gates e Aprovações",
43
- content: "Configurar gates no pipeline e aprovações de release",
44
- chapter_title: "Cap. 07",
45
- section_title: "CI/CD Seguro",
46
- tags: ["ci/cd", "pipeline", "approval"],
47
- aliases_pt_en: ["continuous integration", "release gates"],
48
- intent_topics: ["ci_cd_gates"],
49
- canonical_control_ids: ["REQ-003"],
50
- artifact_ids: [],
51
- authority_level: "canonical"
52
- },
53
- {
54
- // Record sem objectID - deve ser ignorado em enrichment
55
- title: "Record sem ID",
56
- content: "Não tem objectID",
57
- chapter_title: "Cap. 00"
58
- },
59
- {
60
- objectID: "doc-004",
61
- // Sem campos de enrichment
62
- title: "Record simples",
63
- content: "Sem enrichment fields"
64
- }
65
- ]
66
- };
67
- /**
68
- * Mock com campos vazios/undefined para testes de edge cases.
69
- */
70
- export const edgeCaseSnapshotPayload = {
71
- items: [
72
- {
73
- objectID: "edge-001",
74
- title: " título com espaços ",
75
- content: undefined,
76
- aliases_pt_en: [] // Array vazio
77
- },
78
- {
79
- objectID: "edge-002",
80
- title: "Record com tags inválidas",
81
- tags: ["", null, 123] // Valores inválidos
82
- }
83
- ]
84
- };
85
- /**
86
- * Mock do backend checkout de testes.
87
- */
88
- export const mockBackendCheckout = {
89
- schemaVersion: "0.1.0",
90
- checkedOutAt: new Date().toISOString(),
91
- upstreamRepoPath: "/upstream/repo",
92
- contractFiles: {
93
- docsSnapshot: "data/publish/docs.json",
94
- entitiesSnapshot: "data/publish/entities.json",
95
- docsEnrichedSnapshot: "data/publish/docs_enriched.json",
96
- entitiesEnrichedSnapshot: "data/publish/entities_enriched.json",
97
- indexSettings: "data/publish/index_settings.json",
98
- runManifest: "data/reports/run_manifest.json"
99
- },
100
- runManifest: {
101
- runId: "test-run-001",
102
- generatedAt: "2026-03-24T10:00:00Z",
103
- branch: "main",
104
- commitSha: "abc123def456",
105
- repoUrl: "https://github.com/test/repo"
106
- },
107
- indices: {
108
- docs: {
109
- indexName: "sbd_toe_docs_test",
110
- recordFamily: "documents",
111
- settings: {}
112
- },
113
- entities: {
114
- indexName: "sbd_toe_entities_test",
115
- recordFamily: "entities",
116
- settings: {}
117
- }
118
- }
119
- };
120
- /**
121
- * Helper para criar um record normalizado mock para testes de score e intent.
122
- */
123
- export function createMockNormalizedRecord(overrides = {}) {
124
- return {
125
- citationId: "D1",
126
- source: "docs",
127
- indexName: "test_index",
128
- objectID: "test-001",
129
- title: "Test Record",
130
- excerpt: "This is a test excerpt",
131
- chapter: "Cap. 01",
132
- section: "Section 1",
133
- role: "Developer",
134
- phase: "Development",
135
- action: "Implementation",
136
- artefact: "Code",
137
- url: "https://example.com/test",
138
- pageLabel: "page-1",
139
- documentPath: "docs/chapter-01",
140
- chapterPath: "chapter-01",
141
- documentTitle: "Test Document",
142
- tags: ["test", "mock"],
143
- aliases_pt_en: undefined,
144
- intent_topics: undefined,
145
- canonical_control_ids: undefined,
146
- artifact_ids: undefined,
147
- authority_level: undefined,
148
- algoliaRank: 1,
149
- localScore: 0,
150
- raw: {
151
- objectID: "test-001",
152
- title: "Test Record",
153
- content: "Test content"
154
- },
155
- ...overrides
156
- };
157
- }
158
- /**
159
- * Helper para criar um record com intent topics específicos.
160
- */
161
- export function createMockRecordWithIntentTopics(intent, overrides = {}) {
162
- return createMockNormalizedRecord({
163
- intent_topics: [intent, "secondary_topic"],
164
- ...overrides
165
- });
166
- }
167
- /**
168
- * Helper para criar um record com aliases.
169
- */
170
- export function createMockRecordWithAliases(aliases, overrides = {}) {
171
- return createMockNormalizedRecord({
172
- aliases_pt_en: aliases,
173
- ...overrides
174
- });
175
- }
176
- //# sourceMappingURL=test-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,189 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { handleGenerateDocument } from "./generate-document.js";
3
- // ---------------------------------------------------------------------------
4
- // Helpers
5
- // ---------------------------------------------------------------------------
6
- function call(args) {
7
- return handleGenerateDocument(args);
8
- }
9
- // ---------------------------------------------------------------------------
10
- // Validation
11
- // ---------------------------------------------------------------------------
12
- describe("handleGenerateDocument — validation", () => {
13
- it("throws rpcError -32602 for invalid type", () => {
14
- let err;
15
- try {
16
- call({ type: "invalid-type", riskLevel: "L1" });
17
- }
18
- catch (e) {
19
- err = e;
20
- }
21
- expect(err).toBeInstanceOf(Error);
22
- expect(err.rpcError?.code).toBe(-32602);
23
- expect(err.message).toContain("invalid-type");
24
- });
25
- it("throws rpcError -32602 for invalid riskLevel", () => {
26
- let err;
27
- try {
28
- call({ type: "checklist", riskLevel: "L4" });
29
- }
30
- catch (e) {
31
- err = e;
32
- }
33
- expect(err).toBeInstanceOf(Error);
34
- expect(err.rpcError?.code).toBe(-32602);
35
- expect(err.message).toContain("L4");
36
- });
37
- it("throws rpcError -32602 when type is missing", () => {
38
- let err;
39
- try {
40
- call({ riskLevel: "L1" });
41
- }
42
- catch (e) {
43
- err = e;
44
- }
45
- expect(err).toBeInstanceOf(Error);
46
- expect(err.rpcError?.code).toBe(-32602);
47
- });
48
- it("throws rpcError -32602 when riskLevel is missing", () => {
49
- let err;
50
- try {
51
- call({ type: "checklist" });
52
- }
53
- catch (e) {
54
- err = e;
55
- }
56
- expect(err).toBeInstanceOf(Error);
57
- expect(err.rpcError?.code).toBe(-32602);
58
- });
59
- });
60
- // ---------------------------------------------------------------------------
61
- // Output structure
62
- // ---------------------------------------------------------------------------
63
- describe("handleGenerateDocument — output structure", () => {
64
- it("returns required fields for all 5 types at L1", () => {
65
- const types = [
66
- "classification-template",
67
- "threat-model-template",
68
- "checklist",
69
- "training-plan",
70
- "secure-config"
71
- ];
72
- for (const type of types) {
73
- const result = call({ type, riskLevel: "L1" });
74
- expect(result.documentType).toBe(type);
75
- expect(result.riskLevel).toBe("L1");
76
- expect(result.sections.length).toBeGreaterThan(0);
77
- expect(result.acceptanceCriteria.length).toBeGreaterThan(0);
78
- expect(result.relevantBundles.length).toBeGreaterThan(0);
79
- }
80
- });
81
- it("context field is accepted but does not change output structure", () => {
82
- const withContext = call({
83
- type: "checklist",
84
- riskLevel: "L1",
85
- context: { projectName: "Test", team: "Dev" }
86
- });
87
- const withoutContext = call({
88
- type: "checklist",
89
- riskLevel: "L1"
90
- });
91
- expect(withContext.sections).toEqual(withoutContext.sections);
92
- });
93
- });
94
- // ---------------------------------------------------------------------------
95
- // L1/L2/L3 progression
96
- // ---------------------------------------------------------------------------
97
- describe("handleGenerateDocument — risk level progression", () => {
98
- it("L3 has more sections than L1 for classification-template", () => {
99
- const l1 = call({ type: "classification-template", riskLevel: "L1" });
100
- const l3 = call({ type: "classification-template", riskLevel: "L3" });
101
- expect(l3.sections.length).toBeGreaterThan(l1.sections.length);
102
- });
103
- it("L3 has more sections than L2 for threat-model-template", () => {
104
- const l2 = call({ type: "threat-model-template", riskLevel: "L2" });
105
- const l3 = call({ type: "threat-model-template", riskLevel: "L3" });
106
- expect(l3.sections.length).toBeGreaterThanOrEqual(l2.sections.length);
107
- });
108
- it("L2 has more sections than L1 for secure-config", () => {
109
- const l1 = call({ type: "secure-config", riskLevel: "L1" });
110
- const l2 = call({ type: "secure-config", riskLevel: "L2" });
111
- expect(l2.sections.length).toBeGreaterThan(l1.sections.length);
112
- });
113
- it("all types produce sections at all risk levels", () => {
114
- const types = [
115
- "classification-template",
116
- "threat-model-template",
117
- "checklist",
118
- "training-plan",
119
- "secure-config"
120
- ];
121
- const levels = ["L1", "L2", "L3"];
122
- for (const type of types) {
123
- for (const riskLevel of levels) {
124
- const result = call({ type, riskLevel });
125
- expect(result.sections.length).toBeGreaterThan(0);
126
- }
127
- }
128
- });
129
- });
130
- // ---------------------------------------------------------------------------
131
- // relevantBundles
132
- // ---------------------------------------------------------------------------
133
- describe("handleGenerateDocument — relevantBundles", () => {
134
- it("classification-template has expected bundles", () => {
135
- const result = call({ type: "classification-template", riskLevel: "L1" });
136
- expect(result.relevantBundles).toContain("01-classificacao-aplicacoes");
137
- expect(result.relevantBundles).toContain("02-requisitos-seguranca");
138
- });
139
- it("threat-model-template includes 03-threat-modeling", () => {
140
- const result = call({ type: "threat-model-template", riskLevel: "L2" });
141
- expect(result.relevantBundles).toContain("03-threat-modeling");
142
- });
143
- it("secure-config includes infrastructure bundles", () => {
144
- const result = call({ type: "secure-config", riskLevel: "L1" });
145
- expect(result.relevantBundles).toContain("08-iac-infraestrutura");
146
- expect(result.relevantBundles).toContain("09-containers-imagens");
147
- });
148
- it("training-plan includes 13-formacao-onboarding", () => {
149
- const result = call({ type: "training-plan", riskLevel: "L1" });
150
- expect(result.relevantBundles).toContain("13-formacao-onboarding");
151
- });
152
- });
153
- // ---------------------------------------------------------------------------
154
- // Section fields
155
- // ---------------------------------------------------------------------------
156
- describe("handleGenerateDocument — section fields", () => {
157
- it("each field has name, required, and guidance", () => {
158
- const result = call({ type: "checklist", riskLevel: "L2" });
159
- for (const section of result.sections) {
160
- expect(typeof section.name).toBe("string");
161
- expect(typeof section.mandatory).toBe("boolean");
162
- for (const field of section.fields) {
163
- expect(typeof field.name).toBe("string");
164
- expect(["mandatory", "conditional", "optional"]).toContain(field.required);
165
- expect(typeof field.guidance).toBe("string");
166
- expect(field.guidance.length).toBeGreaterThan(0);
167
- }
168
- }
169
- });
170
- it("guidance never contains pre-filled substantive content (only instructions)", () => {
171
- const types = [
172
- "classification-template",
173
- "threat-model-template",
174
- "checklist",
175
- "training-plan",
176
- "secure-config"
177
- ];
178
- for (const type of types) {
179
- const result = call({ type, riskLevel: "L2" });
180
- for (const section of result.sections) {
181
- for (const field of section.fields) {
182
- // guidance should be instructional — check it's not suspiciously long pre-filled content
183
- expect(field.guidance.length).toBeLessThan(300);
184
- }
185
- }
186
- }
187
- });
188
- });
189
- //# sourceMappingURL=generate-document.test.js.map