symbiont / composer-syckdev
[Sy]mlink-pa[ck]age-[dev]elopment
Installs: 9
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Forks: 0
Type:composer-plugin
pkg:composer/symbiont/composer-syckdev
Requires
- php: ^8.2
- composer-plugin-api: ^2.0
- symbiont/config: ^1.2.9
- symbiont/dipendency: ^1.0.1
Requires (Dev)
- composer/composer: ^2.1
- mockery/mockery: ^1.6
- phpunit/phpunit: ^11.1
README
Syckdev (short for Symlink-package-development) is a Composer plugin that dramatically simplifies local package development workflows.
Tired of constantly running composer update after every small change in a local dependency?
Syckdev lets you activate / deactivate symlinked local versions of your packages with a few keystrokes — right from the terminal — without touching your composer.json.
Perfect for monorepo-style or multi-package development where you're actively working on several interdependent libraries at once.
[!IMPORTANT]
This project is work in progress — feedback and contributions are very welcome!
Features
- Interactive terminal UI to toggle local dev versions on/off
- Shows clearly which packages are using local code vs. installed versions
- Supports aliased directory structures (when local folder ≠ Packagist name)
- Displays dependency reasons (
composer why-style) - No need to modify repositories or add path entries manually
- Works globally — one installation for all your projects
Requirements
- PHP ≥ 8.2
- Composer ≥ 2.1
Installation
Global installation is recommended:
# Remove any old version first (if exists)
composer global remove symbiont/composer-syckdev
# Install latest version
composer global require symbiont/composer-syckdev
Make sure ~/.composer/vendor/bin (or equivalent) is in your $PATH.
Quick Setup
- Create a central directory where all your local packages live (e.g.
~/Development/syckdev-repo). Inside it, organize packages using the
vendor/packagepattern (or use aliases later).Example:
~/Development/syckdev-repo/ ├── symbiont/ │ ├── config/ │ ├── dipendency/ │ ├── dispatcher/ │ └── support/ │ ├── boot-trait/ │ └── forward-call/ └── other-vendor/ └── some-lib/In every project where you want to use local overrides, create a
.syckdev.jsonfile at the root:{ "path": "/home/youruser/Development/syckdev-repo", "packages": [ "symbiont/dipendency", "symbiont/dispatcher" ], "alias": { "symbiont/support-boot-trait": "symbiont/support/boot-trait", "symbiont/support-forward-call": "symbiont/support/forward-call" } }path— root folder containing your local packagespackages— (optional) packages to show by default in "required" modealias— maps Packagist-style names → real folder paths (useful when folder structure differs)
[!NOTE]
Future versions will auto-detect packages from the symlink directory using theircomposer.jsonname → no manualpackagesoraliasneeded!
Usage
Run any of these commands from your project root:
composer sd:status # or just: composer sd
You'll enter an interactive terminal view:
Syckdev dev-main ← project name + current branch
┌─────────┬───────────────────────────────┐
│ path │ /home/user/syckdev-repo │
│ package │ symbiont/composer-syckdev │
│ mode │ required │
└─────────┴───────────────────────────────┘
required mode
┌─────┬─────────────────────┬──────────┬───────────┬────────────┬─────────┬───────┬──────────────────────────────────────┐
│ nr │ name │ local │ installed │ status │ type │ alias │ why │
├─────┼─────────────────────┼──────────┼───────────┼────────────┼─────────┼───────┼──────────────────────────────────────┤
│ a:1 │ symbiont/config │ 0a456228 │ v1.2.9 * │ - inactive │ library │ - │ symbiont/composer-syckdev (dev-main) │
│ a:2 │ symbiont/dipendency │ 8dd2595e │ v1.0.1 * │ - inactive │ library │ - │ symbiont/composer-syckdev (dev-main) │
└─────┴─────────────────────┴──────────┴───────────┴────────────┴─────────┴───────┴──────────────────────────────────────┘
q(uit) all (show all packages)
a(ctivate):{nr} d(eactivate):{nr} i(nfo):{nr}
<enter option>:
Available Commands
| Key | Action |
|---|---|
q | Quit |
all | Switch to "all packages" mode |
req | Switch back to "required only" mode |
a:5 | Activate package #5 |
d:3 | Deactivate package #3 |
i:2 | Show more info about package #2 |
After activation, status changes to + active and the command prefix flips from a: → d:.
Column Reference
| Column | Meaning |
|---|---|
nr | Package number for activation/deactivation |
name | Package name (Packagist style) |
local | Commit / version currently present in your symlink folder |
installed | Version Composer currently has installed |
status | - inactive or + active (using local symlink) |
type | composer.json → "type" value |
alias | Real folder path if aliased |
why | Why this package is present (like composer why <package>) |
Coming Features
Planned improvements to make Syckdev even more powerful and convenient:
Automatic project-specific cloning
One command to clone any currently used package from your project'svendor/directory directly into the central symlink directory — organized per project.
Example target structure:
~/Development/syckdev/.my-project-name/vendor/symbiont/configReset command
A simplecomposer sd:reset(or similar) that deactivates all currently active symlinked packages at once, reverting everything to the Composer-installed (remote) versions.
Ideal for quickly cleaning up before committing, deploying, or testing "production-like" behavior.Web-based user interface
An optional lightweight HTTP server (e.g.composer sd:serve) that opens a clean browser dashboard athttp://localhost:some-port.
View status, toggle packages on/off, see dependency graphs, and get detailed info — no more terminal-only interaction when you prefer a GUI.
These features are already on the roadmap — contributions and ideas are very welcome!
Running Tests
The test requires a composer .syckdev.json at the root of this project.
{
"path": "/var/www-symlinks",
"packages": [
"symbiont/dipendency",
"symbiont/dispatcher",
"symbiont/config"
],
"alias": {
"symbiont/support-boot-trait": "symbiont/support/boot-trait",
"symbiont/support-forward-call": "symbiont/support/forward-call"
}
}
Then simply run
composer test
Contributing
Feel free to open issues or merge requests on GitLab.
Links
- 📖 Full technical documentation: https://pacmanrulez.gitlab.io/symbiont-syckdev
- 🐙 Repository: https://gitlab.com/pacmanrulez/symbiont-syckdev