ima-claude 2.20.0 → 2.26.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/README.md +74 -9
- package/dist/cli.js +2 -1
- package/package.json +1 -1
- package/plugins/ima-claude/.claude-plugin/plugin.json +2 -2
- package/plugins/ima-claude/agents/explorer.md +29 -15
- package/plugins/ima-claude/agents/implementer.md +58 -13
- package/plugins/ima-claude/agents/memory.md +19 -19
- package/plugins/ima-claude/agents/reviewer.md +84 -34
- package/plugins/ima-claude/agents/tester.md +59 -16
- package/plugins/ima-claude/agents/wp-developer.md +66 -21
- package/plugins/ima-claude/hooks/bootstrap.sh +42 -44
- package/plugins/ima-claude/hooks/prompt_coach_digest.md +14 -17
- package/plugins/ima-claude/hooks/prompt_coach_system.md +10 -12
- package/plugins/ima-claude/personalities/README.md +17 -6
- package/plugins/ima-claude/personalities/enable-efficient.md +61 -0
- package/plugins/ima-claude/personalities/enable-terse.md +71 -0
- package/plugins/ima-claude/skills/agentic-workflows/SKILL.md +35 -71
- package/plugins/ima-claude/skills/architect/SKILL.md +54 -168
- package/plugins/ima-claude/skills/compound-bridge/SKILL.md +41 -94
- package/plugins/ima-claude/skills/design-to-code/SKILL.md +43 -78
- package/plugins/ima-claude/skills/discourse/SKILL.md +79 -194
- package/plugins/ima-claude/skills/discourse-admin/SKILL.md +41 -103
- package/plugins/ima-claude/skills/docs-organize/SKILL.md +63 -203
- package/plugins/ima-claude/skills/ember-discourse/SKILL.md +90 -200
- package/plugins/ima-claude/skills/espocrm/SKILL.md +14 -23
- package/plugins/ima-claude/skills/espocrm-api/SKILL.md +79 -192
- package/plugins/ima-claude/skills/functional-programmer/SKILL.md +33 -237
- package/plugins/ima-claude/skills/gh-cli/SKILL.md +26 -65
- package/plugins/ima-claude/skills/ima-bootstrap/SKILL.md +71 -104
- package/plugins/ima-claude/skills/ima-bootstrap/references/ima-brand.md +32 -22
- package/plugins/ima-claude/skills/ima-brand/SKILL.md +18 -23
- package/plugins/ima-claude/skills/ima-copywriting/SKILL.md +68 -179
- package/plugins/ima-claude/skills/ima-doc2pdf/SKILL.md +32 -102
- package/plugins/ima-claude/skills/ima-editorial-scorecard/SKILL.md +38 -63
- package/plugins/ima-claude/skills/ima-editorial-workflow/SKILL.md +69 -114
- package/plugins/ima-claude/skills/ima-email-creator/SKILL.md +16 -22
- package/plugins/ima-claude/skills/ima-forms-expert/SKILL.md +21 -37
- package/plugins/ima-claude/skills/ima-git/SKILL.md +81 -0
- package/plugins/ima-claude/skills/jira-checkpoint/SKILL.md +39 -120
- package/plugins/ima-claude/skills/jquery/SKILL.md +107 -233
- package/plugins/ima-claude/skills/js-fp/SKILL.md +75 -296
- package/plugins/ima-claude/skills/js-fp-api/SKILL.md +52 -162
- package/plugins/ima-claude/skills/js-fp-react/SKILL.md +47 -270
- package/plugins/ima-claude/skills/js-fp-vue/SKILL.md +55 -209
- package/plugins/ima-claude/skills/js-fp-wordpress/SKILL.md +59 -204
- package/plugins/ima-claude/skills/livecanvas/SKILL.md +19 -32
- package/plugins/ima-claude/skills/mcp-atlassian/SKILL.md +92 -162
- package/plugins/ima-claude/skills/mcp-context7/SKILL.md +32 -64
- package/plugins/ima-claude/skills/mcp-gitea/SKILL.md +98 -188
- package/plugins/ima-claude/skills/mcp-github/SKILL.md +60 -124
- package/plugins/ima-claude/skills/mcp-memory/SKILL.md +1 -177
- package/plugins/ima-claude/skills/mcp-qdrant/SKILL.md +58 -115
- package/plugins/ima-claude/skills/mcp-sequential/SKILL.md +32 -87
- package/plugins/ima-claude/skills/mcp-serena/SKILL.md +54 -80
- package/plugins/ima-claude/skills/mcp-tavily/SKILL.md +40 -63
- package/plugins/ima-claude/skills/mcp-vestige/SKILL.md +75 -116
- package/plugins/ima-claude/skills/php-authnet/SKILL.md +32 -65
- package/plugins/ima-claude/skills/php-fp/SKILL.md +50 -129
- package/plugins/ima-claude/skills/php-fp-wordpress/SKILL.md +25 -73
- package/plugins/ima-claude/skills/phpunit-wp/SKILL.md +103 -463
- package/plugins/ima-claude/skills/playwright/SKILL.md +69 -220
- package/plugins/ima-claude/skills/prompt-starter/SKILL.md +33 -83
- package/plugins/ima-claude/skills/prompt-starter/references/code-review.md +38 -0
- package/plugins/ima-claude/skills/py-fp/SKILL.md +78 -384
- package/plugins/ima-claude/skills/quasar-fp/SKILL.md +54 -255
- package/plugins/ima-claude/skills/quickstart/SKILL.md +7 -11
- package/plugins/ima-claude/skills/rails/SKILL.md +63 -184
- package/plugins/ima-claude/skills/resume-session/SKILL.md +14 -35
- package/plugins/ima-claude/skills/rg/SKILL.md +61 -146
- package/plugins/ima-claude/skills/ruby-fp/SKILL.md +66 -163
- package/plugins/ima-claude/skills/save-session/SKILL.md +10 -39
- package/plugins/ima-claude/skills/scorecard/SKILL.md +42 -40
- package/plugins/ima-claude/skills/skill-analyzer/SKILL.md +42 -71
- package/plugins/ima-claude/skills/skill-creator/SKILL.md +79 -250
- package/plugins/ima-claude/skills/task-master/SKILL.md +11 -31
- package/plugins/ima-claude/skills/task-planner/SKILL.md +44 -153
- package/plugins/ima-claude/skills/task-runner/SKILL.md +61 -143
- package/plugins/ima-claude/skills/unit-testing/SKILL.md +59 -134
- package/plugins/ima-claude/skills/wp-ddev/SKILL.md +38 -120
- package/plugins/ima-claude/skills/wp-local/SKILL.md +26 -108
|
@@ -5,184 +5,113 @@ description: "Test workflow orchestration — decision tree routing to domain sk
|
|
|
5
5
|
|
|
6
6
|
# Unit Testing - Orchestration Skill
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Pure functions are trivially testable. Hard-to-test code is a design problem, not a test setup problem.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
**Core rules:**
|
|
11
|
+
- Extract pure logic — separate decisions from effects
|
|
12
|
+
- Test behavior, not implementation
|
|
13
|
+
- Bottom-heavy pyramid: many unit, few integration, fewer E2E
|
|
14
|
+
- Mock only boundaries (DB, network, filesystem), not your own code
|
|
11
15
|
|
|
12
|
-
##
|
|
13
|
-
|
|
14
|
-
Pure functions are trivially testable. If something is hard to test, the problem is the code design, not the test setup.
|
|
15
|
-
|
|
16
|
-
1. **Extract pure logic** — separate decisions from effects
|
|
17
|
-
2. **Test behavior, not implementation** — what it does, not how
|
|
18
|
-
3. **Bottom-heavy pyramid** — many unit tests, few integration, fewer E2E
|
|
19
|
-
4. **Minimal mocking** — mock boundaries (DB, network, filesystem), not your own code
|
|
20
|
-
|
|
21
|
-
## Decision Tree: Which Skills to Use
|
|
16
|
+
## Decision Tree: Which Skills
|
|
22
17
|
|
|
23
18
|
```
|
|
24
19
|
What are you testing?
|
|
25
20
|
├── WordPress PHP plugin/theme?
|
|
26
21
|
│ → phpunit-wp (primary) + php-fp + php-fp-wordpress
|
|
27
|
-
│ → References: php-fp/references/testing-patterns.md
|
|
28
|
-
│ php-fp-wordpress/references/testing-strategy.md
|
|
29
22
|
│
|
|
30
23
|
├── General PHP (non-WordPress)?
|
|
31
24
|
│ → php-fp (primary)
|
|
32
|
-
│ → References: php-fp/references/testing-patterns.md
|
|
33
25
|
│
|
|
34
26
|
├── JavaScript/TypeScript?
|
|
35
|
-
│ ├── React components?
|
|
36
|
-
│
|
|
37
|
-
│
|
|
38
|
-
│ │ → js-fp-vue + js-fp
|
|
39
|
-
│ │ → References: js-fp-vue/references/testing.md
|
|
40
|
-
│ └── General JS/TS?
|
|
41
|
-
│ → js-fp (primary)
|
|
42
|
-
│ → References: js-fp/references/testing-patterns.md
|
|
27
|
+
│ ├── React components? → js-fp-react + js-fp
|
|
28
|
+
│ ├── Vue components? → js-fp-vue + js-fp
|
|
29
|
+
│ └── General JS/TS? → js-fp (primary)
|
|
43
30
|
│
|
|
44
|
-
├── End-to-end / browser
|
|
45
|
-
│ → playwright (primary)
|
|
31
|
+
├── End-to-end / browser? → playwright (primary)
|
|
46
32
|
│
|
|
47
33
|
└── Unknown / mixed?
|
|
48
|
-
→
|
|
49
|
-
→ Route to domain skill once context is clear
|
|
34
|
+
→ functional-programmer → route to domain skill once clear
|
|
50
35
|
```
|
|
51
36
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
## Workflow: Adding Tests to Existing Code
|
|
37
|
+
## Workflow: Adding Tests
|
|
55
38
|
|
|
56
|
-
|
|
39
|
+
**Step 1 — Analyze:** Read code under test. Identify pure functions vs impure boundaries. Map dependencies (DB, filesystem, network, global state).
|
|
57
40
|
|
|
58
|
-
|
|
59
|
-
- Identify pure functions vs impure boundaries
|
|
60
|
-
- Map dependencies: what does this code touch? (DB, filesystem, network, global state)
|
|
61
|
-
|
|
62
|
-
### Step 2: Classify
|
|
41
|
+
**Step 2 — Classify:**
|
|
63
42
|
|
|
64
43
|
| Code Type | Test Type | Speed | Mocking |
|
|
65
44
|
|-----------|-----------|-------|---------|
|
|
66
|
-
| Pure function
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
| API endpoint
|
|
70
|
-
| Full user workflow | E2E
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
- PHP: `tests/Unit/`, `tests/Integration/` (mirror `src/` structure)
|
|
76
|
-
- JS/TS: colocated `*.test.ts` or `__tests__/` directory
|
|
45
|
+
| Pure function | Unit | Fast (<10ms) | None |
|
|
46
|
+
| Injected deps | Unit | Fast | Stub deps |
|
|
47
|
+
| WP hook/filter | Unit or integration | Medium | Mock WP functions |
|
|
48
|
+
| API endpoint | Integration | Medium | Mock external services |
|
|
49
|
+
| Full user workflow | E2E | Slow | None (real browser) |
|
|
50
|
+
|
|
51
|
+
**Step 3 — Structure:**
|
|
52
|
+
- PHP: `tests/Unit/`, `tests/Integration/` (mirror `src/`)
|
|
53
|
+
- JS/TS: colocated `*.test.ts` or `__tests__/`
|
|
77
54
|
- E2E: `tests/e2e/` or `e2e/`
|
|
78
55
|
|
|
79
|
-
|
|
56
|
+
**Step 4 — Write:** `Arrange → Act → Assert` (one behavior per test)
|
|
57
|
+
- Test name = behavior description: `it('returns empty array when no items match filter')`
|
|
58
|
+
- One assertion per concept; no logic in tests; minimal test data
|
|
80
59
|
|
|
81
|
-
|
|
60
|
+
**Step 5 — Verify:** Run suite, all green, no unexplained skips, coverage meets floor.
|
|
82
61
|
|
|
83
|
-
|
|
84
|
-
Arrange → Act → Assert (one behavior per test)
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
- **Test name = behavior description**: `it('returns empty array when no items match filter')`
|
|
88
|
-
- **One assertion per concept** (multiple `expect` calls are fine if they verify one behavior)
|
|
89
|
-
- **No logic in tests**: no conditionals, no loops, no try/catch
|
|
90
|
-
- **Test data is minimal**: only include fields relevant to the behavior under test
|
|
91
|
-
|
|
92
|
-
### Step 5: Verify
|
|
93
|
-
|
|
94
|
-
- Run the test suite: `composer test`, `npm test`, `npx vitest`, etc.
|
|
95
|
-
- All tests pass (green)
|
|
96
|
-
- No skipped or pending tests without a documented reason
|
|
97
|
-
- Coverage meets project floor (if configured)
|
|
98
|
-
|
|
99
|
-
## Workflow: TDD (Test-Driven Development)
|
|
100
|
-
|
|
101
|
-
### Red-Green-Refactor
|
|
62
|
+
## TDD: Red-Green-Refactor
|
|
102
63
|
|
|
103
64
|
```
|
|
104
|
-
1. RED — Write
|
|
105
|
-
2. GREEN —
|
|
106
|
-
3. REFACTOR — Clean up
|
|
65
|
+
1. RED — Write failing test for next behavior
|
|
66
|
+
2. GREEN — Minimum code to pass
|
|
67
|
+
3. REFACTOR — Clean up, keep green
|
|
107
68
|
```
|
|
108
69
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
Pure functions + TDD = fast feedback loops. No setup, no teardown, no mocking.
|
|
112
|
-
|
|
113
|
-
```
|
|
114
|
-
Test: add(2, 3) === 5
|
|
115
|
-
Code: const add = (a, b) => a + b
|
|
116
|
-
Done.
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### TDD for Impure Boundaries
|
|
120
|
-
|
|
121
|
-
When TDD hits an impure boundary (DB, network, filesystem):
|
|
122
|
-
|
|
123
|
-
1. **Define the interface** — what does the boundary need to provide?
|
|
124
|
-
2. **Stub the boundary** — test against the interface, not the implementation
|
|
125
|
-
3. **Wire up later** — connect the real implementation after the pure logic is tested
|
|
126
|
-
|
|
127
|
-
### When TDD Slows You Down
|
|
128
|
-
|
|
129
|
-
TDD is a tool, not a religion. Skip it when:
|
|
130
|
-
- Exploring/prototyping (you'll throw the code away)
|
|
131
|
-
- The implementation is trivial and obvious
|
|
132
|
-
- You're writing glue code with no logic
|
|
133
|
-
|
|
134
|
-
See `references/tdd-workflow.md` for detailed mechanics.
|
|
70
|
+
Skip TDD when: exploring/prototyping, trivial/obvious implementation, pure glue code.
|
|
135
71
|
|
|
136
72
|
## Mock Decision Tree
|
|
137
73
|
|
|
138
74
|
```
|
|
139
75
|
Is the dependency hard to test?
|
|
140
|
-
├── No
|
|
141
|
-
├── Yes,
|
|
76
|
+
├── No → Don't mock. Test directly.
|
|
77
|
+
├── Yes, I own the code
|
|
142
78
|
│ ├── Can I extract pure logic? → Extract it. Test the pure part.
|
|
143
79
|
│ └── Can I inject the dependency? → Inject it. Pass a stub.
|
|
144
|
-
└── Yes, external
|
|
145
|
-
→ Mock it. Use the simplest mock type that works.
|
|
80
|
+
└── Yes, external (DB, API, filesystem, time) → Mock it.
|
|
146
81
|
```
|
|
147
82
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
|
151
|
-
|
|
152
|
-
|
|
|
153
|
-
|
|
|
154
|
-
| **Fake** | Working simplified implementation | Complex interfaces (in-memory DB) |
|
|
155
|
-
| **Full mock** | Strict expectations on calls | Almost never. Couples tests to implementation. |
|
|
156
|
-
|
|
157
|
-
See `references/mock-patterns.md` for language-specific examples and anti-patterns.
|
|
83
|
+
| Mock Type | What it does | When |
|
|
84
|
+
|-----------|-------------|------|
|
|
85
|
+
| Stub | Returns canned data | Default choice |
|
|
86
|
+
| Spy | Records calls | When verifying a call was made |
|
|
87
|
+
| Fake | Working simplified impl | Complex interfaces (in-memory DB) |
|
|
88
|
+
| Full mock | Strict call expectations | Almost never |
|
|
158
89
|
|
|
159
|
-
##
|
|
160
|
-
|
|
161
|
-
Before considering tests "done":
|
|
90
|
+
## Quality Checklist
|
|
162
91
|
|
|
163
92
|
- [ ] Tests verify behavior, not implementation
|
|
164
|
-
- [ ] Each test
|
|
165
|
-
- [ ] No test depends on another
|
|
166
|
-
- [ ] No
|
|
93
|
+
- [ ] Each test name describes the scenario
|
|
94
|
+
- [ ] No test depends on another's state
|
|
95
|
+
- [ ] No timers, real network, or filesystem in unit tests
|
|
167
96
|
- [ ] Pure functions tested without mocking
|
|
168
|
-
- [ ] Mocks
|
|
169
|
-
- [ ] Edge cases
|
|
97
|
+
- [ ] Mocks only at impure boundaries
|
|
98
|
+
- [ ] Edge cases: empty input, null/undefined, boundary values
|
|
170
99
|
- [ ] Error paths tested (not just happy path)
|
|
171
|
-
- [ ]
|
|
100
|
+
- [ ] Unit suite runs < 10s
|
|
172
101
|
|
|
173
102
|
## Anti-Patterns
|
|
174
103
|
|
|
175
|
-
| Anti-Pattern |
|
|
176
|
-
|
|
177
|
-
| Testing implementation details |
|
|
178
|
-
| Mocking everything |
|
|
179
|
-
| Giant test setup |
|
|
180
|
-
| Copy-paste test bodies |
|
|
181
|
-
| Testing framework behavior |
|
|
182
|
-
| 100% coverage target |
|
|
183
|
-
| `sleep()` in tests |
|
|
104
|
+
| Anti-Pattern | Fix |
|
|
105
|
+
|-------------|-----|
|
|
106
|
+
| Testing implementation details | Test behavior/output instead |
|
|
107
|
+
| Mocking everything | Extract pure logic, mock only boundaries |
|
|
108
|
+
| Giant test setup | Simplify code under test or use factories |
|
|
109
|
+
| Copy-paste test bodies | Use parameterized/table-driven tests |
|
|
110
|
+
| Testing framework behavior | Trust the framework |
|
|
111
|
+
| 100% coverage target | Set a floor, not a ceiling |
|
|
112
|
+
| `sleep()` in tests | Use deterministic waits or fix the design |
|
|
184
113
|
|
|
185
|
-
##
|
|
114
|
+
## Domain Skill Reference
|
|
186
115
|
|
|
187
116
|
| Context | Primary Skill | Reference Files |
|
|
188
117
|
|---------|--------------|-----------------|
|
|
@@ -192,7 +121,3 @@ Before considering tests "done":
|
|
|
192
121
|
| Vue.js | `js-fp-vue` | `js-fp-vue/references/testing.md` |
|
|
193
122
|
| React | `js-fp-react` | `js-fp/references/testing-patterns.md` |
|
|
194
123
|
| E2E / Browser | `playwright` | (self-contained skill) |
|
|
195
|
-
|
|
196
|
-
## The Final Word
|
|
197
|
-
|
|
198
|
-
*"If it's hard to test, it's hard to use. Testability is a design signal, not a chore. Extract the pure, inject the impure, and the tests write themselves."*
|
|
@@ -7,34 +7,24 @@ description: "Run WordPress WP-CLI commands in DDEV environments. Database queri
|
|
|
7
7
|
|
|
8
8
|
Execute WP-CLI commands in DDEV WordPress environments. Zero configuration — just be in a DDEV project directory.
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
**Prerequisites**: Docker + DDEV v1.25+ installed.
|
|
10
|
+
**Prerequisites**: Docker + DDEV v1.25+
|
|
13
11
|
|
|
14
12
|
```bash
|
|
15
|
-
# Start your DDEV project
|
|
16
13
|
ddev start
|
|
17
|
-
|
|
18
|
-
# Run WP-CLI commands directly
|
|
19
14
|
ddev wp plugin list
|
|
20
|
-
ddev wp user list
|
|
21
15
|
ddev wp db query "SELECT * FROM wp_posts LIMIT 5"
|
|
22
|
-
|
|
23
|
-
# View project info (URLs, ports, credentials)
|
|
24
|
-
ddev describe
|
|
16
|
+
ddev describe # URLs, ports, credentials
|
|
25
17
|
```
|
|
26
18
|
|
|
27
19
|
## How It Works
|
|
28
20
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
4. No UUIDs, no socket paths, no wrapper scripts
|
|
21
|
+
- DDEV auto-detects `.ddev/config.yaml`
|
|
22
|
+
- WP-CLI runs inside web container with correct PHP, MySQL, WordPress paths
|
|
23
|
+
- No host environment pollution, no UUIDs, no socket paths
|
|
33
24
|
|
|
34
25
|
## Common Commands
|
|
35
26
|
|
|
36
|
-
### Database
|
|
37
|
-
`ddev wp db query <sql>` · `ddev wp db export [file]` · `ddev wp db import <file>` · `ddev wp search-replace <old> <new>`
|
|
27
|
+
### Database
|
|
38
28
|
```bash
|
|
39
29
|
ddev wp db query "SELECT * FROM wp_users"
|
|
40
30
|
ddev wp db export dump.sql
|
|
@@ -43,29 +33,23 @@ ddev wp search-replace 'old.com' 'new.com' --dry-run
|
|
|
43
33
|
ddev wp search-replace 'old.com' 'new.com' --all-tables
|
|
44
34
|
```
|
|
45
35
|
|
|
46
|
-
###
|
|
47
|
-
`ddev wp plugin list` · `ddev wp plugin activate <plugin>` · `ddev wp plugin deactivate <plugin>` · `ddev wp plugin install <plugin> [--activate]`
|
|
36
|
+
### Plugins
|
|
48
37
|
```bash
|
|
49
|
-
ddev wp plugin list
|
|
50
38
|
ddev wp plugin list --status=active --format=json
|
|
51
39
|
ddev wp plugin activate my-plugin
|
|
52
|
-
ddev wp plugin deactivate my-plugin
|
|
53
40
|
ddev wp plugin install contact-form-7 --activate
|
|
54
41
|
ddev wp plugin is-installed woocommerce && echo "yes"
|
|
55
42
|
```
|
|
56
43
|
|
|
57
|
-
###
|
|
58
|
-
`ddev wp user list` · `ddev wp user create <login> <email> [--role=<role>]` · `ddev wp user update <user> [--field=value]`
|
|
44
|
+
### Users
|
|
59
45
|
```bash
|
|
60
|
-
ddev wp user list
|
|
61
46
|
ddev wp user list --role=administrator --format=table
|
|
62
47
|
ddev wp user create testuser test@example.com --role=editor
|
|
63
48
|
ddev wp user update 1 --display_name="Admin User"
|
|
64
49
|
ddev wp user add-role 2 editor
|
|
65
50
|
```
|
|
66
51
|
|
|
67
|
-
###
|
|
68
|
-
`ddev wp theme list` · `ddev wp theme activate <theme>` · `ddev wp theme status <theme>`
|
|
52
|
+
### Themes
|
|
69
53
|
```bash
|
|
70
54
|
ddev wp theme list
|
|
71
55
|
ddev wp theme activate twentytwentyfour
|
|
@@ -73,16 +57,13 @@ ddev wp theme status flavor
|
|
|
73
57
|
```
|
|
74
58
|
|
|
75
59
|
### Cache & Transients
|
|
76
|
-
`ddev wp cache flush` · `ddev wp transient delete --all` · `ddev wp transient get <key>`
|
|
77
60
|
```bash
|
|
78
61
|
ddev wp cache flush
|
|
79
62
|
ddev wp transient delete --all
|
|
80
63
|
ddev wp transient get my_transient_key
|
|
81
|
-
ddev wp transient list --format=table
|
|
82
64
|
```
|
|
83
65
|
|
|
84
66
|
### Options
|
|
85
|
-
`ddev wp option get <key>` · `ddev wp option update <key> <value>` · `ddev wp option list [--search=<pattern>]`
|
|
86
67
|
```bash
|
|
87
68
|
ddev wp option get siteurl
|
|
88
69
|
ddev wp option update blogname "New Site Name"
|
|
@@ -90,20 +71,17 @@ ddev wp option list --search="woocommerce_*" --format=table
|
|
|
90
71
|
ddev wp option delete my_old_option
|
|
91
72
|
```
|
|
92
73
|
|
|
93
|
-
###
|
|
94
|
-
`ddev wp post list [--post_type=<type>]` · `ddev wp post create` · `ddev wp post update <id>` · `ddev wp post delete <id>`
|
|
74
|
+
### Posts
|
|
95
75
|
```bash
|
|
96
76
|
ddev wp post list --post_type=page --format=table
|
|
97
77
|
ddev wp post list --post_status=draft --fields=ID,post_title
|
|
98
78
|
ddev wp post create --post_type=post --post_title="Test" --post_status=publish
|
|
99
79
|
ddev wp post update 42 --post_title="Updated Title"
|
|
100
80
|
ddev wp post delete 42 --force
|
|
101
|
-
ddev wp post meta get 42 _thumbnail_id
|
|
102
81
|
ddev wp post meta update 42 custom_field "new value"
|
|
103
82
|
```
|
|
104
83
|
|
|
105
|
-
### Taxonomy
|
|
106
|
-
`ddev wp term list <taxonomy>` · `ddev wp term create <taxonomy> <term>` · `ddev wp term update <taxonomy> <term-id>`
|
|
84
|
+
### Taxonomy
|
|
107
85
|
```bash
|
|
108
86
|
ddev wp term list category --format=table
|
|
109
87
|
ddev wp term create category "New Category" --slug=new-category
|
|
@@ -112,24 +90,19 @@ ddev wp term delete category 5
|
|
|
112
90
|
```
|
|
113
91
|
|
|
114
92
|
### Menu
|
|
115
|
-
`ddev wp menu list` · `ddev wp menu item list <menu>` · `ddev wp menu item add-post <menu> <post-id>`
|
|
116
93
|
```bash
|
|
117
94
|
ddev wp menu list --format=table
|
|
118
|
-
ddev wp menu item list primary-menu
|
|
119
95
|
ddev wp menu item add-post primary-menu 42
|
|
120
96
|
ddev wp menu item add-custom primary-menu "Link" https://example.com
|
|
121
97
|
```
|
|
122
98
|
|
|
123
|
-
### Rewrite
|
|
124
|
-
`ddev wp rewrite flush` · `ddev wp rewrite list` · `ddev wp rewrite structure <structure>`
|
|
99
|
+
### Rewrite
|
|
125
100
|
```bash
|
|
126
101
|
ddev wp rewrite flush
|
|
127
|
-
ddev wp rewrite list --format=csv
|
|
128
102
|
ddev wp rewrite structure '/%postname%/'
|
|
129
103
|
```
|
|
130
104
|
|
|
131
105
|
### Scaffold
|
|
132
|
-
`ddev wp scaffold plugin <slug>` · `ddev wp scaffold child-theme <slug>` · `ddev wp scaffold post-type <slug>`
|
|
133
106
|
```bash
|
|
134
107
|
ddev wp scaffold plugin my-plugin --plugin_name="My Plugin"
|
|
135
108
|
ddev wp scaffold post-type product --plugin=my-plugin
|
|
@@ -137,128 +110,73 @@ ddev wp scaffold taxonomy genre --post_types=product --plugin=my-plugin
|
|
|
137
110
|
ddev wp scaffold child-theme flavor-child --parent_theme=flavor
|
|
138
111
|
```
|
|
139
112
|
|
|
140
|
-
### Eval
|
|
141
|
-
`ddev wp eval <code>` · `ddev wp eval-file <file>`
|
|
113
|
+
### Eval
|
|
142
114
|
```bash
|
|
143
115
|
ddev wp eval "echo home_url();"
|
|
144
116
|
ddev wp eval "var_dump(wp_get_current_user());"
|
|
145
|
-
ddev wp eval "echo get_option('active_plugins') | print_r;"
|
|
146
117
|
ddev wp eval-file test-script.php
|
|
147
118
|
```
|
|
148
119
|
|
|
149
120
|
## DDEV Project Commands
|
|
150
121
|
|
|
151
122
|
```bash
|
|
152
|
-
# Lifecycle
|
|
153
123
|
ddev start # Start containers
|
|
154
124
|
ddev stop # Stop (preserves database)
|
|
155
125
|
ddev restart # Restart after config changes
|
|
156
|
-
|
|
157
|
-
# Information
|
|
158
126
|
ddev describe # URLs, ports, DB credentials, PHP version
|
|
159
|
-
ddev list # All DDEV projects on
|
|
160
|
-
|
|
161
|
-
# Shell & Exec
|
|
127
|
+
ddev list # All DDEV projects on machine
|
|
162
128
|
ddev ssh # Interactive shell in web container
|
|
163
|
-
ddev exec ls -la # Run
|
|
164
|
-
|
|
165
|
-
# Logs
|
|
129
|
+
ddev exec ls -la # Run command in web container
|
|
166
130
|
ddev logs # Web server logs
|
|
167
|
-
ddev logs -s db # Database
|
|
168
|
-
|
|
169
|
-
# Launch
|
|
131
|
+
ddev logs -s db # Database logs
|
|
170
132
|
ddev launch # Open site in browser
|
|
171
133
|
ddev launch wp-admin/ # Open WP admin
|
|
172
134
|
```
|
|
173
135
|
|
|
174
136
|
## IMA Addon Commands
|
|
175
137
|
|
|
176
|
-
Commands provided by the `ima-ddev-wordpress` addon:
|
|
177
|
-
|
|
178
138
|
```bash
|
|
179
|
-
# First-time bootstrap (idempotent
|
|
180
|
-
ddev
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
ddev import-assets ~/path/to/extracted-archive
|
|
184
|
-
|
|
185
|
-
# Import database dump
|
|
186
|
-
ddev import-db --file=~/path/to/dump.sql
|
|
187
|
-
|
|
188
|
-
# Update the addon
|
|
189
|
-
ddev add-on update ima-ddev-wordpress
|
|
139
|
+
ddev setup # First-time bootstrap (idempotent)
|
|
140
|
+
ddev import-assets ~/path/to/extracted-archive # Import wp-content from WPE archive
|
|
141
|
+
ddev import-db --file=~/path/to/dump.sql # Import database dump
|
|
142
|
+
ddev add-on update ima-ddev-wordpress # Update addon
|
|
190
143
|
```
|
|
191
144
|
|
|
192
145
|
## Supply Chain Security
|
|
193
146
|
|
|
194
|
-
|
|
147
|
+
Use `ddev npm`/`ddev composer` — never bare host commands. Container isolation prevents compromised deps from accessing host SSH keys, env vars, other projects.
|
|
195
148
|
|
|
196
|
-
| Instead of | Use |
|
|
197
|
-
|
|
198
|
-
| `npm install` | `ddev npm install` |
|
|
199
|
-
| `composer install` | `ddev composer install` |
|
|
200
|
-
| `npm run composer:dev` | `ddev npm run composer:dev` |
|
|
149
|
+
| Instead of | Use |
|
|
150
|
+
|---|---|
|
|
151
|
+
| `npm install` | `ddev npm install` |
|
|
152
|
+
| `composer install` | `ddev composer install` |
|
|
153
|
+
| `npm run composer:dev` | `ddev npm run composer:dev` |
|
|
201
154
|
|
|
202
|
-
**Exception
|
|
155
|
+
**Exception**: `npm run deploy` stays on host — needs SSH for WP Engine push.
|
|
203
156
|
|
|
204
157
|
## Global Flags
|
|
205
158
|
|
|
206
|
-
These flags work with most WP-CLI commands:
|
|
207
|
-
|
|
208
159
|
| Flag | Description |
|
|
209
160
|
|---|---|
|
|
210
|
-
| `--format=<format>` |
|
|
211
|
-
| `--fields=<fields>` | Comma-separated columns
|
|
161
|
+
| `--format=<format>` | `table`, `csv`, `json`, `yaml`, `count`, `ids` |
|
|
162
|
+
| `--fields=<fields>` | Comma-separated columns |
|
|
212
163
|
| `--quiet` | Suppress informational messages |
|
|
213
|
-
| `--skip-themes` | Skip loading themes
|
|
214
|
-
| `--skip-plugins` | Skip
|
|
215
|
-
| `--skip-plugins=<plugin>` | Skip
|
|
164
|
+
| `--skip-themes` | Skip loading themes |
|
|
165
|
+
| `--skip-plugins` | Skip all plugins (debug conflicts) |
|
|
166
|
+
| `--skip-plugins=<plugin>` | Skip specific plugin |
|
|
216
167
|
| `--debug` | Show debug output |
|
|
217
|
-
| `--user=<id\|login>` | Run
|
|
218
|
-
|
|
219
|
-
## Finding More Commands
|
|
220
|
-
|
|
221
|
-
The 12 categories above cover ~90% of daily dev usage. For everything else:
|
|
168
|
+
| `--user=<id\|login>` | Run as specific user |
|
|
222
169
|
|
|
223
170
|
```bash
|
|
224
171
|
ddev wp help
|
|
225
172
|
ddev wp help plugin
|
|
226
|
-
ddev wp help post list
|
|
227
173
|
```
|
|
228
174
|
|
|
229
|
-
See [`references/wp-cli-reference.md`](references/wp-cli-reference.md)
|
|
230
|
-
|
|
231
|
-
## Daily Workflow
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
# Start your day
|
|
235
|
-
ddev start
|
|
236
|
-
|
|
237
|
-
# Develop — code changes auto-reflected via bind mounts
|
|
238
|
-
# Test
|
|
239
|
-
ddev wp plugin activate my-plugin
|
|
240
|
-
ddev wp cache flush
|
|
241
|
-
ddev launch
|
|
242
|
-
|
|
243
|
-
# Stop when done
|
|
244
|
-
ddev stop
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
## Integration
|
|
248
|
-
|
|
249
|
-
**With php-fp-wordpress**: Test plugins during development, verify security functions, check database operations.
|
|
250
|
-
|
|
251
|
-
**With js-fp-wordpress**: Test script enqueuing, verify AJAX endpoints, check jQuery availability.
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
# Develop plugin with php-fp-wordpress patterns, test with DDEV
|
|
255
|
-
ddev wp plugin activate my-new-plugin
|
|
256
|
-
ddev wp eval "var_dump(current_user_can('edit_posts'));"
|
|
257
|
-
```
|
|
175
|
+
See [`references/wp-cli-reference.md`](references/wp-cli-reference.md) and [`references/ddev-commands.md`](references/ddev-commands.md).
|
|
258
176
|
|
|
259
177
|
## Quality Gates
|
|
260
178
|
|
|
261
|
-
Before
|
|
262
|
-
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
179
|
+
Before destructive commands:
|
|
180
|
+
- Correct project: `ddev describe`
|
|
181
|
+
- Backup if needed: `ddev export-db --file=backup.sql.gz`
|
|
182
|
+
- Containers running: `ddev start`
|