Token导航 LogoToken导航

Agent Skill · 开发

sniffable-python(sniffable Python 测试)

用于辅助 Python 项目开发、测试、依赖管理和常见框架工作流。它适合让 Agent 阅读 Python 代码、定位测试问题、整理运行命令、生成脚本或分析数据处理逻辑。使用时需要确认项目虚拟环境、依赖版本和测试入口;涉及执行脚本、读写文件、访问数据库或调用外部 API 时,应先明确运行目录和输入输出范围,避免误改生产数据。

sniffable-python 是开发类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为执行命令;许可证信息还不明确,第三方扫描已通过,按安装量在开发类的 21,746 个 Skill 里排第 19,628。

总安装 264周安装 11GitHub Stars 37下载 88核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:sniffable-python(sniffable Python 测试)
来源仓库:https://github.com/simhacker/moollm
仓库路径:skills/sniffable-python
安装命令:
npx skills add https://github.com/simhacker/moollm --skill sniffable-python
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/simhacker/moollm --skill sniffable-python

这个 Skill 是做什么的

开发类 Skill 面向写代码、改代码和排查问题,一般会读写仓库文件,部分还会执行构建或测试命令。

sniffable-python 用于辅助 Python 项目开发、测试、依赖管理和常见框架工作流,适合处理 Python 代码和测试问题。它能阅读 Python 代码、定位测试问题、整理运行命令,提升开发效率。

安装命令为 npx skills add https://github.com/simhacker/moollm --skill sniffable-python,建议结合虚拟环境和依赖版本使用。使用时需确认运行目录和输入输出范围,避免误改生产数据;涉及脚本执行时应先明确权限边界。

该技能适用于开发类任务,需配合 Codex、Claude、Cursor、Gemini CLI 使用。

来源仓库内路径:skills/sniffable-python

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/simhacker/moollm --skill sniffable-python;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要执行命令,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

sniffable-python 怎么安装?

在终端执行 npx skills add https://github.com/simhacker/moollm --skill sniffable-python。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

sniffable-python 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

sniffable-python 需要什么权限?

权限级别是执行命令。安装流程涉及命令执行,可能通过 npx skills add https://github.com/simhacker/moollm --skill sniffable-python 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

sniffable-python 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

sniffable-python 用的人多吗?

公开数据是累计安装 264 次,近一周安装 11 次,下载 88 次,GitHub 37 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

sniffable-python 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 需要执行命令,装到常用环境前要先评估影响面。
  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发类任务、又不想每次都手写提示词的人。

不太适合

  • 不能接受 Skill 在你机器上执行命令的人。
  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
skill-vetter

技能审查员 · OpenClaw

8,779,018986操作浏览器MIT-0通过
ontology

本体论 · OpenClaw

6,636,960576只读MIT-0通过
entra-app-registration

内部应用程序注册 · Codex、Claude

6,631,872764接触敏感数据未明确通过
entra-app-registration

内部应用程序注册 · Codex、Claude

3,757,680201接触敏感数据未明确通过
nano-banana-pro

纳米香蕉专业版 · OpenClaw

3,526,898364接触敏感数据MIT-0有提醒
sniffable-python

sniffable Python 测试 · 本页

26437执行命令未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Sniffable Python

"Structure code for the first 50 lines. That's all the LLM needs."

Don't invent new syntax — structure existing syntax for optimal LLM comprehension.

*If your code smells good, the LLM can sniff it from the first whiff.*

*Steve Jobs wanted pixels you could lick. We want code you can sniff.*


The Problem

LLMs can read Python. But:

  • Large files overwhelm context
  • Implementation details bury the API
  • Comments scattered or missing
  • No clear entry point for understanding

Solution: Structure Python so the first ~50 lines contain everything needed to understand and use the tool. Make your code's bouquet apparent from the opening notes.


The Pattern

Canonical Structure

