project-shield 1.0.1 → 1.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 (42) hide show
  1. package/dist/index.js +62 -20
  2. package/dist/index.js.map +1 -1
  3. package/dist/license/commands.d.ts +17 -0
  4. package/dist/license/commands.d.ts.map +1 -0
  5. package/dist/license/commands.js +154 -0
  6. package/dist/license/commands.js.map +1 -0
  7. package/dist/license/gate.d.ts +14 -0
  8. package/dist/license/gate.d.ts.map +1 -0
  9. package/dist/license/gate.js +35 -0
  10. package/dist/license/gate.js.map +1 -0
  11. package/dist/license/http.d.ts +7 -0
  12. package/dist/license/http.d.ts.map +1 -0
  13. package/dist/license/http.js +89 -0
  14. package/dist/license/http.js.map +1 -0
  15. package/dist/license/index.d.ts +6 -0
  16. package/dist/license/index.d.ts.map +1 -0
  17. package/dist/license/index.js +20 -0
  18. package/dist/license/index.js.map +1 -0
  19. package/dist/license/storage.d.ts +31 -0
  20. package/dist/license/storage.d.ts.map +1 -0
  21. package/dist/license/storage.js +138 -0
  22. package/dist/license/storage.js.map +1 -0
  23. package/dist/license/types.d.ts +55 -0
  24. package/dist/license/types.d.ts.map +1 -0
  25. package/dist/license/types.js +4 -0
  26. package/dist/license/types.js.map +1 -0
  27. package/dist/license/usage.d.ts +22 -0
  28. package/dist/license/usage.d.ts.map +1 -0
  29. package/dist/license/usage.js +60 -0
  30. package/dist/license/usage.js.map +1 -0
  31. package/dist/license/validator.d.ts +28 -0
  32. package/dist/license/validator.d.ts.map +1 -0
  33. package/dist/license/validator.js +108 -0
  34. package/dist/license/validator.js.map +1 -0
  35. package/dist/output/terminal.d.ts +8 -2
  36. package/dist/output/terminal.d.ts.map +1 -1
  37. package/dist/output/terminal.js +21 -2
  38. package/dist/output/terminal.js.map +1 -1
  39. package/dist/scanner/engine.d.ts.map +1 -1
  40. package/dist/scanner/engine.js +19 -0
  41. package/dist/scanner/engine.js.map +1 -1
  42. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -46,6 +46,10 @@ const terminal_js_1 = require("./output/terminal.js");
46
46
  const fixit_js_1 = require("./output/fixit.js");
47
47
  const evidence_js_1 = require("./output/evidence.js");
48
48
  const failsafe_js_1 = require("./integrity/failsafe.js");
49
+ const validator_js_1 = require("./license/validator.js");
50
+ const usage_js_1 = require("./license/usage.js");
51
+ const gate_js_1 = require("./license/gate.js");
52
+ const commands_js_1 = require("./license/commands.js");
49
53
  const program = new commander_1.Command();
50
54
  program
51
55
  .name('project-shield')
@@ -59,11 +63,22 @@ program
59
63
  .option('-i, --ignore <path>', 'Path to .shieldignore file')
60
64
  .option('-r, --ruleset <path>', 'Path to ruleset JSON file')
61
65
  .option('-b, --badge <path>', 'Output path for SVG badge', '')
62
- .option('--pro', 'Generate Pro badge (no watermark)', false)
63
66
  .option('--fix', 'Show fix-it remediation guides', false)
64
67
  .option('--evidence <path>', 'Output path for evidence pack (JSON + PDF)')
