get-shit-done-cc 1.10.0-experimental.0 → 1.10.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 +16 -17
- package/agents/gsd-executor.md +375 -37
- package/agents/gsd-planner.md +108 -15
- package/bin/install.js +163 -238
- package/commands/gsd/help.md +0 -43
- package/commands/gsd/new-project.md +8 -94
- package/commands/gsd/plan-phase.md +5 -35
- package/get-shit-done/references/verification-patterns.md +1 -1
- package/get-shit-done/templates/phase-prompt.md +4 -4
- package/get-shit-done/templates/state.md +0 -37
- package/get-shit-done/workflows/execute-phase.md +1 -44
- package/get-shit-done/workflows/execute-plan.md +856 -34
- package/hooks/dist/gsd-statusline.js +9 -6
- package/package.json +7 -10
- package/agents/design-specialist.md +0 -222
- package/commands/gsd/autopilot.md +0 -518
- package/commands/gsd/checkpoints.md +0 -229
- package/commands/gsd/design-system.md +0 -70
- package/commands/gsd/discuss-design.md +0 -77
- package/commands/gsd/extend.md +0 -80
- package/get-shit-done/references/ccr-integration.md +0 -468
- package/get-shit-done/references/checkpoint-execution.md +0 -369
- package/get-shit-done/references/checkpoint-types.md +0 -728
- package/get-shit-done/references/deviation-rules.md +0 -215
- package/get-shit-done/references/framework-patterns.md +0 -543
- package/get-shit-done/references/ui-principles.md +0 -258
- package/get-shit-done/skills/gsd-extend/SKILL.md +0 -154
- package/get-shit-done/skills/gsd-extend/references/agent-structure.md +0 -305
- package/get-shit-done/skills/gsd-extend/references/extension-anatomy.md +0 -123
- package/get-shit-done/skills/gsd-extend/references/reference-structure.md +0 -408
- package/get-shit-done/skills/gsd-extend/references/template-structure.md +0 -370
- package/get-shit-done/skills/gsd-extend/references/validation-rules.md +0 -140
- package/get-shit-done/skills/gsd-extend/references/workflow-structure.md +0 -253
- package/get-shit-done/skills/gsd-extend/templates/agent-template.md +0 -234
- package/get-shit-done/skills/gsd-extend/templates/reference-template.md +0 -239
- package/get-shit-done/skills/gsd-extend/templates/workflow-template.md +0 -169
- package/get-shit-done/skills/gsd-extend/workflows/create-approach.md +0 -332
- package/get-shit-done/skills/gsd-extend/workflows/list-extensions.md +0 -133
- package/get-shit-done/skills/gsd-extend/workflows/remove-extension.md +0 -93
- package/get-shit-done/skills/gsd-extend/workflows/validate-extension.md +0 -184
- package/get-shit-done/templates/autopilot-script-simple.sh +0 -181
- package/get-shit-done/templates/autopilot-script.sh +0 -1142
- package/get-shit-done/templates/autopilot-script.sh.backup +0 -1142
- package/get-shit-done/templates/design-system.md +0 -238
- package/get-shit-done/templates/phase-design.md +0 -205
- package/get-shit-done/templates/phase-models-template.json +0 -71
- package/get-shit-done/tui/App.tsx +0 -169
- package/get-shit-done/tui/README.md +0 -107
- package/get-shit-done/tui/build.js +0 -37
- package/get-shit-done/tui/components/ActivityFeed.tsx +0 -126
- package/get-shit-done/tui/components/PhaseCard.tsx +0 -86
- package/get-shit-done/tui/components/StatsBar.tsx +0 -147
- package/get-shit-done/tui/dist/index.js +0 -387
- package/get-shit-done/tui/index.tsx +0 -12
- package/get-shit-done/tui/package-lock.json +0 -1074
- package/get-shit-done/tui/package.json +0 -22
- package/get-shit-done/tui/utils/pipeReader.ts +0 -129
- package/get-shit-done/workflows/design-system.md +0 -245
- package/get-shit-done/workflows/discuss-design.md +0 -330
- package/get-shit-done/workflows/execute-plan-auth.md +0 -122
- package/get-shit-done/workflows/execute-plan-checkpoints.md +0 -541
|
@@ -1,370 +0,0 @@
|
|
|
1
|
-
<template_structure>
|
|
2
|
-
|
|
3
|
-
## Template Extensions
|
|
4
|
-
|
|
5
|
-
Templates define consistent output structures for artifacts. They're used by workflows and agents to produce standardized documents.
|
|
6
|
-
|
|
7
|
-
## Required Frontmatter
|
|
8
|
-
|
|
9
|
-
```yaml
|
|
10
|
-
---
|
|
11
|
-
name: template-name
|
|
12
|
-
description: What this template produces
|
|
13
|
-
used_by:
|
|
14
|
-
- workflow-name # Workflows that use this template
|
|
15
|
-
- agent-name # Agents that use this template
|
|
16
|
-
placeholders:
|
|
17
|
-
- name # List of placeholders in template
|
|
18
|
-
- description # Helps users understand what to provide
|
|
19
|
-
- date
|
|
20
|
-
---
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Template Body Structure
|
|
24
|
-
|
|
25
|
-
```xml
|
|
26
|
-
<template>
|
|
27
|
-
|
|
28
|
-
# {title}
|
|
29
|
-
|
|
30
|
-
**Created:** {date}
|
|
31
|
-
**Author:** {author}
|
|
32
|
-
|
|
33
|
-
## Section One
|
|
34
|
-
|
|
35
|
-
{section_one_content}
|
|
36
|
-
|
|
37
|
-
## Section Two
|
|
38
|
-
|
|
39
|
-
| Column A | Column B |
|
|
40
|
-
|----------|----------|
|
|
41
|
-
| {row1_a} | {row1_b} |
|
|
42
|
-
| {row2_a} | {row2_b} |
|
|
43
|
-
|
|
44
|
-
## Section Three
|
|
45
|
-
|
|
46
|
-
{section_three_content}
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
*Generated by GSD*
|
|
50
|
-
|
|
51
|
-
</template>
|
|
52
|
-
|
|
53
|
-
<guidelines>
|
|
54
|
-
|
|
55
|
-
## How to Fill This Template
|
|
56
|
-
|
|
57
|
-
**{title}:** Short descriptive title
|
|
58
|
-
|
|
59
|
-
**{date}:** ISO format (YYYY-MM-DD)
|
|
60
|
-
|
|
61
|
-
**{section_one_content}:**
|
|
62
|
-
- Include X, Y, Z
|
|
63
|
-
- Format as bullets or prose
|
|
64
|
-
- Length: 2-5 sentences
|
|
65
|
-
|
|
66
|
-
...
|
|
67
|
-
|
|
68
|
-
</guidelines>
|
|
69
|
-
|
|
70
|
-
<examples>
|
|
71
|
-
|
|
72
|
-
## Good Example
|
|
73
|
-
|
|
74
|
-
```markdown
|
|
75
|
-
# Authentication Implementation
|
|
76
|
-
|
|
77
|
-
**Created:** 2025-01-26
|
|
78
|
-
**Author:** Claude
|
|
79
|
-
|
|
80
|
-
## Overview
|
|
81
|
-
|
|
82
|
-
JWT-based authentication with refresh token rotation...
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## Bad Example
|
|
86
|
-
|
|
87
|
-
```markdown
|
|
88
|
-
# Auth
|
|
89
|
-
|
|
90
|
-
**Created:** today
|
|
91
|
-
|
|
92
|
-
## Overview
|
|
93
|
-
|
|
94
|
-
Did auth stuff.
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
The bad example is too vague and doesn't follow formatting guidelines.
|
|
98
|
-
|
|
99
|
-
</examples>
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Placeholder Syntax
|
|
103
|
-
|
|
104
|
-
Templates use curly braces for placeholders:
|
|
105
|
-
|
|
106
|
-
```
|
|
107
|
-
{placeholder_name}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Placeholders can have defaults:
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
{placeholder_name|default_value}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
Placeholders can be conditional:
|
|
117
|
-
|
|
118
|
-
```
|
|
119
|
-
{?optional_section}
|
|
120
|
-
Content that only appears if optional_section is provided.
|
|
121
|
-
{/optional_section}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## Template Usage
|
|
125
|
-
|
|
126
|
-
Templates are used via @-reference:
|
|
127
|
-
|
|
128
|
-
```xml
|
|
129
|
-
<output>
|
|
130
|
-
Create `.planning/phases/XX-name/{phase}-{plan}-SUMMARY.md`
|
|
131
|
-
Use template: @~/.claude/gsd-extensions/templates/my-summary.md
|
|
132
|
-
</output>
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
The executor:
|
|
136
|
-
1. Loads template
|
|
137
|
-
2. Fills placeholders with actual values
|
|
138
|
-
3. Writes resulting document
|
|
139
|
-
|
|
140
|
-
## Example: API Documentation Template
|
|
141
|
-
|
|
142
|
-
```yaml
|
|
143
|
-
---
|
|
144
|
-
name: api-endpoint-doc
|
|
145
|
-
description: Documentation template for API endpoints
|
|
146
|
-
used_by:
|
|
147
|
-
- execute-plan
|
|
148
|
-
placeholders:
|
|
149
|
-
- endpoint_path
|
|
150
|
-
- method
|
|
151
|
-
- description
|
|
152
|
-
- request_body
|
|
153
|
-
- response_body
|
|
154
|
-
- error_codes
|
|
155
|
-
---
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
```xml
|
|
159
|
-
<template>
|
|
160
|
-
|
|
161
|
-
# {method} {endpoint_path}
|
|
162
|
-
|
|
163
|
-
{description}
|
|
164
|
-
|
|
165
|
-
## Request
|
|
166
|
-
|
|
167
|
-
**Method:** {method}
|
|
168
|
-
**Path:** {endpoint_path}
|
|
169
|
-
**Authentication:** {auth_required|Required}
|
|
170
|
-
|
|
171
|
-
### Headers
|
|
172
|
-
|
|
173
|
-
| Header | Required | Description |
|
|
174
|
-
|--------|----------|-------------|
|
|
175
|
-
| Authorization | {auth_required|Yes} | Bearer token |
|
|
176
|
-
| Content-Type | Yes | application/json |
|
|
177
|
-
|
|
178
|
-
### Body
|
|
179
|
-
|
|
180
|
-
```json
|
|
181
|
-
{request_body}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### Parameters
|
|
185
|
-
|
|
186
|
-
{?path_params}
|
|
187
|
-
**Path Parameters:**
|
|
188
|
-
|
|
189
|
-
| Parameter | Type | Description |
|
|
190
|
-
|-----------|------|-------------|
|
|
191
|
-
{path_params}
|
|
192
|
-
{/path_params}
|
|
193
|
-
|
|
194
|
-
{?query_params}
|
|
195
|
-
**Query Parameters:**
|
|
196
|
-
|
|
197
|
-
| Parameter | Type | Required | Description |
|
|
198
|
-
|-----------|------|----------|-------------|
|
|
199
|
-
{query_params}
|
|
200
|
-
{/query_params}
|
|
201
|
-
|
|
202
|
-
## Response
|
|
203
|
-
|
|
204
|
-
### Success (200)
|
|
205
|
-
|
|
206
|
-
```json
|
|
207
|
-
{response_body}
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### Errors
|
|
211
|
-
|
|
212
|
-
| Code | Description |
|
|
213
|
-
|------|-------------|
|
|
214
|
-
{error_codes}
|
|
215
|
-
|
|
216
|
-
## Example
|
|
217
|
-
|
|
218
|
-
### Request
|
|
219
|
-
|
|
220
|
-
```bash
|
|
221
|
-
curl -X {method} \
|
|
222
|
-
-H "Authorization: Bearer $TOKEN" \
|
|
223
|
-
-H "Content-Type: application/json" \
|
|
224
|
-
-d '{request_body}' \
|
|
225
|
-
https://api.example.com{endpoint_path}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### Response
|
|
229
|
-
|
|
230
|
-
```json
|
|
231
|
-
{response_body}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
</template>
|
|
235
|
-
|
|
236
|
-
<guidelines>
|
|
237
|
-
|
|
238
|
-
## Filling This Template
|
|
239
|
-
|
|
240
|
-
**{endpoint_path}:** Full path including parameters (e.g., `/api/users/:id`)
|
|
241
|
-
|
|
242
|
-
**{method}:** HTTP method (GET, POST, PUT, PATCH, DELETE)
|
|
243
|
-
|
|
244
|
-
**{description}:** 1-2 sentences describing what the endpoint does
|
|
245
|
-
|
|
246
|
-
**{request_body}:** JSON example of request body (or "N/A" for GET)
|
|
247
|
-
|
|
248
|
-
**{response_body}:** JSON example of successful response
|
|
249
|
-
|
|
250
|
-
**{error_codes}:** Table rows of error codes and descriptions
|
|
251
|
-
|
|
252
|
-
</guidelines>
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
## Example: Phase Summary Template (Override)
|
|
256
|
-
|
|
257
|
-
Override the built-in summary template:
|
|
258
|
-
|
|
259
|
-
```yaml
|
|
260
|
-
---
|
|
261
|
-
name: summary
|
|
262
|
-
description: Custom phase summary format for this project
|
|
263
|
-
used_by:
|
|
264
|
-
- execute-plan
|
|
265
|
-
placeholders:
|
|
266
|
-
- phase
|
|
267
|
-
- plan
|
|
268
|
-
- objective
|
|
269
|
-
- accomplishments
|
|
270
|
-
- decisions
|
|
271
|
-
- next_steps
|
|
272
|
-
---
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
```xml
|
|
276
|
-
<template>
|
|
277
|
-
|
|
278
|
-
---
|
|
279
|
-
phase: {phase}
|
|
280
|
-
plan: {plan}
|
|
281
|
-
completed: {date}
|
|
282
|
-
duration: {duration}
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
# Phase {phase} Plan {plan}: {title}
|
|
286
|
-
|
|
287
|
-
> {one_liner}
|
|
288
|
-
|
|
289
|
-
## What We Built
|
|
290
|
-
|
|
291
|
-
{accomplishments}
|
|
292
|
-
|
|
293
|
-
## Technical Decisions
|
|
294
|
-
|
|
295
|
-
| Decision | Why | Impact |
|
|
296
|
-
|----------|-----|--------|
|
|
297
|
-
{decisions}
|
|
298
|
-
|
|
299
|
-
## Files Changed
|
|
300
|
-
|
|
301
|
-
**Created:**
|
|
302
|
-
{files_created}
|
|
303
|
-
|
|
304
|
-
**Modified:**
|
|
305
|
-
{files_modified}
|
|
306
|
-
|
|
307
|
-
## What's Next
|
|
308
|
-
|
|
309
|
-
{next_steps}
|
|
310
|
-
|
|
311
|
-
## Verification
|
|
312
|
-
|
|
313
|
-
- [x] All tasks complete
|
|
314
|
-
- [x] Tests pass
|
|
315
|
-
- [x] Code reviewed
|
|
316
|
-
|
|
317
|
-
---
|
|
318
|
-
*Plan completed {date}*
|
|
319
|
-
|
|
320
|
-
</template>
|
|
321
|
-
|
|
322
|
-
<guidelines>
|
|
323
|
-
|
|
324
|
-
## Filling This Template
|
|
325
|
-
|
|
326
|
-
**{one_liner}:** Substantive summary (not "Authentication implemented")
|
|
327
|
-
- Good: "JWT auth with refresh rotation using jose library"
|
|
328
|
-
- Bad: "Did auth"
|
|
329
|
-
|
|
330
|
-
**{accomplishments}:** Bullet list of what was actually built
|
|
331
|
-
- Be specific about functionality
|
|
332
|
-
- Include relevant technical details
|
|
333
|
-
|
|
334
|
-
**{decisions}:** Table of architectural/technical decisions made
|
|
335
|
-
- Include WHY, not just WHAT
|
|
336
|
-
- Note impact on future work
|
|
337
|
-
|
|
338
|
-
</guidelines>
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
## Template Best Practices
|
|
342
|
-
|
|
343
|
-
**1. Clear placeholders**
|
|
344
|
-
Name placeholders descriptively. `{user_name}` not `{x}`.
|
|
345
|
-
|
|
346
|
-
**2. Include guidelines**
|
|
347
|
-
Template users need to know what goes in each placeholder.
|
|
348
|
-
|
|
349
|
-
**3. Provide examples**
|
|
350
|
-
Show good vs bad filled templates.
|
|
351
|
-
|
|
352
|
-
**4. Use conditional sections**
|
|
353
|
-
Templates should handle optional content gracefully.
|
|
354
|
-
|
|
355
|
-
**5. Match existing patterns**
|
|
356
|
-
If extending built-in templates, maintain similar structure.
|
|
357
|
-
|
|
358
|
-
**6. Document usage**
|
|
359
|
-
Note which workflows/agents use this template.
|
|
360
|
-
|
|
361
|
-
## Template Discovery
|
|
362
|
-
|
|
363
|
-
GSD discovers templates by:
|
|
364
|
-
|
|
365
|
-
1. Checking `@` references in workflow/agent files
|
|
366
|
-
2. Scanning template directories for matches
|
|
367
|
-
|
|
368
|
-
Templates are NOT auto-loaded. They must be explicitly referenced.
|
|
369
|
-
|
|
370
|
-
</template_structure>
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
<validation_rules>
|
|
2
|
-
|
|
3
|
-
## Extension Validation
|
|
4
|
-
|
|
5
|
-
All extensions are validated before activation. Invalid extensions are skipped with warning.
|
|
6
|
-
|
|
7
|
-
## Common Validation Rules
|
|
8
|
-
|
|
9
|
-
**1. YAML Frontmatter**
|
|
10
|
-
|
|
11
|
-
Must be valid YAML between `---` markers:
|
|
12
|
-
```yaml
|
|
13
|
-
---
|
|
14
|
-
name: kebab-case-name
|
|
15
|
-
description: One sentence description
|
|
16
|
-
# type-specific fields...
|
|
17
|
-
---
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
**2. Required Fields by Type**
|
|
21
|
-
|
|
22
|
-
| Type | Required Fields |
|
|
23
|
-
|------|-----------------|
|
|
24
|
-
| Workflow | name, description, triggers |
|
|
25
|
-
| Agent | name, description, tools, spawn_from |
|
|
26
|
-
| Reference | name, description, load_when |
|
|
27
|
-
| Template | name, description, used_by |
|
|
28
|
-
|
|
29
|
-
**3. Name Validation**
|
|
30
|
-
|
|
31
|
-
- Must be kebab-case: `my-extension-name`
|
|
32
|
-
- Must match filename (without .md)
|
|
33
|
-
- No spaces or special characters
|
|
34
|
-
- 3-50 characters
|
|
35
|
-
|
|
36
|
-
**4. XML Structure**
|
|
37
|
-
|
|
38
|
-
If extension uses XML tags:
|
|
39
|
-
- Tags must be properly closed
|
|
40
|
-
- Nesting must be balanced
|
|
41
|
-
- No malformed tags
|
|
42
|
-
|
|
43
|
-
## Type-Specific Validation
|
|
44
|
-
|
|
45
|
-
### Workflows
|
|
46
|
-
|
|
47
|
-
```yaml
|
|
48
|
-
triggers:
|
|
49
|
-
- plan-phase # valid
|
|
50
|
-
- execute-plan # valid
|
|
51
|
-
- execute-phase # valid
|
|
52
|
-
- verify-phase # valid
|
|
53
|
-
- custom # valid
|
|
54
|
-
- invalid-trigger # INVALID
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**Must have:**
|
|
58
|
-
- At least one valid trigger
|
|
59
|
-
- `<process>` section with `<step>` elements
|
|
60
|
-
- `<success_criteria>` section
|
|
61
|
-
|
|
62
|
-
### Agents
|
|
63
|
-
|
|
64
|
-
```yaml
|
|
65
|
-
tools:
|
|
66
|
-
- Read # valid
|
|
67
|
-
- Write # valid
|
|
68
|
-
- Edit # valid
|
|
69
|
-
- Bash # valid
|
|
70
|
-
- Grep # valid
|
|
71
|
-
- Glob # valid
|
|
72
|
-
- WebFetch # valid
|
|
73
|
-
- WebSearch # valid
|
|
74
|
-
- mcp__context7__* # valid (MCP tools)
|
|
75
|
-
- InvalidTool # INVALID
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Must have:**
|
|
79
|
-
- At least one valid tool
|
|
80
|
-
- `<role>` section
|
|
81
|
-
- `<output_format>` section
|
|
82
|
-
|
|
83
|
-
### References
|
|
84
|
-
|
|
85
|
-
```yaml
|
|
86
|
-
load_when:
|
|
87
|
-
- keyword # valid - loads when keyword appears
|
|
88
|
-
- "*-auth-*" # valid - glob pattern
|
|
89
|
-
- always # valid - always loads (use sparingly)
|
|
90
|
-
- "" # INVALID - empty keyword
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**Must have:**
|
|
94
|
-
- At least one load_when keyword
|
|
95
|
-
- Content body (not empty)
|
|
96
|
-
|
|
97
|
-
### Templates
|
|
98
|
-
|
|
99
|
-
```yaml
|
|
100
|
-
used_by:
|
|
101
|
-
- workflow-name # should reference real workflow
|
|
102
|
-
- agent-name # should reference real agent
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
**Must have:**
|
|
106
|
-
- `<template>` section with actual template content
|
|
107
|
-
- `<guidelines>` section explaining placeholders
|
|
108
|
-
|
|
109
|
-
## Validation Commands
|
|
110
|
-
|
|
111
|
-
```bash
|
|
112
|
-
# Validate a single extension
|
|
113
|
-
/gsd:extend validate {path}
|
|
114
|
-
|
|
115
|
-
# Validate all extensions
|
|
116
|
-
/gsd:extend validate --all
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Error Messages
|
|
120
|
-
|
|
121
|
-
| Error | Cause | Fix |
|
|
122
|
-
|-------|-------|-----|
|
|
123
|
-
| "Invalid YAML frontmatter" | Malformed YAML | Check indentation and syntax |
|
|
124
|
-
| "Missing required field: {field}" | Field not present | Add the required field |
|
|
125
|
-
| "Invalid trigger: {trigger}" | Unknown trigger name | Use valid trigger name |
|
|
126
|
-
| "Invalid tool: {tool}" | Unknown tool name | Use valid tool name |
|
|
127
|
-
| "Unbalanced XML tags" | Missing closing tag | Close all opened tags |
|
|
128
|
-
| "Name doesn't match filename" | name: foo but file is bar.md | Make them match |
|
|
129
|
-
|
|
130
|
-
## Self-Validation
|
|
131
|
-
|
|
132
|
-
Extensions should self-validate by:
|
|
133
|
-
|
|
134
|
-
1. Including comprehensive examples
|
|
135
|
-
2. Testing with real usage
|
|
136
|
-
3. Documenting edge cases
|
|
137
|
-
|
|
138
|
-
Good extension authors test their extensions before sharing.
|
|
139
|
-
|
|
140
|
-
</validation_rules>
|