#!/usr/bin/env python3
"""skill-name: Brief description of what the script does.

This docstring becomes --help output AND is immediately visible to the LLM.
It should contain:
- Purpose (one sentence)
- Usage examples
- Key behaviors

Usage:
    python script.py command [options]

Examples:
    python script.py move north --quiet
    python script.py examine sword --verbose
"""

import argparse
from pathlib import Path
import yaml

# Configuration
DEFAULT_ROOM = "start"
VALID_DIRECTIONS = ["north", "south", "east", "west"]
MAX_INVENTORY = 10

def main():
    """Main entry point — CLI structure only, no implementation."""
    parser = argparse.ArgumentParser(
        description=__doc__.split('\n')[0],  # First line of module docstring
        formatter_class=argparse.RawDescriptionHelpFormatter
    )
    subparsers = parser.add_subparsers(dest="command", required=True)

    # move command
    move_parser = subparsers.add_parser("move", help="Move in a direction")
    move_parser.add_argument("direction", choices=VALID_DIRECTIONS,
                             help="Direction to move")
    move_parser.add_argument("--quiet", "-q", action="store_true",
                             help="Suppress output")

    # examine command
    examine_parser = subparsers.add_parser("examine", help="Look at something")
    examine_parser.add_argument("target", help="What to examine")
    examine_parser.add_argument("--verbose", "-v", action="store_true",
                                help="Show details")

    # status command
    status_parser = subparsers.add_parser("status", help="Show game state")
    status_parser.add_argument("--verbose", "-v", action="store_true",
                               help="Show details")

    args = parser.parse_args()
    _dispatch(args)

# Implementation (LLM only reads past here if modifying behavior)

def _dispatch(args):
    """Route to appropriate handler."""
    if args.command == "move":
        _do_move(args.direction, args.quiet)
    elif args.command == "examine":
        _do_examine(args.target, args.verbose)
    elif args.command == "status":
        _show_status(args.verbose)

def _do_move(direction: str, quiet: bool) -> None:
    """Internal: Execute movement."""
    ...

def _do_examine(target: str, verbose: bool) -> None:
    """Internal: Examine an object."""
    ...

def _show_status(verbose: bool) -> None:
    """Internal: Display status."""
    ...

if __name__ == "__main__":
    main()

The Zones

ZoneLinesPurpose
Shebang + Docstring1-15Purpose, usage, becomes --help
Imports16-22Dependencies visible at a glance
Constants23-30Configuration, valid values, limits
CLI Structure31-50Command tree with types and docs
Implementation51+Only read if modifying

Why This Works

Dual-Audience Design

# One file, two audiences, same source of truth
dual_audience:
  source: "Python file (sniffable)"
  audiences:
    human:
      entry_point: "--help"
      sees: "CLI usage, arguments, examples"
    llm:
      entry_point: "first 50 lines"
      sees: "docstring, imports, constants, CLI tree"
  convergence: "Same source of truth — no duplication, no drift"

DRY Principle

The CLI decorators ARE the documentation:

@click.option('--verbose', '-v', is_flag=True, help='Show details')

This single line defines:

  • The flag name (--verbose)
  • The short form (-v)
  • The type (boolean flag)
  • The help text
  • The Python parameter name and type

No duplication. No drift. One source.


Why Syntax Compression Fails

Some argue for compressing syntax to save tokens — dense symbols, sigils, minimal keywords. This is the wrong optimization.

Perl is the cautionary tale. Its obsessive fetish for compact syntax, sigils, punctuation, and performative TMTOWTDI one-liners — to the point of looking like line noise — is exactly why it's no longer relevant for LLM comprehension and generation.

ApproachTokensComprehensionTraining Data
Dense novel syntaxFewerLow (unfamiliar)Minimal
Sniffable PythonMoreHigh (known syntax)Billions

The LLM already knows Python cold. Teaching it a novel syntax costs millions of tokens per context window (docs, examples, corrections) — and that cost is paid every single prompt, because prompting is not training. LLMs have no memory. Sniffable Python costs zero tokens to teach — the LLM just reads code it understands deeply from massive pre-training.

