python
Skill1 starsChanged 8 days agoMITView on GitHub
Comprehensive Python code standards based on PEP 8, PEP 20, PEP 257, and the Google Python Style Guide — the base layer for all Python work; routes to framework standards (FastAPI, DRF, Airflow) in `frameworks/` and deeper architecture references. Use whenever writing, reviewing, or refactoring Python. Trigger on: "write Python", "Python function", "is this Pythonic", "Python best practices", "PEP 8", "Python code review", "FastAPI", "Django REST Framework", "DRF", "Airflow", "DAG", "DDD", "clean architecture", "hexagonal architecture", "design pattern", or any Python development task.
- Installs packages
We split this skill into the rules it gives an agent
28 rules. 0 are common, 12 are distinctive, and 16 are very specific to this project.
0
Common
Most of the 40 edited versions we read keep these.
12
Distinctive
This author's own choices. Worth a look.
16
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 15
When writing, reviewing, or refactoring Python code, follow these standards (based on PEP 8, PEP 20, PEP 257, and the [Google Python Style
- Very specific: line 130
Never: use l (el), O (oh), or I (eye) as single-character variable names.
- Distinctive: line 131
Avoid abbreviations that are ambiguous or unfamiliar outside your project.
- Very specific: line 132
Don't include the type in the variable name (e.g., id_to_name_dict).
- Distinctive: line 133
Always use descriptive names.
- Very specific: line 137
Always use self as the first argument to instance methods.
- Very specific: line 138
Always use cls as the first argument to class methods.
- Very specific: line 139
If an argument name clashes with a keyword, append a trailing underscore (class_).
- Distinctive: line 153
Use sparingly and only when they add non-obvious context.
- Distinctive: line 155
Never state the obvious:
- Distinctive: line 181
Write docstrings for all public modules, functions, classes, and methods.
- Distinctive: line 183
If multi-line, leave a blank line after the summary, then add elaboration.
- Distinctive: line 247
Every module should begin with a docstring:
- Very specific: line 275
Use built-in generics (list, dict, tuple, set) instead of imports from typing where possible (Python 3.9+).
- Very specific: line 276
Use X | Y union syntax instead of Union[X, Y] (Python 3.10+).
- Very specific: line 278
Don't annotate the return value of __init__.
- Very specific: line 307
Use built-in exception classes when appropriate (e.g., ValueError, TypeError).
- Very specific: line 309
Never: use bare except: or catch Exception unless re-raising or creating an isolation point.
- Very specific: line 311
Use finally for cleanup.
- Very specific: line 312
Do not use assert for validation of production data—only for internal invariants and tests.
- Very specific: line 345
Use is / is not for comparisons with singletons like None, never == / !=:
- Distinctive: line 359
Use implicit truthiness where possible:
- Very specific: line 391
Use with statements for resource management (files, sockets, locks):
- Distinctive: line 406
Prefer comprehensions for simple cases.
- Distinctive: line 425
Never: use mutable objects as default argument values:
- Very specific: line 440
Always wrap executable code in a __main__ check:
- Very specific: line 464
Use Ruff as the one formatter/linter.
- Distinctive: line 531
When writing or reviewing Python code, verify:
“Common” is measured: kept by at least 6 in 10 of the 40 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Python Code Standards
When writing, reviewing, or refactoring Python code, follow these standards (based on PEP 8, PEP 20, PEP 257, and the Google Python Style Guide).
This is the base layer for all Python code, general or framework-specific; test code itself
belongs to zeno-stack/zeno-python-testing. This is one skill:
core Python standards live in this file, framework-specific standards live as plain reference
files in frameworks/, and deeper same-language material lives in references/. If the task
involves a specific framework, apply this file's standards plus the matching framework
reference below — each frameworks/ file assumes this file's PEP 8/naming/docstring/typing
rules and only covers what's specific to that framework:
| Framework | Reference |
| FastAPI, Pydantic v2, async SQLAlchemy | frameworks/fastapi.md |
| Django REST Framework, Django, DRF | frameworks/django-rest-framework.md |
| Apache Airflow 3, Astronomer, DAG authoring | frameworks/airflow.md |
For deeper, non-framework-specific Python material, load the matching file in references/:
| Concern | Reference |
| DDD, Clean/Hexagonal Architecture, SOLID, ports & adapters, design patterns in idiomatic Python | references/ddd-clean-architecture.md |
| Strategic DDD (bounded contexts, context mapping, EventStorming), TDD practice, BDD/Gherkin, Kafka event-driven testing | references/ddd-tdd-bdd-workflow.md |
Pythonic structural idioms — EAFP vs LBYL, advanced typing (Protocol, TypeVar), exception chaining, custom context managers, generators, dataclasses, decorators, concurrency model choice (threads/processes/asyncio), package layout, __slots__ | references/pythonic-idioms.md |
For domain modeling, Clean/Hexagonal Architecture, SOLID applied to Python specifically, or
choosing/rejecting a design pattern or dependency-injection approach, additionally load
references/ddd-clean-architecture.md — load it alongside this file (and the framework
reference, if any) whenever the task is architectural, not just stylistic: aggregates, ports
and adapters, a Repository/Unit-of-Work, a composition root, or a "should I use a design
pattern here" question.
For strategic domain design (bounded contexts, context mapping, EventStorming), TDD/BDD
process, or Kafka-specific event-driven testing, additionally load
references/ddd-tdd-bdd-workflow.md — load it alongside references/ddd-clean-architecture.md,
not instead of it: that file owns tactical patterns (aggregates, repositories, UoW) and the
test pyramid; this one owns strategic design and the TDD/BDD/Kafka-testing methodology built
around those tactical patterns.
1. The Zen of Python (PEP 20)
These guiding principles should inform every design and coding decision:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!2–4. Layout, Imports, Whitespace — enforced by Ruff, not restated here
Raw PEP 8 mechanics (indentation and continuation-line alignment, blank-line counts, import ordering, operator spacing, whitespace pet peeves) are mechanically enforced by this skill's own Ruff configuration in §11 — run it rather than reviewing for these by hand; a rule the formatter already enforces is not worth a human (or model) pass. The house choices layered on top of plain PEP 8, which Ruff is configured to enforce and which do need stating:
- Line length: 79 characters for code (Ruff
line-length = 79), 72 for docstrings/comments — the stricter PEP 8 limit, not the common 88/100 relaxations. - 4 spaces, never tabs; hanging indents add a level, closing brackets align with the first character of the construct's line.
- Import groups stdlib → third-party → local, blank line between groups, one module per
importline, no wildcard imports (from x import *breaks static tooling), and prefer absolute imports; explicit relative imports are acceptable within a package. - Module-level dunders (
__all__,__version__) sit after the module docstring but before any imports exceptfrom __future__.
5. Naming Conventions
5.1 Summary Table
| Type | Convention | Example |
| Module | lowercase_with_underscores | my_module.py |
| Package | lowercase (no underscores) | mypackage |
| Class | CapitalizedWords (CamelCase) | MyClass |
| Exception | CapitalizedWords + Error suffix | ConnectionError |
| Function | lowercase_with_underscores | calculate_total() |
| Method | lowercase_with_underscores | get_name() |
| Variable | lowercase_with_underscores | total_count |
| Constant | UPPER_CASE_WITH_UNDERSCORES | MAX_OVERFLOW |
| Type Variable | CapitalizedWords (short) | T, AnyStr |
5.2 Underscore Conventions
| Pattern | Meaning |
_single_leading | Weak "internal use" indicator; not imported by from M import * |
single_trailing_ | Used to avoid conflicts with Python keywords (e.g., class_) |
__double_leading | Triggers name mangling in classes |
__dunder__ | "Magic" attributes/methods; never invent new ones |
5.3 Names to Avoid
- Never use
l(el),O(oh), orI(eye) as single-character variable names. - Avoid abbreviations that are ambiguous or unfamiliar outside your project.
- Don't include the type in the variable name (e.g.,
id_to_name_dict). - Always use descriptive names; descriptiveness should be proportional to scope.
5.4 Function and Method Arguments
- Always use
selfas the first argument to instance methods. - Always use
clsas the first argument to class methods. - If an argument name clashes with a keyword, append a trailing underscore (
class_).
6. Comments
6.1 Block Comments
- Indented to the same level as the code they describe.
- Each line starts with
#followed by a single space. - Separate paragraphs within a block comment with a line containing only
#.
6.2 Inline Comments
- Use sparingly and only when they add non-obvious context.
- Separate from the statement by at least two spaces, starting with
#. - Never state the obvious:
# ❌ Wrong
x = x + 1 # Increment x
# ✅ Correct
x = x + 1 # Compensate for border6.3 TODO Comments
Format (Google Style):
# TODO(username): Refactor this to use the new Widget class.
# TODO: b/12345678 - Remove this after the migration is complete.7. Docstrings (PEP 257 + Google Style)
7.1 General Rules
- Always use
"""triple double quotes""". - Write docstrings for all public modules, functions, classes, and methods.
- The first line is a summary ending in a period, question mark, or exclamation point.
- If multi-line, leave a blank line after the summary, then add elaboration.
- One-liner docstrings keep closing
"""on the same line. - Multi-line docstrings place the closing
"""on its own line.
7.2 One-Line Docstrings
def kos_root():
"""Return the pathname of the KOS root directory."""
global _kos_root
if _kos_root:
return _kos_root7.3 Multi-Line Docstrings (Google Style)
def fetch_smalltable_rows(
table_handle: smalltable.Table,
keys: Sequence[bytes | str],
require_all_keys: bool = False,
) -> Mapping[bytes, tuple[str, ...]]:
"""Fetch rows from a Smalltable.
Retrieve rows pertaining to the given keys from the Table instance
represented by table_handle. String keys will be UTF-8 encoded.
Args:
table_handle: An open smalltable.Table instance.
keys: A sequence of strings representing the key of each table row
to fetch. String keys will be UTF-8 encoded.
require_all_keys: If True, only rows with values set for all keys
will be returned.
Returns:
A dict mapping keys to the corresponding table row data fetched.
Each row is represented as a tuple of strings.
Raises:
IOError: An error occurred accessing the smalltable.
"""7.4 Class Docstrings
class SampleClass:
"""Summary of class here.
Longer class information...
Attributes:
likes_spam: A boolean indicating if we like SPAM or not.
eggs: An integer count of the eggs we have laid.
"""
def __init__(self, likes_spam: bool = False):
"""Initialize SampleClass with preference settings."""
self.likes_spam = likes_spam
self.eggs = 07.5 Module Docstrings
Every module should begin with a docstring:
"""A one-line summary of the module, terminated by a period.
Leave one blank line. The rest of this docstring should contain an
overall description of the module or program. Optionally, it may also
contain a brief description of exported classes and functions and/or
usage examples.
Typical usage example:
foo = ClassFoo()
bar = foo.function_bar()
"""Cross-cutting doc discipline (when to document, keeping docs in sync with code / drift, driving
Sphinx/mkdocstrings): see documenting-code. Prefer docstrings with runnable doctest examples —
they self-verify and are the cheapest drift guard.
8. Type Annotations (PEP 484 + Google Style)
8.1 General Rules
- Annotate all public APIs with type hints.
- Use built-in generics (
list,dict,tuple,set) instead of imports fromtypingwhere possible (Python 3.9+). - Use
X | Yunion syntax instead ofUnion[X, Y](Python 3.10+). - Annotating
selforclsis generally unnecessary. - Don't annotate the return value of
__init__.
8.2 Examples
def greeting(name: str) -> str:
"""Generate a greeting message."""
return f"Hello, {name}!"
def process_items(items: list[int], threshold: float = 0.5) -> dict[str, int]:
"""Process items above a threshold."""
return {"above": sum(1 for x in items if x > threshold)}
# For complex signatures, break one parameter per line
def my_method(
self,
first_var: int,
second_var: Foo,
third_var: Bar | None,
) -> int:
...9. Exception Handling (Google Style)
9.1 Rules
- Use built-in exception classes when appropriate (e.g.,
ValueError,TypeError). - Custom exceptions should inherit from an existing exception class and end with
Error. - Never use bare
except:or catchExceptionunless re-raising or creating an isolation point. - Minimize code inside
try/exceptblocks. - Use
finallyfor cleanup. - Do not use
assertfor validation of production data—only for internal invariants and tests.
9.2 Example
def connect_to_next_port(self, minimum: int) -> int:
"""Connect to the next available port.
Args:
minimum: A port value greater or equal to 1024.
Returns:
The new minimum port.
Raises:
ConnectionError: If no available port is found.
"""
if minimum < 1024:
raise ValueError(f"Min. port must be at least 1024, not {minimum}.")
port = self._find_next_open_port(minimum)
if port is None:
raise ConnectionError(
f"Could not connect to service on port {minimum} or higher."
)
return port10. Programming Recommendations
10.1 Comparisons
- Use
is/is notfor comparisons with singletons likeNone, never==/!=:
# ✅ Correct
if foo is not None:
...
# ❌ Wrong
if foo != None:
...10.2 Boolean Checks
- Use implicit truthiness where possible:
# ✅ Correct
if items:
...
if not items:
...
# ❌ Wrong
if len(items) != 0:
...
if items == []:
...10.3 String Concatenation
- For joining many strings, use
"".join()instead of+=in loops:
# ✅ Correct
result = "".join(items)
# ❌ Wrong (O(n²) in some implementations)
result = ""
for item in items:
result += item10.4 Context Managers
- Use
withstatements for resource management (files, sockets, locks):
# ✅ Correct
with open("file.txt") as f:
data = f.read()
# ❌ Wrong
f = open("file.txt")
data = f.read()
f.close()10.5 Comprehensions & Generators
- Prefer comprehensions for simple cases; avoid for complex logic:
# ✅ Good — simple and readable
squares = [x * x for x in range(10)]
# ❌ Bad — too complex, use a loop instead
result = [
(x, y, z)
for x in range(5)
for y in range(5)
if x != y
for z in range(5)
if y != z
]10.6 Default Arguments
- Never use mutable objects as default argument values:
# ✅ Correct
def foo(a: list[int] | None = None):
if a is None:
a = []
# ❌ Wrong
def foo(a: list[int] = []):
...10.7 The Main Guard
- Always wrap executable code in a
__main__check:
def main():
...
if __name__ == "__main__":
main()11. Linting & Formatting Tools
Enforce these standards automatically using the following tools:
| Tool | Purpose | Install |
| Ruff | Fast linter + formatter — the single recommended tool; replaces flake8, isort, and black | pip install ruff |
| mypy | Static type checker | pip install mypy |
| pylint | Comprehensive linter (optional; Google style guide references it) | pip install pylint |
| bandit | Security linter for common Python security issues | pip install bandit |
| pip-audit | Dependency vulnerability scanning (run in CI) | pip install pip-audit |
Use Ruff as the one formatter/linter. Black and isort are legacy standalone alternatives — do not add them alongside Ruff, which already covers both (ruff format = Black-compatible formatting, the I rule = isort).
Recommended pyproject.toml configuration:
[tool.ruff]
line-length = 79
target-version = "py311"
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort
"N", # pep8-naming
"D", # pydocstyle
"UP", # pyupgrade
"B", # bugbear
"SIM", # simplify
"ANN", # annotations
]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = trueAnti-pattern quick reference
| Anti-pattern | Instead |
| Tabs for indentation | 4 spaces per level, always |
import os, sys on one line | One import per line, grouped stdlib → third-party → local |
Wildcard imports (from module import *) | Import the module or specific names explicitly |
Spaces around = in keyword arguments/defaults (imag = 0.0) | imag=0.0 — no spaces for kwargs and default values |
l, O, I as single-character variable names | Descriptive names, proportional to scope |
Inline comments stating the obvious (x = x + 1 # Increment x) | Comment only non-obvious context (# Compensate for border) |
foo != None / foo == None | foo is not None / foo is None |
if len(items) != 0 or items == [] | Implicit truthiness: if items: / if not items: |
Building strings with += in a loop | "".join(items) |
Manual open() / close() for files, sockets, locks | with context manager |
| Multi-clause comprehensions with complex logic | A plain loop |
Mutable default arguments (def foo(a: list[int] = [])) | Default to None and guard inside the function |
Bare except: or catching Exception broadly | Catch specific exceptions; re-raise or isolate deliberately |
assert to validate production data | Raise real exceptions (ValueError, etc.); reserve assert for internal invariants and tests |
| Executable code at module top level | Wrap in main() behind if __name__ == "__main__": |
type(obj) == list | isinstance(obj, list) — respects subclasses |
Re-raising a translated exception without from | raise NewError(...) from exc — preserves the original traceback chain |
| Threads for CPU-bound work | ProcessPoolExecutor — the GIL blocks thread-based CPU parallelism (see references/pythonic-idioms.md) |
Regular class instantiated by the thousands with no __slots__ | Add __slots__ once instance count matters for memory |
Pre-flight checklist — run before delivering any Python code
When writing or reviewing Python code, verify:
- Indentation: 4 spaces, no tabs
- Line length: ≤79 chars (72 for docstrings/comments)
- Imports: Ordered (stdlib → third-party → local), one per line, no wildcards
- Blank lines: 2 around top-level definitions, 1 around methods
- Naming:
snake_casefor functions/variables,CamelCasefor classes,UPPER_CASEfor constants - Docstrings: Triple double quotes, present on all public APIs, Google style Args/Returns/Raises
- Type hints: Present on public APIs, using modern syntax
- Whitespace: No trailing whitespace, proper operator spacing
- Comparisons:
is/is notfor singletons, implicit truthiness for containers - No mutable defaults: Use
None+ guard instead - Context managers:
withfor files, sockets, locks - Main guard:
if __name__ == "__main__"present - Exception handling: Specific exceptions, no bare
except: - Exception chaining:
raise ... fromused when translating one exception into another - Generators: Large or streamed data uses a generator, not a fully-materialized list
- Concurrency: Tool matches the workload — threads for blocking I/O, processes for CPU, asyncio for async-native I/O (see
references/pythonic-idioms.md)
Other versions43 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 43
- alinaqi/maggy★ 711same name
- alinaqi/claude-bootstrap★ 708same name
- Mindrally/skills★ 275same name
- kid-sid/claude-spellbook★ 190same name
- hass-energy/haeo★ 72same name
- nimadorostkar/Claude-Skills-collection★ 33same name
- maroffo/claude-forge★ 17same name
- G1Joshi/Agent-Skills★ 15same name
- kissgyorgy/coding-agents★ 15same name
- harness-studio/harness-studio★ 9same name
33 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
Used alongsideProjects with it also use android-kotlin, java and 7 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
alinaqiSkillandroid-kotlin
Android Kotlin development with Coroutines, Jetpack Compose, Hilt, and MockK testing
Also in 4 projects that use this
infiniumtekSkilljava
Expert code-review guidance for Java (.java) changes. Flags correctness bugs, concurrency hazards, security vulnerabilities, performance problems, and unidiomatic code in a diff. Use when reviewing modified or added Java source.
Also in 4 projects that use this
ffsshhttiikkSkillcsharp
C# programming language best practices and patterns
Also in 4 projects that use this
carapace-shSkillruby
Use when working with Ruby — the dynamic, object-oriented language and its runtime (MRI/CRuby). Covers the object model, metaprogramming, core types, blocks/procs/lambdas, control flow and exceptions, I/O and encoding, the concurrency model (Threads, Fibers, Ractors, GVL), garbage collection and ObjectSpace, the RubyGems/Bundler package system, the interpreter CLI and tooling (irb, erb, rake, rdoc/ri), environment variables, and the standard library. Triggers on: "ruby", "Ruby", "MRI", "CRuby", "YARV", "Ripper", "object model", "method lookup", "eigenclass", "singleton class", "metaprogramming", "define_method", "method_missing", "class_eval", "instance_eval", "Refinements", "Binding", "Proc", "lambda", "block", "yield", "rescue", "ensure", "raise", "begin", "end", "Encoding", "String#encode", "Thread", "Fiber", "Ractor", "GVL", "GIL", "Mutex", "ObjectSpace", "GC", "WeakRef", "gem", "Gemfile", "Bundler", "gemspec", "bundle exec", "irb", "erb", "rake", "Rakefile", "rdoc", "ri", "RUBYOPT", "RUBYLIB", "GEM_HOME", "GEM_PATH", "BUNDLE_GEMFILE", "frozen string literal", "RUBY_VERSION", "RUBY_ENGINE".
Also in 4 projects that use this
ffsshhttiikkSkillflutter
Flutter cross-platform framework
Also in 3 projects that use this
mcollinaSkillnode
Provides domain-specific best practices for Node.js development with TypeScript, covering type stripping, async patterns, error handling, streams, modules, testing, performance, caching, logging, and more. Use when setting up Node.js projects with native TypeScript support, configuring type stripping (--experimental-strip-types), writing Node 22+ TypeScript without a build step, or when the user mentions 'native TypeScript in Node', 'strip types', 'Node 22 TypeScript', '.ts files without compilation', 'ts-node alternative', or needs guidance on error handling, graceful shutdown, flaky tests, profiling, or environment configuration in Node.js. Helps configure tsconfig.json for type stripping, set up package.json scripts, handle module resolution and import extensions, and apply robust patterns across the full Node.js stack.
Also in 3 projects that use this
In this repository91 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- goSkill
- json-standardsSkill
- rabbitmqSkill
- rSkill
- rustSkill
- code-standardsSkill
- software-architectureSkill
- swiftSkill
- typescript-code-standardsSkill
- architecture-documentation-and-decision-recordsSkill
- business-requirements-standardsSkill
- developer-handoff-standardsSkill
- development-planning-standardsSkill
- document-writer-reviewerSkill
- feature-planning-standardsSkill
- functional-specification-standardsSkill
- non-functional-requirements-standardsSkill
- operations-standardsSkill
- product-requirements-standardsSkill
- documentationSkill
- solution-architecture-standardsSkill
- technical-requirements-standardsSkill
- documenting-codeSkill
- github-circleci-standardsSkill
- graphifySkill
- puml-diagramsSkill
- software-architecture-progressionSkill
- testingSkill
- software-test-specificationSkill
- zeno-councilSkill
- zeno-debugSkill
- zeno-insightSkill
- zenoSkill
- zeno-stackSkill
- zeno-accessibilitySkill
- zeno-angular-developerSkill
- zeno-api-designSkill
- zeno-browser-qaSkill
- zeno-build-resolverSkill
- zeno-codebase-onboardingSkill
- zeno-code-tourSkill
- zeno-comment-analysisSkill
- zeno-config-gcSkill
- zeno-context-budgetSkill
- zeno-context-compactionSkill
- zeno-cost-reportSkill
- zeno-database-migrationsSkill
- zeno-deep-researchSkill
- zeno-deployment-patternsSkill
- zeno-design-systemSkill
- zeno-docker-patternsSkill
- zeno-e2e-testingSkill
- zeno-error-handlingSkill
- zeno-find-skillsSkill
- zeno-frontend-designSkill
- zeno-github-opsSkill
- zeno-git-workflowSkill
- zeno-harness-optimizerSkill
- The first 60 shown.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