65
68
  .action(async (targetPath, options) => {
66
69
  try {
70
+ // ─── License validation ───────────────────────────────
71
+ const tier = await (0, validator_js_1.validateLicense)();
72
+ const gate = (0, gate_js_1.getFeatureGate)(tier);
73
+ // Check scan limit
74
+ const scanCheck = (0, usage_js_1.canScan)(tier);
75
+ if (!scanCheck.allowed) {
76
+ console.error(`Error: ${scanCheck.reason}`);
77
+ process.exit(1);
78
+ }
79
+ // Show tier header
80
+ const tierLabel = tier.isPro ? '\x1b[32mPro\x1b[0m' : 'Free';
81
+ console.log(`Tier: ${tierLabel} (${tier.scansUsed}/${tier.maxScans} scans)`);
67
82
  const resolvedPath = path.resolve(targetPath);
68
83
  const format = options.format;
69
84
  // Load ruleset info for display
@@ -77,39 +92,44 @@ program
77
92
  // Calculate score and lock status
78
93
  const score = (0, score_js_1.calculateScore)(result);
79
94
  const lockStatus = (0, lock_js_1.getLockStatus)(score);
80
- const seal = (0, seal_js_1.sealResult)(result, score, ruleset.version, { isPro: options.pro });
95
+ const seal = (0, seal_js_1.sealResult)(result, score, ruleset.version, { isPro: gate.canGenerateSealUUID });
81
96
  if (format === 'json') {
82
- const jsonObj = JSON.parse((0, terminal_js_1.formatJsonOutput)(result, score, seal));
97
+ const jsonObj = JSON.parse((0, terminal_js_1.formatJsonOutput)(result, score, seal, { isPro: gate.isPro }));
83
98
  if (options.fix) {
84
- const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro: options.pro });
85
- jsonObj.fixit = (0, fixit_js_1.formatFixitJson)(guides, options.pro);
99
+ const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro: gate.canSeeFullFixit });
100
+ jsonObj.fixit = (0, fixit_js_1.formatFixitJson)(guides, gate.canSeeFullFixit);
86
101
  }
87
102
  console.log(JSON.stringify(jsonObj, null, 2));
88
103
  }
89
104
  else {
90
- console.log((0, terminal_js_1.formatTerminalOutput)(result, ruleset.version, ruleset.sha256, score, lockStatus));
105
+ console.log((0, terminal_js_1.formatTerminalOutput)(result, ruleset.version, ruleset.sha256, score, lockStatus, { isPro: gate.isPro }));
91
106
  if (options.fix) {
92
- const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro: options.pro });
93
- console.log((0, fixit_js_1.formatFixitTerminal)(guides, options.pro));
107
+ const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro: gate.canSeeFullFixit });
108
+ console.log((0, fixit_js_1.formatFixitTerminal)(guides, gate.canSeeFullFixit));
94
109
  }
95
110
  }
96
- // Evidence Pack generation
111
+ // Evidence Pack generation (Pro only)
97
112
  if (options.evidence) {
98
- const evidencePath = path.resolve(options.evidence);
99
- const pack = (0, evidence_js_1.generateEvidenceJSON)(result, score, lockStatus, seal, {
100
- scanTarget: resolvedPath,
101
- rulesetHash: ruleset.sha256,
102
- rulesetVersion: ruleset.version,
103
- });
104
- (0, evidence_js_1.saveEvidenceJSON)(pack, `${evidencePath}.json`);
105
- console.log(`Evidence JSON saved to: ${evidencePath}.json`);
106
- await (0, evidence_js_1.generateEvidencePDF)(pack, `${evidencePath}.pdf`);
107
- console.log(`Evidence PDF saved to: ${evidencePath}.pdf`);
113
+ if (!gate.canGenerateEvidence) {
114
+ console.error('Error: Evidence Pack is a Pro feature. Upgrade: https://project-shield.dev/pro');
115
+ }
116
+ else {
117
+ const evidencePath = path.resolve(options.evidence);
118
+ const pack = (0, evidence_js_1.generateEvidenceJSON)(result, score, lockStatus, seal, {
119
+ scanTarget: resolvedPath,
120
+ rulesetHash: ruleset.sha256,
121
+ rulesetVersion: ruleset.version,
122
+ });
123
+ (0, evidence_js_1.saveEvidenceJSON)(pack, `${evidencePath}.json`);
124
+ console.log(`Evidence JSON saved to: ${evidencePath}.json`);
125
+ await (0, evidence_js_1.generateEvidencePDF)(pack, `${evidencePath}.pdf`);
126
+ console.log(`Evidence PDF saved to: ${evidencePath}.pdf`);
127
+ }
108
128
  }