The Symbol Collision Problem

Short symbols cause semantic collisions. When @ appears, it activates Python decorators, shell patterns, email addresses, and more — simultaneously. The model has to do disambiguation work that wouldn't exist with unambiguous keywords. That disambiguation costs compute and introduces error modes.

Comprehension Fidelity > Token Count

You're not optimizing for token count. You're optimizing for how well the LLM understands your code.

Dense punctuation is anti-optimized for how transformers tokenize and reason. Verbose, well-structured code with semantic comments actually compresses better in the LLM's internal representations.


Comments as YAML Jazz

Apply YAML-JAZZ principles to Python comments:

# CONSTANTS
TIMEOUT = 30        # generous — API is flaky on Mondays
MAX_RETRIES = 3     # based on observed failure patterns in prod
BATCH_SIZE = 100    # memory-safe for 8GB instances

# TODO: Add circuit breaker after next major outage
# FIXME: Rate limiting not yet implemented
# NOTE: This duplicates logic in api_client.py — consider extracting

These comments ARE data. The LLM reads them. Acts on them. Uses them to understand *why*, not just *what*.


Comments: Substance Over Decoration

Don't waste tokens on decorative separators:

# BAD: Decorative separators (long = or - lines add no meaning)
# GOOD: Plain and functional
# Imports
import argparse

Don't trim Christmas trees:

Avoid ASCII art or box-drawing in comments. Use plain section comments instead:

# Configuration
TIMEOUT = 30  # generous — API flaky on Mondays

Do include useful semantic comments:

# ✓ GOOD: Explains WHY
TIMEOUT = 30        # generous — API flaky on Mondays
MAX_RETRIES = 3     # based on observed failure patterns
BATCH_SIZE = 100    # memory-safe for 8GB instances

# ✓ GOOD: Documents intent
# TODO: Add circuit breaker after next outage
# NOTE: Duplicates logic in api_client.py — consider extracting

The rule: Every comment token should carry meaning. If it's just decoration, delete it.


Argparse vs Click vs Typer

Argparse is preferred for sniffable Python because it separates structure from implementation:

FeatureArgparseClickTyper
Structure/impl separation✓ Clean✗ Mixed✗ Mixed
Top-down tree order✓✗✗
Built-in (no deps)✓✗✗
Training dataAbundantAbundantGrowing
LLM familiarityHighestHighMedium

The Argparse Advantage

With Click/Typer, decorators attach to functions — so CLI structure is interleaved with implementation:

# Click: structure mixed with implementation
@cli.command()
def examine(target: str):  # ← implementation starts here
    """Look at something."""
    do_stuff()  # ← can't sniff without reading this

With argparse, main() contains the entire CLI tree with no implementation:

# Argparse: clean separation
def main():
    """CLI structure only — no implementation."""
    parser = argparse.ArgumentParser(description="Tool description")
    subparsers = parser.add_subparsers(dest="command")

    # examine command
    examine_parser = subparsers.add_parser("examine", help="Look at something")
    examine_parser.add_argument("target", help="What to examine")
    examine_parser.add_argument("--verbose", "-v", action="store_true")

    # move command
    move_parser = subparsers.add_parser("move", help="Move in a direction")
    move_parser.add_argument("direction", choices=VALID_DIRECTIONS)

    args = parser.parse_args()
    _dispatch(args)  # ← implementation is ELSEWHERE

# IMPLEMENTATION (completely separate, below the fold)
def _dispatch(args):
    ...

The LLM reads main() and sees the entire command tree — arguments, types, choices, help text — without any implementation noise. Pure sniffability. No need to hold your nose.


Integration with Sister Scripts

Sniffable Python is how sister scripts should be structured:

skill/
├── SKILL.md           # Tells LLM how to generate scripts
├── CARD.yml           # Interface definition
└── scripts/
    └── helper.py      # Sniffable Python

