hackmyagent-core 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 (73) hide show
  1. package/dist/checker/check-skill.d.ts +48 -0
  2. package/dist/checker/check-skill.d.ts.map +1 -0
  3. package/dist/checker/check-skill.js +105 -0
  4. package/dist/checker/check-skill.js.map +1 -0
  5. package/dist/checker/check-skill.test.d.ts +2 -0
  6. package/dist/checker/check-skill.test.d.ts.map +1 -0
  7. package/dist/checker/check-skill.test.js +83 -0
  8. package/dist/checker/check-skill.test.js.map +1 -0
  9. package/dist/checker/index.d.ts +12 -0
  10. package/dist/checker/index.d.ts.map +1 -0
  11. package/dist/checker/index.js +16 -0
  12. package/dist/checker/index.js.map +1 -0
  13. package/dist/checker/permission-analyzer.d.ts +12 -0
  14. package/dist/checker/permission-analyzer.d.ts.map +1 -0
  15. package/dist/checker/permission-analyzer.js +84 -0
  16. package/dist/checker/permission-analyzer.js.map +1 -0
  17. package/dist/checker/permission-analyzer.test.d.ts +2 -0
  18. package/dist/checker/permission-analyzer.test.d.ts.map +1 -0
  19. package/dist/checker/permission-analyzer.test.js +87 -0
  20. package/dist/checker/permission-analyzer.test.js.map +1 -0
  21. package/dist/checker/publisher-verifier.d.ts +34 -0
  22. package/dist/checker/publisher-verifier.d.ts.map +1 -0
  23. package/dist/checker/publisher-verifier.js +121 -0
  24. package/dist/checker/publisher-verifier.js.map +1 -0
  25. package/dist/checker/publisher-verifier.test.d.ts +2 -0
  26. package/dist/checker/publisher-verifier.test.d.ts.map +1 -0
  27. package/dist/checker/publisher-verifier.test.js +171 -0
  28. package/dist/checker/publisher-verifier.test.js.map +1 -0
  29. package/dist/checker/skill-identifier.d.ts +14 -0
  30. package/dist/checker/skill-identifier.d.ts.map +1 -0
  31. package/dist/checker/skill-identifier.js +55 -0
  32. package/dist/checker/skill-identifier.js.map +1 -0
  33. package/dist/checker/skill-identifier.test.d.ts +2 -0
  34. package/dist/checker/skill-identifier.test.d.ts.map +1 -0
  35. package/dist/checker/skill-identifier.test.js +64 -0
  36. package/dist/checker/skill-identifier.test.js.map +1 -0
  37. package/dist/hardening/index.d.ts +7 -0
  38. package/dist/hardening/index.d.ts.map +1 -0
  39. package/dist/hardening/index.js +9 -0
  40. package/dist/hardening/index.js.map +1 -0
  41. package/dist/hardening/scanner.d.ts +85 -0
  42. package/dist/hardening/scanner.d.ts.map +1 -0
  43. package/dist/hardening/scanner.js +3410 -0
  44. package/dist/hardening/scanner.js.map +1 -0
  45. package/dist/hardening/scanner.test.d.ts +2 -0
  46. package/dist/hardening/scanner.test.d.ts.map +1 -0
  47. package/dist/hardening/scanner.test.js +1103 -0
  48. package/dist/hardening/scanner.test.js.map +1 -0
  49. package/dist/hardening/security-check.d.ts +56 -0
  50. package/dist/hardening/security-check.d.ts.map +1 -0
  51. package/dist/hardening/security-check.js +6 -0
  52. package/dist/hardening/security-check.js.map +1 -0
  53. package/dist/index.d.ts +27 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +35 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/scanner/external-scanner.d.ts +13 -0
  58. package/dist/scanner/external-scanner.d.ts.map +1 -0
  59. package/dist/scanner/external-scanner.js +299 -0
  60. package/dist/scanner/external-scanner.js.map +1 -0
  61. package/dist/scanner/external-scanner.test.d.ts +2 -0
  62. package/dist/scanner/external-scanner.test.d.ts.map +1 -0
  63. package/dist/scanner/external-scanner.test.js +302 -0
  64. package/dist/scanner/external-scanner.test.js.map +1 -0
  65. package/dist/scanner/index.d.ts +6 -0
  66. package/dist/scanner/index.d.ts.map +1 -0
  67. package/dist/scanner/index.js +9 -0
  68. package/dist/scanner/index.js.map +1 -0
  69. package/dist/scanner/types.d.ts +32 -0
  70. package/dist/scanner/types.d.ts.map +1 -0
  71. package/dist/scanner/types.js +6 -0
  72. package/dist/scanner/types.js.map +1 -0
  73. package/package.json +37 -0
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Publisher verification via DNS TXT records
4
+ *
5
+ * Publishers can verify ownership by adding a TXT record to their domain:
6
+ * - hackmyagent-verify=<publisher-name>
7
+ * - hackmyagent-publisher=<publisher-name>
8
+ * - opena2a-verify=<publisher-name>
9
+ *
10
+ * The record can be at:
11
+ * - The root domain (e.g., TXT @ for publisher.dev)
12
+ * - A _hackmyagent subdomain (e.g., TXT _hackmyagent.publisher.dev)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.lookupDnsTxt = lookupDnsTxt;
16
+ exports.verifyPublisher = verifyPublisher;
17
+ const dns_1 = require("dns");
18
+ // Accepted TXT record prefixes (case-insensitive)
19
+ const VALID_PREFIXES = [
20
+ 'hackmyagent-verify=',
21
+ 'hackmyagent-publisher=',
22
+ 'opena2a-verify=',
23
+ 'publisher=', // For _hackmyagent subdomain
24
+ ];
25
+ // Domain suffixes to try when looking up a publisher
26
+ const DOMAIN_SUFFIXES = ['.dev', '.com', '.io', '.org'];
27
+ /**
28
+ * Look up TXT records for a domain
29
+ */
30
+ async function lookupDnsTxt(domain) {
31
+ try {
32
+ const records = await dns_1.promises.resolveTxt(domain);
33
+ // dns.resolveTxt returns string[][] (chunks), flatten them
34
+ return records.map((chunks) => chunks.join(''));
35
+ }
36
+ catch (error) {
37
+ // ENOTFOUND, ENODATA, etc. - domain doesn't exist or has no TXT records
38
+ return [];
39
+ }
40
+ }
41
+ /**
42
+ * Check if a TXT record verifies the publisher
43
+ */
44
+ function checkTxtRecord(record, publisherName) {
45
+ const lowerRecord = record.toLowerCase();
46
+ const lowerPublisher = publisherName.toLowerCase();
47
+ for (const prefix of VALID_PREFIXES) {
48
+ if (lowerRecord.startsWith(prefix.toLowerCase())) {
49
+ const value = record.substring(prefix.length).trim();
50
+ return value.toLowerCase() === lowerPublisher;
51
+ }
52
+ }
53
+ return false;
54
+ }
55
+ /**
56
+ * Get domains to check for a publisher
57
+ */
58
+ function getDomainsToCheck(publisherName, options) {
59
+ const domains = [];
60
+ // If registry has a custom domain for this publisher, check it first
61
+ if (options?.registryDomains?.[publisherName]) {
62
+ const customDomain = options.registryDomains[publisherName];
63
+ domains.push(customDomain);
64
+ domains.push(`_hackmyagent.${customDomain}`);
65
+ }
66
+ // Try common domain patterns
67
+ for (const suffix of DOMAIN_SUFFIXES) {
68
+ const baseDomain = `${publisherName}${suffix}`;
69
+ domains.push(baseDomain);
70
+ domains.push(`_hackmyagent.${baseDomain}`);
71
+ }
72
+ return domains;
73
+ }
74
+ /**
75
+ * Look up DNS TXT records (with mock support for testing)
76
+ */
77
+ async function getDnsRecords(domain, options) {
78
+ // Use mock records if provided (for testing)
79
+ if (options?.mockDnsRecords) {
80
+ return options.mockDnsRecords[domain] ?? [];
81
+ }
82
+ // Real DNS lookup
83
+ return lookupDnsTxt(domain);
84
+ }
85
+ /**
86
+ * Extract the base domain from a full domain (removes _hackmyagent. prefix)
87
+ */
88
+ function getBaseDomain(domain) {
89
+ if (domain.startsWith('_hackmyagent.')) {
90
+ return domain.substring('_hackmyagent.'.length);
91
+ }
92
+ return domain;
93
+ }
94
+ /**
95
+ * Verify a publisher's identity via DNS TXT records
96
+ */
97
+ async function verifyPublisher(publisherName, options) {
98
+ const domainsToCheck = getDomainsToCheck(publisherName, options);
99
+ const checkedDomains = [];
100
+ for (const domain of domainsToCheck) {
101
+ checkedDomains.push(domain);
102
+ const records = await getDnsRecords(domain, options);
103
+ for (const record of records) {
104
+ if (checkTxtRecord(record, publisherName)) {
105
+ return {
106
+ verified: true,
107
+ method: 'dns',
108
+ domain: getBaseDomain(domain),
109
+ txtRecord: record,
110
+ verifiedAt: new Date(),
111
+ };
112
+ }
113
+ }
114
+ }
115
+ return {
116
+ verified: false,
117
+ method: 'none',
118
+ failureReason: `No valid TXT record found for publisher "${publisherName}". Checked domains: ${checkedDomains.join(', ')}`,
119
+ };
120
+ }
121
+ //# sourceMappingURL=publisher-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-verifier.js","sourceRoot":"","sources":["../../src/checker/publisher-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=publisher-verifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-verifier.test.d.ts","sourceRoot":"","sources":["../../src/checker/publisher-verifier.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const publisher_verifier_1 = require("./publisher-verifier");
5
+ (0, vitest_1.describe)('lookupDnsTxt', () => {
6
+ (0, vitest_1.it)('returns TXT records for a domain', async () => {
7
+ // Using a well-known domain that has TXT records
8
+ const records = await (0, publisher_verifier_1.lookupDnsTxt)('google.com');
9
+ (0, vitest_1.expect)(Array.isArray(records)).toBe(true);
10
+ // Google has SPF and other TXT records
11
+ (0, vitest_1.expect)(records.length).toBeGreaterThan(0);
12
+ });
13
+ (0, vitest_1.it)('returns empty array for domain with no TXT records', async () => {
14
+ // Use a subdomain unlikely to have TXT records
15
+ const records = await (0, publisher_verifier_1.lookupDnsTxt)('no-txt-records.example.com');
16
+ (0, vitest_1.expect)(records).toEqual([]);
17
+ });
18
+ (0, vitest_1.it)('returns empty array for non-existent domain', async () => {
19
+ const records = await (0, publisher_verifier_1.lookupDnsTxt)('this-domain-definitely-does-not-exist-12345.com');
20
+ (0, vitest_1.expect)(records).toEqual([]);
21
+ });
22
+ });
23
+ (0, vitest_1.describe)('verifyPublisher', () => {
24
+ (0, vitest_1.describe)('DNS TXT verification', () => {
25
+ (0, vitest_1.it)('verifies publisher with valid hackmyagent TXT record', async () => {
26
+ const result = await (0, publisher_verifier_1.verifyPublisher)('test-publisher', {
27
+ mockDnsRecords: {
28
+ 'test-publisher.dev': ['hackmyagent-verify=test-publisher'],
29
+ },
30
+ });
31
+ (0, vitest_1.expect)(result).toMatchObject({
32
+ verified: true,
33
+ method: 'dns',
34
+ domain: 'test-publisher.dev',
35
+ });
36
+ });
37
+ (0, vitest_1.it)('verifies publisher with _hackmyagent subdomain TXT record', async () => {
38
+ const result = await (0, publisher_verifier_1.verifyPublisher)('example-org', {
39
+ mockDnsRecords: {
40
+ '_hackmyagent.example-org.dev': ['publisher=example-org'],
41
+ },
42
+ });
43
+ (0, vitest_1.expect)(result).toMatchObject({
44
+ verified: true,
45
+ method: 'dns',
46
+ domain: 'example-org.dev',
47
+ });
48
+ });
49
+ (0, vitest_1.it)('fails verification when TXT record has wrong publisher name', async () => {
50
+ const result = await (0, publisher_verifier_1.verifyPublisher)('my-publisher', {
51
+ mockDnsRecords: {
52
+ 'my-publisher.dev': ['hackmyagent-verify=wrong-name'],
53
+ },
54
+ });
55
+ (0, vitest_1.expect)(result.verified).toBe(false);
56
+ (0, vitest_1.expect)(result.method).toBe('none');
57
+ });
58
+ (0, vitest_1.it)('fails verification when no TXT records exist', async () => {
59
+ const result = await (0, publisher_verifier_1.verifyPublisher)('unverified-publisher', {
60
+ mockDnsRecords: {},
61
+ });
62
+ (0, vitest_1.expect)(result.verified).toBe(false);
63
+ (0, vitest_1.expect)(result.method).toBe('none');
64
+ });
65
+ (0, vitest_1.it)('tries multiple domain patterns', async () => {
66
+ // Should try: publisher.dev, publisher.com, publisher.io
67
+ const result = await (0, publisher_verifier_1.verifyPublisher)('mycompany', {
68
+ mockDnsRecords: {
69
+ 'mycompany.io': ['hackmyagent-verify=mycompany'],
70
+ },
71
+ });
72
+ (0, vitest_1.expect)(result).toMatchObject({
73
+ verified: true,
74
+ method: 'dns',
75
+ domain: 'mycompany.io',
76
+ });
77
+ });
78
+ (0, vitest_1.it)('supports custom domain via registry lookup', async () => {
79
+ const result = await (0, publisher_verifier_1.verifyPublisher)('opena2a', {
80
+ registryDomains: {
81
+ opena2a: 'opena2a.dev',
82
+ },
83
+ mockDnsRecords: {
84
+ 'opena2a.dev': ['hackmyagent-verify=opena2a'],
85
+ },
86
+ });
87
+ (0, vitest_1.expect)(result).toMatchObject({
88
+ verified: true,
89
+ method: 'dns',
90
+ domain: 'opena2a.dev',
91
+ });
92
+ });
93
+ });
94
+ (0, vitest_1.describe)('TXT record formats', () => {
95
+ (0, vitest_1.it)('accepts hackmyagent-verify=publisher format', async () => {
96
+ const result = await (0, publisher_verifier_1.verifyPublisher)('acme', {
97
+ mockDnsRecords: {
98
+ 'acme.dev': ['hackmyagent-verify=acme'],
99
+ },
100
+ });
101
+ (0, vitest_1.expect)(result.verified).toBe(true);
102
+ });
103
+ (0, vitest_1.it)('accepts hackmyagent-publisher=publisher format', async () => {
104
+ const result = await (0, publisher_verifier_1.verifyPublisher)('acme', {
105
+ mockDnsRecords: {
106
+ 'acme.dev': ['hackmyagent-publisher=acme'],
107
+ },
108
+ });
109
+ (0, vitest_1.expect)(result.verified).toBe(true);
110
+ });
111
+ (0, vitest_1.it)('accepts opena2a-verify=publisher format (alias)', async () => {
112
+ const result = await (0, publisher_verifier_1.verifyPublisher)('acme', {
113
+ mockDnsRecords: {
114
+ 'acme.dev': ['opena2a-verify=acme'],
115
+ },
116
+ });
117
+ (0, vitest_1.expect)(result.verified).toBe(true);
118
+ });
119
+ (0, vitest_1.it)('ignores unrelated TXT records', async () => {
120
+ const result = await (0, publisher_verifier_1.verifyPublisher)('acme', {
121
+ mockDnsRecords: {
122
+ 'acme.dev': [
123
+ 'v=spf1 include:_spf.google.com ~all',
124
+ 'google-site-verification=abc123',
125
+ 'hackmyagent-verify=acme', // This one should match
126
+ ],
127
+ },
128
+ });
129
+ (0, vitest_1.expect)(result.verified).toBe(true);
130
+ });
131
+ (0, vitest_1.it)('is case-insensitive for record keys', async () => {
132
+ const result = await (0, publisher_verifier_1.verifyPublisher)('acme', {
133
+ mockDnsRecords: {
134
+ 'acme.dev': ['HackMyAgent-Verify=acme'],
135
+ },
136
+ });
137
+ (0, vitest_1.expect)(result.verified).toBe(true);
138
+ });
139
+ });
140
+ (0, vitest_1.describe)('verification result details', () => {
141
+ (0, vitest_1.it)('includes verification timestamp', async () => {
142
+ const before = new Date();
143
+ const result = await (0, publisher_verifier_1.verifyPublisher)('test', {
144
+ mockDnsRecords: {
145
+ 'test.dev': ['hackmyagent-verify=test'],
146
+ },
147
+ });
148
+ const after = new Date();
149
+ (0, vitest_1.expect)(result.verifiedAt).toBeDefined();
150
+ (0, vitest_1.expect)(result.verifiedAt.getTime()).toBeGreaterThanOrEqual(before.getTime());
151
+ (0, vitest_1.expect)(result.verifiedAt.getTime()).toBeLessThanOrEqual(after.getTime());
152
+ });
153
+ (0, vitest_1.it)('includes the matched TXT record', async () => {
154
+ const result = await (0, publisher_verifier_1.verifyPublisher)('test', {
155
+ mockDnsRecords: {
156
+ 'test.dev': ['hackmyagent-verify=test'],
157
+ },
158
+ });
159
+ (0, vitest_1.expect)(result.txtRecord).toBe('hackmyagent-verify=test');
160
+ });
161
+ (0, vitest_1.it)('returns failure reason when not verified', async () => {
162
+ const result = await (0, publisher_verifier_1.verifyPublisher)('unknown', {
163
+ mockDnsRecords: {},
164
+ });
165
+ (0, vitest_1.expect)(result.verified).toBe(false);
166
+ (0, vitest_1.expect)(result.failureReason).toBeDefined();
167
+ (0, vitest_1.expect)(result.failureReason).toContain('No valid TXT record found');
168
+ });
169
+ });
170
+ });
171
+ //# sourceMappingURL=publisher-verifier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher-verifier.test.js","sourceRoot":"","sources":["../../src/checker/publisher-verifier.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Skill identifier parser
3
+ * Parses skill identifiers like @publisher/skill, ./local/path, or GitHub URLs
4
+ */
5
+ export interface SkillIdentifier {
6
+ publisher?: string;
7
+ name: string;
8
+ version?: string;
9
+ source: 'registry' | 'local' | 'github';
10
+ path?: string;
11
+ url?: string;
12
+ }
13
+ export declare function parseSkillIdentifier(identifier: string): SkillIdentifier;
14
+ //# sourceMappingURL=skill-identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-identifier.d.ts","sourceRoot":"","sources":["../../src/checker/skill-identifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAmDxE"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Skill identifier parser
4
+ * Parses skill identifiers like @publisher/skill, ./local/path, or GitHub URLs
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.parseSkillIdentifier = parseSkillIdentifier;
8
+ function parseSkillIdentifier(identifier) {
9
+ const trimmed = identifier.trim();
10
+ if (!trimmed) {
11
+ throw new Error('Invalid skill identifier: empty string');
12
+ }
13
+ // GitHub URL
14
+ if (trimmed.startsWith('https://github.com/')) {
15
+ const match = trimmed.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)/);
16
+ if (!match) {
17
+ throw new Error('Invalid skill identifier: malformed GitHub URL');
18
+ }
19
+ return {
20
+ publisher: match[1],
21
+ name: match[2],
22
+ version: undefined,
23
+ source: 'github',
24
+ url: trimmed,
25
+ };
26
+ }
27
+ // Local path (relative or absolute)
28
+ if (trimmed.startsWith('./') || trimmed.startsWith('/')) {
29
+ const parts = trimmed.split('/');
30
+ const name = parts[parts.length - 1];
31
+ return {
32
+ publisher: undefined,
33
+ name,
34
+ version: undefined,
35
+ source: 'local',
36
+ path: trimmed,
37
+ };
38
+ }
39
+ // Scoped npm-style identifier @publisher/skill[@version]
40
+ if (trimmed.startsWith('@')) {
41
+ // Match @publisher/name or @publisher/name@version
42
+ const match = trimmed.match(/^@([^/]+)\/([^@]+)(?:@(.+))?$/);
43
+ if (!match || !match[1] || !match[2]) {
44
+ throw new Error('Invalid skill identifier: malformed scoped identifier');
45
+ }
46
+ return {
47
+ publisher: match[1],
48
+ name: match[2],
49
+ version: match[3],
50
+ source: 'registry',
51
+ };
52
+ }
53
+ throw new Error('Invalid skill identifier: unrecognized format');
54
+ }
55
+ //# sourceMappingURL=skill-identifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-identifier.js","sourceRoot":"","sources":["../../src/checker/skill-identifier.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAWH,oDAmDC;AAnDD,SAAgB,oBAAoB,CAAC,UAAkB;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAElC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,aAAa;IACb,IAAI,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACnB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,OAAO;SACb,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,IAAI;YACJ,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,mDAAmD;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACnB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-identifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-identifier.test.d.ts","sourceRoot":"","sources":["../../src/checker/skill-identifier.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const skill_identifier_1 = require("./skill-identifier");
5
+ (0, vitest_1.describe)('parseSkillIdentifier', () => {
6
+ (0, vitest_1.it)('parses scoped npm-style identifier @publisher/skill', () => {
7
+ const result = (0, skill_identifier_1.parseSkillIdentifier)('@opena2a/security');
8
+ (0, vitest_1.expect)(result).toEqual({
9
+ publisher: 'opena2a',
10
+ name: 'security',
11
+ version: undefined,
12
+ source: 'registry',
13
+ });
14
+ });
15
+ (0, vitest_1.it)('parses identifier with version @publisher/skill@1.0.0', () => {
16
+ const result = (0, skill_identifier_1.parseSkillIdentifier)('@opena2a/security@1.0.0');
17
+ (0, vitest_1.expect)(result).toEqual({
18
+ publisher: 'opena2a',
19
+ name: 'security',
20
+ version: '1.0.0',
21
+ source: 'registry',
22
+ });
23
+ });
24
+ (0, vitest_1.it)('parses local file path', () => {
25
+ const result = (0, skill_identifier_1.parseSkillIdentifier)('./skills/my-skill');
26
+ (0, vitest_1.expect)(result).toEqual({
27
+ publisher: undefined,
28
+ name: 'my-skill',
29
+ version: undefined,
30
+ source: 'local',
31
+ path: './skills/my-skill',
32
+ });
33
+ });
34
+ (0, vitest_1.it)('parses absolute file path', () => {
35
+ const result = (0, skill_identifier_1.parseSkillIdentifier)('/Users/dev/skills/custom');
36
+ (0, vitest_1.expect)(result).toEqual({
37
+ publisher: undefined,
38
+ name: 'custom',
39
+ version: undefined,
40
+ source: 'local',
41
+ path: '/Users/dev/skills/custom',
42
+ });
43
+ });
44
+ (0, vitest_1.it)('parses GitHub URL', () => {
45
+ const result = (0, skill_identifier_1.parseSkillIdentifier)('https://github.com/opena2a/my-skill');
46
+ (0, vitest_1.expect)(result).toEqual({
47
+ publisher: 'opena2a',
48
+ name: 'my-skill',
49
+ version: undefined,
50
+ source: 'github',
51
+ url: 'https://github.com/opena2a/my-skill',
52
+ });
53
+ });
54
+ (0, vitest_1.it)('throws on invalid identifier', () => {
55
+ (0, vitest_1.expect)(() => (0, skill_identifier_1.parseSkillIdentifier)('')).toThrow('Invalid skill identifier');
56
+ (0, vitest_1.expect)(() => (0, skill_identifier_1.parseSkillIdentifier)(' ')).toThrow('Invalid skill identifier');
57
+ });
58
+ (0, vitest_1.it)('throws on malformed scoped identifier', () => {
59
+ (0, vitest_1.expect)(() => (0, skill_identifier_1.parseSkillIdentifier)('@')).toThrow('Invalid skill identifier');
60
+ (0, vitest_1.expect)(() => (0, skill_identifier_1.parseSkillIdentifier)('@publisher')).toThrow('Invalid skill identifier');
61
+ (0, vitest_1.expect)(() => (0, skill_identifier_1.parseSkillIdentifier)('@/skill')).toThrow('Invalid skill identifier');
62
+ });
63
+ });
64
+ //# sourceMappingURL=skill-identifier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-identifier.test.js","sourceRoot":"","sources":["../../src/checker/skill-identifier.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hardening module
3
+ */
4
+ export { HardeningScanner } from './scanner';
5
+ export type { ScanOptions } from './scanner';
6
+ export type { SecurityCheck, CheckResult, FixResult, SecurityFinding, ScanResult, Severity, } from './security-check';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hardening/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,YAAY,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,eAAe,EACf,UAAU,EACV,QAAQ,GACT,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Hardening module
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HardeningScanner = void 0;
7
+ var scanner_1 = require("./scanner");
8
+ Object.defineProperty(exports, "HardeningScanner", { enumerable: true, get: function () { return scanner_1.HardeningScanner; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hardening/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Hardening Scanner
3
+ * Scans for security issues and optionally auto-fixes them
4
+ */
5
+ import type { ScanResult } from './security-check';
6
+ export interface ScanOptions {
7
+ targetDir: string;
8
+ autoFix?: boolean;
9
+ /** Preview fixes without applying them */
10
+ dryRun?: boolean;
11
+ /** Check IDs to ignore (e.g., ['CRED-001', 'GIT-002']) */
12
+ ignore?: string[];
13
+ /** File/folder paths to ignore (e.g., ['.env', 'secrets/', 'test/']) */
14
+ ignorePaths?: string[];
15
+ }
16
+ export declare class HardeningScanner {
17
+ private static readonly BACKUP_FILES;
18
+ scan(options: ScanOptions): Promise<ScanResult>;
19
+ private detectPlatform;
20
+ private checkCredentialExposure;
21
+ private checkClaudeMd;
22
+ private checkMcpConfig;
23
+ private checkFilePermissions;
24
+ private checkGitSecurity;
25
+ private checkNetworkSecurity;
26
+ private checkMcpAdvanced;
27
+ private checkClaudeAdvanced;
28
+ private checkCursorConfig;
29
+ private checkVscodeConfig;
30
+ private checkCredentialsAdvanced;
31
+ private checkPermissionsAdvanced;
32
+ private checkEnvironmentSecurity;
33
+ private checkLoggingSecurity;
34
+ private checkDependencySecurity;
35
+ private checkAuthSecurity;
36
+ private checkProcessSecurity;
37
+ private checkClaudeExtended;
38
+ private checkMcpExtended;
39
+ private checkNetworkExtended;
40
+ private checkAPISecurity;
41
+ private checkSecretManagement;
42
+ private checkIOSecurity;
43
+ /**
44
+ * Prompt injection defense checks
45
+ */
46
+ private checkPromptSecurity;
47
+ /**
48
+ * Input validation and sanitization checks
49
+ */
50
+ private checkInputValidation;
51
+ /**
52
+ * Rate limiting and throttling checks
53
+ */
54
+ private checkRateLimiting;
55
+ /**
56
+ * Session and timeout security checks
57
+ */
58
+ private checkSessionSecurity;
59
+ /**
60
+ * Data encryption checks
61
+ */
62
+ private checkEncryption;
63
+ /**
64
+ * Audit trail and logging security checks
65
+ */
66
+ private checkAuditTrail;
67
+ /**
68
+ * Process isolation and sandboxing checks
69
+ */
70
+ private checkSandboxing;
71
+ /**
72
+ * MCP tool permission boundary checks
73
+ */
74
+ private checkToolBoundaries;
75
+ private calculateScore;
76
+ /**
77
+ * Create a backup of files that may be modified during auto-fix
78
+ */
79
+ private createBackup;
80
+ /**
81
+ * Rollback to the most recent backup
82
+ */
83
+ rollback(targetDir: string): Promise<void>;
84
+ }
85
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/hardening/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,kBAAkB,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAoCD,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAelC;IAEI,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YAuLvC,cAAc;YA8Bd,uBAAuB;YA0GvB,aAAa;YAgDb,cAAc;YAkHd,oBAAoB;YAwDpB,gBAAgB;YA4IhB,oBAAoB;YA6EpB,gBAAgB;YAqIhB,mBAAmB;YAsEnB,iBAAiB;YAyCjB,iBAAiB;YA+DjB,wBAAwB;YA0FxB,wBAAwB;YAmExB,wBAAwB;YAqHxB,oBAAoB;YA+GpB,uBAAuB;YA8HvB,iBAAiB;YA8GjB,oBAAoB;YAuGpB,mBAAmB;YAiGnB,gBAAgB;YAmIhB,oBAAoB;YAoIpB,gBAAgB;YAyHhB,qBAAqB;YA+GrB,eAAe;IAiI7B;;OAEG;YACW,mBAAmB;IA8GjC;;OAEG;YACW,oBAAoB;IAiKlC;;OAEG;YACW,iBAAiB;IA4I/B;;OAEG;YACW,oBAAoB;IAwIlC;;OAEG;YACW,eAAe;IAqJ7B;;OAEG;YACW,eAAe;IAuI7B;;OAEG;YACW,eAAe;IAyG7B;;OAEG;YACW,mBAAmB;IAmHjC,OAAO,CAAC,cAAc;IAuBtB;;OAEG;YACW,YAAY;IAkD1B;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4DjD"}