109
129
  // Badge generation
110
130
  if (options.badge) {
111
131
  try {
112
- const svg = (0, badge_js_1.generateBadge)(score, lockStatus, { isPro: options.pro });
132
+ const svg = (0, badge_js_1.generateBadge)(score, lockStatus, { isPro: gate.canSeeCleanBadge });
113
133
  const badgePath = path.resolve(options.badge);
114
134
  (0, badge_js_1.saveBadge)(svg, badgePath);
115
135
  console.log(`Badge saved to: ${badgePath}`);
@@ -123,6 +143,8 @@ program
123
143
  }
124
144
  }
125
145
  }
146
+ // Record the scan AFTER successful completion
147
+ (0, usage_js_1.recordScan)();
126
148
  // Exit with code 1 if critical findings
127
149
  const hasCritical = result.summary.critical > 0 ||
128
150
  result.summary.confirmedPii > 0 ||
@@ -147,5 +169,25 @@ program
147
169
  process.exit(1);
148
170
  }
149
171
  });
172
+ // ─── License commands ─────────────────────────────────────────
173
+ program
174
+ .command('activate')
175
+ .description('Activate a Pro license key')
176
+ .argument('<key>', 'License key (PSH-XXXX-XXXX-XXXX-XXXX)')
177
+ .action(async (key) => {
178
+ await (0, commands_js_1.activateCommand)(key);
179
+ });
180
+ program
181
+ .command('deactivate')
182
+ .description('Deactivate the current license')
183
+ .action(async () => {
184
+ await (0, commands_js_1.deactivateCommand)();
185
+ });
186
+ program
187
+ .command('status')
188
+ .description('Show license and usage status')
189
+ .action(async () => {
190
+ await (0, commands_js_1.statusCommand)();
191
+ });
150
192
  program.parse();
