@vetala/vetala 0.1.0-beta
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.
Potentially problematic release.
This version of @vetala/vetala might be problematic. Click here for more details.
- package/CONTRIBUTING.md +77 -0
- package/LICENSE +184 -0
- package/README.md +136 -0
- package/THIRD_PARTY_LICENSES.md +17 -0
- package/dist/src/agent.d.ts +30 -0
- package/dist/src/agent.js +216 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/approvals.d.ts +18 -0
- package/dist/src/approvals.js +81 -0
- package/dist/src/approvals.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +87 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +12 -0
- package/dist/src/config.js +183 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context-memory.d.ts +7 -0
- package/dist/src/context-memory.js +96 -0
- package/dist/src/context-memory.js.map +1 -0
- package/dist/src/ink/command-suggestions.d.ts +7 -0
- package/dist/src/ink/command-suggestions.js +179 -0
- package/dist/src/ink/command-suggestions.js.map +1 -0
- package/dist/src/ink/ink-terminal-ui.d.ts +36 -0
- package/dist/src/ink/ink-terminal-ui.js +79 -0
- package/dist/src/ink/ink-terminal-ui.js.map +1 -0
- package/dist/src/ink/repl-app.d.ts +9 -0
- package/dist/src/ink/repl-app.js +789 -0
- package/dist/src/ink/repl-app.js.map +1 -0
- package/dist/src/ink/transcript-cards.d.ts +6 -0
- package/dist/src/ink/transcript-cards.js +24 -0
- package/dist/src/ink/transcript-cards.js.map +1 -0
- package/dist/src/path-policy.d.ts +11 -0
- package/dist/src/path-policy.js +67 -0
- package/dist/src/path-policy.js.map +1 -0
- package/dist/src/process-utils.d.ts +13 -0
- package/dist/src/process-utils.js +52 -0
- package/dist/src/process-utils.js.map +1 -0
- package/dist/src/repl.d.ts +9 -0
- package/dist/src/repl.js +13 -0
- package/dist/src/repl.js.map +1 -0
- package/dist/src/sarvam/client.d.ts +15 -0
- package/dist/src/sarvam/client.js +208 -0
- package/dist/src/sarvam/client.js.map +1 -0
- package/dist/src/sarvam/models.d.ts +2 -0
- package/dist/src/sarvam/models.js +7 -0
- package/dist/src/sarvam/models.js.map +1 -0
- package/dist/src/search-provider.d.ts +6 -0
- package/dist/src/search-provider.js +8 -0
- package/dist/src/search-provider.js.map +1 -0
- package/dist/src/session-store.d.ts +19 -0
- package/dist/src/session-store.js +318 -0
- package/dist/src/session-store.js.map +1 -0
- package/dist/src/skills/runtime.d.ts +26 -0
- package/dist/src/skills/runtime.js +317 -0
- package/dist/src/skills/runtime.js.map +1 -0
- package/dist/src/skills/types.d.ts +25 -0
- package/dist/src/skills/types.js +2 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/terminal-ui.d.ts +29 -0
- package/dist/src/terminal-ui.js +236 -0
- package/dist/src/terminal-ui.js.map +1 -0
- package/dist/src/tools/filesystem.d.ts +2 -0
- package/dist/src/tools/filesystem.js +622 -0
- package/dist/src/tools/filesystem.js.map +1 -0
- package/dist/src/tools/git.d.ts +2 -0
- package/dist/src/tools/git.js +326 -0
- package/dist/src/tools/git.js.map +1 -0
- package/dist/src/tools/index.d.ts +6 -0
- package/dist/src/tools/index.js +21 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/registry.d.ts +15 -0
- package/dist/src/tools/registry.js +59 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/shell.d.ts +2 -0
- package/dist/src/tools/shell.js +97 -0
- package/dist/src/tools/shell.js.map +1 -0
- package/dist/src/tools/skill.d.ts +3 -0
- package/dist/src/tools/skill.js +130 -0
- package/dist/src/tools/skill.js.map +1 -0
- package/dist/src/tools/web.d.ts +3 -0
- package/dist/src/tools/web.js +144 -0
- package/dist/src/tools/web.js.map +1 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/workspace-trust.d.ts +3 -0
- package/dist/src/workspace-trust.js +31 -0
- package/dist/src/workspace-trust.js.map +1 -0
- package/dist/src/xdg.d.ts +9 -0
- package/dist/src/xdg.js +77 -0
- package/dist/src/xdg.js.map +1 -0
- package/package.json +57 -0
- package/skill/agents-md-generator/SKILL.md +75 -0
- package/skill/agents-md-generator/references/agents_md_template.md +160 -0
- package/skill/agents-md-generator/references/loc_measurement.md +67 -0
- package/skill/agents-md-generator/references/monorepo_detection.md +78 -0
- package/skill/agents-md-generator/references/monorepo_strategy.md +60 -0
- package/skill/agents-md-generator/references/read_only_commands.md +151 -0
- package/skill/agents-md-generator/references/update_strategy.md +160 -0
- package/skill/agents-md-generator/references/working_agreements.md +53 -0
- package/skill/biz-opportunity-scout/SKILL.md +53 -0
- package/skill/biz-opportunity-scout/references/competitive_analysis.md +84 -0
- package/skill/biz-opportunity-scout/references/market_sizing.md +68 -0
- package/skill/biz-opportunity-scout/references/pmf_indicators.md +94 -0
- package/skill/biz-opportunity-scout/references/report_template.md +243 -0
- package/skill/biz-opportunity-scout/references/unit_economics.md +97 -0
- package/skill/code-review/SKILL.md +86 -0
- package/skill/code-review/references/change_analysis.md +116 -0
- package/skill/code-review/references/git_operations.md +115 -0
- package/skill/code-review/references/impact_detection.md +149 -0
- package/skill/code-review/references/output_format.md +137 -0
- package/skill/code-review/references/severity_criteria.md +100 -0
- package/skill/code-security-audit/SKILL.md +123 -0
- package/skill/code-security-audit/references/audit_process.md +277 -0
- package/skill/code-security-audit/references/remediation_patterns.md +599 -0
- package/skill/code-security-audit/references/report_format.md +391 -0
- package/skill/code-security-audit/references/security_domains.md +830 -0
- package/skill/code-security-audit/references/vulnerability_patterns.md +813 -0
- package/skill/composition-patterns/SKILL.md +83 -0
- package/skill/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/skill/composition-patterns/rules/architecture-compound-components.md +112 -0
- package/skill/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/skill/composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/skill/composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/skill/composition-patterns/rules/state-context-interface.md +191 -0
- package/skill/composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/skill/composition-patterns/rules/state-lift-state.md +125 -0
- package/skill/deploy-to-vercel/SKILL.md +293 -0
- package/skill/deploy-to-vercel/resources/deploy-sandbox.sh +301 -0
- package/skill/deploy-to-vercel/resources/deploy.sh +301 -0
- package/skill/doc/SKILL_GUIDELINES.md +138 -0
- package/skill/git-workflow/SKILL.md +94 -0
- package/skill/git-workflow/references/advanced-git.md +632 -0
- package/skill/git-workflow/references/branching-strategies.md +344 -0
- package/skill/git-workflow/references/ci-cd-integration.md +683 -0
- package/skill/git-workflow/references/code-quality-tools.md +351 -0
- package/skill/git-workflow/references/commit-conventions.md +439 -0
- package/skill/git-workflow/references/github-releases.md +288 -0
- package/skill/git-workflow/references/pull-request-workflow.md +773 -0
- package/skill/git-workflow/scripts/verify-git-workflow.sh +263 -0
- package/skill/jetbrains-vmoptions/SKILL.md +51 -0
- package/skill/jetbrains-vmoptions/references/common-options.md +357 -0
- package/skill/jetbrains-vmoptions/references/gc-options.md +350 -0
- package/skill/jetbrains-vmoptions/references/memory-options.md +339 -0
- package/skill/jetbrains-vmoptions/references/prerequisite-check.md +65 -0
- package/skill/kysely-converter/SKILL.md +62 -0
- package/skill/kysely-converter/references/delete.md +323 -0
- package/skill/kysely-converter/references/insert.md +386 -0
- package/skill/kysely-converter/references/operators.md +331 -0
- package/skill/kysely-converter/references/select.md +1000 -0
- package/skill/kysely-converter/references/update.md +349 -0
- package/skill/kysely-converter/references/window_function.md +537 -0
- package/skill/react-best-practices/SKILL.md +131 -0
- package/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/skill/react-best-practices/rules/advanced-init-once.md +42 -0
- package/skill/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/skill/react-best-practices/rules/async-dependencies.md +51 -0
- package/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/skill/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/skill/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/skill/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/skill/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/skill/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/skill/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/skill/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/skill/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/skill/react-best-practices/rules/server-auth-actions.md +96 -0
- package/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/skill/react-best-practices/rules/server-dedup-props.md +65 -0
- package/skill/react-best-practices/rules/server-hoist-static-io.md +142 -0
- package/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/skill/react-native-skills/SKILL.md +115 -0
- package/skill/react-native-skills/rules/animation-derived-value.md +53 -0
- package/skill/react-native-skills/rules/animation-gesture-detector-press.md +95 -0
- package/skill/react-native-skills/rules/animation-gpu-properties.md +65 -0
- package/skill/react-native-skills/rules/design-system-compound-components.md +66 -0
- package/skill/react-native-skills/rules/fonts-config-plugin.md +71 -0
- package/skill/react-native-skills/rules/imports-design-system-folder.md +68 -0
- package/skill/react-native-skills/rules/js-hoist-intl.md +61 -0
- package/skill/react-native-skills/rules/list-performance-callbacks.md +44 -0
- package/skill/react-native-skills/rules/list-performance-function-references.md +132 -0
- package/skill/react-native-skills/rules/list-performance-images.md +53 -0
- package/skill/react-native-skills/rules/list-performance-inline-objects.md +97 -0
- package/skill/react-native-skills/rules/list-performance-item-expensive.md +94 -0
- package/skill/react-native-skills/rules/list-performance-item-memo.md +82 -0
- package/skill/react-native-skills/rules/list-performance-item-types.md +104 -0
- package/skill/react-native-skills/rules/list-performance-virtualize.md +67 -0
- package/skill/react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
- package/skill/react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
- package/skill/react-native-skills/rules/navigation-native-navigators.md +188 -0
- package/skill/react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
- package/skill/react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
- package/skill/react-native-skills/rules/react-state-dispatcher.md +91 -0
- package/skill/react-native-skills/rules/react-state-fallback.md +56 -0
- package/skill/react-native-skills/rules/react-state-minimize.md +65 -0
- package/skill/react-native-skills/rules/rendering-no-falsy-and.md +74 -0
- package/skill/react-native-skills/rules/rendering-text-in-text-component.md +36 -0
- package/skill/react-native-skills/rules/scroll-position-no-state.md +82 -0
- package/skill/react-native-skills/rules/state-ground-truth.md +80 -0
- package/skill/react-native-skills/rules/ui-expo-image.md +66 -0
- package/skill/react-native-skills/rules/ui-image-gallery.md +104 -0
- package/skill/react-native-skills/rules/ui-measure-views.md +78 -0
- package/skill/react-native-skills/rules/ui-menus.md +174 -0
- package/skill/react-native-skills/rules/ui-native-modals.md +77 -0
- package/skill/react-native-skills/rules/ui-pressable.md +61 -0
- package/skill/react-native-skills/rules/ui-safe-area-scroll.md +65 -0
- package/skill/react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
- package/skill/react-native-skills/rules/ui-styling.md +87 -0
- package/skill/react-vite-guide/SKILL.md +101 -0
- package/skill/react-vite-guide/references/composition-patterns.md +709 -0
- package/skill/react-vite-guide/references/performance-optimization.md +1222 -0
- package/skill/react-vite-guide/references/vite-specific.md +385 -0
- package/skill/react-vite-guide/references/web-interface.md +146 -0
- package/skill/skill-maker/SKILL.md +52 -0
- package/skill/skill-maker/references/content_spec.md +67 -0
- package/skill/skill-maker/references/frontmatter_spec.md +96 -0
- package/skill/skill-maker/references/input_validation.md +90 -0
- package/skill/skill-maker/references/skill_structure.md +74 -0
- package/skill/system-prompt-creator/SKILL.md +50 -0
- package/skill/system-prompt-creator/references/data_format_selection.md +135 -0
- package/skill/system-prompt-creator/references/multi_prompt_architecture.md +386 -0
- package/skill/system-prompt-creator/references/prompt_structure.md +140 -0
- package/skill/system-prompt-creator/references/quality_criteria.md +83 -0
- package/skill/typst-creator/SKILL.md +51 -0
- package/skill/typst-creator/references/layout.md +401 -0
- package/skill/typst-creator/references/math.md +297 -0
- package/skill/typst-creator/references/scripting.md +237 -0
- package/skill/typst-creator/references/styling.md +217 -0
- package/skill/typst-creator/references/syntax.md +234 -0
- package/skill/web-design-guidelines/SKILL.md +35 -0
- package/terminal.png +0 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
# Code Quality Tools
|
|
2
|
+
|
|
3
|
+
Shell linting, formatting, smart fixup commits, and structural diffs.
|
|
4
|
+
|
|
5
|
+
## shellcheck - Shell Script Linter
|
|
6
|
+
|
|
7
|
+
### Rule Categories
|
|
8
|
+
|
|
9
|
+
| Prefix | Category | Examples |
|
|
10
|
+
|--------|----------|----------|
|
|
11
|
+
| SC1xxx | Syntax errors | SC1009 (missing `$` on variable), SC1073 (couldn't parse) |
|
|
12
|
+
| SC2xxx | Suggestions/warnings | SC2086 (double quote to prevent globbing), SC2046 (quote to prevent splitting) |
|
|
13
|
+
| SC3xxx | Portability | SC3010 (`[[ ]]` not POSIX), SC3030 (arrays not POSIX) |
|
|
14
|
+
| SC4xxx | Deprecation | Deprecated features that should be avoided |
|
|
15
|
+
|
|
16
|
+
### .shellcheckrc Configuration
|
|
17
|
+
|
|
18
|
+
Place `.shellcheckrc` in the project root:
|
|
19
|
+
|
|
20
|
+
```ini
|
|
21
|
+
# Default shell dialect
|
|
22
|
+
shell=bash
|
|
23
|
+
|
|
24
|
+
# Globally disabled rules
|
|
25
|
+
disable=SC1091 # Don't follow sourced files
|
|
26
|
+
disable=SC2154 # Referenced but not assigned (common with env vars)
|
|
27
|
+
|
|
28
|
+
# Enable optional checks
|
|
29
|
+
enable=require-variable-braces
|
|
30
|
+
enable=check-unassigned-uppercase
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Common Rules and Fixes
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# SC2086: Double quote to prevent globbing and word splitting
|
|
37
|
+
# Bad:
|
|
38
|
+
echo $var
|
|
39
|
+
# Good:
|
|
40
|
+
echo "$var"
|
|
41
|
+
|
|
42
|
+
# SC2046: Quote command substitution to prevent splitting
|
|
43
|
+
# Bad:
|
|
44
|
+
files=$(find . -name "*.sh")
|
|
45
|
+
# Good:
|
|
46
|
+
files="$(find . -name "*.sh")"
|
|
47
|
+
|
|
48
|
+
# SC2155: Declare and assign separately to avoid masking return values
|
|
49
|
+
# Bad:
|
|
50
|
+
local foo="$(mycmd)"
|
|
51
|
+
# Good:
|
|
52
|
+
local foo
|
|
53
|
+
foo="$(mycmd)"
|
|
54
|
+
|
|
55
|
+
# SC2164: Use cd ... || exit to handle cd failure
|
|
56
|
+
# Bad:
|
|
57
|
+
cd /some/dir
|
|
58
|
+
# Good:
|
|
59
|
+
cd /some/dir || exit 1
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### CI Integration
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
# GitHub Actions - shellcheck
|
|
66
|
+
- name: Run shellcheck
|
|
67
|
+
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
|
|
68
|
+
with:
|
|
69
|
+
scandir: './scripts'
|
|
70
|
+
severity: warning
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## shfmt - Shell Script Formatter
|
|
76
|
+
|
|
77
|
+
### Flag Reference
|
|
78
|
+
|
|
79
|
+
| Flag | Description | Example |
|
|
80
|
+
|------|-------------|---------|
|
|
81
|
+
| `-w` | Write result to file (in-place) | `shfmt -w script.sh` |
|
|
82
|
+
| `-d` | Display diff (error if not formatted) | `shfmt -d script.sh` |
|
|
83
|
+
| `-i N` | Indent with N spaces (0 = tabs) | `shfmt -i 2 script.sh` |
|
|
84
|
+
| `-bn` | Binary ops like `&&` and `\|` may start a line | `shfmt -bn script.sh` |
|
|
85
|
+
| `-ci` | Indent switch cases | `shfmt -ci script.sh` |
|
|
86
|
+
| `-sr` | Redirect operators followed by a space | `shfmt -sr script.sh` |
|
|
87
|
+
| `-fn` | Function opening brace on a separate line | `shfmt -fn script.sh` |
|
|
88
|
+
| `-ln` | Language variant: `bash`, `posix`, `mksh`, `bats` | `shfmt -ln bash script.sh` |
|
|
89
|
+
|
|
90
|
+
### EditorConfig Integration
|
|
91
|
+
|
|
92
|
+
shfmt reads `.editorconfig` settings automatically:
|
|
93
|
+
|
|
94
|
+
```ini
|
|
95
|
+
# .editorconfig
|
|
96
|
+
[*.sh]
|
|
97
|
+
indent_style = space
|
|
98
|
+
indent_size = 2
|
|
99
|
+
shell_variant = bash
|
|
100
|
+
binary_next_line = true
|
|
101
|
+
switch_case_indent = true
|
|
102
|
+
space_redirects = true
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
When an `.editorconfig` is present, run `shfmt -w .` without explicit flags.
|
|
106
|
+
|
|
107
|
+
### CI Integration
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
# GitHub Actions - shfmt
|
|
111
|
+
- name: Check shell formatting
|
|
112
|
+
uses: mvdan/sh@8202166b7d1e3473a7c65eeac53ddbdb55d5b808 # v3.12.0
|
|
113
|
+
with:
|
|
114
|
+
sh-version: latest
|
|
115
|
+
args: '-d -i 2 .'
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## git-absorb - Smart Fixup Commits
|
|
121
|
+
|
|
122
|
+
### How It Works
|
|
123
|
+
|
|
124
|
+
1. You stage changes with `git add` (the fixes you want to absorb)
|
|
125
|
+
2. `git absorb` analyzes the staged hunks
|
|
126
|
+
3. For each hunk, it finds the most recent commit that modified those exact lines
|
|
127
|
+
4. It creates `fixup!` commits targeting those parent commits
|
|
128
|
+
5. `git rebase --autosquash` folds the fixup commits into their targets
|
|
129
|
+
|
|
130
|
+
### Typical Workflow
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# 1. You have a feature branch with 5 commits
|
|
134
|
+
# 2. Code review requests changes to lines in commits 2 and 4
|
|
135
|
+
# 3. Make the fixes in your working tree
|
|
136
|
+
# 4. Stage them
|
|
137
|
+
git add -p
|
|
138
|
+
|
|
139
|
+
# 5. Let git-absorb figure out which commits they belong to
|
|
140
|
+
git absorb
|
|
141
|
+
|
|
142
|
+
# 6. Verify the fixup commits look correct
|
|
143
|
+
git log --oneline main..HEAD
|
|
144
|
+
|
|
145
|
+
# 7. Squash fixups into their parent commits
|
|
146
|
+
git rebase --autosquash main
|
|
147
|
+
|
|
148
|
+
# 8. Force-push the cleaned-up branch
|
|
149
|
+
git push --force-with-lease
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Comparison with Manual Fixup Workflow
|
|
153
|
+
|
|
154
|
+
| Step | Manual | git-absorb |
|
|
155
|
+
|------|--------|------------|
|
|
156
|
+
| Identify target commit | `git log --oneline`, find SHA | Automatic |
|
|
157
|
+
| Create fixup commit | `git commit --fixup=<SHA>` | `git absorb` |
|
|
158
|
+
| Apply fixups | `git rebase --autosquash main` | `git absorb --and-rebase` or same |
|
|
159
|
+
| Multiple fixes | Repeat per commit | Single command handles all |
|
|
160
|
+
|
|
161
|
+
### Limitations
|
|
162
|
+
|
|
163
|
+
- Only works with staged changes (use `git add -p` for partial staging)
|
|
164
|
+
- Cannot absorb changes to lines that were not in any prior commit (new code)
|
|
165
|
+
- Ambiguous hunks (lines modified in multiple commits) are skipped with a warning
|
|
166
|
+
- Requires a clean working tree for `--and-rebase`
|
|
167
|
+
|
|
168
|
+
### Installation
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# macOS
|
|
172
|
+
brew install git-absorb
|
|
173
|
+
|
|
174
|
+
# Arch Linux
|
|
175
|
+
pacman -S git-absorb
|
|
176
|
+
|
|
177
|
+
# Cargo (any platform)
|
|
178
|
+
cargo install git-absorb
|
|
179
|
+
|
|
180
|
+
# Ubuntu/Debian (via cargo or from releases)
|
|
181
|
+
cargo install git-absorb
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## difft (difftastic) - Structural Diff
|
|
187
|
+
|
|
188
|
+
### Language Support
|
|
189
|
+
|
|
190
|
+
difft supports 50+ languages including: Bash, C, C++, C#, CSS, Dart, Elixir, Elm, Go, Haskell, HTML, Java, JavaScript, JSON, Kotlin, Lua, Nix, OCaml, PHP, Python, Ruby, Rust, Scala, SQL, Swift, TOML, TypeScript, YAML, and more.
|
|
191
|
+
|
|
192
|
+
### Configuration Options
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Set as default git diff tool (persistent)
|
|
196
|
+
git config --global diff.external difft
|
|
197
|
+
|
|
198
|
+
# Set display width
|
|
199
|
+
git config --global difftool.difftastic.cmd 'difft --width 80 "$LOCAL" "$REMOTE"'
|
|
200
|
+
|
|
201
|
+
# Color output
|
|
202
|
+
export DFT_COLOR=always # always | never | auto
|
|
203
|
+
|
|
204
|
+
# Display mode
|
|
205
|
+
export DFT_DISPLAY=side-by-side-show-both # side-by-side | side-by-side-show-both | inline
|
|
206
|
+
|
|
207
|
+
# Syntax highlighting
|
|
208
|
+
export DFT_SYNTAX_HIGHLIGHT=on # on | off
|
|
209
|
+
|
|
210
|
+
# Context lines around changes
|
|
211
|
+
export DFT_CONTEXT=3
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Integration with Git
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# One-off usage with git diff
|
|
218
|
+
GIT_EXTERNAL_DIFF=difft git diff
|
|
219
|
+
|
|
220
|
+
# With git log
|
|
221
|
+
GIT_EXTERNAL_DIFF=difft git log -p --ext-diff
|
|
222
|
+
|
|
223
|
+
# With git show
|
|
224
|
+
GIT_EXTERNAL_DIFF=difft git show --ext-diff HEAD
|
|
225
|
+
|
|
226
|
+
# As a difftool (interactive)
|
|
227
|
+
git config --global difftool.difftastic.cmd 'difft "$LOCAL" "$REMOTE"'
|
|
228
|
+
git difftool --tool=difftastic
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Integration with delta
|
|
232
|
+
|
|
233
|
+
If you use `delta` as your git pager, you can combine them:
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# Use difft for structural diff, delta for everything else
|
|
237
|
+
# In .gitconfig:
|
|
238
|
+
[diff]
|
|
239
|
+
external = difft
|
|
240
|
+
[pager]
|
|
241
|
+
diff = delta
|
|
242
|
+
log = delta
|
|
243
|
+
show = delta
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Note: When `diff.external` is set, `delta` won't process diff output since difft handles it directly. Use `--no-ext-diff` to bypass difft and use delta instead when needed:
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
git diff --no-ext-diff # Uses delta pager instead of difft
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Installation
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# macOS
|
|
256
|
+
brew install difftastic
|
|
257
|
+
|
|
258
|
+
# Arch Linux
|
|
259
|
+
pacman -S difftastic
|
|
260
|
+
|
|
261
|
+
# Cargo
|
|
262
|
+
cargo install --locked difftastic
|
|
263
|
+
|
|
264
|
+
# Ubuntu/Debian (from GitHub releases)
|
|
265
|
+
curl -Lo difft.tar.gz https://github.com/Wilfred/difftastic/releases/latest/download/difft-x86_64-unknown-linux-gnu.tar.gz
|
|
266
|
+
tar xf difft.tar.gz && sudo mv difft /usr/local/bin/
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Pre-commit Hook Integration
|
|
272
|
+
|
|
273
|
+
Integrate all tools into a pre-commit hook:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
#!/usr/bin/env bash
|
|
277
|
+
# .git/hooks/pre-commit or via pre-commit framework
|
|
278
|
+
|
|
279
|
+
set -euo pipefail
|
|
280
|
+
|
|
281
|
+
# Find staged shell scripts
|
|
282
|
+
staged_scripts=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(sh|bash)$' || true)
|
|
283
|
+
|
|
284
|
+
if [[ -n "$staged_scripts" ]]; then
|
|
285
|
+
echo "Running shellcheck..."
|
|
286
|
+
echo "$staged_scripts" | xargs shellcheck || {
|
|
287
|
+
echo "shellcheck failed. Fix issues before committing."
|
|
288
|
+
exit 1
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
echo "Running shfmt..."
|
|
292
|
+
echo "$staged_scripts" | xargs shfmt -d -i 2 || {
|
|
293
|
+
echo "shfmt: formatting issues found. Run 'shfmt -w -i 2' on the files above."
|
|
294
|
+
exit 1
|
|
295
|
+
}
|
|
296
|
+
fi
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Using pre-commit Framework
|
|
300
|
+
|
|
301
|
+
```yaml
|
|
302
|
+
# .pre-commit-config.yaml
|
|
303
|
+
repos:
|
|
304
|
+
- repo: https://github.com/koalaman/shellcheck-precommit
|
|
305
|
+
rev: v0.10.0
|
|
306
|
+
hooks:
|
|
307
|
+
- id: shellcheck
|
|
308
|
+
- repo: https://github.com/scop/pre-commit-shfmt
|
|
309
|
+
rev: v3.12.0-2
|
|
310
|
+
hooks:
|
|
311
|
+
- id: shfmt
|
|
312
|
+
args: ['-i', '2', '-w']
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## GitHub Actions Workflow
|
|
318
|
+
|
|
319
|
+
Complete workflow integrating all shell quality tools:
|
|
320
|
+
|
|
321
|
+
```yaml
|
|
322
|
+
name: Shell Quality
|
|
323
|
+
on:
|
|
324
|
+
pull_request:
|
|
325
|
+
paths:
|
|
326
|
+
- '**/*.sh'
|
|
327
|
+
- '**/*.bash'
|
|
328
|
+
- '.shellcheckrc'
|
|
329
|
+
- '.editorconfig'
|
|
330
|
+
|
|
331
|
+
jobs:
|
|
332
|
+
shell-quality:
|
|
333
|
+
runs-on: ubuntu-latest
|
|
334
|
+
steps:
|
|
335
|
+
- uses: actions/checkout@v4
|
|
336
|
+
|
|
337
|
+
- name: Install tools
|
|
338
|
+
run: |
|
|
339
|
+
sudo apt-get update
|
|
340
|
+
sudo apt-get install -y shellcheck
|
|
341
|
+
go install mvdan.cc/sh/v3/cmd/shfmt@latest
|
|
342
|
+
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"
|
|
343
|
+
|
|
344
|
+
- name: shellcheck
|
|
345
|
+
run: |
|
|
346
|
+
git ls-files '*.sh' '*.bash' | xargs --no-run-if-empty shellcheck
|
|
347
|
+
|
|
348
|
+
- name: shfmt
|
|
349
|
+
run: |
|
|
350
|
+
shfmt -d -i 2 .
|
|
351
|
+
```
|