diff --git a/.gitignore b/.gitignore index 2b5e356..674f941 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # TWRP flashable zip output *.zip +**/.codewhale/* +!**/.codewhale/constitution.json +.deepseek/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..a1d0e40 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,92 @@ +# AGENTS.md — CB-C6s-STU-GSI-Fixes + +## Overview + +TWRP flashable zip for the **CB-C6s-STU** tablet (Spreadtrum/Unisoc) running a +GSI. It appends `build.prop` properties, installs a touchscreen IDC config, +and installs a camera sensor config. All install logic lives in a shell-script +`update-binary` — no compiled code, no build system. + +## Build / Package + +```bash +# Create the flashable zip (excluded from git via .gitignore) +cd /home/purpl/Repos/CB-C6s-STU-GSI-Fixes +zip -r ../CB-C6s-STU-GSI-Fixes.zip META-INF/ system/ vendor/ +``` + +No build dependencies, no lint, no test suite. + +## Architecture + +``` +zip root +├── META-INF/com/google/android/ +│ ├── update-binary ← Entry point: POSIX sh script, executed by TWRP +│ └── updater-script ← Dummy placeholder (TWRP ignores it) +├── system/ +│ ├── build.prop ← Properties APPENDED (>>) to /system/build.prop +│ └── usr/idc/ +│ └── goodix_ts.idc ← Copied to /system/usr/idc/goodix_ts.idc (644) +└── vendor/etc/ + └── sensor_config.xml ← Copied to /vendor/etc/ or /system/vendor/etc/ (644) +``` + +### Install flow (update-binary) + +1. Locate zip root: `dirname $0` → up 3 levels (`../../..`) +2. Mount `/system` and `/vendor` +3. **Append** `system/build.prop` → `/system/build.prop` (backup first to `.bak`) +4. Copy `goodix_ts.idc` → `/system/usr/idc/` +5. Copy `sensor_config.xml` → `/vendor/etc/` (fallback to `/system/vendor/etc/` for SAR) +6. Report success via `ui_print()` to `/proc/self/fd/$OUTFD` + +### Critical constraint: build.prop is APPENDED, never replaced + +`update-binary` line ~72: `cat "$BUILDPROP_SRC" >> /system/build.prop` + +The `>>` is intentional. Using `>` or `package_extract_dir` would clobber the +device's existing properties. Re-flashing duplicates entries — warn the user or +add idempotency if this becomes a problem. + +## Key Files + +| File | Role | +|------|------| +| `META-INF/…/update-binary` | Entire install logic (shell script) | +| `META-INF/…/updater-script` | Placeholder; not executed | +| `system/build.prop` | 5 properties appended to device's build.prop | +| `system/usr/idc/goodix_ts.idc` | Touchscreen input device config (orientation + type) | +| `vendor/etc/sensor_config.xml` | Camera module mapping: hi846, gc8034 (rear/front, 4 combos) | +| `README.md` | User-facing documentation | +| `.gitignore` | Excludes `*.zip` | + +## Coding Conventions + +- **Shell**: POSIX sh, no bashisms. Shebang `#!/sbin/sh` (TWRP environment). +- **Error handling**: `abort()` helper exits with message. `2>/dev/null` on + non-critical operations (mount, mkdir, cp backup). +- **Naming**: `UPPER_CASE` for globals/file paths, `snake_case` for helpers. +- **Partition logic**: `/vendor` mount is best-effort; falls back to + `/system/vendor/etc/` when `/vendor/etc/` doesn't exist (SAR compatibility). + +## Git Workflow + +- Branch: `main` (root commit only) +- Commit style: concise summary line, then bullet list of changes +- `.gitignore`: excludes `*.zip` (the build artifact) and tooling directories + +## Tips for AI Agents + +- **This is not a software project** — there is no build system, no package + manager, no test runner. Changes are edits to shell script or config files. +- **To add a new fix**: add the payload file under `system/` or `vendor/`, + add a step to `update-binary` with `ui_print` and `cp` (or append logic), + update `README.md` "What it fixes" table. +- **To add a new build.prop property**: append a line to `system/build.prop`. + If it needs to be idempotent, add a grep guard in `update-binary`. +- **Testing**: flash the zip in TWRP on the device. There is no emulation. +- **The `updater-script` is a dummy** — do not add Edify commands there; put + all logic in `update-binary`. +- **Zip path**: the build artifact is written to the repo's parent directory, + not inside the workspace. `*.zip` in `.gitignore` covers both locations.