When the skill/SKILL.md instructs the LLM to generate a sister script, it should follow sniffable-python conventions:

  1. Docstring with usage at top, no decorations
  2. Imports grouped and labeled
  3. Constants with explanatory comments
  4. CLI structure before implementation
  5. Implementation below the fold

Directory-Agnostic Invocation

Critical pattern: All scripts — including sniffable Python — must work when invoked from ANY directory. Scripts find their skill context using __file__, not os.getcwd().

For bash scripts, see sister-script/ for the equivalent pattern.

The Pattern

from pathlib import Path

# Find THIS script's location (not the caller's cwd)
SCRIPT_DIR = Path(__file__).resolve().parent
SKILL_DIR = SCRIPT_DIR.parent  # If script is in skill/scripts/

# Now find sibling files relative to script location
CONFIG_FILE = SKILL_DIR / "config.yml"
PATTERNS_DIR = SKILL_DIR / "patterns"
TEMPLATES_DIR = SKILL_DIR / "templates"

Why __file__?

  • Path(__file__) — path to THIS script file
  • .resolve() — resolve symlinks to get real location
  • .parent — containing directory

Why NOT os.getcwd()?

  • os.getcwd() returns the CALLER's directory
  • Script invoked from /home/user/ won't find skills/foo/patterns/

The Complete Template

#!/usr/bin/env python3
"""sister-tool: Brief description.

Usage:
    python3 skills/my-skill/scripts/sister-tool.py command [options]

Can be invoked from any directory — finds its own context.
"""

from pathlib import Path
import argparse
import yaml

# DIRECTORY CONTEXT
# Find script location regardless of caller's cwd
SCRIPT_DIR = Path(__file__).resolve().parent
SKILL_DIR = SCRIPT_DIR.parent  # scripts/ is one level down from skill/

# Skill-relative paths
CARD_FILE = SKILL_DIR / "CARD.yml"
PATTERNS_DIR = SKILL_DIR / "patterns"
TEMPLATES_DIR = SKILL_DIR / "templates"
CONFIG_DIR = SKILL_DIR / ".moollm" / "skills" / SKILL_DIR.name

# CONFIGURATION
def load_card():
    """Load skill's CARD.yml for metadata."""
    if CARD_FILE.exists():
        return yaml.safe_load(CARD_FILE.read_text())
    return {}

def main():
    """CLI structure — sniffable, directory-agnostic."""
    card = load_card()
    parser = argparse.ArgumentParser(
        description=card.get("description", __doc__.split('\n')[0])
    )
    # ... CLI structure ...
    args = parser.parse_args()
    _dispatch(args)

# IMPLEMENTATION
def _dispatch(args):
    ...

if __name__ == "__main__":
    main()

Why This Matters

Invocationos.getcwd()Path(__file__).parent
cd skills/foo && python scripts/bar.pyskills/foo/skills/foo/scripts/
python skills/foo/scripts/bar.py/home/user/skills/foo/scripts/
cd / && python /path/to/skills/foo/scripts/bar.py/skills/foo/scripts/

Path(__file__).parent always works. The script finds its own context.


The Play-Learn-Lift Connection

Sniffable Python is the crystallization point of LIFT — where proven procedures become reusable automation.

# PLAY → LEARN → LIFT progression
play_learn_lift:
  play:
    emoji: "🎮"
    action: "Jump in! Try things"
    artifact: "session-log.md"
    quality: "Messy exploration, may fail"
  learn:
    emoji: "📚"
    action: "Patterns emerge, document procedures"
    artifact: "PROCEDURE.md"
    quality: "Structured notes, works when followed"
  lift:
    emoji: "🚀"
    action: "Automate it! Share the tool"
    artifact: "sister-script.py (SNIFFABLE PYTHON)"
    quality: "Clean interface, others can use"

The LIFT stage produces sniffable Python because:

  • Others (human and LLM) need to understand the tool quickly
  • The CLI must be discoverable without reading implementation
  • The script must be maintainable without spelunking

