codefence 1.0.0__py3-none-any.whl

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.
@@ -0,0 +1,30 @@
1
+ // bad_javascript.js
2
+ const express = require('express');
3
+ const jwt = require('jsonwebtoken');
4
+ const app = express();
5
+
6
+ app.get('/admin/users', (req, res) => {
7
+ res.json([]);
8
+ });
9
+
10
+ app.post('/login', (req, res) => {
11
+ const token = jwt.sign({ sub: req.body.user }, 'secret');
12
+ res.json({ token });
13
+ });
14
+
15
+ function render(data) {
16
+ document.getElementById('x').innerHTML = data;
17
+ el.innerHTML = '<b>safe</b>';
18
+ }
19
+
20
+ function setProto(obj, evil) {
21
+ obj.__proto__ = evil;
22
+ }
23
+
24
+ function go(req, res) {
25
+ res.redirect(req.query.next);
26
+ res.redirect('/home');
27
+ }
28
+
29
+ fetch('/api/data').then(r => r.json());
30
+ fetch('/api/safe').then(r => r.json()).catch(handleErr);
@@ -0,0 +1,38 @@
1
+ import os
2
+ import random
3
+ import subprocess
4
+
5
+
6
+ API_KEY = "sk-abcdef1234567890"
7
+
8
+
9
+ def get_user(conn, user_id):
10
+ cursor = conn.cursor()
11
+ cursor.execute("SELECT * FROM users WHERE id = " + user_id)
12
+ cursor.execute(f"SELECT * FROM orders WHERE uid = {user_id}")
13
+ return cursor.fetchall()
14
+
15
+
16
+ def calc(expr):
17
+ return eval(expr)
18
+
19
+
20
+ def run(cmd):
21
+ subprocess.run(cmd, shell=True)
22
+ os.system("echo " + cmd)
23
+
24
+
25
+ def new_token():
26
+ token = random.randint(1000, 999999)
27
+ return token
28
+
29
+
30
+ def do_stuff():
31
+ try:
32
+ risky()
33
+ except:
34
+ pass
35
+ try:
36
+ risky()
37
+ except Exception:
38
+ pass
@@ -0,0 +1,46 @@
1
+ // Example of clean, safe JavaScript code.
2
+ // This file shows patterns that AI Code Sanitizer should NOT flag.
3
+ 'use strict';
4
+
5
+ const express = require('express');
6
+ const helmet = require('helmet');
7
+ const jwt = require('jsonwebtoken');
8
+
9
+ const app = express();
10
+ app.use(helmet());
11
+
12
+ const JWT_SECRET = process.env.JWT_SECRET_KEY;
13
+
14
+ function renderName(el, name) {
15
+ // textContent escapes automatically
16
+ el.textContent = name;
17
+ }
18
+
19
+ function issueToken(userId) {
20
+ // exp is set explicitly
21
+ return jwt.sign({ sub: userId, exp: Math.floor(Date.now() / 1000) + 3600 },
22
+ JWT_SECRET);
23
+ }
24
+
25
+ function validateKey(key) {
26
+ if (key === '__proto__' || key === 'constructor') {
27
+ throw new Error('invalid key');
28
+ }
29
+ return key;
30
+ }
31
+
32
+ async function fetchSafe(url) {
33
+ try {
34
+ const res = await fetch(url);
35
+ return await res.json();
36
+ } catch (err) {
37
+ console.error('fetch failed:', err.message);
38
+ return null;
39
+ }
40
+ }
41
+
42
+ function goHome(res) {
43
+ res.redirect('/home');
44
+ }
45
+
46
+ module.exports = { app, renderName, issueToken, validateKey, fetchSafe, goHome };
@@ -0,0 +1,47 @@
1
+ """Example of clean, safe Python code.
2
+
3
+ This file shows patterns that CodeFence should NOT flag.
4
+ It is included as a reference for safe coding patterns.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import hashlib
9
+ import hmac
10
+ import os
11
+ import secrets
12
+ from pathlib import Path
13
+
14
+
15
+ API_KEY = os.environ["API_KEY"]
16
+ JWT_SECRET = os.environ["JWT_SECRET_KEY"]
17
+
18
+
19
+ def hash_password(password: str, salt: bytes) -> bytes:
20
+ """Use PBKDF2-HMAC-SHA256 for password hashing."""
21
+ return hashlib.pbkdf2_hmac("sha256", password.encode(), salt, 200_000)
22
+
23
+
24
+ def verify_password(password: str, salt: bytes, expected: bytes) -> bool:
25
+ candidate = hash_password(password, salt)
26
+ return hmac.compare_digest(candidate, expected)
27
+
28
+
29
+ def new_session_token() -> str:
30
+ """Use the secrets module for cryptographic tokens."""
31
+ return secrets.token_urlsafe(32)
32
+
33
+
34
+ def read_user_file(base_dir: str, user_path: str) -> str:
35
+ """Safely read a file under a fixed base directory."""
36
+ base = Path(base_dir).resolve()
37
+ target = (base / user_path).resolve()
38
+ if not str(target).startswith(str(base)):
39
+ raise ValueError("path traversal detected")
40
+ return target.read_text(encoding="utf-8")
41
+
42
+
43
+ def safe_divide(a: float, b: float) -> float | None:
44
+ try:
45
+ return a / b
46
+ except ZeroDivisionError:
47
+ return None
@@ -0,0 +1,524 @@
1
+ Metadata-Version: 2.4
2
+ Name: codefence
3
+ Version: 1.0.0
4
+ Summary: A tiny offline policy gate for code. Check AI-generated code before it reaches Git.
5
+ Author: CodeFence
6
+ License: CODEFENCE
7
+ END USER LICENSE AGREEMENT (EULA)
8
+ Version 1.0.0
9
+
10
+ Copyright (c) 2026 CodeFence. All rights reserved.
11
+
12
+ PLEASE READ THIS AGREEMENT CAREFULLY BEFORE USING THIS SOFTWARE.
13
+ BY USING THIS SOFTWARE, YOU AGREE TO BE BOUND BY ITS TERMS.
14
+
15
+ --------------------------------------------------------------------
16
+ 1. DEFINITIONS
17
+ --------------------------------------------------------------------
18
+
19
+ "Software" means the CodeFence command-line tool, its source
20
+ code, documentation, rules file (rules.json), sample files, and any
21
+ accompanying materials delivered together.
22
+
23
+ "Licensor" means the copyright holder of the Software.
24
+
25
+ "You" or "Licensee" means the individual person who purchased or
26
+ acquired the Software.
27
+
28
+ "Personal Use" means use of the Software by a single individual, on
29
+ computers that the individual owns or controls, for that individual's
30
+ own development work. Personal Use does not include use on behalf of
31
+ a commercial entity as a service to third parties.
32
+
33
+ --------------------------------------------------------------------
34
+ 2. GRANT OF LICENSE
35
+ --------------------------------------------------------------------
36
+
37
+ Subject to your compliance with this Agreement, the Licensor grants
38
+ You a non-exclusive, non-transferable, worldwide, perpetual license
39
+ to:
40
+
41
+ (a) install and use the Software on up to three (3) devices that
42
+ You personally own or control;
43
+ (b) read, study, and audit the source code for Your own personal
44
+ understanding of its behavior;
45
+ (c) create private modifications of the source code for Your own
46
+ personal use, provided such modifications remain strictly
47
+ private and are not distributed.
48
+
49
+ This is a license, not a sale. The Licensor retains all right, title,
50
+ and interest in and to the Software.
51
+
52
+ --------------------------------------------------------------------
53
+ 3. RESTRICTIONS
54
+ --------------------------------------------------------------------
55
+
56
+ You may NOT:
57
+
58
+ (a) redistribute, sublicense, sell, resell, rent, lease, lend, or
59
+ otherwise transfer the Software or any modification of it;
60
+ (b) publish, share, or make available the source code, in original
61
+ or modified form, on any public or private repository, forum,
62
+ chat, file-sharing service, or bundle;
63
+ (c) include the Software in any commercial product, bundle, or
64
+ service offering;
65
+ (d) remove, alter, or obscure any copyright, license, or
66
+ attribution notice in the Software;
67
+ (e) use the Software for any unlawful purpose;
68
+ (f) use the Software to provide scanning-as-a-service to third
69
+ parties on a commercial basis.
70
+
71
+ --------------------------------------------------------------------
72
+ 4. SOURCE CODE AVAILABILITY
73
+ --------------------------------------------------------------------
74
+
75
+ The Software is delivered in human-readable source form. This is done
76
+ intentionally so that any user can inspect exactly what the tool does,
77
+ confirm that it performs no network calls, and verify that it does not
78
+ touch files outside the scope documented in SECURITY.md.
79
+
80
+ Availability of the source code under this Agreement does NOT make
81
+ the Software open source. Open-source licenses grant redistribution
82
+ rights; this Agreement does not.
83
+
84
+ --------------------------------------------------------------------
85
+ 5. NO SUPPORT, NO UPDATES
86
+ --------------------------------------------------------------------
87
+
88
+ The Software is provided as-is at the time of purchase. The Licensor
89
+ has no obligation to:
90
+
91
+ (a) provide technical support, bug fixes, or updates;
92
+ (b) maintain compatibility with future Python versions, operating
93
+ systems, or third-party libraries;
94
+ (c) respond to any communication regarding the Software.
95
+
96
+ Any future updates, if ever released, are provided at the Licensor's
97
+ sole discretion and do not extend the obligations of this Agreement.
98
+
99
+ --------------------------------------------------------------------
100
+ 6. CONSUMER RIGHTS (EU/UK)
101
+ --------------------------------------------------------------------
102
+
103
+ If You are a consumer resident in the European Union or the United
104
+ Kingdom, nothing in this Agreement limits or excludes any statutory
105
+ right or remedy You have under applicable mandatory consumer law.
106
+
107
+ In particular:
108
+
109
+ (a) RIGHT OF WITHDRAWAL (EU): You have the right to withdraw from
110
+ the purchase within fourteen (14) days of delivery, without
111
+ giving any reason, provided that You have not downloaded the
112
+ Software file. Once digital content has been downloaded, the
113
+ withdrawal right is typically waived under the EU Consumer
114
+ Rights Directive (2011/83/EU), Article 16(m), unless the
115
+ vendor has obtained Your prior express consent and
116
+ acknowledgement of that waiver.
117
+
118
+ (b) CONFORMITY: If the Software does not conform to its
119
+ description, You may be entitled to a remedy under the
120
+ applicable EU/UK consumer legislation.
121
+
122
+ To exercise the right of withdrawal, follow the process documented
123
+ in REFUND_POLICY.md.
124
+
125
+ --------------------------------------------------------------------
126
+ 7. DISCLAIMER OF WARRANTY
127
+ --------------------------------------------------------------------
128
+
129
+ THE SOFTWARE IS PROVIDED "AS IS" AND "AS AVAILABLE", WITHOUT WARRANTY
130
+ OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
131
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
132
+ NON-INFRINGEMENT.
133
+
134
+ THE LICENSOR DOES NOT WARRANT THAT:
135
+
136
+ (a) the Software will detect every issue in the scanned code;
137
+ (b) the Software will produce no false positives or false negatives;
138
+ (c) a clean scan means the scanned code is secure, correct, or
139
+ complete;
140
+ (d) the Software will run uninterrupted or error-free on every
141
+ environment.
142
+
143
+ The Software is a pattern-based sanity checker. It is NOT a security
144
+ audit, NOT a substitute for professional security review, and NOT a
145
+ guarantee of code quality.
146
+
147
+ --------------------------------------------------------------------
148
+ 8. LIMITATION OF LIABILITY
149
+ --------------------------------------------------------------------
150
+
151
+ TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE TOTAL
152
+ AGGREGATE LIABILITY OF THE LICENSOR ARISING OUT OF OR RELATING TO
153
+ THIS AGREEMENT OR THE SOFTWARE SHALL NOT EXCEED THE AMOUNT ACTUALLY
154
+ PAID BY YOU FOR THE SOFTWARE.
155
+
156
+ IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY INDIRECT,
157
+ INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR FOR ANY
158
+ LOSS OF PROFITS, DATA, BUSINESS, OR GOODWILL, ARISING OUT OF OR
159
+ RELATING TO THE USE OR INABILITY TO USE THE SOFTWARE.
160
+
161
+ NOTHING IN THIS SECTION EXCLUDES OR LIMITS LIABILITY THAT CANNOT BE
162
+ EXCLUDED OR LIMITED UNDER APPLICABLE MANDATORY LAW.
163
+
164
+ --------------------------------------------------------------------
165
+ 9. TERMINATION
166
+ --------------------------------------------------------------------
167
+
168
+ This Agreement is effective until terminated. Your rights under this
169
+ Agreement terminate automatically if You materially breach any of its
170
+ terms. Upon termination, You must stop using the Software and delete
171
+ all copies in Your possession or control.
172
+
173
+ Sections 3, 4, 7, 8, 10, and 11 survive termination.
174
+
175
+ --------------------------------------------------------------------
176
+ 10. GOVERNING LAW
177
+ --------------------------------------------------------------------
178
+
179
+ This Agreement is governed by the laws of England and Wales, without
180
+ regard to its conflict of law rules. Any dispute that cannot be
181
+ resolved amicably shall be subject to the exclusive jurisdiction of
182
+ the courts of England and Wales, except that mandatory consumer
183
+ protections in Your country of residence may grant You the right to
184
+ bring proceedings in Your local courts.
185
+
186
+ --------------------------------------------------------------------
187
+ 11. ENTIRE AGREEMENT
188
+ --------------------------------------------------------------------
189
+
190
+ This Agreement, together with TERMS_OF_USE.md, REFUND_POLICY.md, and
191
+ SECURITY.md, constitutes the entire agreement between You and the
192
+ Licensor concerning the Software.
193
+
194
+ If any provision is held unenforceable, the remaining provisions
195
+ remain in full force and effect.
196
+
197
+ --------------------------------------------------------------------
198
+ END OF LICENSE
199
+ --------------------------------------------------------------------
200
+
201
+ Project-URL: Homepage, https://codefence.dev
202
+ Project-URL: Source, https://github.com/USERNAME/codefence
203
+ Project-URL: Issues, https://github.com/USERNAME/codefence/issues
204
+ Project-URL: Changelog, https://github.com/USERNAME/codefence/blob/main/CHANGELOG.md
205
+ Keywords: security,static-analysis,pre-commit,git-hook,ai-generated-code,sast,sarif,offline,policy
206
+ Classifier: Development Status :: 5 - Production/Stable
207
+ Classifier: Environment :: Console
208
+ Classifier: Intended Audience :: Developers
209
+ Classifier: License :: Other/Proprietary License
210
+ Classifier: Operating System :: OS Independent
211
+ Classifier: Programming Language :: Python :: 3
212
+ Classifier: Programming Language :: Python :: 3.10
213
+ Classifier: Programming Language :: Python :: 3.11
214
+ Classifier: Programming Language :: Python :: 3.12
215
+ Classifier: Programming Language :: Python :: 3.13
216
+ Classifier: Topic :: Software Development :: Quality Assurance
217
+ Classifier: Topic :: Software Development :: Testing
218
+ Classifier: Topic :: Security
219
+ Requires-Python: >=3.10
220
+ Description-Content-Type: text/markdown
221
+ License-File: LICENSE.txt
222
+ License-File: LICENSE_FAQ.md
223
+ License-File: NOTICE.md
224
+ Dynamic: license-file
225
+
226
+ # CodeFence
227
+
228
+ **A tiny offline policy gate for code.**
229
+
230
+ Check AI-generated code before it reaches Git.
231
+
232
+ ---
233
+
234
+ ## What it does
235
+
236
+ CodeFence is a single-file, zero-dependency Python CLI that scans
237
+ source code for selected dangerous patterns before you commit. It
238
+ runs a curated set of rules and reports findings with:
239
+
240
+ - severity (critical / high / medium / low / info)
241
+ - exact location (file:line:column)
242
+ - code snippet
243
+ - short remediation
244
+ - typical before/after fix example
245
+
246
+ It is designed around the risks commonly encountered in AI-assisted
247
+ development, but scans ordinary source code regardless of how it
248
+ was written.
249
+
250
+ **The gate workflow:**
251
+
252
+ AI writes code
253
+ |
254
+ v
255
+ CodeFence runs on staged files
256
+ |
257
+ v
258
+ policy evaluation (allow / warn / block)
259
+ |
260
+ v
261
+ PASS or BLOCKED
262
+ |
263
+ v
264
+ git commit
265
+
266
+ ## What it does NOT do
267
+
268
+ - Not an autofixer. It shows a typical fix; it does not edit files.
269
+ - Not a security audit. It is a pattern-based sanity checker.
270
+ - Not a replacement for Semgrep, CodeQL, or professional review.
271
+ - Not interprocedural. No dataflow, no taint analysis.
272
+ - Not a guarantee. A clean scan does not mean the code is secure.
273
+
274
+ ## Install
275
+
276
+ pip install codefence
277
+
278
+ Or run it directly:
279
+
280
+ python3 codefence.py app.py
281
+
282
+ ## Quick start
283
+
284
+ **One-time setup in a git repository:**
285
+
286
+ codefence init
287
+
288
+ This installs a pre-commit hook and creates .codefence/config.json.
289
+ Every commit is then gated automatically.
290
+
291
+ **Daily usage:**
292
+
293
+ codefence --staged # scan only what is staged
294
+ codefence --staged --diff # only NEW findings since baseline
295
+ codefence baseline # snapshot current findings
296
+
297
+ **One-off scans:**
298
+
299
+ codefence src/
300
+ codefence --format json --output report.json src/
301
+ codefence --format html --output report.html src/
302
+ codefence --format sarif --output results.sarif .
303
+
304
+ **Policy-as-code:**
305
+
306
+ codefence --policy company-policy.json --staged
307
+ codefence policy validate company-policy.json
308
+
309
+ **Explanation:**
310
+
311
+ codefence explain R002
312
+ ## The 30 rules
313
+
314
+ Rules are shipped in rules.json (human-readable JSON). You can
315
+ inspect them, and you can add or disable rules for your own use.
316
+
317
+ ### Secrets
318
+ - R001 - Hardcoded API keys / secrets
319
+ - R011 - Hardcoded database credentials
320
+ - R028 - Env var with hardcoded fallback secret
321
+
322
+ ### Injection
323
+ - R002 - SQL injection via string concatenation (Python)
324
+ - R003 - eval() / exec() on untrusted input (Python)
325
+ - R004 - Command injection via shell=True (Python)
326
+ - R005 - innerHTML with unsanitized data (JavaScript)
327
+ - R010 - Path traversal
328
+ - R014 - Prototype pollution (JavaScript)
329
+ - R019 - Unsafe deserialization (pickle, yaml.load)
330
+
331
+ ### Authentication
332
+ - R006 - Missing authentication on endpoints
333
+ - R015 - Missing rate limiting on public endpoints
334
+ - R018 - Open redirect
335
+ - R020 - Never-expiring tokens / JWT
336
+
337
+ ### Cryptography
338
+ - R008 - Insecure random for security tokens (Python)
339
+ - R009 - Disabled TLS/SSL verification
340
+ - R016 - MD5 / SHA1 for password hashing
341
+
342
+ ### Configuration
343
+ - R007 - Overly permissive CORS (*)
344
+ - R017 - Debug mode left enabled
345
+ - R021 - Missing security headers (Express)
346
+
347
+ ### Reliability
348
+ - R022 - Race conditions (check-then-act)
349
+ - R026 - HTTP request without timeout
350
+ - R027 - Naive datetime (no timezone, context-aware)
351
+
352
+ ### Quality
353
+ - R012 - Broad except: pass
354
+ - R013 - Mutable default arguments
355
+ - R023 - Logging sensitive data
356
+ - R024 - Unused imports / dead code
357
+ - R025 - Promise rejection ignored (JavaScript)
358
+
359
+ ### AI-specific
360
+ - R030 - Typosquatted package imports
361
+ - R031 - TODO / FIXME / HACK in new code
362
+
363
+ Each rule carries a confidence level and a stable rule_version +
364
+ fingerprint for baseline stability.
365
+
366
+ ## Configuration
367
+
368
+ Options can be passed as CLI flags or through a JSON config file
369
+ (auto-discovered at .codefence/config.json after 'codefence init').
370
+
371
+ Example .codefence/config.json:
372
+
373
+ {
374
+ "schema": "codefence/config-v1",
375
+ "format": "json",
376
+ "severity": "medium",
377
+ "include": ["*.py", "*.js"],
378
+ "exclude": ["node_modules", ".git", "venv", "samples"],
379
+ "max_size": 2097152,
380
+ "cache": false
381
+ }
382
+
383
+ Priority: CLI flags > config file > built-in defaults.
384
+
385
+ ### Optional cache
386
+
387
+ Pass --cache to enable a local cache at ~/.cache/codefence/. The
388
+ cache is keyed by SHA-256 of the file content plus a fingerprint
389
+ of rules.json. It is off by default. See SECURITY.md for how the
390
+ cache is protected.
391
+
392
+ ### Optional history
393
+
394
+ Pass --history to record this scan in a local SQLite database at
395
+ ~/.local/share/codefence/history.db. Off by default.
396
+
397
+ Set CODEFENCE_NO_HISTORY=1 to disable history entirely, even when
398
+ --history is set.
399
+
400
+ Query history:
401
+
402
+ codefence history
403
+ codefence stats
404
+ ## Security and privacy
405
+
406
+ - Zero network calls. Zero.
407
+ - Zero telemetry.
408
+ - Zero data upload.
409
+ - Writes only to --output, and optionally to:
410
+ ~/.cache/codefence/ (only when --cache is set)
411
+ ~/.local/share/codefence/ (only when --history is set)
412
+ - Never writes to the files you scan.
413
+ - Never executes the code you scan.
414
+
415
+ The full threat model is documented in SECURITY.md.
416
+
417
+ ## Verifying the download
418
+
419
+ Every shipped file is hashed in CHECKSUMS.txt. To verify:
420
+
421
+ sha256sum codefence.py rules.json
422
+
423
+ Compare the output with the corresponding lines in CHECKSUMS.txt.
424
+ If the hashes do not match, do not use the file.
425
+
426
+ ## Payment and pricing
427
+
428
+ **$12 USD, one-time.**
429
+
430
+ Includes the current major version (v1.x) and its maintenance
431
+ releases. No subscription. No support. No account.
432
+
433
+ Payments are available in cryptocurrency only:
434
+
435
+ - USDT (TRC20 or BEP20)
436
+ - USDC
437
+ - BTC
438
+ - TRX
439
+ - XRP
440
+
441
+ Official purchase channels:
442
+
443
+ - Getly
444
+ - SilkRoadx402
445
+ - ctlx.cc
446
+
447
+ If you find CodeFence on any other site claiming to sell it,
448
+ treat that site as unofficial.
449
+
450
+ ## License
451
+
452
+ Source-available. Not open source.
453
+
454
+ Summary:
455
+
456
+ - Personal use on up to 3 devices that you own or control.
457
+ - Read, study, and privately modify the source.
458
+ - No redistribution. No resale. No bundling.
459
+ - No scanning-as-a-service on a commercial basis.
460
+
461
+ For plain-language answers to common questions, see LICENSE_FAQ.md.
462
+ For the full legal terms, see LICENSE.txt and TERMS_OF_USE.md.
463
+
464
+ **Governing law:** England and Wales. Mandatory consumer
465
+ protections in your country of residence remain fully applicable.
466
+
467
+ ## Support
468
+
469
+ There is no support.
470
+
471
+ - No email. No chat. No issue tracker.
472
+ - No guaranteed updates.
473
+ - No bug-fix commitments.
474
+
475
+ If you need a product with ongoing support, please look elsewhere.
476
+
477
+ ## FAQ
478
+
479
+ **Q: Will this find every security issue in my code?**
480
+ A: No. It finds a curated set of dangerous patterns. It is a
481
+ sanity check, not a security audit.
482
+
483
+ **Q: Can I use it in CI?**
484
+ A: Yes. JSON and SARIF outputs are pure on stdout. Exit codes are
485
+ stable.
486
+
487
+ **Q: Does it phone home?**
488
+ A: No. Zero network calls. You can verify by reading the source
489
+ or by running it under strace.
490
+
491
+ **Q: Does it fix my code?**
492
+ A: No. It shows a typical before/after fix. You apply it yourself.
493
+
494
+ **Q: Does it support TypeScript?**
495
+ A: No. Python, JavaScript (.js, .mjs, .cjs).
496
+
497
+ **Q: What about false positives?**
498
+ A: Pattern-based scanners always produce some. Rules with lower
499
+ confidence are flagged as such. You can disable any rule in
500
+ rules.json or via policy overrides.
501
+
502
+ **Q: Can I modify the source?**
503
+ A: Yes, privately. See LICENSE_FAQ.md.
504
+
505
+ **Q: Can my team use it?**
506
+ A: Each developer using CodeFence on their own machine needs
507
+ their own license. One license covers one individual on up to
508
+ three devices.
509
+
510
+ **Q: How do I get updates?**
511
+ A: There are no guaranteed updates.
512
+
513
+ **Q: Can I get a refund?**
514
+ A: See REFUND_POLICY.md.
515
+
516
+ ## A note on honesty
517
+
518
+ This product is built to do a specific, limited thing well. It
519
+ does not overstate what it can do. Every claim in this README is
520
+ traceable to a line of code or a test. If you find a claim that
521
+ is not supported by what the tool actually does, please report
522
+ it.
523
+
524
+ *End of README.*