squick 1.0.1__py3-none-win_amd64.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.
squick/__init__.py ADDED
@@ -0,0 +1,79 @@
1
+ # Copyright 2026 Horizon LLC
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ """Squick CLI wrapper.
4
+
5
+ Bundles a platform-specific ``squick`` binary inside the wheel and exposes
6
+ it both as a ``squick`` console script and a thin Python API. The wheel
7
+ is platform-specific: ``pip`` picks the right one for the host.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import os
13
+ import subprocess
14
+ import sys
15
+ from pathlib import Path
16
+ from typing import Iterable
17
+
18
+ __all__ = ["main", "scan", "binary_path", "BinaryNotFoundError"]
19
+
20
+ _BINARY_NAME = "squick.exe" if sys.platform == "win32" else "squick"
21
+
22
+
23
+ class BinaryNotFoundError(RuntimeError):
24
+ """Raised when the bundled squick binary cannot be located."""
25
+
26
+
27
+ def binary_path() -> str:
28
+ """Return the absolute path to the bundled squick binary."""
29
+
30
+ pkg_dir = Path(__file__).resolve().parent
31
+ candidate = pkg_dir / "_binary" / _BINARY_NAME
32
+ if candidate.is_file():
33
+ return str(candidate)
34
+ override = os.environ.get("SQUICK_BINARY")
35
+ if override and Path(override).is_file():
36
+ return override
37
+ raise BinaryNotFoundError(
38
+ f"squick binary not found at {candidate}. "
39
+ "This usually indicates a broken installation; reinstall the package "
40
+ "or set SQUICK_BINARY to point at a valid squick executable."
41
+ )
42
+
43
+
44
+ def main() -> None:
45
+ """Console-script entrypoint. Execs the binary with the caller's argv."""
46
+
47
+ try:
48
+ binary = binary_path()
49
+ except BinaryNotFoundError as exc:
50
+ print(f"squick: {exc}", file=sys.stderr)
51
+ sys.exit(1)
52
+ completed = subprocess.run([binary, *sys.argv[1:]], check=False)
53
+ sys.exit(completed.returncode)
54
+
55
+
56
+ def scan(
57
+ root: str | os.PathLike[str] = ".",
58
+ *,
59
+ extra_args: Iterable[str] | None = None,
60
+ capture: bool = False,
61
+ ) -> str:
62
+ """Run ``squick scan`` against ``root`` and return the context markdown.
63
+
64
+ By default the binary is invoked in pass-through mode so it writes
65
+ ``.squick/context.md`` next to the project; the returned string is
66
+ the contents of that file. Pass ``capture=True`` to return what the
67
+ binary prints to stdout instead (useful when overriding ``--out -``).
68
+ """
69
+
70
+ binary = binary_path()
71
+ args: list[str] = [binary, "scan", str(root)]
72
+ if extra_args:
73
+ args.extend(extra_args)
74
+ if capture:
75
+ result = subprocess.run(args, check=True, capture_output=True, text=True)
76
+ return result.stdout
77
+ subprocess.run(args, check=True)
78
+ context_md = Path(root) / ".squick" / "context.md"
79
+ return context_md.read_text(encoding="utf-8") if context_md.is_file() else ""
squick/__main__.py ADDED
@@ -0,0 +1,7 @@
1
+ # Copyright 2026 Horizon LLC
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ from . import main
5
+
6
+ if __name__ == "__main__":
7
+ main()
@@ -0,0 +1,12 @@
1
+ name: components/html-semantic
2
+ description: HTML5 semantic tags whose presence implies a UI region.
3
+ entries:
4
+ - { pattern: "nav", match: component, tag: navigation, confidence: high }
5
+ - { pattern: "header", match: component, tag: page-header, confidence: high }
6
+ - { pattern: "footer", match: component, tag: page-footer, confidence: high }
7
+ - { pattern: "main", match: component, tag: main-content, confidence: high }
8
+ - { pattern: "aside", match: component, tag: sidebar, confidence: high }
9
+ - { pattern: "article", match: component, tag: article-region, confidence: high }
10
+ - { pattern: "section", match: component, tag: section-region, confidence: medium }
11
+ - { pattern: "form", match: component, tag: form-region, confidence: high }
12
+ - { pattern: "dialog", match: component, tag: dialog-region, confidence: high }
@@ -0,0 +1,25 @@
1
+ name: components/ui-patterns
2
+ description: Conventional UI component names. Match against component or filename.
3
+ entries:
4
+ - { pattern: "navbar", kind: glob, match: component, tag: navigation, confidence: high }
5
+ - { pattern: "*navbar*", kind: glob, match: component, tag: navigation, confidence: high }
6
+ - { pattern: "*sidebar*", kind: glob, match: component, tag: sidebar, confidence: high }
7
+ - { pattern: "*header*", kind: glob, match: component, tag: page-header, confidence: medium }
8
+ - { pattern: "*footer*", kind: glob, match: component, tag: page-footer, confidence: medium }
9
+ - { pattern: "*hero*", kind: glob, match: component, tag: hero-section, confidence: high }
10
+ - { pattern: "*modal*", kind: glob, match: component, tag: modal, confidence: high }
11
+ - { pattern: "*dialog*", kind: glob, match: component, tag: dialog, confidence: high }
12
+ - { pattern: "*dropdown*", kind: glob, match: component, tag: dropdown, confidence: high }
13
+ - { pattern: "*accordion*", kind: glob, match: component, tag: accordion, confidence: high }
14
+ - { pattern: "*breadcrumb*", kind: glob, match: component, tag: breadcrumb, confidence: high }
15
+ - { pattern: "*pagination*", kind: glob, match: component, tag: pagination, confidence: high }
16
+ - { pattern: "*tabs*", kind: glob, match: component, tag: tabs, confidence: medium }
17
+ - { pattern: "*toast*", kind: glob, match: component, tag: toast, confidence: high }
18
+ - { pattern: "*tooltip*", kind: glob, match: component, tag: tooltip, confidence: high }
19
+ - { pattern: "*card*", kind: glob, match: component, tag: card, confidence: medium }
20
+ - { pattern: "*button*", kind: glob, match: component, tag: button, confidence: medium }
21
+ - { pattern: "*spinner*", kind: glob, match: component, tag: spinner, confidence: high }
22
+ - { pattern: "*loader*", kind: glob, match: component, tag: spinner, confidence: medium }
23
+ - { pattern: "*contactform*", kind: glob, match: component, tag: contact-form, confidence: high }
24
+ - { pattern: "*loginform*", kind: glob, match: component, tag: login-form, confidence: high }
25
+ - { pattern: "*signupform*", kind: glob, match: component, tag: signup-form, confidence: high }
@@ -0,0 +1,21 @@
1
+ name: files/node
2
+ description: Node.js / TypeScript file roles signalled by canonical filenames.
3
+ entries:
4
+ - { pattern: "index.js", match: filename, tag: entrypoint, confidence: high }
5
+ - { pattern: "index.ts", match: filename, tag: entrypoint, confidence: high }
6
+ - { pattern: "index.tsx", match: filename, tag: entrypoint, confidence: medium }
7
+ - { pattern: "main.js", match: filename, tag: entrypoint, confidence: high }
8
+ - { pattern: "main.ts", match: filename, tag: entrypoint, confidence: high }
9
+ - { pattern: "server.js", match: filename, tag: server-entrypoint, confidence: high }
10
+ - { pattern: "server.ts", match: filename, tag: server-entrypoint, confidence: high }
11
+ - { pattern: "app.js", match: filename, tag: app-entrypoint, confidence: high }
12
+ - { pattern: "app.ts", match: filename, tag: app-entrypoint, confidence: high }
13
+ - { pattern: "package.json", match: filename, tag: package-manifest, confidence: high }
14
+ - { pattern: "tsconfig.json", match: filename, tag: build-config, confidence: high }
15
+ - { pattern: "*.config.js", kind: glob, match: filename, tag: build-config, confidence: high }
16
+ - { pattern: "*.config.ts", kind: glob, match: filename, tag: build-config, confidence: high }
17
+ - { pattern: "*.test.ts", kind: glob, match: filename, tag: unit-test, confidence: high }
18
+ - { pattern: "*.test.js", kind: glob, match: filename, tag: unit-test, confidence: high }
19
+ - { pattern: "*.spec.ts", kind: glob, match: filename, tag: unit-test, confidence: high }
20
+ - { pattern: "*.spec.js", kind: glob, match: filename, tag: unit-test, confidence: high }
21
+ - { pattern: "*.d.ts", kind: glob, match: filename, tag: type-declaration, confidence: high }
@@ -0,0 +1,19 @@
1
+ name: files/python
2
+ description: Python file roles signalled by canonical filenames.
3
+ entries:
4
+ - { pattern: "main.py", match: filename, tag: entrypoint, confidence: high, note: "Conventional script entry point." }
5
+ - { pattern: "__main__.py", match: filename, tag: entrypoint, confidence: high }
6
+ - { pattern: "__init__.py", match: filename, tag: package-init, confidence: high }
7
+ - { pattern: "setup.py", match: filename, tag: build-config, confidence: high }
8
+ - { pattern: "pyproject.toml", match: filename, tag: build-config, confidence: high }
9
+ - { pattern: "conftest.py", match: filename, tag: test-config, confidence: high }
10
+ - { pattern: "manage.py", match: filename, tag: django-cli, confidence: high }
11
+ - { pattern: "asgi.py", match: filename, tag: asgi-entrypoint, confidence: high }
12
+ - { pattern: "wsgi.py", match: filename, tag: wsgi-entrypoint, confidence: high }
13
+ - { pattern: "models.py", match: filename, tag: data-models, confidence: high }
14
+ - { pattern: "views.py", match: filename, tag: views-handlers, confidence: high }
15
+ - { pattern: "urls.py", match: filename, tag: url-routing, confidence: high }
16
+ - { pattern: "admin.py", match: filename, tag: admin-config, confidence: high }
17
+ - { pattern: "serializers.py", match: filename, tag: data-serializers, confidence: high }
18
+ - { pattern: "schemas.py", match: filename, tag: data-schemas, confidence: high }
19
+ - { pattern: "tasks.py", match: filename, tag: background-tasks, confidence: medium }
@@ -0,0 +1,10 @@
1
+ name: frameworks/django
2
+ description: Django markers — imports and conventional layout.
3
+ entries:
4
+ - { pattern: "django", kind: glob, match: import, tag: framework-django, confidence: high }
5
+ - { pattern: "django.*", kind: glob, match: import, tag: framework-django, confidence: high }
6
+ - { pattern: "rest_framework", kind: glob, match: import, tag: framework-drf, confidence: high }
7
+ - { pattern: "rest_framework.*", kind: glob, match: import, tag: framework-drf, confidence: high }
8
+ - { pattern: "migrations", match: path-segment, tag: db-migrations, confidence: high }
9
+ - { pattern: "templates", match: path-segment, tag: html-templates, confidence: high }
10
+ - { pattern: "static", match: path-segment, tag: static-assets, confidence: medium }
@@ -0,0 +1,22 @@
1
+ name: frameworks/express
2
+ description: Express.js and Koa conventions.
3
+ entries:
4
+ - { pattern: "express", match: import, tag: framework-express, confidence: high }
5
+ - { pattern: "@express/*", kind: glob, match: import, tag: framework-express, confidence: high }
6
+ - { pattern: "koa", match: import, tag: framework-koa, confidence: high }
7
+ - { pattern: "@koa/*", kind: glob, match: import, tag: framework-koa, confidence: high }
8
+ - { pattern: "fastify", match: import, tag: framework-fastify, confidence: high }
9
+ - { pattern: "@fastify/*", kind: glob, match: import, tag: framework-fastify, confidence: high }
10
+ - { pattern: "hapi", match: import, tag: framework-hapi, confidence: high }
11
+ - { pattern: "@hapi/*", kind: glob, match: import, tag: framework-hapi, confidence: high }
12
+ - { pattern: "@nestjs/*", kind: glob, match: import, tag: framework-nestjs, confidence: high }
13
+
14
+ - { pattern: "routes", match: path-segment, tag: api-routes, confidence: medium }
15
+ - { pattern: "middleware", match: path-segment, tag: middleware-layer, confidence: high }
16
+ - { pattern: "middlewares", match: path-segment, tag: middleware-layer, confidence: high }
17
+ - { pattern: "controllers", match: path-segment, tag: controllers, confidence: high }
18
+
19
+ - { pattern: "server.js", match: filename, tag: server-entrypoint, confidence: high }
20
+ - { pattern: "server.ts", match: filename, tag: server-entrypoint, confidence: high }
21
+ - { pattern: "app.module.ts", match: filename, tag: nestjs-root-module, confidence: high }
22
+ - { pattern: "main.ts", match: filename, tag: nestjs-bootstrap, confidence: medium, note: "NestJS bootstrap file." }
@@ -0,0 +1,15 @@
1
+ name: frameworks/fastapi
2
+ description: FastAPI conventions and entry points.
3
+ entries:
4
+ - { pattern: "fastapi", match: import, tag: framework-fastapi, confidence: high }
5
+ - { pattern: "fastapi.*", kind: glob, match: import, tag: framework-fastapi, confidence: high }
6
+ - { pattern: "starlette", match: import, tag: framework-starlette, confidence: high }
7
+ - { pattern: "starlette.*", kind: glob, match: import, tag: framework-starlette, confidence: high }
8
+
9
+ - { pattern: "routers", match: path-segment, tag: fastapi-routers, confidence: high }
10
+ - { pattern: "dependencies", match: path-segment, tag: fastapi-dependencies, confidence: medium }
11
+
12
+ - { pattern: "main.py", match: filename, tag: fastapi-entrypoint, confidence: medium, note: "Conventional FastAPI app entrypoint." }
13
+ - { pattern: "app.py", match: filename, tag: fastapi-entrypoint, confidence: medium }
14
+ - { pattern: "deps.py", match: filename, tag: fastapi-dependencies, confidence: medium }
15
+ - { pattern: "schemas.py", match: filename, tag: fastapi-pydantic-schemas, confidence: medium }
@@ -0,0 +1,13 @@
1
+ name: frameworks/flask
2
+ description: Flask conventions and blueprint layout.
3
+ entries:
4
+ - { pattern: "flask", match: import, tag: framework-flask, confidence: high }
5
+ - { pattern: "flask.*", kind: glob, match: import, tag: framework-flask, confidence: high }
6
+ - { pattern: "flask_*", kind: glob, match: import, tag: framework-flask-extension, confidence: high }
7
+
8
+ - { pattern: "blueprints", match: path-segment, tag: flask-blueprints, confidence: high }
9
+
10
+ - { pattern: "app.py", match: filename, tag: flask-app, confidence: medium }
11
+ - { pattern: "wsgi.py", match: filename, tag: wsgi-entrypoint, confidence: high }
12
+ - { pattern: "routes.py", match: filename, tag: flask-routes, confidence: medium }
13
+ - { pattern: "extensions.py", match: filename, tag: flask-extensions, confidence: medium }
@@ -0,0 +1,42 @@
1
+ name: frameworks/nextjs
2
+ description: Next.js App Router and Pages Router conventions.
3
+ entries:
4
+ - { pattern: "next", match: import, tag: framework-nextjs, confidence: high }
5
+ - { pattern: "next/*", kind: glob, match: import, tag: framework-nextjs, confidence: high }
6
+ - { pattern: "next-intl", match: import, tag: nextjs-i18n, confidence: high }
7
+ - { pattern: "next-intl/*", kind: glob, match: import, tag: nextjs-i18n, confidence: high }
8
+
9
+ - { pattern: "app", match: path-segment, tag: nextjs-app-router, confidence: high }
10
+ - { pattern: "pages", match: path-segment, tag: nextjs-pages-router, confidence: medium }
11
+
12
+ - { pattern: "page.tsx", match: filename, tag: nextjs-route-page, confidence: high, note: "App Router page component." }
13
+ - { pattern: "page.jsx", match: filename, tag: nextjs-route-page, confidence: high }
14
+ - { pattern: "page.ts", match: filename, tag: nextjs-route-page, confidence: high }
15
+ - { pattern: "page.js", match: filename, tag: nextjs-route-page, confidence: high }
16
+ - { pattern: "layout.tsx", match: filename, tag: nextjs-layout, confidence: high }
17
+ - { pattern: "layout.jsx", match: filename, tag: nextjs-layout, confidence: high }
18
+ - { pattern: "layout.ts", match: filename, tag: nextjs-layout, confidence: high }
19
+ - { pattern: "layout.js", match: filename, tag: nextjs-layout, confidence: high }
20
+ - { pattern: "loading.tsx", match: filename, tag: nextjs-loading-ui, confidence: high }
21
+ - { pattern: "loading.jsx", match: filename, tag: nextjs-loading-ui, confidence: high }
22
+ - { pattern: "error.tsx", match: filename, tag: nextjs-error-boundary, confidence: high }
23
+ - { pattern: "error.jsx", match: filename, tag: nextjs-error-boundary, confidence: high }
24
+ - { pattern: "not-found.tsx", match: filename, tag: nextjs-not-found, confidence: high }
25
+ - { pattern: "not-found.jsx", match: filename, tag: nextjs-not-found, confidence: high }
26
+ - { pattern: "route.ts", match: filename, tag: nextjs-route-handler, confidence: high, note: "App Router API route handler." }
27
+ - { pattern: "route.js", match: filename, tag: nextjs-route-handler, confidence: high }
28
+ - { pattern: "middleware.ts", match: filename, tag: nextjs-middleware, confidence: high }
29
+ - { pattern: "middleware.js", match: filename, tag: nextjs-middleware, confidence: high }
30
+ - { pattern: "next.config.ts", match: filename, tag: nextjs-config, confidence: high }
31
+ - { pattern: "next.config.js", match: filename, tag: nextjs-config, confidence: high }
32
+ - { pattern: "next.config.mjs", match: filename, tag: nextjs-config, confidence: high }
33
+
34
+ - { pattern: "^GET$", kind: regex, match: symbol-name, tag: http-handler-get, confidence: high }
35
+ - { pattern: "^POST$", kind: regex, match: symbol-name, tag: http-handler-post, confidence: high }
36
+ - { pattern: "^PUT$", kind: regex, match: symbol-name, tag: http-handler-put, confidence: high }
37
+ - { pattern: "^DELETE$", kind: regex, match: symbol-name, tag: http-handler-delete, confidence: high }
38
+ - { pattern: "^PATCH$", kind: regex, match: symbol-name, tag: http-handler-patch, confidence: high }
39
+ - { pattern: "^HEAD$", kind: regex, match: symbol-name, tag: http-handler-head, confidence: high }
40
+ - { pattern: "^OPTIONS$", kind: regex, match: symbol-name, tag: http-handler-options, confidence: high }
41
+ - { pattern: "^generateMetadata$", kind: regex, match: symbol-name, tag: nextjs-metadata, confidence: high }
42
+ - { pattern: "^generateStaticParams$", kind: regex, match: symbol-name, tag: nextjs-static-params, confidence: high }
@@ -0,0 +1,14 @@
1
+ name: frameworks/payload
2
+ description: Payload CMS conventions.
3
+ entries:
4
+ - { pattern: "payload", match: import, tag: framework-payload, confidence: high }
5
+ - { pattern: "@payloadcms/*", kind: glob, match: import, tag: framework-payload, confidence: high }
6
+
7
+ - { pattern: "payload.config.ts", match: filename, tag: payload-config, confidence: high }
8
+ - { pattern: "payload.config.js", match: filename, tag: payload-config, confidence: high }
9
+ - { pattern: "payload-types.ts", match: filename, tag: payload-generated-types, confidence: high }
10
+
11
+ - { pattern: "collections", match: path-segment, tag: payload-collections, confidence: high }
12
+ - { pattern: "globals", match: path-segment, tag: payload-globals, confidence: medium }
13
+ - { pattern: "access", match: path-segment, tag: payload-access-control, confidence: medium }
14
+ - { pattern: "fields", match: path-segment, tag: payload-fields, confidence: medium }
@@ -0,0 +1,11 @@
1
+ name: frameworks/react
2
+ description: React markers — hooks, HOCs, JSX-based identifiers.
3
+ entries:
4
+ - { pattern: "react", match: import, tag: framework-react, confidence: high }
5
+ - { pattern: "react-dom", match: import, tag: framework-react, confidence: high }
6
+ - { pattern: "^use[A-Z][A-Za-z0-9]*$", kind: regex, match: symbol-name, tag: react-hook, confidence: high, note: "Custom hook naming convention." }
7
+ - { pattern: "^with[A-Z][A-Za-z0-9]*$", kind: regex, match: symbol-name, tag: react-hoc, confidence: high, note: "Higher-order component convention." }
8
+ - { pattern: "components", match: path-segment, tag: ui-components, confidence: high }
9
+ - { pattern: "hooks", match: path-segment, tag: react-hooks, confidence: high }
10
+ - { pattern: "pages", match: path-segment, tag: route-pages, confidence: high }
11
+ - { pattern: "app", match: path-segment, tag: nextjs-app-router, confidence: medium }
@@ -0,0 +1,16 @@
1
+ name: frameworks/sanity
2
+ description: Sanity headless CMS conventions.
3
+ entries:
4
+ - { pattern: "@sanity/client", match: import, tag: framework-sanity, confidence: high }
5
+ - { pattern: "@sanity/*", kind: glob, match: import, tag: framework-sanity, confidence: high }
6
+ - { pattern: "sanity", match: import, tag: framework-sanity, confidence: high }
7
+ - { pattern: "next-sanity", match: import, tag: framework-sanity, confidence: high }
8
+
9
+ - { pattern: "sanity.config.ts", match: filename, tag: sanity-config, confidence: high }
10
+ - { pattern: "sanity.config.js", match: filename, tag: sanity-config, confidence: high }
11
+ - { pattern: "sanity.cli.ts", match: filename, tag: sanity-cli-config, confidence: high }
12
+ - { pattern: "sanity.cli.js", match: filename, tag: sanity-cli-config, confidence: high }
13
+
14
+ - { pattern: "schemas", match: path-segment, tag: sanity-schemas, confidence: medium }
15
+ - { pattern: "schemaTypes", match: path-segment, tag: sanity-schemas, confidence: high }
16
+ - { pattern: "studio", match: path-segment, tag: sanity-studio, confidence: medium }
@@ -0,0 +1,29 @@
1
+ name: frameworks/strapi
2
+ description: Strapi headless CMS conventions.
3
+ entries:
4
+ - { pattern: "@strapi/strapi", match: import, tag: framework-strapi, confidence: high }
5
+ - { pattern: "@strapi/*", kind: glob, match: import, tag: framework-strapi, confidence: high }
6
+ - { pattern: "strapi", match: import, tag: framework-strapi, confidence: high }
7
+
8
+ - { pattern: "controllers", match: path-segment, tag: strapi-controllers, confidence: high }
9
+ - { pattern: "routes", match: path-segment, tag: strapi-routes, confidence: high }
10
+ - { pattern: "services", match: path-segment, tag: strapi-services, confidence: high }
11
+ - { pattern: "content-types", match: path-segment, tag: strapi-content-types, confidence: high }
12
+ - { pattern: "policies", match: path-segment, tag: strapi-policies, confidence: high }
13
+ - { pattern: "middlewares", match: path-segment, tag: strapi-middlewares, confidence: high }
14
+
15
+ - { pattern: "lifecycles.js", match: filename, tag: strapi-lifecycle-hooks, confidence: high, note: "Strapi entity lifecycle callbacks." }
16
+ - { pattern: "lifecycles.ts", match: filename, tag: strapi-lifecycle-hooks, confidence: high }
17
+ - { pattern: "schema.json", match: filename, tag: strapi-content-schema, confidence: high, note: "Strapi content-type schema." }
18
+ - { pattern: "bootstrap.js", match: filename, tag: strapi-bootstrap, confidence: medium }
19
+ - { pattern: "register.js", match: filename, tag: strapi-register-hook, confidence: medium }
20
+ - { pattern: "destroy.js", match: filename, tag: strapi-destroy-hook, confidence: medium }
21
+
22
+ - { pattern: "^beforeCreate$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
23
+ - { pattern: "^beforeUpdate$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
24
+ - { pattern: "^beforeDelete$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
25
+ - { pattern: "^afterCreate$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
26
+ - { pattern: "^afterUpdate$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
27
+ - { pattern: "^afterDelete$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
28
+ - { pattern: "^beforeFind.*$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
29
+ - { pattern: "^afterFind.*$", kind: regex, match: symbol-name, tag: lifecycle-hook, confidence: high }
@@ -0,0 +1,20 @@
1
+ name: frameworks/wordpress
2
+ description: WordPress theme and plugin file roles.
3
+ entries:
4
+ - { pattern: "wp-config.php", match: filename, tag: wordpress-config, confidence: high }
5
+ - { pattern: "functions.php", match: filename, tag: wordpress-theme-bootstrap, confidence: high }
6
+ - { pattern: "style.css", match: filename, tag: wordpress-theme-manifest, confidence: medium, note: "Header comment declares theme metadata." }
7
+ - { pattern: "index.php", match: filename, tag: wordpress-template, confidence: medium }
8
+ - { pattern: "header.php", match: filename, tag: wordpress-template, confidence: high }
9
+ - { pattern: "footer.php", match: filename, tag: wordpress-template, confidence: high }
10
+ - { pattern: "sidebar.php", match: filename, tag: wordpress-template, confidence: high }
11
+ - { pattern: "single.php", match: filename, tag: wordpress-template, confidence: high }
12
+ - { pattern: "archive.php", match: filename, tag: wordpress-template, confidence: high }
13
+ - { pattern: "page.php", match: filename, tag: wordpress-template, confidence: high }
14
+ - { pattern: "comments.php", match: filename, tag: wordpress-template, confidence: high }
15
+ - { pattern: "search.php", match: filename, tag: wordpress-template, confidence: high }
16
+ - { pattern: "404.php", match: filename, tag: wordpress-template, confidence: high }
17
+
18
+ - { pattern: "wp-content", match: path-segment, tag: wordpress-content-root, confidence: high }
19
+ - { pattern: "plugins", match: path-segment, tag: wordpress-plugins, confidence: medium }
20
+ - { pattern: "themes", match: path-segment, tag: wordpress-themes, confidence: medium }
@@ -0,0 +1,51 @@
1
+ name: naming/python
2
+ description: Python snake_case naming conventions and dunder methods.
3
+ entries:
4
+ - { pattern: "^get_.*", kind: regex, match: symbol-name, tag: getter, confidence: high }
5
+ - { pattern: "^set_.*", kind: regex, match: symbol-name, tag: setter, confidence: high }
6
+ - { pattern: "^fetch_.*", kind: regex, match: symbol-name, tag: fetcher, confidence: high }
7
+ - { pattern: "^load_.*", kind: regex, match: symbol-name, tag: loader, confidence: high }
8
+ - { pattern: "^save_.*", kind: regex, match: symbol-name, tag: saver, confidence: high }
9
+ - { pattern: "^delete_.*", kind: regex, match: symbol-name, tag: deleter, confidence: high }
10
+ - { pattern: "^remove_.*", kind: regex, match: symbol-name, tag: deleter, confidence: high }
11
+ - { pattern: "^create_.*", kind: regex, match: symbol-name, tag: creator, confidence: high }
12
+ - { pattern: "^update_.*", kind: regex, match: symbol-name, tag: updater, confidence: high }
13
+ - { pattern: "^validate_.*", kind: regex, match: symbol-name, tag: validator, confidence: high }
14
+ - { pattern: "^parse_.*", kind: regex, match: symbol-name, tag: parser, confidence: high }
15
+ - { pattern: "^format_.*", kind: regex, match: symbol-name, tag: formatter, confidence: high }
16
+ - { pattern: "^render_.*", kind: regex, match: symbol-name, tag: renderer, confidence: high }
17
+ - { pattern: "^handle_.*", kind: regex, match: symbol-name, tag: handler, confidence: high }
18
+ - { pattern: "^process_.*", kind: regex, match: symbol-name, tag: processor, confidence: high }
19
+ - { pattern: "^on_.*", kind: regex, match: symbol-name, tag: event-handler, confidence: medium }
20
+ - { pattern: "^is_.*", kind: regex, match: symbol-name, tag: predicate, confidence: high }
21
+ - { pattern: "^has_.*", kind: regex, match: symbol-name, tag: predicate, confidence: high }
22
+ - { pattern: "^can_.*", kind: regex, match: symbol-name, tag: predicate, confidence: high }
23
+ - { pattern: "^should_.*", kind: regex, match: symbol-name, tag: predicate, confidence: high }
24
+
25
+ - { pattern: ".*_view$", kind: regex, match: symbol-name, tag: view-handler, confidence: high, note: "Django/Flask view function." }
26
+ - { pattern: ".*_handler$", kind: regex, match: symbol-name, tag: handler, confidence: high }
27
+ - { pattern: ".*_service$", kind: regex, match: symbol-name, tag: service, confidence: high }
28
+ - { pattern: ".*_repository$", kind: regex, match: symbol-name, tag: repository, confidence: high }
29
+ - { pattern: ".*_factory$", kind: regex, match: symbol-name, tag: factory, confidence: high }
30
+ - { pattern: ".*_validator$", kind: regex, match: symbol-name, tag: validator, confidence: high }
31
+ - { pattern: ".*_serializer$", kind: regex, match: symbol-name, tag: serializer, confidence: high }
32
+ - { pattern: ".*_form$", kind: regex, match: symbol-name, tag: form, confidence: high }
33
+ - { pattern: ".*_filter$", kind: regex, match: symbol-name, tag: filter, confidence: high }
34
+ - { pattern: ".*_middleware$", kind: regex, match: symbol-name, tag: middleware, confidence: high }
35
+ - { pattern: ".*_task$", kind: regex, match: symbol-name, tag: task, confidence: high, note: "Celery or background task." }
36
+ - { pattern: ".*_command$", kind: regex, match: symbol-name, tag: command, confidence: medium }
37
+
38
+ - { pattern: "__init__", match: symbol-name, tag: constructor, confidence: high }
39
+ - { pattern: "__new__", match: symbol-name, tag: constructor, confidence: high }
40
+ - { pattern: "__str__", match: symbol-name, tag: repr-method, confidence: high }
41
+ - { pattern: "__repr__", match: symbol-name, tag: repr-method, confidence: high }
42
+ - { pattern: "__eq__", match: symbol-name, tag: equality-method, confidence: high }
43
+ - { pattern: "__hash__", match: symbol-name, tag: hash-method, confidence: high }
44
+ - { pattern: "__call__", match: symbol-name, tag: callable-method, confidence: high }
45
+ - { pattern: "__enter__", match: symbol-name, tag: context-manager, confidence: high }
46
+ - { pattern: "__exit__", match: symbol-name, tag: context-manager, confidence: high }
47
+ - { pattern: "__iter__", match: symbol-name, tag: iterable, confidence: high }
48
+ - { pattern: "__next__", match: symbol-name, tag: iterable, confidence: high }
49
+ - { pattern: "__len__", match: symbol-name, tag: sized, confidence: high }
50
+ - { pattern: "__getitem__", match: symbol-name, tag: indexable, confidence: high }
51
+ - { pattern: "__setitem__", match: symbol-name, tag: indexable, confidence: high }
@@ -0,0 +1,17 @@
1
+ name: naming/suffixes
2
+ description: Class/identifier suffixes that signal architectural role.
3
+ entries:
4
+ - { pattern: ".*Handler$", kind: regex, match: symbol-name, tag: handler, confidence: high }
5
+ - { pattern: ".*Controller$", kind: regex, match: symbol-name, tag: controller, confidence: high }
6
+ - { pattern: ".*Service$", kind: regex, match: symbol-name, tag: service, confidence: high }
7
+ - { pattern: ".*Repository$", kind: regex, match: symbol-name, tag: repository, confidence: high }
8
+ - { pattern: ".*Factory$", kind: regex, match: symbol-name, tag: factory, confidence: high }
9
+ - { pattern: ".*Provider$", kind: regex, match: symbol-name, tag: provider, confidence: high }
10
+ - { pattern: ".*Manager$", kind: regex, match: symbol-name, tag: manager, confidence: high }
11
+ - { pattern: ".*Builder$", kind: regex, match: symbol-name, tag: builder, confidence: high }
12
+ - { pattern: ".*Adapter$", kind: regex, match: symbol-name, tag: adapter, confidence: high }
13
+ - { pattern: ".*Validator$", kind: regex, match: symbol-name, tag: validator, confidence: high }
14
+ - { pattern: ".*Serializer$", kind: regex, match: symbol-name, tag: serializer, confidence: high }
15
+ - { pattern: ".*Mapper$", kind: regex, match: symbol-name, tag: mapper, confidence: high }
16
+ - { pattern: ".*DTO$", kind: regex, match: symbol-name, tag: dto, confidence: high }
17
+ - { pattern: ".*Model$", kind: regex, match: symbol-name, tag: model, confidence: medium }
@@ -0,0 +1,20 @@
1
+ name: naming/verbs
2
+ description: Common function-name verbs that signal intent.
3
+ entries:
4
+ - { pattern: "^get[A-Z].*", kind: regex, match: symbol-name, tag: getter, confidence: high }
5
+ - { pattern: "^set[A-Z].*", kind: regex, match: symbol-name, tag: setter, confidence: high }
6
+ - { pattern: "^fetch[A-Z].*", kind: regex, match: symbol-name, tag: fetcher, confidence: high }
7
+ - { pattern: "^load[A-Z].*", kind: regex, match: symbol-name, tag: loader, confidence: high }
8
+ - { pattern: "^save[A-Z].*", kind: regex, match: symbol-name, tag: saver, confidence: high }
9
+ - { pattern: "^delete[A-Z].*", kind: regex, match: symbol-name, tag: deleter, confidence: high }
10
+ - { pattern: "^create[A-Z].*", kind: regex, match: symbol-name, tag: creator, confidence: high }
11
+ - { pattern: "^update[A-Z].*", kind: regex, match: symbol-name, tag: updater, confidence: high }
12
+ - { pattern: "^validate[A-Z].*", kind: regex, match: symbol-name, tag: validator, confidence: high }
13
+ - { pattern: "^parse[A-Z].*", kind: regex, match: symbol-name, tag: parser, confidence: high }
14
+ - { pattern: "^format[A-Z].*", kind: regex, match: symbol-name, tag: formatter, confidence: high }
15
+ - { pattern: "^render[A-Z].*", kind: regex, match: symbol-name, tag: renderer, confidence: high }
16
+ - { pattern: "^handle[A-Z].*", kind: regex, match: symbol-name, tag: handler, confidence: high }
17
+ - { pattern: "^on[A-Z].*", kind: regex, match: symbol-name, tag: event-handler, confidence: medium }
18
+ - { pattern: "^is[A-Z].*", kind: regex, match: symbol-name, tag: predicate, confidence: high }
19
+ - { pattern: "^has[A-Z].*", kind: regex, match: symbol-name, tag: predicate, confidence: high }
20
+ - { pattern: "^can[A-Z].*", kind: regex, match: symbol-name, tag: predicate, confidence: high }
@@ -0,0 +1,28 @@
1
+ name: routes/web-common
2
+ description: Common public-facing web routes whose meaning is conventional.
3
+ entries:
4
+ - { pattern: "/", match: route, tag: home-page, confidence: high }
5
+ - { pattern: "/about", match: route, tag: about-page, confidence: high }
6
+ - { pattern: "/about-us", match: route, tag: about-page, confidence: high }
7
+ - { pattern: "/aboutus", match: route, tag: about-page, confidence: high }
8
+ - { pattern: "/contact", match: route, tag: contact-page, confidence: high }
9
+ - { pattern: "/contact-us", match: route, tag: contact-page, confidence: high }
10
+ - { pattern: "/pricing", match: route, tag: pricing-page, confidence: high }
11
+ - { pattern: "/privacy", match: route, tag: privacy-page, confidence: high }
12
+ - { pattern: "/terms", match: route, tag: terms-page, confidence: high }
13
+ - { pattern: "/login", match: route, tag: auth-login, confidence: high }
14
+ - { pattern: "/signin", match: route, tag: auth-login, confidence: high }
15
+ - { pattern: "/signup", match: route, tag: auth-signup, confidence: high }
16
+ - { pattern: "/register", match: route, tag: auth-signup, confidence: high }
17
+ - { pattern: "/logout", match: route, tag: auth-logout, confidence: high }
18
+ - { pattern: "/dashboard", match: route, tag: dashboard-page, confidence: high }
19
+ - { pattern: "/settings", match: route, tag: settings-page, confidence: high }
20
+ - { pattern: "/profile", match: route, tag: profile-page, confidence: high }
21
+ - { pattern: "/admin", match: route, tag: admin-area, confidence: high }
22
+ - { pattern: "/api", match: route, tag: api-root, confidence: high }
23
+ - { pattern: "/health", match: route, tag: health-check, confidence: high }
24
+ - { pattern: "/status", match: route, tag: health-check, confidence: medium }
25
+ - { pattern: "/cart", match: route, tag: ecommerce-cart, confidence: high }
26
+ - { pattern: "/checkout", match: route, tag: ecommerce-checkout, confidence: high }
27
+ - { pattern: "/orders", match: route, tag: ecommerce-orders, confidence: high }
28
+ - { pattern: "/products", match: route, tag: ecommerce-products, confidence: high }
Binary file
@@ -0,0 +1,83 @@
1
+ Metadata-Version: 2.4
2
+ Name: squick
3
+ Version: 1.0.1
4
+ Summary: Pre-computed LLM context for AI coding agents.
5
+ Author: Horizon LLC
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/pwnaxe/squick
8
+ Project-URL: Repository, https://github.com/pwnaxe/squick
9
+ Project-URL: Issues, https://github.com/pwnaxe/squick/issues
10
+ Keywords: mcp,ai,llm,context,scanner,ast,tree-sitter
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: Apache Software License
15
+ Classifier: Operating System :: POSIX :: Linux
16
+ Classifier: Operating System :: MacOS :: MacOS X
17
+ Classifier: Operating System :: Microsoft :: Windows
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Rust
25
+ Classifier: Topic :: Software Development :: Code Generators
26
+ Classifier: Topic :: Software Development :: Pre-processors
27
+ Requires-Python: >=3.9
28
+ Description-Content-Type: text/markdown
29
+
30
+ # squick (Python)
31
+
32
+ Pre-computed, LLM-targeted code context for AI coding agents.
33
+
34
+ This PyPI package ships the right platform-specific binary inside the
35
+ wheel and exposes it both as a `squick` console script and a small
36
+ Python API. Installation is platform-aware: `pip` picks the wheel for
37
+ your OS and architecture automatically.
38
+
39
+ ## Install
40
+
41
+ ```bash
42
+ pip install squick
43
+ ```
44
+
45
+ ## Use from the shell
46
+
47
+ ```bash
48
+ squick scan ./your-project # one-shot scan
49
+ squick watch ./your-project # re-scan on file save
50
+ squick mcp # start an MCP server on stdio
51
+ python -m squick scan . # equivalent to the above
52
+ ```
53
+
54
+ ## Use from Python
55
+
56
+ ```python
57
+ import squick
58
+
59
+ # Run a scan and return the generated context.md as a string.
60
+ context = squick.scan("./your-project")
61
+ print(context)
62
+
63
+ # Locate the bundled binary, e.g. to spawn the MCP server manually.
64
+ print(squick.binary_path())
65
+ ```
66
+
67
+ ## Supported platforms
68
+
69
+ | OS | Architecture | Wheel tag |
70
+ | ------- | ------------ | -------------------------- |
71
+ | Linux | x86_64 | `manylinux2014_x86_64` |
72
+ | Linux | aarch64 | `manylinux2014_aarch64` |
73
+ | macOS | x86_64 | `macosx_10_12_x86_64` |
74
+ | macOS | arm64 | `macosx_11_0_arm64` |
75
+ | Windows | x86_64 | `win_amd64` |
76
+
77
+ See the [main project README](https://github.com/pwnaxe/squick) for
78
+ full documentation, dictionary format, and MCP client configuration.
79
+
80
+ ## License
81
+
82
+ Apache-2.0. Copyright 2026 Horizon LLC.
83
+ "Squick" is a trademark of Horizon LLC.
@@ -0,0 +1,26 @@
1
+ squick/__init__.py,sha256=2NwfozOqyEtxeNphWAHWcjekO7LCG432FIPScvkq9Wc,2583
2
+ squick/__main__.py,sha256=MlY2KONOPYQ8gC5qhN2DCTIghInTrQWP3VAtDPE7xG4,126
3
+ squick/_binary/squick.exe,sha256=vkvti2o3eSQDu4RGyMWBLGVwC99272m05NOp8G0SZcg,9637376
4
+ squick/_binary/dictionaries/components/html-semantic.yaml,sha256=6jpfLu92ShZKDbjqvNSULLZIr23Qq1_kHQ5pNo-ElV0,856
5
+ squick/_binary/dictionaries/components/ui-patterns.yaml,sha256=85c0aC_nf43aThy1wbT04zZdWXgfm_9teVe7qjjfmYk,2380
6
+ squick/_binary/dictionaries/files/node.yaml,sha256=dnSCxmB9JOpRKEASrpw5Wf28aLh2DM3CBXMndZW-HOY,1777
7
+ squick/_binary/dictionaries/files/python.yaml,sha256=Dps21X-0KsUasGz9878JzjrrZUMkG_lj-DNA0q63fdY,1562
8
+ squick/_binary/dictionaries/frameworks/django.yaml,sha256=svGsqeZ1LQbkCK9YOxjIYb-ME9f4GLKJPv-TouweigM,793
9
+ squick/_binary/dictionaries/frameworks/express.yaml,sha256=ADySZ-3qXNHgZPmelwMfagoQT1yxx5ald8ZIw24l7wk,1765
10
+ squick/_binary/dictionaries/frameworks/fastapi.yaml,sha256=n2D7nfcGYqJ8jTm8DeWDpLNDOcMihX-QFepvgNnGAPM,1129
11
+ squick/_binary/dictionaries/frameworks/flask.yaml,sha256=uBi90IwgIfBm_e_AXqzFtv3AMWLVeuE2tum7uQVtkCM,867
12
+ squick/_binary/dictionaries/frameworks/nextjs.yaml,sha256=liXKe2LwG07V-6sef_-bN0bEbb8TTiCeW6EsIwWtG9E,3848
13
+ squick/_binary/dictionaries/frameworks/payload.yaml,sha256=gYHcoNesygad7B3sIoyewSEieoP9hq0lO3f2tvDn6jE,1011
14
+ squick/_binary/dictionaries/frameworks/react.yaml,sha256=1RibmTXYAyNCBoBlsGCb2m3O7hnz0U2F7sMmFsWKqfU,977
15
+ squick/_binary/dictionaries/frameworks/sanity.yaml,sha256=6InO9t4ZPYcUVT5q6ZMc40aJGKRkVxUDnLr8I6MspIc,1184
16
+ squick/_binary/dictionaries/frameworks/strapi.yaml,sha256=oUa4OOpfRyxzVRanDsJtZrasi3A0RVuypAQT-_r7ge0,2575
17
+ squick/_binary/dictionaries/frameworks/wordpress.yaml,sha256=eGLUpc3V10cc0MPnLMuZXmeLkV0F7p16yw8DYMy3sTQ,1774
18
+ squick/_binary/dictionaries/naming/python.yaml,sha256=-lT2ebwMCIivHN6PSaCSyn5PrrbudcDo7_IMZBFEXd8,4817
19
+ squick/_binary/dictionaries/naming/suffixes.yaml,sha256=FF0Zup_AogAAIi3hKTb9Vy_trO2TktEFKLSlqt0VB4k,1535
20
+ squick/_binary/dictionaries/naming/verbs.yaml,sha256=N8bTeCBWDiqUV2r0-15jPpG8iENwvVQr2sXtZ2dDwPc,1865
21
+ squick/_binary/dictionaries/routes/web-common.yaml,sha256=TxcOZak2aVXhBVwTOjgS6VxmX5BiITgasuHx0q4q-9g,2296
22
+ squick-1.0.1.dist-info/METADATA,sha256=WMy7ka54U_WZZHp5B9CPytqmk7QQsYgsIS9BmKTa9qs,2798
23
+ squick-1.0.1.dist-info/WHEEL,sha256=QR8DNjG6Lr6bNErJWJgF4dP2dJ2N7NpY-BWly1OvcTM,97
24
+ squick-1.0.1.dist-info/entry_points.txt,sha256=CfBR4ZYgixzhad5h2N8mLCDkntpcqO8Wy2Vo2wlGxZM,39
25
+ squick-1.0.1.dist-info/top_level.txt,sha256=Ax_HMSliBbTtH7YelPlK6iQnEZhZOyOkH41pZ1QbF2c,7
26
+ squick-1.0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-win_amd64
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ squick = squick:main
@@ -0,0 +1 @@
1
+ squick