151
193
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,gDAAkC;AAClC,mDAA2C;AAC3C,uDAAqD;AACrD,iDAAoD;AACpD,+CAAkD;AAClD,iDAAiD;AACjD,gDAA+E;AAC/E,sDAA8E;AAC9E,gDAAyF;AACzF,sDAAmG;AACnG,yDAIiC;AACjC,yDAAyD;AACzD,iDAAyD;AACzD,+CAAmD;AACnD,uDAA0F;AAE1F,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0DAA0D,CAAC;KACvE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;KAClC,MAAM,CAAC,uBAAuB,EAAE,kCAAkC,EAAE,UAAU,CAAC;KAC/E,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;KAC3D,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,CAAC;KAC3D,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,EAAE,CAAC;KAC7D,MAAM,CAAC,OAAO,EAAE,gCAAgC,EAAE,KAAK,CAAC;KACxD,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;KACzE,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAOlC,EAAE,EAAE;IACH,IAAI,CAAC;QACH,yDAAyD;QACzD,MAAM,IAAI,GAAG,MAAM,IAAA,8BAAe,GAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAA,wBAAc,EAAC,IAAI,CAAC,CAAC;QAElC,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,UAAU,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,SAAS,CAAC,CAAC;QAE7E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAA6B,CAAC;QAErD,gCAAgC;QAChC,MAAM,OAAO,GAAG,IAAA,wBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,IAAA,gBAAI,EAAC;YACxB,UAAU,EAAE,YAAY;YACxB,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B,CAAC,CAAC;QAEH,kCAAkC;QAClC,MAAM,KAAK,GAAG,IAAA,yBAAc,EAAC,MAAM,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,IAAA,uBAAa,EAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAA,oBAAU,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAE7F,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,OAAO,GAA4B,IAAI,CAAC,KAAK,CACjD,IAAA,8BAAgB,EAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAC7D,CAAC;YACF,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,IAAA,yBAAc,EAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;gBACvE,OAAO,CAAC,KAAK,GAAG,IAAA,0BAAe,EAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAA,kCAAoB,EAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACrH,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,IAAA,yBAAc,EAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,IAAA,8BAAmB,EAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;YAClG,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpD,MAAM,IAAI,GAAG,IAAA,kCAAoB,EAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;oBACjE,UAAU,EAAE,YAAY;oBACxB,WAAW,EAAE,OAAO,CAAC,MAAM;oBAC3B,cAAc,EAAE,OAAO,CAAC,OAAO;iBAChC,CAAC,CAAC;gBACH,IAAA,8BAAgB,EAAC,IAAI,EAAE,GAAG,YAAY,OAAO,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,2BAA2B,YAAY,OAAO,CAAC,CAAC;gBAC5D,MAAM,IAAA,iCAAmB,EAAC,IAAI,EAAE,GAAG,YAAY,MAAM,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,0BAA0B,YAAY,MAAM,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAA,wBAAa,EAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC9C,IAAA,oBAAS,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,2BAAgB,EAAE,CAAC;oBACtC,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,IAAA,qBAAU,GAAE,CAAC;QAEb,wCAAwC;QACxC,MAAM,WAAW,GACf,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,kCAAoB,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,YAAY,mCAAqB,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,YAAY,6BAAe,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,iEAAiE;AAEjE,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,4BAA4B,CAAC;KACzC,QAAQ,CAAC,OAAO,EAAE,uCAAuC,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;IAC5B,MAAM,IAAA,6BAAe,EAAC,GAAG,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,+BAAiB,GAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,2BAAa,GAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Generate a machine ID from hostname + username + platform.
3
+ */
4
+ export declare function getMachineId(): string;
5
+ /**
6
+ * Activate a license key.
7
+ */
8
+ export declare function activateCommand(key: string): Promise<void>;
9
+ /**
10
+ * Deactivate the current license.
11
+ */
12
+ export declare function deactivateCommand(): Promise<void>;
13
+ /**
14
+ * Show current license status.
15
+ */
16
+ export declare function statusCommand(): Promise<void>;
17
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/license/commands.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBvD;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBnD"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getMachineId = getMachineId;
37
+ exports.activateCommand = activateCommand;
38
+ exports.deactivateCommand = deactivateCommand;
39
+ exports.statusCommand = statusCommand;
40
+ const crypto = __importStar(require("node:crypto"));
41
+ const os = __importStar(require("node:os"));
42
+ const validator_js_1 = require("./validator.js");
43
+ const storage_js_1 = require("./storage.js");
44
+ const usage_js_1 = require("./usage.js");
45
+ const http_js_1 = require("./http.js");
46
+ const API_BASE = 'https://license.project-shield.dev/api/v1';
47
+ const colors = {
48
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
49
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
50
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
51
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
52
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
53
+ dim: (s) => `\x1b[2m${s}\x1b[0m`,
54
+ };
55
+ /**
56
+ * Generate a machine ID from hostname + username + platform.
57
+ */
58
+ function getMachineId() {
59
+ const raw = `${os.hostname()}${os.userInfo().username}${process.platform}`;
60
+ return crypto.createHash('sha256').update(raw).digest('hex').substring(0, 16);
61
+ }
62
+ /**
63
+ * Activate a license key.
64
+ */
65
+ async function activateCommand(key) {
66
+ // 1. Key format validation
67
+ if (!(0, validator_js_1.isValidKeyFormat)(key)) {
68
+ console.error(colors.red('Invalid license key format.'));
69
+ console.error(colors.dim('Expected: PSH-XXXX-XXXX-XXXX-XXXX'));
70
+ return;
71
+ }
72
+ // 2. Server activation
73
+ const machineId = getMachineId();
74
+ try {
75
+ const response = await (0, http_js_1.postJSON)(`${API_BASE}/activate`, {
76
+ key,
77
+ machineId,
78
+ });
79
+ if (response.success && response.license) {
80
+ // 3. Save license file
81
+ const now = new Date();
82
+ const validUntil = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
83
+ (0, storage_js_1.writeLicenseFile)({
84
+ cache: {
85
+ license: response.license,
86
+ validatedAt: now.toISOString(),
87
+ validUntil: validUntil.toISOString(),
88
+ },
89
+ });
90
+ console.log(colors.green('License activated successfully!'));
91
+ console.log(` Tier: ${colors.bold(response.license.tier.toUpperCase())}`);
92
+ console.log(` Email: ${response.license.email}`);
93
+ console.log(` Expires: ${response.license.expiresAt}`);
94
+ console.log(` Scans/month: ${response.license.maxScansPerMonth}`);
95
+ }
96
+ else {
97
+ console.error(colors.red(`Activation failed: ${response.error ?? 'Unknown error'}`));
98
+ }
99
+ }
100
+ catch (err) {
101
+ console.error(colors.red('Could not reach license server.'));
102
+ console.error(colors.dim(err instanceof Error ? err.message : String(err)));
103
+ }
104
+ }
105
+ /**
106
+ * Deactivate the current license.
107
+ */
108
+ async function deactivateCommand() {
109
+ const file = (0, storage_js_1.readLicenseFile)();
110
+ if (!file) {
111
+ console.log(colors.yellow('No active license found.'));
112
+ return;
113
+ }
114
+ const machineId = getMachineId();
115
+ try {
116
+ await (0, http_js_1.postJSON)(`${API_BASE}/deactivate`, {
117
+ key: file.cache.license.key,
118
+ machineId,
119
+ });
120
+ }
121
+ catch {
122
+ // Server unreachable — still remove local license
123
+ }
124
+ (0, storage_js_1.deleteLicenseFile)();
125
+ console.log(colors.green('License deactivated. Reverted to Free tier.'));
126
+ }
127
+ /**
128
+ * Show current license status.
129
+ */
130
+ async function statusCommand() {
131
+ const tier = await (0, validator_js_1.validateLicense)();
132
+ const monthKey = (0, usage_js_1.getCurrentMonthKey)();
133
+ const usage = (0, usage_js_1.getUsageForMonth)(monthKey);
134
+ const file = (0, storage_js_1.readLicenseFile)();
135
+ console.log('');
136
+ console.log(colors.bold('Project Shield — License Status'));
137
+ console.log('');
138
+ console.log(` Tier: ${tier.isPro ? colors.green('Pro') : 'Free'}`);
139
+ console.log(` Scans: ${usage.scanCount}/${tier.maxScans} this month (${tier.scansRemaining} remaining)`);
140
+ console.log(` Source: ${tier.source === 'license' ? 'License key' : 'Default (no key)'}`);
141
+ if (file) {
142
+ const cache = file.cache;
143
+ console.log(` Key: ${cache.license.key.substring(0, 8)}...`);
144
+ console.log(` Email: ${cache.license.email}`);
145
+ console.log(` Expires: ${cache.license.expiresAt}`);
146
+ console.log(` Cache: Valid until ${cache.validUntil}`);
147
+ }
148
+ else {
149
+ console.log('');
150
+ console.log(colors.dim(' Activate a Pro license: project-shield activate PSH-XXXX-XXXX-XXXX-XXXX'));
151
+ }
152
+ console.log('');
153
+ }
154
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/license/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TierStatus, FeatureGate } from './types.js';
2
+ /**
3
+ * Determine feature access based on tier status.
4
+ *
5
+ * | Feature | Free | Pro |
6
+ * |-------------------|-------|------|
7
+ * | evidence | false | true |
8
+ * | piiDetails | false | true |
9
+ * | cleanBadge | false | true |
10
+ * | fullFixit | false | true |
11
+ * | sealUUID | false | true |
12
+ */
13
+ export declare function getFeatureGate(tier: TierStatus): FeatureGate;
14
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/license/gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAoB5D"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFeatureGate = getFeatureGate;
4
+ /**
5
+ * Determine feature access based on tier status.
6
+ *
7
+ * | Feature | Free | Pro |
8
+ * |-------------------|-------|------|
9
+ * | evidence | false | true |
10
+ * | piiDetails | false | true |
11
+ * | cleanBadge | false | true |
12
+ * | fullFixit | false | true |
13
+ * | sealUUID | false | true |
14
+ */
15
+ function getFeatureGate(tier) {
16
+ if (tier.isPro) {
17
+ return {
18
+ isPro: true,
19
+ canGenerateEvidence: true,
20
+ canSeePiiDetails: true,
21
+ canSeeCleanBadge: true,
22
+ canSeeFullFixit: true,
23
+ canGenerateSealUUID: true,
24
+ };
25
+ }
26
+ return {
27
+ isPro: false,
28
+ canGenerateEvidence: false,
29
+ canSeePiiDetails: false,
30
+ canSeeCleanBadge: false,
31
+ canSeeFullFixit: false,
32
+ canGenerateSealUUID: false,
33
+ };
34
+ }
35
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/license/gate.ts"],"names":[],"mappings":";;AAaA,wCAoBC;AA/BD;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,IAAgB;IAC7C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,IAAI;YACX,mBAAmB,EAAE,IAAI;YACzB,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;YACtB,eAAe,EAAE,IAAI;YACrB,mBAAmB,EAAE,IAAI;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,KAAK;QACvB,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,KAAK;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * POST JSON to a URL and parse the JSON response.
3
+ * Uses node:https (no external dependencies).
4
+ * Timeout: 5 seconds.
5
+ */
6
+ export declare function postJSON(url: string, body: unknown): Promise<unknown>;
7
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/license/http.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA+CrE"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.postJSON = postJSON;
37
+ const https = __importStar(require("node:https"));
38
+ const http = __importStar(require("node:http"));
39
+ const TIMEOUT_MS = 5000;
40
+ /**
41
+ * POST JSON to a URL and parse the JSON response.
42
+ * Uses node:https (no external dependencies).
43
+ * Timeout: 5 seconds.
44
+ */
45
+ function postJSON(url, body) {
46
+ return new Promise((resolve, reject) => {
47
+ const data = JSON.stringify(body);
48
+ const parsed = new URL(url);
49
+ const isHttps = parsed.protocol === 'https:';
50
+ const options = {
51
+ hostname: parsed.hostname,
52
+ port: parsed.port || (isHttps ? 443 : 80),
53
+ path: parsed.pathname + parsed.search,
54
+ method: 'POST',
55
+ headers: {
56
+ 'Content-Type': 'application/json',
57
+ 'Content-Length': Buffer.byteLength(data),
58
+ 'User-Agent': 'project-shield-cli/1.0.0',
59
+ },
60
+ timeout: TIMEOUT_MS,
61
+ };
62
+ const transport = isHttps ? https : http;
63
+ const req = transport.request(options, (res) => {
64
+ let responseBody = '';
65
+ res.setEncoding('utf-8');
66
+ res.on('data', (chunk) => {
67
+ responseBody += chunk;
68
+ });
69
+ res.on('end', () => {
70
+ try {
71
+ resolve(JSON.parse(responseBody));
72
+ }
73
+ catch {
74
+ reject(new Error(`Invalid JSON response: ${responseBody.substring(0, 200)}`));
75
+ }
76
+ });
77
+ });
78
+ req.on('timeout', () => {
79
+ req.destroy();
80
+ reject(new Error('Request timed out'));
81
+ });
82
+ req.on('error', (err) => {
83
+ reject(err);
84
+ });
85
+ req.write(data);
86
+ req.end();
87
+ });
88
+ }
89
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/license/http.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,4BA+CC;AAzDD,kDAAoC;AACpC,gDAAkC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,GAAW,EAAE,IAAa;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAE7C,MAAM,OAAO,GAAyB;YACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBACzC,YAAY,EAAE,0BAA0B;aACzC;YACD,OAAO,EAAE,UAAU;SACpB,CAAC;QAEF,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7C,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,YAAY,IAAI,KAAK,CAAC;YACxB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;gBACpC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACrB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { validateLicense, isValidKeyFormat, isCacheValid, isInGracePeriod } from './validator.js';
2
+ export { canScan, recordScan, getCurrentMonthKey, getUsageForMonth } from './usage.js';
3
+ export { getFeatureGate } from './gate.js';
4
+ export { activateCommand, deactivateCommand, statusCommand } from './commands.js';
5
+ export type { TierStatus, FeatureGate, LicenseInfo, LicenseCache, UsageData } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAClF,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusCommand = exports.deactivateCommand = exports.activateCommand = exports.getFeatureGate = exports.getUsageForMonth = exports.getCurrentMonthKey = exports.recordScan = exports.canScan = exports.isInGracePeriod = exports.isCacheValid = exports.isValidKeyFormat = exports.validateLicense = void 0;
4
+ var validator_js_1 = require("./validator.js");
5
+ Object.defineProperty(exports, "validateLicense", { enumerable: true, get: function () { return validator_js_1.validateLicense; } });
6
+ Object.defineProperty(exports, "isValidKeyFormat", { enumerable: true, get: function () { return validator_js_1.isValidKeyFormat; } });
7
+ Object.defineProperty(exports, "isCacheValid", { enumerable: true, get: function () { return validator_js_1.isCacheValid; } });
8
+ Object.defineProperty(exports, "isInGracePeriod", { enumerable: true, get: function () { return validator_js_1.isInGracePeriod; } });
9
+ var usage_js_1 = require("./usage.js");
10
+ Object.defineProperty(exports, "canScan", { enumerable: true, get: function () { return usage_js_1.canScan; } });
11
+ Object.defineProperty(exports, "recordScan", { enumerable: true, get: function () { return usage_js_1.recordScan; } });
12
+ Object.defineProperty(exports, "getCurrentMonthKey", { enumerable: true, get: function () { return usage_js_1.getCurrentMonthKey; } });
13
+ Object.defineProperty(exports, "getUsageForMonth", { enumerable: true, get: function () { return usage_js_1.getUsageForMonth; } });
14
+ var gate_js_1 = require("./gate.js");
15
+ Object.defineProperty(exports, "getFeatureGate", { enumerable: true, get: function () { return gate_js_1.getFeatureGate; } });
16
+ var commands_js_1 = require("./commands.js");
17
+ Object.defineProperty(exports, "activateCommand", { enumerable: true, get: function () { return commands_js_1.activateCommand; } });
18
+ Object.defineProperty(exports, "deactivateCommand", { enumerable: true, get: function () { return commands_js_1.deactivateCommand; } });
19
+ Object.defineProperty(exports, "statusCommand", { enumerable: true, get: function () { return commands_js_1.statusCommand; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":";;;AAAA,+CAAkG;AAAzF,+GAAA,eAAe,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAAE,4GAAA,YAAY,OAAA;AAAE,+GAAA,eAAe,OAAA;AACzE,uCAAuF;AAA9E,mGAAA,OAAO,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAClE,qCAA2C;AAAlC,yGAAA,cAAc,OAAA;AACvB,6CAAkF;AAAzE,8GAAA,eAAe,OAAA;AAAE,gHAAA,iBAAiB,OAAA;AAAE,4GAAA,aAAa,OAAA"}
@@ -0,0 +1,31 @@
1
+ import type { LicenseFile, UsageFile } from './types.js';
2
+ /**
3
+ * Get the config directory path.
4
+ * Uses PROJECT_SHIELD_CONFIG_DIR env var for testing, otherwise ~/.project-shield/
5
+ */
6
+ export declare function getConfigDir(): string;
7
+ /**
8
+ * Ensure the config directory exists.
9
+ */
10
+ export declare function ensureConfigDir(): void;
11
+ /**
12
+ * Read the license file. Returns null if not found or corrupted.
13
+ */
14
+ export declare function readLicenseFile(): LicenseFile | null;
15
+ /**
16
+ * Write the license file.
17
+ */
18
+ export declare function writeLicenseFile(data: LicenseFile): void;
19
+ /**
20
+ * Delete the license file.
21
+ */
22
+ export declare function deleteLicenseFile(): void;
23
+ /**
24
+ * Read the usage file. Returns default if not found or corrupted.
25
+ */
26
+ export declare function readUsageFile(): UsageFile;
27
+ /**
28
+ * Write the usage file.
29
+ */
30
+ export declare function writeUsageFile(data: UsageFile): void;
31
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/license/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIzD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAcpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAIxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAcD;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAazC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAIpD"}