project-shield 1.1.5 → 2.0.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -4
  3. package/dist/auditor/checks/environment.d.ts +7 -0
  4. package/dist/auditor/checks/environment.d.ts.map +1 -0
  5. package/dist/auditor/checks/environment.js +463 -0
  6. package/dist/auditor/checks/environment.js.map +1 -0
  7. package/dist/auditor/checks/hooks.d.ts +13 -0
  8. package/dist/auditor/checks/hooks.d.ts.map +1 -0
  9. package/dist/auditor/checks/hooks.js +234 -0
  10. package/dist/auditor/checks/hooks.js.map +1 -0
  11. package/dist/auditor/engine.d.ts +7 -0
  12. package/dist/auditor/engine.d.ts.map +1 -0
  13. package/dist/auditor/engine.js +183 -0
  14. package/dist/auditor/engine.js.map +1 -0
  15. package/dist/auditor/providers/claude-code.d.ts +17 -0
  16. package/dist/auditor/providers/claude-code.d.ts.map +1 -0
  17. package/dist/auditor/providers/claude-code.js +176 -0
  18. package/dist/auditor/providers/claude-code.js.map +1 -0
  19. package/dist/auditor/providers/types.d.ts +36 -0
  20. package/dist/auditor/providers/types.d.ts.map +1 -0
  21. package/dist/auditor/providers/types.js +4 -0
  22. package/dist/auditor/providers/types.js.map +1 -0
  23. package/dist/index.js +99 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/license/gate.d.ts +3 -0
  26. package/dist/license/gate.d.ts.map +1 -1
  27. package/dist/license/gate.js +9 -0
  28. package/dist/license/gate.js.map +1 -1
  29. package/dist/license/index.d.ts +1 -1
  30. package/dist/license/index.d.ts.map +1 -1
  31. package/dist/license/index.js +3 -1
  32. package/dist/license/index.js.map +1 -1
  33. package/dist/license/storage.d.ts.map +1 -1
  34. package/dist/license/storage.js +5 -0
  35. package/dist/license/storage.js.map +1 -1
  36. package/dist/license/types.d.ts +5 -0
  37. package/dist/license/types.d.ts.map +1 -1
  38. package/dist/license/usage.d.ts +12 -0
  39. package/dist/license/usage.d.ts.map +1 -1
  40. package/dist/license/usage.js +47 -2
  41. package/dist/license/usage.js.map +1 -1
  42. package/dist/output/audit-evidence.d.ts +10 -0
  43. package/dist/output/audit-evidence.d.ts.map +1 -0
  44. package/dist/output/audit-evidence.js +82 -0
  45. package/dist/output/audit-evidence.js.map +1 -0
  46. package/dist/output/audit-fixit.d.ts +34 -0
  47. package/dist/output/audit-fixit.d.ts.map +1 -0
  48. package/dist/output/audit-fixit.js +267 -0
  49. package/dist/output/audit-fixit.js.map +1 -0
  50. package/dist/output/audit-terminal.d.ts +15 -0
  51. package/dist/output/audit-terminal.d.ts.map +1 -0
  52. package/dist/output/audit-terminal.js +200 -0
  53. package/dist/output/audit-terminal.js.map +1 -0
  54. package/dist/retention/expiry.d.ts +13 -0
  55. package/dist/retention/expiry.d.ts.map +1 -0
  56. package/dist/retention/expiry.js +37 -0
  57. package/dist/retention/expiry.js.map +1 -0
  58. package/dist/retention/hash-detect.d.ts +12 -0
  59. package/dist/retention/hash-detect.d.ts.map +1 -0
  60. package/dist/retention/hash-detect.js +29 -0
  61. package/dist/retention/hash-detect.js.map +1 -0
  62. package/dist/retention/storage.d.ts +17 -0
  63. package/dist/retention/storage.d.ts.map +1 -0
  64. package/dist/retention/storage.js +79 -0
  65. package/dist/retention/storage.js.map +1 -0
  66. package/dist/types/audit.d.ts +77 -0
  67. package/dist/types/audit.d.ts.map +1 -0
  68. package/dist/types/audit.js +4 -0
  69. package/dist/types/audit.js.map +1 -0
  70. package/package.json +17 -5
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ // ─── Settings Hash Change Detection ─────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.detectHashChange = detectHashChange;
5
+ const storage_js_1 = require("./storage.js");
6
+ /**
7
+ * Compare stored settings hash with current hash.
8
+ * Returns change detection result.
9
+ */
10
+ function detectHashChange(projectDir, currentHash) {
11
+ const state = (0, storage_js_1.readAuditState)(projectDir);
12
+ if (!state || !state.settingsHash) {
13
+ return {
14
+ hasChanged: false,
15
+ previousHash: '',
16
+ currentHash,
17
+ };
18
+ }
19
+ const hasChanged = state.settingsHash !== currentHash && currentHash !== '';
20
+ return {
21
+ hasChanged,
22
+ previousHash: state.settingsHash,
23
+ currentHash,
24
+ message: hasChanged
25
+ ? 'Claude Code settings have changed since last audit. Run `project-shield audit` to re-check.'
26
+ : undefined,
27
+ };
28
+ }
29
+ //# sourceMappingURL=hash-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-detect.js","sourceRoot":"","sources":["../../src/retention/hash-detect.ts"],"names":[],"mappings":";AAAA,+DAA+D;;AAe/D,4CAwBC;AArCD,6CAA8C;AAS9C;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,UAAkB,EAClB,WAAmB;IAEnB,MAAM,KAAK,GAAG,IAAA,2BAAc,EAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,EAAE;YAChB,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,KAAK,WAAW,IAAI,WAAW,KAAK,EAAE,CAAC;IAE5E,OAAO;QACL,UAAU;QACV,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW;QACX,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,6FAA6F;YAC/F,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface AuditState {
2
+ lastAuditAt: string;
3
+ settingsHash: string;
4
+ score: number;
5
+ grade: string;
6
+ findingsCount: number;
7
+ criticalCount: number;
8
+ }
9
+ /**
10
+ * Read audit state for a project. Returns null if not found or corrupted.
11
+ */
12
+ export declare function readAuditState(projectDir: string): AuditState | null;
13
+ /**
14
+ * Write audit state for a project.
15
+ */
16
+ export declare function writeAuditState(projectDir: string, state: AuditState): void;
17
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/retention/storage.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAWpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAI3E"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ // ─── Retention Storage ──────────────────────────────────────
3
+ // Stores audit state per-project in .claude/.shield/audit-state.json
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.readAuditState = readAuditState;
39
+ exports.writeAuditState = writeAuditState;
40
+ const fs = __importStar(require("node:fs"));
41
+ const path = __importStar(require("node:path"));
42
+ const STATE_DIR = '.claude/.shield';
43
+ const STATE_FILE = 'audit-state.json';
44
+ function getStatePath(projectDir) {
45
+ return path.join(projectDir, STATE_DIR, STATE_FILE);
46
+ }
47
+ function ensureStateDir(projectDir) {
48
+ const dir = path.join(projectDir, STATE_DIR);
49
+ if (!fs.existsSync(dir)) {
50
+ fs.mkdirSync(dir, { recursive: true });
51
+ }
52
+ }
53
+ /**
54
+ * Read audit state for a project. Returns null if not found or corrupted.
55
+ */
56
+ function readAuditState(projectDir) {
57
+ try {
58
+ const filePath = getStatePath(projectDir);
59
+ if (!fs.existsSync(filePath))
60
+ return null;
61
+ const raw = fs.readFileSync(filePath, 'utf-8');
62
+ const data = JSON.parse(raw);
63
+ if (!data.lastAuditAt || typeof data.settingsHash !== 'string')
64
+ return null;
65
+ return data;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Write audit state for a project.
73
+ */
74
+ function writeAuditState(projectDir, state) {
75
+ ensureStateDir(projectDir);
76
+ const filePath = getStatePath(projectDir);
77
+ fs.writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');
78
+ }
79
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/retention/storage.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,qEAAqE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BrE,wCAWC;AAKD,0CAIC;AAjDD,4CAA8B;AAC9B,gDAAkC;AAWlC,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAEtC,SAAS,YAAY,CAAC,UAAkB;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,UAAkB;IAC/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,UAAkB,EAAE,KAAiB;IACnE,cAAc,CAAC,UAAU,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,77 @@
1
+ export type AuditSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
2
+ export type AuditTier = 'free' | 'pro';
3
+ export interface AuditFinding {
4
+ id: string;
5
+ title: string;
6
+ description: string;
7
+ severity: AuditSeverity;
8
+ tier: AuditTier;
9
+ category: 'environment' | 'hooks';
10
+ remediation: string;
11
+ evidence?: string;
12
+ }
13
+ export interface AuditScore {
14
+ total: number;
15
+ grade: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
16
+ breakdown: {
17
+ environment: number;
18
+ hooks: number;
19
+ };
20
+ }
21
+ export interface AuditResult {
22
+ environment: AuditFinding[];
23
+ hooks: AuditFinding[];
24
+ score: AuditScore;
25
+ summary: {
26
+ total: number;
27
+ critical: number;
28
+ high: number;
29
+ medium: number;
30
+ low: number;
31
+ info: number;
32
+ freeVisible: number;
33
+ proOnly: number;
34
+ };
35
+ settingsHash: string;
36
+ scannedAt: string;
37
+ projectDir: string;
38
+ }
39
+ export interface AuditConfig {
40
+ projectDir?: string;
41
+ format?: 'terminal' | 'json';
42
+ fix?: boolean;
43
+ evidencePath?: string;
44
+ }
45
+ export interface AuditEvidencePack {
46
+ version: string;
47
+ generatedAt: string;
48
+ result: AuditResult;
49
+ config: AuditConfig;
50
+ environment?: {
51
+ hostname: string;
52
+ platform: string;
53
+ nodeVersion: string;
54
+ };
55
+ fixitSummary?: {
56
+ totalCritical: number;
57
+ totalWarning: number;
58
+ totalInfo: number;
59
+ guidesAvailable: number;
60
+ };
61
+ fixitGuides?: Array<{
62
+ id: string;
63
+ severity: string;
64
+ title: string;
65
+ description: string;
66
+ steps: string[];
67
+ command?: string;
68
+ references?: string[];
69
+ }>;
70
+ integrity?: {
71
+ auditHash: string;
72
+ generatorVersion: string;
73
+ };
74
+ disclaimer?: string;
75
+ }
76
+ export type RetentionState = 'active' | 'stale' | 'expired';
77
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/types/audit.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAC5E,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACzC,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,CAAC,EAAE;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // ─── Audit Types (F008 + F009) ──────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/types/audit.ts"],"names":[],"mappings":";AAAA,+DAA+D"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "project-shield",
3
- "version": "1.1.5",
4
- "description": "Security scanner for AI coders and MCP users — detects API keys, secrets, and PII",
3
+ "version": "2.0.0",
4
+ "description": "Security scanner for AI coders and MCP users — secrets, PII, injection, and Claude Code environment audit",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
7
7
  "project-shield": "dist/index.js"
@@ -17,7 +17,8 @@
17
17
  },
18
18
  "files": [
19
19
  "dist/",
20
- "rules/"
20
+ "rules/",
21
+ "LICENSE"
21
22
  ],
22
23
  "keywords": [
23
24
  "security",
@@ -29,10 +30,21 @@
29
30
  "prompt-injection",
30
31
  "ai-security",
31
32
  "claude",
32
- "llm"
33
+ "llm",
34
+ "audit",
35
+ "environment-security",
36
+ "hooks"
33
37
  ],
34
- "author": "",
38
+ "author": "ShovelMaker91",
35
39
  "license": "MIT",
40
+ "homepage": "https://github.com/Whitening-Sinabro/project-shield#readme",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/Whitening-Sinabro/project-shield.git"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/Whitening-Sinabro/project-shield/issues"
47
+ },
36
48
  "type": "commonjs",
37
49
  "dependencies": {
38
50
  "chalk": "^5.6.2",