See: play-learn-lift/ — The full methodology


The Skill-to-Script Flow

The skill/ skill describes how skills act as factories that produce instances. When a skill generates a CLI tool, that tool should be sniffable Python.

# Skill → Script → LLM → Output pipeline
skill_to_script_flow:
  - stage: "SKILL.md"
    role: "The teacher — knows how to build things"
    action: "instructs LLM to generate"
  - stage: "Sister Script"
    role: "SNIFFABLE PYTHON"
    properties:
      - "Docstring = API"
      - "main() = CLI tree"
      - "Comments = Jazz"
    action: "LLM sniffs to understand"
  - stage: "LLM Comprehension"
    role: "Reads first 50 lines, understands CLI, can invoke tool"
    action: "executes"
  - stage: "Structured Output"
    role: "YAML / JSON — LLM can parse, feeds back"

Example from adventure skill:

The adventure skill's vision includes a Python CLI that handles deterministic operations:

$ adventure lint examples/adventure-4/    # Validate world
$ adventure move alice north              # Update coordinates
$ adventure scan --pending                # Find work to do

Each of these is a sniffable subcommand. The LLM sniffs adventure --help (or just reads main()) and knows the full API.


The Adventure Linter Feedback Loop

The adventure/ skill demonstrates sniffable Python in a feedback loop:

# Adventure linter feedback loop
linter_feedback_loop:
  - step: "LLM generates content"
    does: "Create rooms, objects, characters in YAML Jazz format"
  - step: "Sniffable linter runs"
    does: "adventure-lint.py validates world consistency"
  - step: "LINTER.yml output"
    does: "Structured findings: errors, warnings, suggestions"
  - step: "LLM reads lint results"
    does: "Understands what needs fixing, generates corrections"
  - step: "iterate"
    does: "Loop back to generation with fixes"

From examples/adventure-4/LINTER.yml:

summary:
  rooms_found: 36
  objects_found: 37
  characters_found: 6
  errors: 8
  warnings: 36
  compile_requests: 9

events:
- type: FOUND_ROOM
  severity: INFO
  path: pub/ROOM.yml
  message: 'Found room: The Gezelligheid Grotto'
  data:
    exits: [NORTH, UP, BACK]
    objects: 15
    sub_rooms: 1

Why this works:

  • The linter is sniffable — LLM understands its CLI
  • The output is YAML — LLM parses it naturally
  • Events are structured — LLM knows what to fix
  • The loop is tight — generate → lint → fix → repeat

This is Python for precision, LLM for poetry.


Live Examples in adventure-4

TomTomagotchi — YAML Jazz in Action

kitchen/tomtomagotchi.yml demonstrates sniffable structure in YAML:

abilities:
  COMPASS:
    description: "Point toward a target"
    usage: "COMPASS [target]"
    targets:
      - start     # Always knows home
      - home      # The surface
      - treasure  # The goal

The comment "Always knows home" is data. The LLM reads it and understands the semantics. This is YAML Jazz applied to game objects.

The Pub — Framing Through Comments

pub/ROOM.yml uses comments to frame the room's purpose:

framing:
  mode: [performance, celebration, socialization, tribute, third_place]

  description: |
    This is a PLACE OF PERFORMANCE AND CELEBRATION.
    This is a THIRD PLACE — neither home nor work, but community.
    This is where TRIBUTES are performed with love.

Comments explain WHY the pub exists. The LLM uses this framing to generate appropriate content — debates are sport, personas are welcome, tributes are loving.

Skills as Rooms

From skill/SKILL.md, skills manifest as rooms you can enter:

> enter the adventure skill
You are in the Adventure Workshop.
Exits: pub, maze, character-gallery
Objects: room-templates, npc-catalog, puzzle-designs

The skill directory IS the room. The sister scripts are objects you can pick up and use. Sniffable Python makes those scripts discoverable.


The Coherence Engine Flow

# Coherence Engine: user request → LLM discovery → execution
coherence_flow:
  trigger: "Run the room builder for the kitchen"
  steps:
    - action: "LLM reads skill/SKILL.md"
      discovers: "scripts/room-builder"
    - action: "LLM sniffs room-builder.py (first 50 lines)"
      sees:
        docstring: "Creates rooms..."
        commands: [create, modify, list]
        options: [--template, --force]
    - action: "LLM understands API, generates command"
      output: "room-builder create --template kitchen"

The LLM discovers the tool's capabilities by reading its structure, not by loading documentation. One quick sniff and it knows what's cooking.


Checklist

When writing sniffable Python:

  • Shebang on line 1
  • Module docstring with purpose, usage, examples
  • Imports grouped at top (no decorative markers)
  • Constants with explanatory comments
  • CLI structure in main() using argparse (preferred) or Click/Typer
  • Each command has a docstring
  • Types specified in function signatures
  • Implementation below line 50
  • Internal functions prefixed with _
  • if __name__ == "__main__": at bottom

Anti-Patterns (Code Smells You Can't Unsmell)

❌ Implementation before CLI

def _helper():
    ...
def _another_helper():
    ...
# 200 lines later...
@click.command()
def main():
    ...

❌ No docstrings

@click.command()
def process(x, y, z):
    # What does this do? What are x, y, z?

❌ Magic constants

if retries > 3:  # Why 3? What happens at 4?

❌ Scattered imports

import os
def foo():
    import json  # Hidden dependency

Commands

CommandAction
SNIFF [file]Read and summarize a Python file's API
SNIFF CODE [file]Language-agnostic review for sniffability
GENERATE-SNIFFABLE [name]Create new sniffable script from template
VALIDATE-SNIFFABLE [file]Check if file follows conventions

SNIFF CODE — Works on Any Language

The SNIFF CODE command isn't Python-specific. It reviews any source file:

> SNIFF CODE src/api/handler.ts

Sniffability Report for handler.ts:
✓ Purpose clear from first 10 lines
✓ Exports/API visible before implementation
✗ Magic number on line 47 — needs comment
✗ Helper function before main export — reorder
✓ Semantic comments explain WHY not WHAT

Overall: Mostly fresh, minor reordering needed

What it checks:

AspectQuestion
PurposeCan you understand what this does in 10 lines?
API-firstAre exports/interfaces/main before helpers?
CommentsDo comments explain WHY, not just WHAT?
No decorationAre comments semantic, not decorative cruft?
ConstantsDo magic values have explanatory comments?
DependenciesAre imports/requires visible at top?

Good for humans. Good for LLMs. Same conventions.


Protocol Symbol

SNIFFABLE-PYTHON

Invoke when: Generating or reading Python scripts that need to be LLM-comprehensible.


Dovetails With — The Intertwingularity

Everything in MOOLLM connects. Sniffable Python sits at the intersection of multiple skills:

# How sniffable-python connects to other skills
skill_connections:
  parent: "constructionism (build to learn)"
  center: "sniffable-python"
  peers:
    - skill: "play-learn-lift"
      relation: "LIFT stage produces sniffable Python"
    - skill: "yaml-jazz"
      relation: "Comments carry semantic meaning"
  children:
    - skill: "sister-script"
      relation: "Sister scripts ARE sniffable Python"
    - skill: "skill"
      relation: "Skills generate sniffable scripts"
    - skill: "adventure"
      relation: "Linter exemplifies the feedback loop"
SkillRelationship to Sniffable Python
sister-script/Sister scripts ARE sniffable Python
skill/Skills generate sniffable scripts
yaml-jazz/Comments carry semantic meaning
play-learn-lift/Sniffable Python is LIFT output
constructionism/Build inspectable things
adventure/Linter exemplifies the feedback loop
session-log/Raw exploration → procedures → scripts
research-notebook/Documented patterns become scripts

Live Examples

ExampleLocationWhat It Shows
Adventure-4 Worldexamples/adventure-4/Complete world with linter-driven generation
TomTomagotchikitchen/tomtomagotchi.ymlYAML Jazz: abilities documented with usage examples
The Pubpub/ROOM.ymlSemantic comments as framing protocol
The Linter OutputLINTER.ymlStructured output the LLM can parse
Skill as Roomskill/SKILL.mdSkills manifest as explorable spaces

The Circle Completes

PLAY: Try things, log them
  ↓
LEARN: Document patterns in PROCEDURE.md
  ↓
LIFT: Generate sister-script.py in SNIFFABLE PYTHON format
  ↓
SKILL: Add to skill, expose to LLM
  ↓
LLM: Sniffs script, understands API, uses tool
  ↓
OUTPUT: YAML results (linter, builder, etc.)
  ↓
PLAY: Try new things with the tool...
  ↓
[repeat]

This is the MOOLLM development loop. Sniffable Python is the code interface that makes it work.


Beyond Python: Universal Sniffability

While this skill focuses on Python, the principles are language-agnostic:

LanguageSniffable Structure
TypeScriptExports at top, types before implementation, JSDoc on public API
GoPackage doc, exported functions first, internal helpers below
RustModule doc, pub items at top, private impl below
JavaClass Javadoc, public methods before private
BashUsage comment at top, main at top, functions below

The universal rule: Whatever a reader (human or LLM) needs to *use* the code should be visible before whatever they need to *modify* it.

// ✓ Sniffable TypeScript
/**
 * User authentication service.
 * @module auth
 */

export interface AuthConfig { ... }
export function authenticate(config: AuthConfig): Promise<User> { ... }
export function logout(): void { ... }

// Implementation details below
function validateToken(token: string): boolean { ... }

Same smell test, any language: Can you understand what this code offers by reading just the head?


Lickable Pixels, Sniffable Code

When Steve Jobs unveiled Mac OS X's Aqua interface in 2000, he said:

*"We made the buttons on the screen look so good you'll want to lick them."*

Jobs understood that interfaces aren't just functional — they should be sensually inviting. The translucent droplets, the pulsing default buttons, the candy-colored icons — these weren't decoration. They were signals of quality that drew users in.

Programming languages are user interfaces. The users are humans and LLMs. And just as lickable pixels invite visual exploration, sniffable code invites structural exploration.

Lickable Pixels (UI)Sniffable Code
Visually invitingStructurally inviting
Draws the eye to affordancesDraws the reader to the API
Beauty signals qualityClarity signals quality
Users want to clickReaders want to use
First impression mattersFirst 50 lines matter

Jobs didn't make Aqua pretty at the expense of function — the visual design *reinforced* usability. Sniffable code works the same way: the structural clarity that helps LLMs also helps humans. We're not optimizing for machines at human expense. We're optimizing for comprehension, and both benefit.

*Perl looks like line noise. Sniffable Python looks like an invitation.*


The Thesis

The "ideal LLM syntax" question has the wrong framing.

You don't need new syntax. You need structured familiar syntax.

  • Languages LLMs know (Python, TypeScript, Go, Rust...)
  • Structured for sniffability (important stuff at top)
  • Comments as data (YAML Jazz applied to any language)
  • Single source of truth (the code IS the spec)

Dense syntax compresses the wrong thing. Sniffable code structures the right thing.

*Jobs made you want to lick the screen. We want you to sniff the source.*


*"The LLM doesn't need fewer tokens of unfamiliar syntax. It needs familiar syntax, structured for fast comprehension."*

*Good code doesn't just avoid bad smells — it has an aroma that draws you in from the header.*

平台分布

Codex

35.4%
按下载量换算31

Claude

29.49%
按下载量换算26

Cursor

17.47%
按下载量换算15

Gemini CLI

9.35%
按下载量换算8

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

执行命令

安装流程涉及命令执行,可能通过 npx skills add https://github.com/simhacker/moollm --skill sniffable-python 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills