@blink-authority-com/claude-code-plugin 1.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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/dist/bsec-client.d.ts +35 -0
  4. package/dist/bsec-client.d.ts.map +1 -0
  5. package/dist/bsec-client.js +122 -0
  6. package/dist/bsec-client.js.map +1 -0
  7. package/dist/docs/cache.d.ts +19 -0
  8. package/dist/docs/cache.d.ts.map +1 -0
  9. package/dist/docs/cache.js +92 -0
  10. package/dist/docs/cache.js.map +1 -0
  11. package/dist/docs/fetcher.d.ts +19 -0
  12. package/dist/docs/fetcher.d.ts.map +1 -0
  13. package/dist/docs/fetcher.js +81 -0
  14. package/dist/docs/fetcher.js.map +1 -0
  15. package/dist/docs/parser.d.ts +33 -0
  16. package/dist/docs/parser.d.ts.map +1 -0
  17. package/dist/docs/parser.js +145 -0
  18. package/dist/docs/parser.js.map +1 -0
  19. package/dist/docs/search.d.ts +38 -0
  20. package/dist/docs/search.d.ts.map +1 -0
  21. package/dist/docs/search.js +180 -0
  22. package/dist/docs/search.js.map +1 -0
  23. package/dist/docs/tools/api.d.ts +12 -0
  24. package/dist/docs/tools/api.d.ts.map +1 -0
  25. package/dist/docs/tools/api.js +58 -0
  26. package/dist/docs/tools/api.js.map +1 -0
  27. package/dist/docs/tools/cli.d.ts +12 -0
  28. package/dist/docs/tools/cli.d.ts.map +1 -0
  29. package/dist/docs/tools/cli.js +56 -0
  30. package/dist/docs/tools/cli.js.map +1 -0
  31. package/dist/docs/tools/concepts.d.ts +18 -0
  32. package/dist/docs/tools/concepts.d.ts.map +1 -0
  33. package/dist/docs/tools/concepts.js +136 -0
  34. package/dist/docs/tools/concepts.js.map +1 -0
  35. package/dist/docs/tools/sdk.d.ts +12 -0
  36. package/dist/docs/tools/sdk.d.ts.map +1 -0
  37. package/dist/docs/tools/sdk.js +72 -0
  38. package/dist/docs/tools/sdk.js.map +1 -0
  39. package/dist/docs/tools/search.d.ts +11 -0
  40. package/dist/docs/tools/search.d.ts.map +1 -0
  41. package/dist/docs/tools/search.js +36 -0
  42. package/dist/docs/tools/search.js.map +1 -0
  43. package/dist/docs/types.d.ts +70 -0
  44. package/dist/docs/types.d.ts.map +1 -0
  45. package/dist/docs/types.js +8 -0
  46. package/dist/docs/types.js.map +1 -0
  47. package/dist/index.d.ts +9 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +622 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/prompts/debug.d.ts +16 -0
  52. package/dist/prompts/debug.d.ts.map +1 -0
  53. package/dist/prompts/debug.js +34 -0
  54. package/dist/prompts/debug.js.map +1 -0
  55. package/dist/prompts/integrate.d.ts +16 -0
  56. package/dist/prompts/integrate.d.ts.map +1 -0
  57. package/dist/prompts/integrate.js +30 -0
  58. package/dist/prompts/integrate.js.map +1 -0
  59. package/dist/prompts/review.d.ts +16 -0
  60. package/dist/prompts/review.d.ts.map +1 -0
  61. package/dist/prompts/review.js +28 -0
  62. package/dist/prompts/review.js.map +1 -0
  63. package/dist/resources/changelog.d.ts +22 -0
  64. package/dist/resources/changelog.d.ts.map +1 -0
  65. package/dist/resources/changelog.js +55 -0
  66. package/dist/resources/changelog.js.map +1 -0
  67. package/dist/resources/errors.d.ts +16 -0
  68. package/dist/resources/errors.d.ts.map +1 -0
  69. package/dist/resources/errors.js +103 -0
  70. package/dist/resources/errors.js.map +1 -0
  71. package/dist/resources/patterns.d.ts +16 -0
  72. package/dist/resources/patterns.d.ts.map +1 -0
  73. package/dist/resources/patterns.js +151 -0
  74. package/dist/resources/patterns.js.map +1 -0
  75. package/dist/templates/approval-workflow.d.ts +6 -0
  76. package/dist/templates/approval-workflow.d.ts.map +1 -0
  77. package/dist/templates/approval-workflow.js +467 -0
  78. package/dist/templates/approval-workflow.js.map +1 -0
  79. package/dist/templates/audit-trail.d.ts +6 -0
  80. package/dist/templates/audit-trail.d.ts.map +1 -0
  81. package/dist/templates/audit-trail.js +396 -0
  82. package/dist/templates/audit-trail.js.map +1 -0
  83. package/dist/templates/cli-tool.d.ts +6 -0
  84. package/dist/templates/cli-tool.d.ts.map +1 -0
  85. package/dist/templates/cli-tool.js +346 -0
  86. package/dist/templates/cli-tool.js.map +1 -0
  87. package/dist/templates/express-api.d.ts +6 -0
  88. package/dist/templates/express-api.d.ts.map +1 -0
  89. package/dist/templates/express-api.js +314 -0
  90. package/dist/templates/express-api.js.map +1 -0
  91. package/dist/templates/notary.d.ts +6 -0
  92. package/dist/templates/notary.d.ts.map +1 -0
  93. package/dist/templates/notary.js +360 -0
  94. package/dist/templates/notary.js.map +1 -0
  95. package/dist/test.d.ts +8 -0
  96. package/dist/test.d.ts.map +1 -0
  97. package/dist/test.js +140 -0
  98. package/dist/test.js.map +1 -0
  99. package/dist/tools/add-signing.d.ts +19 -0
  100. package/dist/tools/add-signing.d.ts.map +1 -0
  101. package/dist/tools/add-signing.js +317 -0
  102. package/dist/tools/add-signing.js.map +1 -0
  103. package/dist/tools/decode.d.ts +13 -0
  104. package/dist/tools/decode.d.ts.map +1 -0
  105. package/dist/tools/decode.js +262 -0
  106. package/dist/tools/decode.js.map +1 -0
  107. package/dist/tools/hierarchy.d.ts +13 -0
  108. package/dist/tools/hierarchy.d.ts.map +1 -0
  109. package/dist/tools/hierarchy.js +319 -0
  110. package/dist/tools/hierarchy.js.map +1 -0
  111. package/dist/tools/lint.d.ts +13 -0
  112. package/dist/tools/lint.d.ts.map +1 -0
  113. package/dist/tools/lint.js +323 -0
  114. package/dist/tools/lint.js.map +1 -0
  115. package/dist/tools/scaffold.d.ts +11 -0
  116. package/dist/tools/scaffold.d.ts.map +1 -0
  117. package/dist/tools/scaffold.js +84 -0
  118. package/dist/tools/scaffold.js.map +1 -0
  119. package/dist/tools/sign-test.d.ts +17 -0
  120. package/dist/tools/sign-test.d.ts.map +1 -0
  121. package/dist/tools/sign-test.js +126 -0
  122. package/dist/tools/sign-test.js.map +1 -0
  123. package/dist/tools/test-vectors.d.ts +13 -0
  124. package/dist/tools/test-vectors.d.ts.map +1 -0
  125. package/dist/tools/test-vectors.js +169 -0
  126. package/dist/tools/test-vectors.js.map +1 -0
  127. package/dist/tools/verify-local.d.ts +17 -0
  128. package/dist/tools/verify-local.d.ts.map +1 -0
  129. package/dist/tools/verify-local.js +233 -0
  130. package/dist/tools/verify-local.js.map +1 -0
  131. package/dist/tools/verify-test.d.ts +17 -0
  132. package/dist/tools/verify-test.d.ts.map +1 -0
  133. package/dist/tools/verify-test.js +107 -0
  134. package/dist/tools/verify-test.js.map +1 -0
  135. package/package.json +54 -0
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Document notary scaffold template.
3
+ * Generates a notarization service: upload, hash, sign, verify.
4
+ */
5
+ export function generateNotary(name, features) {
6
+ const hasMultiAlgo = features.includes('multi-algorithm') || features.includes('post-quantum');
7
+ const files = {};
8
+ // --- package.json ---
9
+ files['package.json'] = JSON.stringify({
10
+ name,
11
+ version: '0.1.0',
12
+ description: `${name} — Document notarization service with BLINK Authority`,
13
+ type: 'module',
14
+ scripts: {
15
+ build: 'tsc',
16
+ start: 'node dist/server.js',
17
+ dev: 'tsx src/server.ts',
18
+ },
19
+ dependencies: {
20
+ '@blink-technology/sdk': '^0.14.0',
21
+ express: '^4.21.0',
22
+ multer: '^1.4.5-lts.1',
23
+ dotenv: '^16.4.0',
24
+ },
25
+ devDependencies: {
26
+ '@types/express': '^4.17.21',
27
+ '@types/multer': '^1.4.12',
28
+ '@types/node': '^22.15.2',
29
+ typescript: '^5.8.3',
30
+ tsx: '^4.19.0',
31
+ },
32
+ }, null, 2);
33
+ // --- tsconfig.json ---
34
+ files['tsconfig.json'] = JSON.stringify({
35
+ compilerOptions: {
36
+ target: 'ES2022',
37
+ module: 'Node16',
38
+ moduleResolution: 'Node16',
39
+ outDir: 'dist',
40
+ rootDir: 'src',
41
+ strict: true,
42
+ esModuleInterop: true,
43
+ skipLibCheck: true,
44
+ forceConsistentCasingInFileNames: true,
45
+ declaration: true,
46
+ sourceMap: true,
47
+ },
48
+ include: ['src/**/*'],
49
+ exclude: ['node_modules', 'dist'],
50
+ }, null, 2);
51
+ // --- .env.example ---
52
+ files['.env.example'] = `# BLINK Secure Engine connection
53
+ BSEC_URL=http://localhost:9100
54
+ BSEC_TOKEN=your-bsec-token-here
55
+ SLOT_NAME=default
56
+
57
+ # Server
58
+ PORT=3000
59
+ `;
60
+ // --- src/blink.ts ---
61
+ files['src/blink.ts'] = `/**
62
+ * BLINK Secure Engine connection management.
63
+ *
64
+ * BLINK Authority — https://blink-authority.com
65
+ */
66
+
67
+ import { BlinkSigner, BlinkVerifier, AlgoSuiteId } from '@blink-technology/sdk';
68
+
69
+ let signer: BlinkSigner;
70
+ let vrfPublicKey: Uint8Array;
71
+
72
+ export async function initBlink(bsecUrl: string, slotName: string): Promise<void> {
73
+ signer = await BlinkSigner.connect(bsecUrl, slotName, AlgoSuiteId.Ed25519);
74
+ vrfPublicKey = await signer.vrfPublicKey();
75
+ console.log(
76
+ \`[blink] Connected to BSEC at \${bsecUrl} \` +
77
+ \`(slot=\${slotName}, pk=\${Buffer.from(vrfPublicKey).toString('hex').slice(0, 16)}...)\`,
78
+ );
79
+ }
80
+
81
+ export function getSigner(): BlinkSigner { return signer; }
82
+ export function getVrfPublicKey(): Uint8Array { return vrfPublicKey; }
83
+ export function getVrfPublicKeyHex(): string { return Buffer.from(vrfPublicKey).toString('hex'); }
84
+
85
+ export function createVerifier(): BlinkVerifier {
86
+ return new BlinkVerifier(vrfPublicKey, {
87
+ freshnessWindowMs: 365 * 24 * 60 * 60 * 1000, // 1 year for notarization
88
+ clockSkewToleranceMs: 60_000,
89
+ });
90
+ }
91
+
92
+ export async function shutdownBlink(): Promise<void> {
93
+ if (signer) {
94
+ await signer.close();
95
+ console.log('[blink] Disconnected from BLINK Secure Engine');
96
+ }
97
+ }
98
+ `;
99
+ // --- src/notarize.ts ---
100
+ files['src/notarize.ts'] = `/**
101
+ * Document notarization logic.
102
+ *
103
+ * 1. Compute SHA-256 hash of the uploaded document
104
+ * 2. Sign the hash via BLINK Secure Engine (single-use credential)
105
+ * 3. Return the notarization certificate (envelope + metadata)
106
+ */
107
+
108
+ import { createHash, randomUUID } from 'node:crypto';
109
+ import { getSigner, getVrfPublicKeyHex } from './blink.js';
110
+
111
+ export interface NotarizationCertificate {
112
+ id: string;
113
+ document: {
114
+ filename: string;
115
+ size: number;
116
+ hash: string;
117
+ };
118
+ envelope: string;
119
+ signerPublicKey: string;
120
+ assuranceLevel: string;
121
+ notarizedAt: string;
122
+ }
123
+
124
+ /**
125
+ * Notarize a document: hash it, then sign the hash with BLINK.
126
+ */
127
+ export async function notarizeDocument(
128
+ file: Buffer,
129
+ filename: string,
130
+ ): Promise<NotarizationCertificate> {
131
+ // Step 1: Compute SHA-256 hash of the file
132
+ const hash = createHash('sha256').update(new Uint8Array(file)).digest();
133
+ const hashBytes = new Uint8Array(hash.buffer, hash.byteOffset, hash.byteLength);
134
+
135
+ // Step 2: Sign the hash via BLINK Secure Engine
136
+ // Uses signDetached — the hash is the payload, not included in the envelope
137
+ const envelope = await getSigner().signDetached(hashBytes);
138
+
139
+ // Step 3: Build the notarization certificate
140
+ return {
141
+ id: \`NOTARY-\${randomUUID()}\`,
142
+ document: {
143
+ filename,
144
+ size: file.length,
145
+ hash: hash.toString('hex'),
146
+ },
147
+ envelope: Buffer.from(envelope).toString('base64'),
148
+ signerPublicKey: getVrfPublicKeyHex(),
149
+ assuranceLevel: 'Standard Assurance',
150
+ notarizedAt: new Date().toISOString(),
151
+ };
152
+ }
153
+
154
+ /**
155
+ * Verify a previously notarized document.
156
+ * Re-hashes the file and checks the envelope signature.
157
+ */
158
+ export async function verifyNotarization(
159
+ file: Buffer,
160
+ certificate: NotarizationCertificate,
161
+ ): Promise<{ valid: boolean; reason?: string }> {
162
+ // Re-hash the file
163
+ const currentHash = createHash('sha256').update(new Uint8Array(file)).digest('hex');
164
+
165
+ // Check hash matches
166
+ if (currentHash !== certificate.document.hash) {
167
+ return {
168
+ valid: false,
169
+ reason: \`Document hash mismatch: expected \${certificate.document.hash}, got \${currentHash}\`,
170
+ };
171
+ }
172
+
173
+ // Verify the BLINK envelope
174
+ const { createVerifier } = await import('./blink.js');
175
+ const verifier = createVerifier();
176
+ const envelopeBytes = new Uint8Array(Buffer.from(certificate.envelope, 'base64'));
177
+ const result = verifier.verify(envelopeBytes);
178
+
179
+ return {
180
+ valid: result.valid,
181
+ reason: result.valid ? undefined : (result.reason ?? 'Signature verification failed'),
182
+ };
183
+ }
184
+ `;
185
+ // --- src/routes.ts ---
186
+ files['src/routes.ts'] = `/**
187
+ * Notary API routes.
188
+ *
189
+ * POST /notarize — Upload a document, receive a notarization certificate
190
+ * POST /verify — Upload a document + certificate, verify authenticity
191
+ * GET /health — Health check
192
+ */
193
+
194
+ import { Router } from 'express';
195
+ import multer from 'multer';
196
+ import { notarizeDocument, verifyNotarization } from './notarize.js';
197
+ import { getVrfPublicKeyHex } from './blink.js';
198
+
199
+ const upload = multer({
200
+ storage: multer.memoryStorage(),
201
+ limits: { fileSize: 50 * 1024 * 1024 }, // 50 MB max
202
+ });
203
+
204
+ const router = Router();
205
+
206
+ /**
207
+ * POST /notarize — Upload a file to notarize.
208
+ * Returns a notarization certificate containing the BLINK envelope.
209
+ */
210
+ router.post('/notarize', upload.single('file'), async (req, res, next) => {
211
+ try {
212
+ if (!req.file) {
213
+ res.status(400).json({ error: 'No file uploaded. Send as multipart/form-data with field "file".' });
214
+ return;
215
+ }
216
+
217
+ const certificate = await notarizeDocument(req.file.buffer, req.file.originalname);
218
+ res.status(201).json(certificate);
219
+ } catch (err) {
220
+ next(err);
221
+ }
222
+ });
223
+
224
+ /**
225
+ * POST /verify — Upload a file and its certificate to verify.
226
+ * Re-hashes the file and checks the BLINK signature.
227
+ */
228
+ router.post('/verify', upload.single('file'), async (req, res, next) => {
229
+ try {
230
+ if (!req.file) {
231
+ res.status(400).json({ error: 'No file uploaded.' });
232
+ return;
233
+ }
234
+
235
+ const certJson = req.body?.certificate;
236
+ if (!certJson) {
237
+ res.status(400).json({ error: 'Missing "certificate" field in request body.' });
238
+ return;
239
+ }
240
+
241
+ const certificate = typeof certJson === 'string' ? JSON.parse(certJson) : certJson;
242
+ const result = await verifyNotarization(req.file.buffer, certificate);
243
+
244
+ res.json({
245
+ verified: result.valid,
246
+ reason: result.reason,
247
+ document: {
248
+ filename: req.file.originalname,
249
+ size: req.file.size,
250
+ },
251
+ });
252
+ } catch (err) {
253
+ next(err);
254
+ }
255
+ });
256
+
257
+ /** GET /health */
258
+ router.get('/health', (_req, res) => {
259
+ res.json({
260
+ status: 'ok',
261
+ service: '${name}',
262
+ signerPublicKey: getVrfPublicKeyHex(),
263
+ timestamp: new Date().toISOString(),
264
+ });
265
+ });
266
+
267
+ export default router;
268
+ `;
269
+ // --- src/server.ts ---
270
+ files['src/server.ts'] = `/**
271
+ * ${name} — Document notarization service with BLINK Authority.
272
+ *
273
+ * Upload documents to get a cryptographic notarization certificate.
274
+ * Verify documents by re-uploading with the certificate.
275
+ */
276
+
277
+ import 'dotenv/config';
278
+ import express from 'express';
279
+ import { initBlink, shutdownBlink } from './blink.js';
280
+ import routes from './routes.js';
281
+
282
+ async function main(): Promise<void> {
283
+ const bsecUrl = process.env['BSEC_URL'] ?? 'http://localhost:9100';
284
+ const slotName = process.env['SLOT_NAME'] ?? 'default';
285
+ const port = parseInt(process.env['PORT'] ?? '3000', 10);
286
+
287
+ // Connect to BLINK Secure Engine
288
+ await initBlink(bsecUrl, slotName);
289
+
290
+ const app = express();
291
+ app.use(express.json());
292
+ app.use(routes);
293
+
294
+ const server = app.listen(port, () => {
295
+ console.log(\`[server] ${name} listening on port \${port}\`);
296
+ });
297
+
298
+ // Graceful shutdown
299
+ const shutdown = async (signal: string) => {
300
+ console.log(\`[server] Received \${signal}, shutting down...\`);
301
+ server.close();
302
+ await shutdownBlink();
303
+ process.exit(0);
304
+ };
305
+
306
+ process.on('SIGINT', () => shutdown('SIGINT'));
307
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
308
+ }
309
+
310
+ main().catch((err) => {
311
+ console.error('[server] Fatal error:', err);
312
+ process.exit(1);
313
+ });
314
+ `;
315
+ // --- README.md ---
316
+ files['README.md'] = `# ${name}
317
+
318
+ Document notarization service built on **BLINK Authority**. Upload documents to receive
319
+ a cryptographic notarization certificate, then verify documents later.
320
+
321
+ ## Quick Start
322
+
323
+ \`\`\`bash
324
+ npm install
325
+ cp .env.example .env
326
+ npm run dev
327
+ \`\`\`
328
+
329
+ ## API
330
+
331
+ ### POST /notarize
332
+ Upload a file to notarize. Returns a certificate with the BLINK signature envelope.
333
+
334
+ \`\`\`bash
335
+ curl -F "file=@document.pdf" http://localhost:3000/notarize
336
+ \`\`\`
337
+
338
+ ### POST /verify
339
+ Upload a file and its certificate to verify authenticity.
340
+
341
+ \`\`\`bash
342
+ curl -F "file=@document.pdf" -F "certificate=@certificate.json" http://localhost:3000/verify
343
+ \`\`\`
344
+
345
+ ### GET /health
346
+ Health check with signer public key.
347
+
348
+ ## How It Works
349
+
350
+ 1. **Upload** — The document is uploaded to the server
351
+ 2. **Hash** — SHA-256 hash is computed
352
+ 3. **Sign** — The hash is signed with a single-use BLINK credential
353
+ 4. **Certificate** — The BLINK envelope + metadata is returned as the notarization certificate
354
+ 5. **Verify** — Re-upload the document; the server re-hashes and verifies the envelope
355
+
356
+ Built with [BLINK Authority](https://blink-authority.com).
357
+ `;
358
+ return files;
359
+ }
360
+ //# sourceMappingURL=notary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notary.js","sourceRoot":"","sources":["../../src/templates/notary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,QAAkB;IAElB,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAE/F,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,uBAAuB;IACvB,KAAK,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CACpC;QACE,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,GAAG,IAAI,uDAAuD;QAC3E,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,qBAAqB;YAC5B,GAAG,EAAE,mBAAmB;SACzB;QACD,YAAY,EAAE;YACZ,uBAAuB,EAAE,SAAS;YAClC,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,SAAS;SAClB;QACD,eAAe,EAAE;YACf,gBAAgB,EAAE,UAAU;YAC5B,eAAe,EAAE,SAAS;YAC1B,aAAa,EAAE,UAAU;YACzB,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,SAAS;SACf;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEF,wBAAwB;IACxB,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS,CACrC;QACE,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,QAAQ;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,gCAAgC,EAAE,IAAI;YACtC,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;SAChB;QACD,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;KAClC,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEF,uBAAuB;IACvB,KAAK,CAAC,cAAc,CAAC,GAAG;;;;;;;CAOzB,CAAC;IAEA,uBAAuB;IACvB,KAAK,CAAC,cAAc,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCzB,CAAC;IAEA,0BAA0B;IAC1B,KAAK,CAAC,iBAAiB,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoF5B,CAAC;IAEA,wBAAwB;IACxB,KAAK,CAAC,eAAe,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2EX,IAAI;;;;;;;CAOnB,CAAC;IAEA,wBAAwB;IACxB,KAAK,CAAC,eAAe,CAAC,GAAG;KACtB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;6BAwBoB,IAAI;;;;;;;;;;;;;;;;;;;CAmBhC,CAAC;IAEA,oBAAoB;IACpB,KAAK,CAAC,WAAW,CAAC,GAAG,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyC/B,CAAC;IAEA,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/test.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Simple smoke test for BLINK Claude Plugin tool handlers.
3
+ *
4
+ * Run: npm test
5
+ * (Requires: npm run build first)
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
package/dist/test.js ADDED
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Simple smoke test for BLINK Claude Plugin tool handlers.
3
+ *
4
+ * Run: npm test
5
+ * (Requires: npm run build first)
6
+ */
7
+ import { handleScaffold } from './tools/scaffold.js';
8
+ import { handleAddSigning } from './tools/add-signing.js';
9
+ import { handleDecodeEnvelope } from './tools/decode.js';
10
+ import { handleGenerateTestVectors } from './tools/test-vectors.js';
11
+ import { handleVerifyLocal } from './tools/verify-local.js';
12
+ import { handleLint } from './tools/lint.js';
13
+ import { handleHierarchyDesign } from './tools/hierarchy.js';
14
+ import { handleSignTest } from './tools/sign-test.js';
15
+ import { handleVerifyTest } from './tools/verify-test.js';
16
+ import { PluginBsecClient, createPluginBsecClient } from './bsec-client.js';
17
+ let passed = 0;
18
+ let failed = 0;
19
+ function test(name, fn) {
20
+ try {
21
+ fn();
22
+ passed++;
23
+ console.log(` PASS: ${name}`);
24
+ }
25
+ catch (err) {
26
+ failed++;
27
+ console.log(` FAIL: ${name}`);
28
+ console.log(` ${err}`);
29
+ }
30
+ }
31
+ function assert(condition, message) {
32
+ if (!condition)
33
+ throw new Error(message);
34
+ }
35
+ console.log('\nBLINK Claude Plugin — Smoke Tests\n');
36
+ // ---------------------------------------------------------------------------
37
+ // S45-01: BSEC Client
38
+ // ---------------------------------------------------------------------------
39
+ console.log('S45-01: BSEC Client');
40
+ test('createPluginBsecClient returns a PluginBsecClient', () => {
41
+ const client = createPluginBsecClient('https://localhost:8443', 'test-token');
42
+ assert(client instanceof PluginBsecClient, 'Expected PluginBsecClient instance');
43
+ });
44
+ // ---------------------------------------------------------------------------
45
+ // S45-02: blink_sign_test
46
+ // ---------------------------------------------------------------------------
47
+ console.log('\nS45-02: blink_sign_test');
48
+ test('returns error when BSEC not configured', () => {
49
+ const result = handleSignTest({ payload: 'test' }, null);
50
+ // Synchronous return when no client
51
+ assert(!('then' in result), 'Expected synchronous result');
52
+ const toolResult = result;
53
+ assert(toolResult.isError === true, 'Expected isError');
54
+ const body = JSON.parse(toolResult.content[0].text);
55
+ assert(body.error === 'Connected mode not configured', 'Expected connected mode error');
56
+ });
57
+ test('returns error when payload is empty', () => {
58
+ const result = handleSignTest({ payload: '' }, null);
59
+ const toolResult = result;
60
+ assert(toolResult.isError === true, 'Expected isError for empty payload');
61
+ });
62
+ // ---------------------------------------------------------------------------
63
+ // S45-03: blink_verify_test
64
+ // ---------------------------------------------------------------------------
65
+ console.log('\nS45-03: blink_verify_test');
66
+ test('returns error when envelope is missing', () => {
67
+ const result = handleVerifyTest({}, null);
68
+ const toolResult = result;
69
+ assert(toolResult.isError === true, 'Expected isError for missing envelope');
70
+ });
71
+ test('returns offline mode result for valid-format envelope', () => {
72
+ // Create a minimal valid envelope
73
+ const envelope = {
74
+ signature: Buffer.alloc(64).toString('base64'),
75
+ ephemeral_public_key: Buffer.alloc(32).toString('base64'),
76
+ vrf_proof: Buffer.alloc(80).toString('base64'),
77
+ p_derive: Buffer.alloc(32).toString('base64'),
78
+ domain_input: 'test:identity:2026-03-31T00:00:00Z',
79
+ timestamp: new Date().toISOString(),
80
+ algorithm: 'ed25519',
81
+ payload_hash: 'a'.repeat(64),
82
+ };
83
+ const envelopeB64 = Buffer.from(JSON.stringify(envelope)).toString('base64');
84
+ const pDerive = Buffer.alloc(32).toString('base64');
85
+ const result = handleVerifyTest({ envelope: envelopeB64, p_derive: pDerive }, null);
86
+ const toolResult = result;
87
+ const body = JSON.parse(toolResult.content[0].text);
88
+ assert(body.mode === 'offline', 'Expected offline mode');
89
+ assert(body.format_verification !== undefined, 'Expected format_verification');
90
+ });
91
+ // ---------------------------------------------------------------------------
92
+ // Existing tools (quick smoke)
93
+ // ---------------------------------------------------------------------------
94
+ console.log('\nExisting tools (smoke)');
95
+ test('blink_scaffold returns files', () => {
96
+ const result = handleScaffold({ template: 'express-api', name: 'test-app' });
97
+ assert(result.content.length > 0, 'Expected content');
98
+ const body = JSON.parse(result.content[0].text);
99
+ assert(body.files || body.project_name, 'Expected scaffold output');
100
+ });
101
+ test('blink_add_signing returns enhanced code', () => {
102
+ const result = handleAddSigning({ code: 'app.get("/", (req, res) => res.send("ok"));', pattern: 'sign-response' });
103
+ assert(result.content.length > 0, 'Expected content');
104
+ });
105
+ test('blink_decode_envelope handles invalid input', () => {
106
+ const result = handleDecodeEnvelope({ envelope: 'not-valid-base64!!' });
107
+ assert(result.content.length > 0, 'Expected content');
108
+ });
109
+ test('blink_generate_test_vectors returns vectors', () => {
110
+ const result = handleGenerateTestVectors({ count: 2 });
111
+ assert(result.content.length > 0, 'Expected content');
112
+ const body = JSON.parse(result.content[0].text);
113
+ assert(body.test_vectors || body.vectors || Array.isArray(body), 'Expected test vectors');
114
+ });
115
+ test('blink_verify_local handles missing envelope', () => {
116
+ const result = handleVerifyLocal({});
117
+ assert(result.content.length > 0, 'Expected content');
118
+ const body = JSON.parse(result.content[0].text);
119
+ assert(body.format_valid === false, 'Expected format_valid false');
120
+ });
121
+ test('blink_lint returns results', () => {
122
+ const result = handleLint({ code: 'const x = 1;' });
123
+ assert(result.content.length > 0, 'Expected content');
124
+ });
125
+ test('blink_hierarchy_design returns hierarchy', () => {
126
+ const result = handleHierarchyDesign({ description: 'A small startup with 3 services' });
127
+ assert(result.content.length > 0, 'Expected content');
128
+ });
129
+ // ---------------------------------------------------------------------------
130
+ // Summary
131
+ // ---------------------------------------------------------------------------
132
+ console.log(`\n${'='.repeat(40)}`);
133
+ console.log(`Results: ${passed} passed, ${failed} failed, ${passed + failed} total`);
134
+ if (failed > 0) {
135
+ process.exit(1);
136
+ }
137
+ else {
138
+ console.log('All tests passed.\n');
139
+ }
140
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * blink_add_signing tool handler.
3
+ *
4
+ * Takes existing code and a signing pattern, returns enhanced code
5
+ * with BLINK signing added. Uses string manipulation (not AST) for v1.
6
+ *
7
+ * Patterns:
8
+ * sign-response — Add BLINK signing middleware to Express responses
9
+ * sign-document — Add document hashing + BLINK signing
10
+ * sign-audit-entry — Add hash-chained audit entry signing
11
+ * verify-incoming — Add incoming signature verification
12
+ */
13
+ export declare function handleAddSigning(args: Record<string, unknown>): {
14
+ content: Array<{
15
+ type: string;
16
+ text: string;
17
+ }>;
18
+ };
19
+ //# sourceMappingURL=add-signing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-signing.d.ts","sourceRoot":"","sources":["../../src/tools/add-signing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkTH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAiCpD"}