@evertonferreira96/agents 0.0.0-stage → 0.1.0
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.
- package/.claude/agents/api.md +45 -0
- package/.claude/agents/app.md +41 -0
- package/.claude/agents/architect.md +49 -0
- package/.claude/agents/infra.md +27 -0
- package/.claude/agents/product.md +58 -0
- package/.claude/agents/quick.md +33 -0
- package/.claude/agents/security.md +39 -0
- package/.claude/agents/ui.md +54 -0
- package/.claude/agents/verifier.md +56 -0
- package/.claude/agents/web.md +41 -0
- package/.claude/hooks/config-update-check.mjs +14 -0
- package/.claude/hooks/context-budget.mjs +51 -0
- package/.claude/hooks/graphify-update.sh +16 -0
- package/.claude/hooks/guard-bash.sh +64 -0
- package/.claude/hooks/orchestrator-guard.sh +49 -0
- package/.claude/hooks/post-compact.sh +26 -0
- package/.claude/hooks/readonly-guard.sh +54 -0
- package/.claude/hooks/stop-verify.sh +52 -0
- package/.claude/rules/api.md +21 -0
- package/.claude/rules/db.md +9 -0
- package/.claude/rules/delivery-diagram.md +16 -0
- package/.claude/rules/git-workflow.md +34 -0
- package/.claude/rules/graphify.md +3 -0
- package/.claude/rules/mobile.md +22 -0
- package/.claude/rules/tickets.md +9 -0
- package/.claude/rules/ui.md +14 -0
- package/.claude/rules/web.md +27 -0
- package/.claude/settings.json +114 -0
- package/.claude/skills/animate/RECIPES.md +324 -0
- package/.claude/skills/animate/SKILL.md +208 -0
- package/.claude/skills/animate/agents/openai.yaml +5 -0
- package/.claude/skills/animate-expo/RECIPES.md +385 -0
- package/.claude/skills/animate-expo/SKILL.md +264 -0
- package/.claude/skills/animate-expo/agents/openai.yaml +5 -0
- package/.claude/skills/animation-performance/SKILL.md +223 -0
- package/.claude/skills/animation-performance/agents/openai.yaml +5 -0
- package/.claude/skills/apple-design/SKILL.md +291 -0
- package/.claude/skills/apple-design/agents/openai.yaml +5 -0
- package/.claude/skills/arch-api/SKILL.md +291 -0
- package/.claude/skills/arch-api/agents/openai.yaml +3 -0
- package/.claude/skills/arch-api/references/common.md +174 -0
- package/.claude/skills/arch-api/references/contract.md +289 -0
- package/.claude/skills/arch-api/references/domain.md +301 -0
- package/.claude/skills/arch-api/references/endpoints.md +184 -0
- package/.claude/skills/arch-api/references/review.md +228 -0
- package/.claude/skills/arch-api/references/security.md +151 -0
- package/.claude/skills/arch-app/SKILL.md +278 -0
- package/.claude/skills/arch-app/agents/openai.yaml +3 -0
- package/.claude/skills/arch-app/references/navigation-session.md +257 -0
- package/.claude/skills/arch-app/references/review.md +155 -0
- package/.claude/skills/arch-app/references/screens.md +214 -0
- package/.claude/skills/arch-app/references/services.md +301 -0
- package/.claude/skills/arch-app/references/ui-mobile.md +124 -0
- package/.claude/skills/arch-db/SKILL.md +181 -0
- package/.claude/skills/arch-db/agents/openai.yaml +3 -0
- package/.claude/skills/arch-db/references/indexes-queries.md +251 -0
- package/.claude/skills/arch-db/references/migrations.md +191 -0
- package/.claude/skills/arch-db/references/modeling.md +214 -0
- package/.claude/skills/arch-db/references/mysql.md +262 -0
- package/.claude/skills/arch-db/references/pooling-ops.md +112 -0
- package/.claude/skills/arch-db/references/review.md +143 -0
- package/.claude/skills/arch-db/references/transactions-locks.md +141 -0
- package/.claude/skills/arch-web/SKILL.md +307 -0
- package/.claude/skills/arch-web/agents/openai.yaml +3 -0
- package/.claude/skills/arch-web/references/auth-session-env.md +165 -0
- package/.claude/skills/arch-web/references/blocks.md +198 -0
- package/.claude/skills/arch-web/references/cache.md +124 -0
- package/.claude/skills/arch-web/references/review.md +142 -0
- package/.claude/skills/arch-web/references/services.md +297 -0
- package/.claude/skills/arch-web/references/tests.md +159 -0
- package/.claude/skills/arch-web/references/ui-forms.md +143 -0
- package/.claude/skills/break-ui/CATALOG.md +135 -0
- package/.claude/skills/break-ui/SKILL.md +176 -0
- package/.claude/skills/break-ui/agents/openai.yaml +5 -0
- package/.claude/skills/brief/SKILL.md +91 -0
- package/.claude/skills/brief/agents/openai.yaml +3 -0
- package/.claude/skills/diagnosing-bugs/SKILL.md +138 -0
- package/.claude/skills/diagnosing-bugs/agents/openai.yaml +3 -0
- package/.claude/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
- package/.claude/skills/emil-design-eng/SKILL.md +675 -0
- package/.claude/skills/emil-design-eng/agents/openai.yaml +5 -0
- package/.claude/skills/find-animation-opportunities/SKILL.md +141 -0
- package/.claude/skills/find-animation-opportunities/agents/openai.yaml +5 -0
- package/.claude/skills/graphify/.graphify_version +1 -0
- package/.claude/skills/graphify/SKILL.md +742 -0
- package/.claude/skills/graphify/agents/openai.yaml +3 -0
- package/.claude/skills/graphify/references/add-watch.md +56 -0
- package/.claude/skills/graphify/references/exports.md +91 -0
- package/.claude/skills/graphify/references/extraction-spec.md +70 -0
- package/.claude/skills/graphify/references/github-and-merge.md +46 -0
- package/.claude/skills/graphify/references/hooks.md +33 -0
- package/.claude/skills/graphify/references/query.md +317 -0
- package/.claude/skills/graphify/references/transcribe.md +52 -0
- package/.claude/skills/graphify/references/update.md +221 -0
- package/.claude/skills/grill-me/SKILL.md +7 -0
- package/.claude/skills/grill-me/agents/openai.yaml +5 -0
- package/.claude/skills/grill-with-docs/SKILL.md +64 -0
- package/.claude/skills/grill-with-docs/agents/openai.yaml +5 -0
- package/.claude/skills/grilling/SKILL.md +30 -0
- package/.claude/skills/grilling/agents/openai.yaml +3 -0
- package/.claude/skills/handoff/SKILL.md +28 -0
- package/.claude/skills/handoff/agents/openai.yaml +5 -0
- package/.claude/skills/impeccable/SKILL.md +89 -0
- package/.claude/skills/impeccable/agents/openai.yaml +5 -0
- package/.claude/skills/impeccable/reference/adapt.md +318 -0
- package/.claude/skills/impeccable/reference/adapt.native.md +58 -0
- package/.claude/skills/impeccable/reference/android.md +46 -0
- package/.claude/skills/impeccable/reference/animate.md +89 -0
- package/.claude/skills/impeccable/reference/audit.md +137 -0
- package/.claude/skills/impeccable/reference/audit.native.md +139 -0
- package/.claude/skills/impeccable/reference/bolder.md +33 -0
- package/.claude/skills/impeccable/reference/clarify.md +94 -0
- package/.claude/skills/impeccable/reference/colorize.md +86 -0
- package/.claude/skills/impeccable/reference/component-review.md +63 -0
- package/.claude/skills/impeccable/reference/craft-floor.md +44 -0
- package/.claude/skills/impeccable/reference/craft.md +5 -0
- package/.claude/skills/impeccable/reference/critique.md +809 -0
- package/.claude/skills/impeccable/reference/degraded/asset-producer.md +42 -0
- package/.claude/skills/impeccable/reference/degraded/documenter.md +24 -0
- package/.claude/skills/impeccable/reference/degraded/finish-reviewer.md +38 -0
- package/.claude/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/.claude/skills/impeccable/reference/delight.md +70 -0
- package/.claude/skills/impeccable/reference/distill.md +111 -0
- package/.claude/skills/impeccable/reference/doctor.md +54 -0
- package/.claude/skills/impeccable/reference/document.md +416 -0
- package/.claude/skills/impeccable/reference/extract.md +69 -0
- package/.claude/skills/impeccable/reference/generate.md +101 -0
- package/.claude/skills/impeccable/reference/harden.md +345 -0
- package/.claude/skills/impeccable/reference/hooks.md +113 -0
- package/.claude/skills/impeccable/reference/init.md +131 -0
- package/.claude/skills/impeccable/reference/ios.md +51 -0
- package/.claude/skills/impeccable/reference/layout.md +84 -0
- package/.claude/skills/impeccable/reference/live-setup.md +104 -0
- package/.claude/skills/impeccable/reference/live.md +325 -0
- package/.claude/skills/impeccable/reference/mode-operate.md +21 -0
- package/.claude/skills/impeccable/reference/mode-persuade.md +19 -0
- package/.claude/skills/impeccable/reference/mode-read.md +21 -0
- package/.claude/skills/impeccable/reference/new-work.md +154 -0
- package/.claude/skills/impeccable/reference/onboard.md +234 -0
- package/.claude/skills/impeccable/reference/operate.md +61 -0
- package/.claude/skills/impeccable/reference/optimize.md +258 -0
- package/.claude/skills/impeccable/reference/overdrive.md +127 -0
- package/.claude/skills/impeccable/reference/polish.md +105 -0
- package/.claude/skills/impeccable/reference/quieter.md +99 -0
- package/.claude/skills/impeccable/reference/region-map.md +26 -0
- package/.claude/skills/impeccable/reference/routing.md +24 -0
- package/.claude/skills/impeccable/reference/shape.md +59 -0
- package/.claude/skills/impeccable/reference/typeset.md +80 -0
- package/.claude/skills/impeccable/reference/visualize.md +47 -0
- package/.claude/skills/impeccable/scripts/VERSION +1 -0
- package/.claude/skills/impeccable/scripts/command-metadata.json +98 -0
- package/.claude/skills/impeccable/scripts/data/font-index-failures.json +121 -0
- package/.claude/skills/impeccable/scripts/data/font-index.json +1 -0
- package/.claude/skills/impeccable/scripts/impeccable +206 -0
- package/.claude/skills/impeccable/scripts/impeccable.cmd +214 -0
- package/.claude/skills/impeccable/scripts/live-browser-dom.js +281 -0
- package/.claude/skills/impeccable/scripts/live-browser-ignores.js +242 -0
- package/.claude/skills/impeccable/scripts/live-browser-session.js +148 -0
- package/.claude/skills/impeccable/scripts/live-browser.js +13532 -0
- package/.claude/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/.claude/skills/improve-animations/AUDIT.md +115 -0
- package/.claude/skills/improve-animations/PLAN-TEMPLATE.md +73 -0
- package/.claude/skills/improve-animations/SKILL.md +110 -0
- package/.claude/skills/improve-animations/agents/openai.yaml +5 -0
- package/.claude/skills/mobile-native/SKILL.md +311 -0
- package/.claude/skills/mobile-native/agents/openai.yaml +3 -0
- package/.claude/skills/orchestrate/SKILL.md +181 -0
- package/.claude/skills/orchestrate/agents/openai.yaml +3 -0
- package/.claude/skills/pick-ui-library/SKILL.md +85 -0
- package/.claude/skills/pick-ui-library/agents/openai.yaml +5 -0
- package/.claude/skills/ponytail/SKILL.md +52 -0
- package/.claude/skills/ponytail/agents/openai.yaml +3 -0
- package/.claude/skills/ponytail-audit/SKILL.md +103 -0
- package/.claude/skills/ponytail-audit/agents/openai.yaml +3 -0
- package/.claude/skills/ponytail-debt/SKILL.md +44 -0
- package/.claude/skills/ponytail-debt/agents/openai.yaml +3 -0
- package/.claude/skills/ponytail-review/SKILL.md +101 -0
- package/.claude/skills/ponytail-review/agents/openai.yaml +3 -0
- package/.claude/skills/postgres-best-practices/SKILL.md +42 -0
- package/.claude/skills/postgres-best-practices/agents/openai.yaml +3 -0
- package/.claude/skills/postgres-best-practices/references/backup-restore.md +372 -0
- package/.claude/skills/postgres-best-practices/references/bulk-loading.md +315 -0
- package/.claude/skills/postgres-best-practices/references/connection-pooling.md +310 -0
- package/.claude/skills/postgres-best-practices/references/hot-standby.md +221 -0
- package/.claude/skills/postgres-best-practices/references/indexing.md +318 -0
- package/.claude/skills/postgres-best-practices/references/logical-replication.md +610 -0
- package/.claude/skills/postgres-best-practices/references/major-version-upgrades.md +334 -0
- package/.claude/skills/postgres-best-practices/references/performance-diagnostics.md +553 -0
- package/.claude/skills/postgres-best-practices/references/query-optimization.md +294 -0
- package/.claude/skills/postgres-best-practices/references/query-patterns.md +566 -0
- package/.claude/skills/postgres-best-practices/references/schema-design.md +362 -0
- package/.claude/skills/postgres-best-practices/references/security-roles.md +489 -0
- package/.claude/skills/postgres-best-practices/references/transaction-isolation.md +344 -0
- package/.claude/skills/project-docs/SKILL.md +330 -0
- package/.claude/skills/project-docs/agents/openai.yaml +3 -0
- package/.claude/skills/prototype/PICKER.md +197 -0
- package/.claude/skills/prototype/SKILL.md +98 -0
- package/.claude/skills/prototype/agents/openai.yaml +5 -0
- package/.claude/skills/retro/SKILL.md +43 -0
- package/.claude/skills/retro/agents/openai.yaml +5 -0
- package/.claude/skills/review/SKILL.md +74 -0
- package/.claude/skills/review/agents/openai.yaml +3 -0
- package/.claude/skills/review/references/smells.md +23 -0
- package/.claude/skills/review-animations/SKILL.md +120 -0
- package/.claude/skills/review-animations/STANDARDS.md +187 -0
- package/.claude/skills/review-animations/agents/openai.yaml +5 -0
- package/.claude/skills/tdd/SKILL.md +38 -0
- package/.claude/skills/tdd/agents/openai.yaml +3 -0
- package/.claude/skills/tdd/mocking.md +59 -0
- package/.claude/skills/tdd/tests.md +77 -0
- package/.claude/skills/triage/SKILL.md +58 -0
- package/.claude/skills/triage/agents/openai.yaml +3 -0
- package/.claude/skills/ui-ux-pro-max/SKILL.md +378 -0
- package/.claude/skills/ui-ux-pro-max/agents/openai.yaml +5 -0
- package/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/.claude/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/.claude/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.claude/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/.claude/skills/writing-for-agents/SKILL-MECHANICS.md +22 -0
- package/.claude/skills/writing-for-agents/SKILL.md +81 -0
- package/.claude/skills/writing-for-agents/agents/openai.yaml +3 -0
- package/.worktreeinclude +3 -0
- package/AGENTS.md +44 -0
- package/README.md +14 -2
- package/VERSION +1 -0
- package/bin/agents.mjs +45 -0
- package/docs/adr/README.md +31 -0
- package/docs/brief-template.md +3 -0
- package/docs/plans/README.md +73 -0
- package/package.json +46 -4
- package/scripts/bootstrap.mjs +188 -0
- package/scripts/check-catalog.mjs +43 -0
- package/scripts/skills-update.mjs +51 -0
- package/skills-lock.json +269 -0
- package/templates/CLAUDE.project.md +41 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# graphify reference: transcribe video and audio
|
|
2
|
+
|
|
3
|
+
Load this only when `detect` reported one or more `video` files. A corpus with no video never reads this.
|
|
4
|
+
|
|
5
|
+
### Step 2.5 - Transcribe video / audio files (only if video files detected)
|
|
6
|
+
|
|
7
|
+
Skip this step entirely if `detect` returned zero `video` files.
|
|
8
|
+
|
|
9
|
+
Video and audio files cannot be read directly. Transcribe them to text first, then treat the transcripts as doc files in Step 3.
|
|
10
|
+
|
|
11
|
+
**Strategy:** Read the god nodes from `graphify-out/.graphify_detect.json` (or the analysis file if it exists from a previous run). You are already a language model — write a one-sentence domain hint yourself from those labels. Then pass it to Whisper as the initial prompt. No separate API call needed.
|
|
12
|
+
|
|
13
|
+
**However**, if the corpus has *only* video files and no other docs/code, use the generic fallback prompt: `"Use proper punctuation and paragraph breaks."`
|
|
14
|
+
|
|
15
|
+
**Step 1 - Write the Whisper prompt yourself.**
|
|
16
|
+
|
|
17
|
+
Read the top god node labels from detect output or analysis, then compose a short domain hint sentence, for example:
|
|
18
|
+
|
|
19
|
+
- Labels: `transformer, attention, encoder, decoder` → `"Machine learning research on transformer architectures and attention mechanisms. Use proper punctuation and paragraph breaks."`
|
|
20
|
+
- Labels: `kubernetes, deployment, pod, helm` → `"DevOps discussion about Kubernetes deployments and Helm charts. Use proper punctuation and paragraph breaks."`
|
|
21
|
+
|
|
22
|
+
**Export** it as `GRAPHIFY_WHISPER_PROMPT` (the exact name the transcriber reads — and it must be `export`ed so the child Python process sees it) for the next command.
|
|
23
|
+
|
|
24
|
+
**Step 2 - Transcribe:**
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
export GRAPHIFY_WHISPER_MODEL=base # or whatever --whisper-model the user passed (must be exported)
|
|
28
|
+
export GRAPHIFY_WHISPER_PROMPT="<the one-sentence domain hint you composed in Step 1>"
|
|
29
|
+
$(cat graphify-out/.graphify_python) -c "
|
|
30
|
+
import json, os, sys
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
from graphify.transcribe import transcribe_all
|
|
33
|
+
|
|
34
|
+
detect = json.loads(Path('graphify-out/.graphify_detect.json').read_text(encoding=\"utf-8\"))
|
|
35
|
+
video_files = detect.get('files', {}).get('video', [])
|
|
36
|
+
prompt = os.environ.get('GRAPHIFY_WHISPER_PROMPT', 'Use proper punctuation and paragraph breaks.')
|
|
37
|
+
|
|
38
|
+
transcript_paths = transcribe_all(video_files, initial_prompt=prompt)
|
|
39
|
+
# Write the JSON from Python (NOT a shell '>' redirect): transcribe_all/Whisper
|
|
40
|
+
# print progress to stdout, which would otherwise corrupt the JSON file (#1392).
|
|
41
|
+
Path('graphify-out/.graphify_transcripts.json').write_text(json.dumps(transcript_paths, ensure_ascii=False), encoding=\"utf-8\")
|
|
42
|
+
print(f'Transcribed {len(transcript_paths)} file(s)', file=sys.stderr)
|
|
43
|
+
"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
After transcription:
|
|
47
|
+
- Read the transcript paths from `graphify-out/.graphify_transcripts.json`
|
|
48
|
+
- Add them to the docs list before dispatching semantic subagents in Step 3B
|
|
49
|
+
- Print how many transcripts were created: `Transcribed N video file(s) -> treating as docs`
|
|
50
|
+
- If transcription fails for a file, print a warning and continue with the rest
|
|
51
|
+
|
|
52
|
+
**Whisper model:** Default is `base`. If the user passed `--whisper-model <name>`, `export GRAPHIFY_WHISPER_MODEL=<name>` (it must be exported, not just assigned) before running the command above.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# graphify reference: incremental update and cluster-only
|
|
2
|
+
|
|
3
|
+
Load this only when the user passed `--update` or `--cluster-only`. A first-time full build never reads this file.
|
|
4
|
+
|
|
5
|
+
## For --update (incremental re-extraction)
|
|
6
|
+
|
|
7
|
+
Use when you've added or modified files since the last run. Only re-extracts changed files - saves tokens and time.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
$(cat graphify-out/.graphify_python) -c "
|
|
11
|
+
import sys, json
|
|
12
|
+
from graphify.detect import detect_incremental, save_manifest
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from graphify.paths import out_path
|
|
16
|
+
from graphify.watch import _read_build_excludes, _read_build_gitignore
|
|
17
|
+
result = detect_incremental(Path('INPUT_PATH'), extra_excludes=_read_build_excludes(out_path()), gitignore=_read_build_gitignore(out_path()))
|
|
18
|
+
new_total = result.get('new_total', 0)
|
|
19
|
+
nf = result.get('new_files', {})
|
|
20
|
+
print(json.dumps({
|
|
21
|
+
'new_total': new_total,
|
|
22
|
+
'deleted': len(result.get('deleted_files', [])),
|
|
23
|
+
'new_by_type': {t: len(v) for t, v in nf.items()},
|
|
24
|
+
'total_files': result.get('total_files'),
|
|
25
|
+
'total_words': result.get('total_words'),
|
|
26
|
+
'skipped_sensitive': result.get('skipped_sensitive', []),
|
|
27
|
+
}, indent=2, ensure_ascii=False))
|
|
28
|
+
print('Full result: graphify-out/.graphify_incremental.json')
|
|
29
|
+
Path('graphify-out/.graphify_incremental.json').write_text(json.dumps(result, ensure_ascii=False), encoding=\"utf-8\")
|
|
30
|
+
deleted = list(result.get('deleted_files', []))
|
|
31
|
+
if new_total == 0 and not deleted:
|
|
32
|
+
print('No files changed since last run. Nothing to update.')
|
|
33
|
+
raise SystemExit(0)
|
|
34
|
+
if deleted:
|
|
35
|
+
print(f'{len(deleted)} deleted file(s) to prune.')
|
|
36
|
+
if new_total > 0:
|
|
37
|
+
print(f'{new_total} new/changed file(s) to re-extract.')
|
|
38
|
+
"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Then populate `.graphify_detect.json` so Steps 3A–6 (which read it unconditionally) see the right state for an incremental run. `files` carries the changed subset (drives Step 3A AST + Step 3B0 cache check on only what changed); `all_files` carries the full corpus for any step that needs corpus-wide context:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
$(cat graphify-out/.graphify_python) -c "
|
|
45
|
+
import json
|
|
46
|
+
from pathlib import Path
|
|
47
|
+
r = json.loads(Path('graphify-out/.graphify_incremental.json').read_text(encoding=\"utf-8\"))
|
|
48
|
+
Path('graphify-out/.graphify_detect.json').write_text(json.dumps({
|
|
49
|
+
'files': r.get('new_files', {}),
|
|
50
|
+
'all_files': r.get('files', {}),
|
|
51
|
+
'total_files': r.get('new_total', 0),
|
|
52
|
+
'total_words': r.get('total_words', 0),
|
|
53
|
+
'skipped_sensitive': r.get('skipped_sensitive', []),
|
|
54
|
+
'needs_graph': True,
|
|
55
|
+
}, ensure_ascii=False), encoding=\"utf-8\")
|
|
56
|
+
"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
If new files exist, first check whether all changed files are code files:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
$(cat graphify-out/.graphify_python) -c "
|
|
63
|
+
import json
|
|
64
|
+
from pathlib import Path
|
|
65
|
+
|
|
66
|
+
result = json.loads(open('graphify-out/.graphify_incremental.json', encoding='utf-8').read()) if Path('graphify-out/.graphify_incremental.json').exists() else {}
|
|
67
|
+
code_exts = {'.py','.ts','.js','.go','.rs','.java','.cpp','.c','.rb','.swift','.kt','.cs','.scala','.php','.cc','.cxx','.hpp','.h','.kts','.lua','.toc','.f','.F','.f90','.F90','.f95','.F95','.f03','.F03','.f08','.F08'}
|
|
68
|
+
new_files = result.get('new_files', {})
|
|
69
|
+
all_changed = [f for files in new_files.values() for f in files]
|
|
70
|
+
code_only = all(Path(f).suffix.lower() in code_exts for f in all_changed)
|
|
71
|
+
print('code_only:', code_only)
|
|
72
|
+
"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
If `code_only` is True: print `[graphify update] Code-only changes detected - skipping semantic extraction (no LLM needed)`, run Step 3A (AST) on the changed files, then follow only Part B's **Fast path** to overwrite `.graphify_semantic.json` with an empty result and run Part C to create `.graphify_extract.json` from the fresh AST result. Skip semantic cache checks/writes and subagents (Steps B0–B3); do not reuse semantic sidecars from a prior run. Continue to the incremental merge and Steps 4–8 only after Part C has completed.
|
|
76
|
+
|
|
77
|
+
If `code_only` is False (any changed file is a doc/paper/image/video): **first, if any changed file is in `new_files['video']`, run `references/transcribe.md` (Step 2.5) on those files, then rewrite `.graphify_detect.json` to move the resulting transcript paths into `files['document']` and drop `files['video']`** — otherwise raw `.mp4/.mp3` paths are fed to semantic subagents as unreadable media (#1392). Then run the full Steps 3A–3C pipeline as normal.
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
If no new files exist (only deletions), create an empty extraction so the merge step can prune:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
if [ ! -f graphify-out/.graphify_extract.json ]; then
|
|
84
|
+
echo '[graphify update] Only deletions -- creating empty extraction for merge.'
|
|
85
|
+
$(cat graphify-out/.graphify_python) -c "
|
|
86
|
+
import json
|
|
87
|
+
from pathlib import Path
|
|
88
|
+
Path('graphify-out/.graphify_extract.json').write_text(json.dumps({'nodes':[],'edges':[],'hyperedges':[],'input_tokens':0,'output_tokens':0}), encoding='utf-8')
|
|
89
|
+
"
|
|
90
|
+
fi
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
Then:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
$(cat graphify-out/.graphify_python) -c "
|
|
98
|
+
import json
|
|
99
|
+
from pathlib import Path
|
|
100
|
+
from graphify.build import build_merge
|
|
101
|
+
from graphify.detect import save_manifest
|
|
102
|
+
|
|
103
|
+
# Load new extraction and incremental state
|
|
104
|
+
new_extraction = json.loads(Path('graphify-out/.graphify_extract.json').read_text(encoding=\"utf-8\"))
|
|
105
|
+
incremental = json.loads(Path('graphify-out/.graphify_incremental.json').read_text(encoding=\"utf-8\"))
|
|
106
|
+
deleted = list(incremental.get('deleted_files', []))
|
|
107
|
+
# prune_sources is ONLY for genuinely DELETED files. Changed/re-extracted files are
|
|
108
|
+
# handled by build_merge's replace-on-re-extract (#1344): every source_file in
|
|
109
|
+
# new_chunks is dropped from the base before merge, so old/stale nodes don't survive.
|
|
110
|
+
# Do NOT add changed here: with root= passed, prune_set relativizes to the same base
|
|
111
|
+
# as the freshly merged nodes and would DELETE the re-extracted content (#1178 is moot
|
|
112
|
+
# now that replace — not the dedup pass — reconciles changed files).
|
|
113
|
+
prune = list(deleted) or None
|
|
114
|
+
|
|
115
|
+
# Use build_merge() — reads graph.json directly without NetworkX round-trip
|
|
116
|
+
# so edge direction (calls, implements, imports) is always preserved (#801).
|
|
117
|
+
# Pass root= so prune_sources (absolute paths from detect_incremental) are
|
|
118
|
+
# relativized to match the graph's relative source_file values; without it
|
|
119
|
+
# nothing is pruned and stale nodes accumulate on every update (#1361).
|
|
120
|
+
# directed=IS_DIRECTED: replace IS_DIRECTED with True if --directed was given, else
|
|
121
|
+
# False. Without it a --directed --update silently rebuilds undirected and collapses
|
|
122
|
+
# reciprocal A<->B edges (#1392).
|
|
123
|
+
G = build_merge(
|
|
124
|
+
[new_extraction],
|
|
125
|
+
graph_path='graphify-out/graph.json',
|
|
126
|
+
prune_sources=prune,
|
|
127
|
+
root='INPUT_PATH',
|
|
128
|
+
directed=IS_DIRECTED,
|
|
129
|
+
)
|
|
130
|
+
print(f'[graphify update] Merged: {G.number_of_nodes()} nodes, {G.number_of_edges()} edges')
|
|
131
|
+
|
|
132
|
+
# Write merged result back to .graphify_extract.json so Step 4 sees the full graph
|
|
133
|
+
merged_out = {
|
|
134
|
+
'nodes': [{'id': n, **d} for n, d in G.nodes(data=True)],
|
|
135
|
+
'edges': [
|
|
136
|
+
# Explicit source/target last so they win over any stale attrs in d.
|
|
137
|
+
{**{k: val for k, val in d.items() if k not in ('_src', '_tgt', 'source', 'target')},
|
|
138
|
+
'source': d.get('_src', u), 'target': d.get('_tgt', v)}
|
|
139
|
+
for u, v, d in G.edges(data=True)
|
|
140
|
+
],
|
|
141
|
+
# G.graph["hyperedges"] holds hyperedges from both existing graph.json
|
|
142
|
+
# and new_extraction (build_merge combines them). Falling back to
|
|
143
|
+
# new_extraction only would silently drop prior-run hyperedges (#801).
|
|
144
|
+
'hyperedges': list(G.graph.get('hyperedges', [])),
|
|
145
|
+
'input_tokens': new_extraction.get('input_tokens', 0),
|
|
146
|
+
'output_tokens': new_extraction.get('output_tokens', 0),
|
|
147
|
+
}
|
|
148
|
+
Path('graphify-out/.graphify_extract.json').write_text(json.dumps(merged_out, ensure_ascii=False), encoding=\"utf-8\")
|
|
149
|
+
print(f'[graphify update] Merged extraction written ({len(merged_out[\"nodes\"])} nodes, {len(merged_out[\"edges\"])} edges)')
|
|
150
|
+
|
|
151
|
+
# Save manifest so next --update diffs against today's state, not the
|
|
152
|
+
# prior run's baseline (prevents ghost-node reports on subsequent updates).
|
|
153
|
+
# root= matches the build_merge call above so the manifest keys stay relative to
|
|
154
|
+
# the scan root — portable across clones/machines, so --update keeps matching
|
|
155
|
+
# cached files instead of missing every one after a move (#1417).
|
|
156
|
+
#
|
|
157
|
+
# Only stamp semantic files (docs/papers/images) that ACTUALLY produced output
|
|
158
|
+
# THIS run (new_extraction is this run's fresh extraction, read above before the
|
|
159
|
+
# merge overwrote the file): a changed doc whose chunk failed must stay unstamped
|
|
160
|
+
# so the next --update re-queues it, otherwise it is marked done and its content
|
|
161
|
+
# is lost forever (#2015). Mirrors the library extract path
|
|
162
|
+
# (cli._stamped_manifest_files + clear_semantic + scan_corpus).
|
|
163
|
+
from graphify.cli import _stamped_manifest_files
|
|
164
|
+
_manifest_files = _stamped_manifest_files(incremental['files'], new_extraction, Path('INPUT_PATH'))
|
|
165
|
+
# Changed semantic files dispatched this run but NOT stamped had their chunk fail
|
|
166
|
+
# or be omitted; clear any stale semantic_hash so they are re-queued (#1948).
|
|
167
|
+
_sem_types = ('document', 'paper', 'image')
|
|
168
|
+
_dispatched = {f for t, fl in incremental.get('new_files', {}).items() if t in _sem_types for f in fl}
|
|
169
|
+
_stamped = {f for fl in _manifest_files.values() for f in fl}
|
|
170
|
+
_cleared = _dispatched - _stamped
|
|
171
|
+
# scan_corpus = the RAW full corpus so in-root files newly excluded since last run
|
|
172
|
+
# are dropped rather than masquerading as deletions; untouched rows preserved (#1908).
|
|
173
|
+
_scan = {f for fl in incremental['files'].values() for f in fl}
|
|
174
|
+
save_manifest(_manifest_files, root='INPUT_PATH', scan_corpus=_scan, clear_semantic=_cleared or None)
|
|
175
|
+
print('[graphify update] Manifest saved.')
|
|
176
|
+
"
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Then run Steps 4–8 on the merged graph as normal.
|
|
180
|
+
|
|
181
|
+
After Step 4, show the graph diff:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
$(cat graphify-out/.graphify_python) -c "
|
|
185
|
+
import json
|
|
186
|
+
from graphify.analyze import graph_diff
|
|
187
|
+
from graphify.build import build_from_json
|
|
188
|
+
from graphify.paths import load_node_link_graph
|
|
189
|
+
import networkx as nx
|
|
190
|
+
from pathlib import Path
|
|
191
|
+
|
|
192
|
+
# Load old graph (before update) from backup written before merge
|
|
193
|
+
old_data = json.loads(Path('graphify-out/.graphify_old.json').read_text(encoding=\"utf-8\")) if Path('graphify-out/.graphify_old.json').exists() else None
|
|
194
|
+
new_extract = json.loads(Path('graphify-out/.graphify_extract.json').read_text(encoding=\"utf-8\"))
|
|
195
|
+
G_new = build_from_json(new_extract, directed=IS_DIRECTED)
|
|
196
|
+
|
|
197
|
+
if old_data:
|
|
198
|
+
G_old = load_node_link_graph(old_data)
|
|
199
|
+
diff = graph_diff(G_old, G_new)
|
|
200
|
+
print(diff['summary'])
|
|
201
|
+
if diff['new_nodes']:
|
|
202
|
+
print('New nodes:', ', '.join(n['label'] for n in diff['new_nodes'][:5]))
|
|
203
|
+
if diff['new_edges']:
|
|
204
|
+
print('New edges:', len(diff['new_edges']))
|
|
205
|
+
"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Before the merge step, save the old graph: `cp graphify-out/graph.json graphify-out/.graphify_old.json`
|
|
209
|
+
Clean up after: `rm -f graphify-out/.graphify_old.json`
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## For --cluster-only
|
|
214
|
+
|
|
215
|
+
Skip Steps 1–3. Re-run clustering on the existing graph:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
graphify cluster-only .
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
`graphify cluster-only .` is **self-contained**: it re-clusters, names communities, and regenerates `GRAPH_REPORT.md`, `graph.json`, and `graph.html` from the existing graph. **Do not re-run Steps 5–9** — they read intermediate files (`.graphify_extract.json`, `.graphify_detect.json`, `.graphify_analysis.json`) that a prior build's cleanup (Step 9) already deleted, so they raise `FileNotFoundError` (#1392). When it finishes, present the refreshed `GRAPH_REPORT.md` summary as usual.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grill-with-docs
|
|
3
|
+
description: A relentless interview to sharpen a plan or design, which also creates docs (ADRs and glossary) as we go.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Grill with docs
|
|
8
|
+
|
|
9
|
+
Call the Skill tool with "grilling". That skill is the interview: design tree, rounds, frontier, recommended answers. This skill adds three things around it: what to read before the first round, what to write while the rounds run, and what to return to the orchestrator at the end.
|
|
10
|
+
|
|
11
|
+
Runs in the main session, because it needs the user. Subagents never run it.
|
|
12
|
+
|
|
13
|
+
## Before the first round
|
|
14
|
+
|
|
15
|
+
1. Read what already exists: `docs/plans/<task>.md`, the ticket, the ADRs in `docs/adr/`, `GLOSSARY.md`.
|
|
16
|
+
2. If `graphify-out/graph.json` exists, query it for the area the plan touches.
|
|
17
|
+
3. Seed the design tree and the recommended answers with what you read. Facts come from the code, the docs or a sub-agent, never from the user.
|
|
18
|
+
|
|
19
|
+
## Written during the rounds
|
|
20
|
+
|
|
21
|
+
### Glossary: `GLOSSARY.md` (repo root)
|
|
22
|
+
|
|
23
|
+
Capture domain language the moment it is settled, so code, tickets and agents share one vocabulary.
|
|
24
|
+
|
|
25
|
+
- One entry per term: **Term** - definition in one or two sentences. Add `Not:` for synonyms to avoid and `See:` for related terms.
|
|
26
|
+
- Write a term only when the user confirms its meaning. Ask when two words seem to name one thing, or one word names two.
|
|
27
|
+
- Prefer the user's business words over technical ones; flag where the code currently uses a different name.
|
|
28
|
+
- Create the file if missing, with the header `# Glossary - domain language for <project>`.
|
|
29
|
+
- Keep it a glossary: no implementation detail, no decisions (those are ADRs).
|
|
30
|
+
|
|
31
|
+
### ADRs: `docs/adr/`
|
|
32
|
+
|
|
33
|
+
Write an ADR only for a decision that is hard to reverse or that a future reader would question: new domain or integration, storage or data ownership, sync vs async flow, retry/timeout/fallback policy, a rejected obvious option.
|
|
34
|
+
|
|
35
|
+
- Follow the numbering and template in `docs/adr/README.md` (`NNNN-<slug>.md`: Status, Date, Context, Decision, Consequences).
|
|
36
|
+
- Status `Proposed` while grilling. It becomes `Accepted` only with the change that implements it.
|
|
37
|
+
- If the decision meets an `/architect` trigger, say so: the orchestrator runs `/architect` on the proposal before it is accepted.
|
|
38
|
+
- Never edit an Accepted ADR; write a new one that supersedes it.
|
|
39
|
+
|
|
40
|
+
## Close
|
|
41
|
+
|
|
42
|
+
When the frontier is empty and the user confirms the shared understanding, return one block:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Decisions
|
|
46
|
+
1. <decision> - <one-line reason>
|
|
47
|
+
Deferred
|
|
48
|
+
- <question> - <who/when decides>
|
|
49
|
+
Out of scope
|
|
50
|
+
- <item>
|
|
51
|
+
Plan changes
|
|
52
|
+
- <what to add or change in docs/plans/<task>.md>
|
|
53
|
+
Docs written
|
|
54
|
+
- GLOSSARY.md: <terms added or changed>
|
|
55
|
+
- docs/adr/NNNN-<slug>.md (Proposed): <title>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The orchestrator applies "Plan changes" to the plan file. A decision that meets an `/architect` trigger becomes an ADR proposal, not a silent plan line.
|
|
59
|
+
|
|
60
|
+
## It's working if
|
|
61
|
+
|
|
62
|
+
- Facts were looked up, never asked; the user only answered decisions.
|
|
63
|
+
- `GLOSSARY.md` and the Proposed ADRs were written during the rounds, not reconstructed after.
|
|
64
|
+
- The closing block applies to `docs/plans/<task>.md` without anyone re-reading the conversation.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grilling
|
|
3
|
+
description: Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Interview the user relentlessly until you reach a shared understanding. Map this as a **design tree**: every decision branches into the decisions that hang off it.
|
|
7
|
+
|
|
8
|
+
Work the tree in **rounds**. The **frontier** is every decision whose prerequisites are already settled: the questions you can ask _now_ without guessing at answers you haven't heard yet. Ask the whole frontier in one round: number each question and give your recommended answer. Then wait for the user's answers before the next round.
|
|
9
|
+
|
|
10
|
+
Format a round like so:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
❓ **Q1** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
|
|
14
|
+
|
|
15
|
+
➡️ <your recommended answer>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
❓ **Q2** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
|
|
20
|
+
|
|
21
|
+
➡️ <your recommended answer>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Word each question so "yes" accepts your recommended answer.
|
|
25
|
+
|
|
26
|
+
Each round the user answers reshapes the tree: settled decisions push the frontier outward and unblock questions that depended on them. Recompute the frontier and ask the next round. A question whose answer depends on another question still open in this round belongs to a _later_ round, not this one.
|
|
27
|
+
|
|
28
|
+
Finding _facts_ is your job, never the user's. When a frontier question needs a fact from the environment (filesystem, tools, etc.), dispatch a sub-agent to find it; don't ask the user for anything you could look up yourself. Don't block on it: a running exploration is an unsettled prerequisite, so only the questions downstream of it wait for the sub-agent to report; ask the rest of the frontier now. The _decisions_ are the user's: put each to them and wait.
|
|
29
|
+
|
|
30
|
+
The session is done when the frontier is empty: every branch of the design tree visited, nothing left silently assumed. Do not act on it until the user confirms you have reached a shared understanding.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: handoff
|
|
3
|
+
description: Compact the current conversation into a handoff document for another agent or session to pick up.
|
|
4
|
+
argument-hint: "What will the next session be used for?"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save it to `.claude/handoffs/<task>-<yyyymmdd-hhmm>.md` inside the current worktree (the orchestrator guard allows `.claude/`; the folder is gitignored, so commit the file explicitly if a colleague needs it from the branch). Print the absolute path at the end.
|
|
9
|
+
|
|
10
|
+
Open with the facts the next session needs before anything else:
|
|
11
|
+
|
|
12
|
+
- Worktree path, branch, base ref
|
|
13
|
+
- Plan: `docs/plans/<task>.md`, and which tickets are done, in flight, and next (the frontier)
|
|
14
|
+
- Agents to dispatch next (`/api`, `/web`, `/app`, `/ui`, `/infra`, `/verifier`, `/security`) and the skills to call the Skill tool for
|
|
15
|
+
|
|
16
|
+
Then the live thread: what is in flight, why, what was tried and failed, and what to do next.
|
|
17
|
+
|
|
18
|
+
Do not duplicate content already captured in other artifacts (plan, ADRs, `GLOSSARY.md`, tickets, commits, diffs). Reference them by path or URL instead. Downgrade anything the session only assumed to "unverified"; the next agent will trust the document.
|
|
19
|
+
|
|
20
|
+
Redact any sensitive information, such as API keys, passwords, or personally identifiable information.
|
|
21
|
+
|
|
22
|
+
If the user passed arguments, treat them as a description of what the next session will focus on and tailor the doc accordingly.
|
|
23
|
+
|
|
24
|
+
## It's working if
|
|
25
|
+
|
|
26
|
+
- The file is a small fraction of the conversation and points at the plan, ADRs and commits instead of copying them.
|
|
27
|
+
- A fresh session reads it and dispatches the next ticket without asking the user to re-explain the setup.
|
|
28
|
+
- Nothing in it is a key, a token, a password, or a claim the session never verified.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: impeccable
|
|
3
|
+
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
|
4
|
+
version: 4.6.0
|
|
5
|
+
user-invocable: true
|
|
6
|
+
argument-hint: "[shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live|generate] [target]"
|
|
7
|
+
license: Apache 2.0
|
|
8
|
+
disable-model-invocation: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
This skill gives you the tools and permission to create design that earns to be called out-of-distribution craft: Whereas before, your design work would have been safe, timid and measured, you now approach every design task as an award-winning design director with impeccable understanding for what makes exceptional design work: production-grade code, peak creativity, a clear POV, deep understanding of the needs of the client and users, and exceptional craft.
|
|
12
|
+
|
|
13
|
+
Core principles:
|
|
14
|
+
- Go all out. No hedging, no shortcuts. The deliverable must be complete (except assets the user must provide).
|
|
15
|
+
- Dream big and bold. Distinct, beautiful, outstanding and highly inspiring work.
|
|
16
|
+
- Verify in bounded passes, not a loop, and the ceiling covers the whole cycle: screenshots, defect scans, micro-edits, and rebuilds alike. Build fully, inspect once with a batched round (desktop and mobile together on the web; the shipped device classes on a native platform), fix everything it shows in one batch, confirm with at most one more round, and stop polishing. Open-ended self-QA burns the user's money doing worse what the finish handoffs do better.
|
|
17
|
+
|
|
18
|
+
## Setup
|
|
19
|
+
|
|
20
|
+
1. Run `<skill-base-dir>/scripts/impeccable context` once per session, where `<skill-base-dir>` is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. That base directory resolves every `.claude/skills/impeccable/scripts/impeccable <verb>` command in this skill and its references, and `.claude/skills/impeccable/scripts` is the fallback only when the runtime reports no base directory. On a Windows shell without `sh`, call `.claude/skills/impeccable/scripts/impeccable.cmd` instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as `--target <path>`. It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.
|
|
21
|
+
2. Load the request's playbook: its Commands-table reference for an explicit/implied sub-command, or [reference/new-work.md](reference/new-work.md) for a new surface or replacement visual world. Inspect target and incumbent visual truth before editing. When the app cannot run, start with committed visual-regression goldens or screenshot fixtures; verify target and freshness against current tokens, CSS, components, or assets, resolve conflicts, and compare theme/variant captures.
|
|
22
|
+
3. After resolving analysis and direction, read [reference/craft-floor.md](reference/craft-floor.md) immediately before any UI edit, including small refinements. It carries the quality floor, the absolute bans, and the reflexes no detector catches. Do not load it for planning-only work.
|
|
23
|
+
|
|
24
|
+
**Launcher unavailable:** On refusal or failure, send a separate message **before the next tool call**: “Context loading did not run; I’ll read the existing project context directly.” Then read existing PRODUCT.md and DESIGN.md without inventing missing context, follow applicable steps 2–3, and continue through permitted tools. This applies to planning and editing; launcher failure alone does not block either.
|
|
25
|
+
|
|
26
|
+
## How to design
|
|
27
|
+
|
|
28
|
+
- **The brief wins.** Honor pinned aesthetics, eras, materials, fonts, and palettes even when they conflict with a saturated-pattern warning. Redirecting a clear brief toward your taste is failure.
|
|
29
|
+
- **Refinement preserves; redesign replaces.** Refinement keeps the incumbent identity, behavior, copy, and everything outside scope. Ask before replacing factual copy or adding claims. Redesign keeps product truth, content, function, native affordances, and constraints, but treats the old look as evidence and anti-reference; choose a replacement world in new-work and replace DESIGN.md. Never split the difference into polish on the discarded look.
|
|
30
|
+
- **Loaded symbols stay out of the decoration.** A subject's world does not license emblems tied to militarism, supremacy, or hate movements as motifs, badges, or ornament, such as the Rising Sun flag's rays, the Confederate battle flag, or Nazi-era insignia and their stylised variants; reach for that world's neutral forms instead. Content that documents such a symbol as fact stays as it is.
|
|
31
|
+
- **Visual authority is evidence, not a filename.** Missing DESIGN.md alone does not make a project greenfield; new-work decides whether to preserve, expand, or replace the incumbent world.
|
|
32
|
+
|
|
33
|
+
## Modes
|
|
34
|
+
|
|
35
|
+
The mode names what the visitor's success looks like on this surface.
|
|
36
|
+
|
|
37
|
+
- **Persuade:** the visitor decides and acts; design is the product. Landing pages, marketing, campaigns, pricing. Earn attention and action. Ship real imagery when the brief needs it; follow the committed world, not category habit.
|
|
38
|
+
- **Operate:** the visitor completes a task. App UI, dashboards, editors, admin, settings, tools. Scanability, consistency, native expectations, and the real usage scene outrank expression. Brand lives in precise details.
|
|
39
|
+
- **Read:** the visitor understands something. Docs, articles, guides, help, changelogs. Structure for comprehension, then make the reading experience worth staying in.
|
|
40
|
+
- **Experience:** the visitor is inside the work itself. Portfolios, galleries, showcases. Let the artifact lead from the first viewport; the interface recedes.
|
|
41
|
+
|
|
42
|
+
Choose the mode from the requested surface, not the product, and persist it only in that surface brief. A tool's landing page is still Persuade; a fashion house's documentation is still Read; a docs index is Read, not Persuade. See [new-work.md](reference/new-work.md) for new surfaces and [operate.md](reference/operate.md) for deeper Operate/Read guidance.
|
|
43
|
+
|
|
44
|
+
## Commands
|
|
45
|
+
|
|
46
|
+
| Command | Category | Description | Reference |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| `craft [feature]` | Build | Deprecated alias for an ordinary new-work request | [reference/craft.md](reference/craft.md) |
|
|
49
|
+
| `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) |
|
|
50
|
+
| `init` | Build | Capture durable product context in PRODUCT.md | [reference/init.md](reference/init.md) |
|
|
51
|
+
| `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) |
|
|
52
|
+
| `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) |
|
|
53
|
+
| `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) |
|
|
54
|
+
| `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) · native: [reference/audit.native.md](reference/audit.native.md) |
|
|
55
|
+
| `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) |
|
|
56
|
+
| `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) |
|
|
57
|
+
| `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) |
|
|
58
|
+
| `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) |
|
|
59
|
+
| `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) |
|
|
60
|
+
| `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) |
|
|
61
|
+
| `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) |
|
|
62
|
+
| `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) |
|
|
63
|
+
| `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) |
|
|
64
|
+
| `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) |
|
|
65
|
+
| `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) |
|
|
66
|
+
| `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) |
|
|
67
|
+
| `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) |
|
|
68
|
+
| `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) · native: [reference/adapt.native.md](reference/adapt.native.md) |
|
|
69
|
+
| `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) |
|
|
70
|
+
| `live` | Iterate | Visual variant mode: pick elements in the browser, iterate on alternatives | [reference/live.md](reference/live.md) |
|
|
71
|
+
| `generate [n] [action] [element]` | Iterate | Variants, versions, or alternatives of a named element to choose from in the live browser; no manual picking | [reference/generate.md](reference/generate.md) |
|
|
72
|
+
|
|
73
|
+
Routing:
|
|
74
|
+
|
|
75
|
+
- **No argument:** read [routing.md](reference/routing.md) and present its context-aware menu; never auto-run a command.
|
|
76
|
+
- **Explicit or clearly implied request to run a command:** load its reference (native variant on native platforms) and follow it. Ask once if two commands fit.
|
|
77
|
+
- **Workflow or command-selection question:** read [Workflow questions](reference/routing.md#workflow-questions).
|
|
78
|
+
- **Otherwise:** treat the request as general design work. Missing PRODUCT.md routes a new surface or replacement world through init, then new-work; a narrow refinement of existing code proceeds on the incumbent implementation as `impeccable context` directs, offering init afterward rather than blocking on it.
|
|
79
|
+
- `teach` aliases `init`. `craft` is a deprecated alias for ordinary new-work and adds nothing. `shape` owns task discovery, then enters new-work only for visual-world and surface-concept decisions.
|
|
80
|
+
|
|
81
|
+
After init writes PRODUCT.md, resume without rerunning `impeccable context`; init loads the native platform reference itself when the platform it recorded is `ios`, `android`, or `adaptive`.
|
|
82
|
+
|
|
83
|
+
**Pin / Unpin:** `.claude/skills/impeccable/scripts/impeccable pin <pin|unpin> <command>` creates or removes a standalone `/<command>` shortcut. Report the script's result concisely; relay stderr verbatim on error.
|
|
84
|
+
|
|
85
|
+
**Hooks:** `/impeccable hooks <on|off|status|ignore-rule|ignore-file|ignore-value|reset>` manages the design detector hook for this project (auto-runs the detector after UI file edits and surfaces findings). Load [reference/hooks.md](reference/hooks.md) when the user invokes it with any argument.
|
|
86
|
+
|
|
87
|
+
**Doctor:** `/impeccable doctor` reports and repairs drift between this project's Impeccable artifacts (PRODUCT.md, DESIGN.md and its sidecar, config, surface briefs, the hook) and what this version reads. Load [reference/doctor.md](reference/doctor.md) when the user invokes it, or when they ask what is out of date, stale, or needs refreshing. A `CONTEXT_STALE` directive in Setup's output is the cheap subset of the same report; act on it there per its own instructions rather than running doctor unasked.
|
|
88
|
+
|
|
89
|
+
**Never repair drift as a side effect of a design task.** A `CONTEXT_STALE` finding is reported, not acted on, unless the user asks. The one exception is a finding marked `auto`, which the next write to that file performs anyway.
|