feat: offline robustness, non-text slop pattern, and technical nuance#17
feat: offline robustness, non-text slop pattern, and technical nuance#17edithatogo wants to merge 79 commits intoblader:mainfrom
Conversation
…apters.py' as complete
…idate_adapters.py' as complete
…all_adapters.py' as complete
There was a problem hiding this comment.
Pull request overview
This PR expands and hardens the repo’s “adapter” ecosystem by adding Python automation + tests, introducing a Professional skill variant assembled from modular fragments, and adding prose linting via Vale (Google/Microsoft style packages).
Changes:
- Added Python equivalents of adapter sync/validate/install scripts with pytest coverage + strict Ruff/Mypy configuration.
- Refactored skill content into
src/fragments and introducedSKILL_PROFESSIONAL.md(Humanizer Pro), plus updated adapters/docs to reference variants. - Added Vale + bundled Google/Microsoft style rules, wired into pre-commit and CI.
Reviewed changes
Copilot reviewed 169 out of 171 changed files in this pull request and generated 14 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/init.py | Initializes tests package. |
| tests/test_install_adapters.py | Unit tests for Python install script behavior. |
| tests/test_sync_adapters.py | Unit tests for Python sync script behavior. |
| tests/test_validate_adapters.py | Unit tests for Python validation script behavior. |
| scripts/init.py | Initializes scripts package. |
| scripts/install_adapters.py | Python installer for adapters into local/workspace locations. |
| scripts/sync_adapters.py | Python sync utility to propagate version/date into adapters. |
| scripts/validate_adapters.py | Python validator to ensure adapters match canonical skill metadata. |
| scripts/install-adapters.ps1 | PowerShell installer wrapper for adapter installation. |
| scripts/install-adapters.cmd | CMD wrapper for PowerShell install script. |
| scripts/sync-adapters.ps1 | PowerShell compiler/sync script assembling skill variants from src/. |
| scripts/sync-adapters.cmd | CMD wrapper for PowerShell sync script. |
| scripts/validate-adapters.ps1 | PowerShell validation script for adapter metadata alignment. |
| scripts/validate-adapters.cmd | CMD wrapper for PowerShell validation script. |
| pyproject.toml | Adds strict Ruff/Mypy and pytest+coverage settings. |
| .github/workflows/ci.yml | CI job running pre-commit + pytest. |
| .pre-commit-config.yaml | Adds hooks for Vale, Ruff, Mypy, and markdownlint. |
| .vale.ini | Configures Vale to lint docs using Google/Microsoft styles. |
| .markdownlint.yaml | Configures markdownlint rules used by pre-commit. |
| .gitignore | Ignores Python caches and coverage artifacts. |
| WARP.md | Updates repo guidance formatting. |
| README.md | Updates installation/usage, adds multi-agent adapter and automation guidance. |
| SKILL.md | Updates canonical Humanizer skill content (patterns + formatting updates). |
| SKILL_PROFESSIONAL.md | Adds Pro variant skill focused on “Voice and Craft”. |
| src/core_frontmatter.yaml | Modular fragment for shared frontmatter content. |
| src/core_patterns.md | Modular fragment for shared pattern catalog (incl. Pattern #26). |
| src/human_header.md | Modular header for standard skill variant. |
| src/pro_header.md | Modular header for Pro variant. |
| AGENTS.md | Codex CLI adapter instructions and metadata. |
| adapters/VERSIONING.md | Documents adapter/skill versioning strategy. |
| adapters/vscode/HUMANIZER.md | VS Code adapter markdown (metadata synced from skill). |
| adapters/vscode/humanizer.code-snippets | VS Code snippet template for Humanizer prompt. |
| .vscode/humanizer.code-snippets | Workspace snippet copy for convenience/installation target. |
| adapters/gemini-extension/gemini-extension.json | Gemini CLI extension manifest. |
| adapters/gemini-extension/GEMINI.md | Gemini adapter instructions/metadata. |
| adapters/gemini-extension/GEMINI_PRO.md | Pro Gemini adapter instructions/metadata. |
| adapters/gemini-extension/commands/humanizer/humanize.toml | Gemini saved command prompt for Humanizer. |
| adapters/antigravity-skill/README.md | Antigravity skill adapter documentation. |
| adapters/antigravity-skill/SKILL.md | Antigravity skill adapter (standard) content + metadata. |
| adapters/antigravity-skill/SKILL_PROFESSIONAL.md | Antigravity skill adapter (pro) content + metadata. |
| adapters/antigravity-rules-workflows/rules/humanizer.md | Antigravity rule template. |
| adapters/antigravity-rules-workflows/workflows/humanize.md | Antigravity workflow template. |
| .agent/rules/humanizer.md | Workspace-installed rule copy (local install target). |
| .agent/workflows/humanize.md | Workspace-installed workflow copy (local install target). |
| .agent/skills/humanizer/README.md | Workspace-installed skill README copy (local install target). |
| styles/Microsoft/meta.json | Vale package metadata for Microsoft style rules. |
| styles/Microsoft/Acronyms.yml | Microsoft acronyms rule. |
| styles/Microsoft/Accessibility.yml | Microsoft accessibility language rule. |
| styles/Microsoft/Adverbs.yml | Microsoft adverbs rule. |
| styles/Microsoft/Avoid.yml | Microsoft avoided terms rule. |
| styles/Microsoft/AMPM.yml | Microsoft AM/PM formatting rule. |
| styles/Microsoft/Auto.yml | Microsoft auto-* hyphenation rule. |
| styles/Microsoft/Contractions.yml | Microsoft contractions rule. |
| styles/Microsoft/Dashes.yml | Microsoft dash spacing rule. |
| styles/Microsoft/DateFormat.yml | Microsoft date format rule. |
| styles/Microsoft/DateNumbers.yml | Microsoft ordinal date words rule. |
| styles/Microsoft/DateOrder.yml | Microsoft date ordering rule. |
| styles/Microsoft/Ellipses.yml | Microsoft ellipses rule. |
| styles/Microsoft/FirstPerson.yml | Microsoft first-person pronoun rule. |
| styles/Microsoft/Foreign.yml | Microsoft Latin abbreviations rule. |
| styles/Microsoft/Gender.yml | Microsoft gender pronoun patterns rule. |
| styles/Microsoft/GenderBias.yml | Microsoft gender-biased terms substitution. |
| styles/Microsoft/GeneralURL.yml | Microsoft general-audience URL wording rule. |
| styles/Microsoft/HeadingAcronyms.yml | Microsoft heading acronyms rule. |
| styles/Microsoft/HeadingColons.yml | Microsoft heading colon capitalization rule. |
| styles/Microsoft/HeadingPunctuation.yml | Microsoft heading punctuation rule. |
| styles/Microsoft/Headings.yml | Microsoft heading capitalization rule. |
| styles/Microsoft/Hyphens.yml | Microsoft -ly hyphenation rule. |
| styles/Microsoft/Negative.yml | Microsoft negative number dash rule. |
| styles/Microsoft/Ordinal.yml | Microsoft ordinal “-ly” rule. |
| styles/Microsoft/OxfordComma.yml | Microsoft Oxford comma suggestion. |
| styles/Microsoft/Passive.yml | Microsoft passive voice rule. |
| styles/Microsoft/Percentages.yml | Microsoft percentage wording rule. |
| styles/Microsoft/Plurals.yml | Microsoft optional plurals rule. |
| styles/Microsoft/Quotes.yml | Microsoft quote punctuation rule. |
| styles/Microsoft/RangeTime.yml | Microsoft time range rule. |
| styles/Microsoft/Semicolon.yml | Microsoft semicolon suggestion. |
| styles/Microsoft/SentenceLength.yml | Microsoft sentence length rule. |
| styles/Microsoft/Spacing.yml | Microsoft sentence spacing rule. |
| styles/Microsoft/Suspended.yml | Microsoft suspended hyphen constructs rule. |
| styles/Microsoft/Terms.yml | Microsoft preferred terms substitutions. |
| styles/Microsoft/Units.yml | Microsoft units formatting rule. |
| styles/Microsoft/URLFormat.yml | Microsoft “URL of” wording substitution. |
| styles/Microsoft/Vocab.yml | Microsoft vocabulary reminders. |
| styles/Microsoft/We.yml | Microsoft first-person plural rule. |
| styles/Microsoft/Wordiness.yml | Microsoft wordiness substitutions. |
| styles/Google/meta.json | Vale package metadata for Google style rules. |
| styles/Google/vocab.txt | Google vocabulary list. |
| styles/Google/Acronyms.yml | Google acronyms rule. |
| styles/Google/AMPM.yml | Google AM/PM formatting rule. |
| styles/Google/Colons.yml | Google colon capitalization rule. |
| styles/Google/Contractions.yml | Google contractions rule. |
| styles/Google/DateFormat.yml | Google date format rule. |
| styles/Google/Ellipses.yml | Google ellipses rule. |
| styles/Google/EmDash.yml | Google em dash spacing rule. |
| styles/Google/Exclamation.yml | Google exclamation rule. |
| styles/Google/FirstPerson.yml | Google first-person pronoun rule. |
| styles/Google/Gender.yml | Google gender pronoun patterns rule. |
| styles/Google/GenderBias.yml | Google gender-biased terms substitution. |
| styles/Google/HeadingPunctuation.yml | Google heading punctuation rule. |
| styles/Google/Headings.yml | Google heading capitalization rule. |
| styles/Google/Latin.yml | Google Latin abbreviations substitution. |
| styles/Google/LyHyphens.yml | Google -ly hyphenation rule. |
| styles/Google/OptionalPlurals.yml | Google optional plurals rule. |
| styles/Google/Ordinal.yml | Google ordinal number rule. |
| styles/Google/OxfordComma.yml | Google Oxford comma rule. |
| styles/Google/Parens.yml | Google parentheses usage rule. |
| styles/Google/Passive.yml | Google passive voice rule. |
| styles/Google/Periods.yml | Google acronyms-with-periods rule. |
| styles/Google/Quotes.yml | Google quote punctuation rule. |
| styles/Google/Ranges.yml | Google numeric range phrasing rule. |
| styles/Google/Semicolons.yml | Google semicolon rule. |
| styles/Google/Slang.yml | Google internet slang rule. |
| styles/Google/Spacing.yml | Google sentence spacing rule. |
| styles/Google/Spelling.yml | Google American spelling rule. |
| styles/Google/We.yml | Google first-person plural rule. |
| styles/Google/Will.yml | Google “will” usage rule. |
| styles/Google/Units.yml | Google units nonbreaking-space rule. |
| styles/Google/WordList.yml | Google preferred word list substitutions. |
| conductor/workflow.md | Adds/updates Conductor workflow process documentation. |
| conductor/tracks.md | Lists tracks and their status. |
| conductor/tech-stack.md | Documents project tech stack and constraints. |
| conductor/setup_state.json | Records Conductor setup state. |
| conductor/product.md | Product overview for multi-agent adapters direction. |
| conductor/product-guidelines.md | Product behavior guidelines and invariants for adapters. |
| conductor/code_styleguides/general.md | General code style guide. |
| conductor/code_styleguides/javascript.md | JavaScript style guide summary. |
| conductor/code_styleguides/typescript.md | TypeScript style guide summary. |
| conductor/tracks/universal-automated-adapters_20260131/spec.md | Track spec for universal automated adapters. |
| conductor/tracks/universal-automated-adapters_20260131/plan.md | Track plan for universal automated adapters. |
| conductor/tracks/universal-automated-adapters_20260131/metadata.json | Track metadata for universal automated adapters. |
| conductor/tracks/humanizer-adapters_20260125/spec.md | Track spec for initial adapter architecture. |
| conductor/tracks/humanizer-adapters_20260125/plan.md | Track plan for initial adapter architecture. |
| conductor/tracks/humanizer-adapters_20260125/metadata.json | Track metadata for initial adapter architecture. |
| conductor/tracks/humanizer-adapters_20260125/inventory.md | Environment inventory for adapters. |
| conductor/tracks/humanizer-adapters_20260125/adapter-metadata.md | Defines adapter metadata contract. |
| conductor/tracks/humanizer-adapters_20260125/adapter-core.md | Shared adapter core instruction snippet. |
| conductor/tracks/gemini-extension_20260131/spec.md | Track spec for Gemini extension adapter. |
| conductor/tracks/gemini-extension_20260131/requirements.md | Gemini extension requirements summary. |
| conductor/tracks/gemini-extension_20260131/plan.md | Track plan for Gemini extension adapter. |
| conductor/tracks/gemini-extension_20260131/metadata.json | Track metadata for Gemini extension adapter. |
| conductor/tracks/gemini-extension_20260131/metadata-contract.md | Gemini extension metadata contract reference. |
| conductor/tracks/gemini-extension_20260131/layout.md | Gemini extension layout decisions. |
| conductor/tracks/gemini-extension_20260131/implementation.md | Gemini extension implementation notes. |
| conductor/tracks/devops-quality_20260131/spec.md | Track spec for DevOps/quality tooling. |
| conductor/tracks/devops-quality_20260131/plan.md | Track plan for DevOps/quality tooling. |
| conductor/tracks/devops-quality_20260131/metadata.json | Track metadata for DevOps/quality tooling. |
| conductor/tracks/antigravity-skills_20260131/spec.md | Track spec for Antigravity skill adapter. |
| conductor/tracks/antigravity-skills_20260131/plan.md | Track plan for Antigravity skill adapter. |
| conductor/tracks/antigravity-skills_20260131/metadata.json | Track metadata for Antigravity skill adapter. |
| conductor/tracks/antigravity-rules-workflows_20260131/spec.md | Track spec for Antigravity rules/workflows. |
| conductor/tracks/antigravity-rules-workflows_20260131/plan.md | Track plan for Antigravity rules/workflows. |
| conductor/tracks/antigravity-rules-workflows_20260131/metadata.json | Track metadata for Antigravity rules/workflows. |
| conductor/tracks/adapters-expansion_20260131/spec.md | Track spec for Qwen/Copilot adapter expansion. |
| conductor/tracks/adapters-expansion_20260131/plan.md | Track plan for Qwen/Copilot adapter expansion. |
| conductor/tracks/adapters-expansion_20260131/metadata.json | Track metadata for Qwen/Copilot adapter expansion. |
| pr11.json | Captured metadata for referenced PR #11. |
| issues.json | Snapshot of referenced issues list. |
| issue_2.txt | Snapshot content for issue #2. |
| issue_10.txt | Snapshot content for issue #10. |
| issue_13.txt | Snapshot content for issue #13. |
| issue_15.txt | Snapshot content for issue #15. |
| issue_16.txt | Snapshot content for issue #16. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| ### Manual install/update | ||
|
|
||
| If you already have this repo cloned (or you downloaded `SKILL.md`), copy the skill file into Claude Code’s skills directory: | ||
| Copy the desired skill file into Claude Code’s skills directory: | ||
|
|
||
| **Standard Version (Human):** | ||
| ```bash | ||
| mkdir -p ~/.claude/skills/humanizer | ||
| cp SKILL.md ~/.claude/skills/humanizer/ | ||
| cp SKILL.md ~/.claude/skills/humanizer/SKILL.md | ||
| ``` | ||
|
|
||
| **Professional Version (Pro):** | ||
| ```bash | ||
| cp SKILL_PROFESSIONAL.md ~/.claude/skills/humanizer/SKILL_PROFESSIONAL.md | ||
| ``` |
There was a problem hiding this comment.
The manual install commands assume ~/.claude/skills/humanizer/ already exists, but the section no longer creates it. Add a mkdir -p ~/.claude/skills/humanizer step (or mention that the directory must exist) so the cp commands don’t fail.
|
|
||
|
|
There was a problem hiding this comment.
This file starts a YAML frontmatter block with --- but never closes it with a terminating ---. Most frontmatter parsers (and the repo’s own WARP.md description) expect --- … ---, so the skill metadata may not parse correctly. Add the closing delimiter after allowed-tools.
| --- |
|
|
||
|
|
There was a problem hiding this comment.
This file starts YAML frontmatter with --- but doesn’t include a closing --- delimiter. That can break tools/agents that parse the skill metadata as frontmatter. Close the frontmatter block after the allowed-tools section.
| --- |
| allowed-tools: | ||
| - Read | ||
| - Write | ||
| - Edit | ||
| - Grep | ||
| - Glob | ||
| - AskUserQuestion |
There was a problem hiding this comment.
src/*_header.md files insert core_frontmatter.yaml into the YAML frontmatter, but nothing closes the frontmatter block. Consider appending a terminating --- (and a blank line) as part of this fragment (or in the headers) so generated SKILL*.md files have valid --- … --- frontmatter.
scripts/validate_adapters.py
Outdated
| if not re.search(rf"skill_name:\s*{re.escape(skill_name)}", content): | ||
| errors.append(f"{adapter_path}: skill_name mismatch (expected {skill_name})") | ||
|
|
||
| if not re.search(rf"skill_version:\s*{re.escape(skill_version)}", content): | ||
| errors.append( | ||
| f"{adapter_path}: skill_version mismatch (expected {skill_version})" | ||
| ) | ||
|
|
||
| if "last_synced:" not in content: | ||
| errors.append(f"{adapter_path}: missing last_synced") | ||
|
|
||
| if not re.search(rf"source_path:\s*{re.escape(source_path)}", content): | ||
| errors.append(f"{adapter_path}: source_path mismatch (expected {source_path})") |
There was a problem hiding this comment.
The metadata checks aren’t anchored, so mismatches can pass (e.g., skill_name: humanizer-pro matches expected humanizer, and 2.1.10 matches 2.1.1). Anchor these regexes to full lines (multiline) or parse the YAML frontmatter so validation can’t succeed on prefix matches.
| adapters = [ | ||
| "AGENTS.md", | ||
| "adapters/gemini-extension/GEMINI.md", | ||
| "adapters/vscode/HUMANIZER.md", | ||
| "adapters/antigravity-skill/SKILL.md", | ||
| "adapters/antigravity-rules-workflows/README.md", | ||
| "adapters/qwen-cli/QWEN.md", | ||
| "adapters/copilot/COPILOT.md", | ||
| ] |
There was a problem hiding this comment.
The validation list omits Pro adapter artifacts that exist in the repo (e.g., adapters/antigravity-skill/SKILL_PROFESSIONAL.md, adapters/gemini-extension/GEMINI_PRO.md). If Pro is supported, include these paths in validation so drift is caught.
scripts/validate_adapters.py
Outdated
| adapter_path = root / adapter_rel_path | ||
| all_errors.extend( | ||
| validate_adapter(adapter_path, skill_name, skill_version, str(source_path)) | ||
| ) |
There was a problem hiding this comment.
validate_adapter(..., str(source_path)) compares adapters against the CLI-provided path string. If a user passes --source path/to/SKILL.md, adapters that correctly record source_path: SKILL.md will fail validation. Compare against source_path.name (or a normalized repo-relative path) instead.
| # Define paths | ||
| root = Path(__file__).parent.parent | ||
| adapters = root / "adapters" | ||
|
|
||
| # 1. Antigravity Skill | ||
| sync_antigravity_skill( | ||
| source_path, adapters / "antigravity-skill" / "SKILL.md", version, today | ||
| ) | ||
|
|
||
| # 2. Gemini Extension | ||
| update_metadata(adapters / "gemini-extension" / "GEMINI.md", version, today) | ||
|
|
||
| # 3. Antigravity Rules Metadata | ||
| update_metadata( | ||
| adapters / "antigravity-rules-workflows" / "README.md", version, today | ||
| ) | ||
|
|
||
| # 4. Qwen CLI Metadata | ||
| update_metadata(adapters / "qwen-cli" / "QWEN.md", version, today) | ||
|
|
||
| # 5. Copilot Metadata | ||
| update_metadata(adapters / "copilot" / "COPILOT.md", version, today) | ||
|
|
||
| # 6. VS Code Metadata | ||
| update_metadata(adapters / "vscode" / "HUMANIZER.md", version, today) | ||
|
|
There was a problem hiding this comment.
The Python sync script only updates Standard adapters (and hardcodes skill_name: humanizer for Antigravity). The repo also contains Pro artifacts (e.g., SKILL_PROFESSIONAL.md, GEMINI_PRO.md, SKILL_PROFESSIONAL.md under antigravity-skill) that won’t get synced/dated. Either add Pro handling here or document that Python sync is Standard-only.
| run: | | ||
| python -m pip install --upgrade pip | ||
| python -m pip install pytest pytest-cov ruff mypy pre-commit | ||
|
|
There was a problem hiding this comment.
CI runs pre-commit (which includes a vale hook), but the workflow never installs the vale binary. On a clean runner this will fail. Add an explicit Vale install step (or switch to a pre-commit hook that vendors Vale) before pre-commit run --all-files.
| - name: Install Vale | |
| run: | | |
| VALE_VERSION="3.8.0" | |
| curl -sSL "https://github.com/errata-ai/vale/releases/download/v${VALE_VERSION}/vale_${VALE_VERSION}_Linux_64-bit.tar.gz" -o vale.tar.gz | |
| tar -xzf vale.tar.gz | |
| sudo mv vale /usr/local/bin/vale | |
| rm vale.tar.gz |
| - Reference the SKILL.md ersion: they are derived from. | ||
| - Include a last synced marker (date). |
There was a problem hiding this comment.
There’s a stray control character in SKILL.md ersion that will render oddly and may break linters. Replace it with the intended word version.
Closes #2, Closes #10, Closes #13.
This PR addresses multiple refinements: