claude-code-workflow 6.3.9 → 6.3.11

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.
Files changed (91) hide show
  1. package/.claude/CLAUDE.md +1 -1
  2. package/.claude/agents/issue-plan-agent.md +21 -15
  3. package/.claude/agents/issue-queue-agent.md +114 -87
  4. package/.claude/commands/issue/discover.md +427 -0
  5. package/.claude/commands/issue/execute.md +195 -363
  6. package/.claude/commands/issue/new.md +13 -1
  7. package/.claude/commands/issue/plan.md +55 -32
  8. package/.claude/commands/issue/queue.md +145 -71
  9. package/.claude/commands/workflow/init.md +75 -29
  10. package/.claude/commands/workflow/lite-fix.md +8 -0
  11. package/.claude/commands/workflow/lite-plan.md +8 -0
  12. package/.claude/commands/workflow/review-module-cycle.md +4 -0
  13. package/.claude/commands/workflow/review-session-cycle.md +4 -0
  14. package/.claude/commands/workflow/review.md +4 -4
  15. package/.claude/commands/workflow/session/solidify.md +299 -0
  16. package/.claude/commands/workflow/session/start.md +10 -7
  17. package/.claude/commands/workflow/tools/context-gather.md +17 -10
  18. package/.claude/skills/software-manual/SKILL.md +184 -0
  19. package/.claude/skills/software-manual/phases/01-requirements-discovery.md +162 -0
  20. package/.claude/skills/software-manual/phases/02-project-exploration.md +101 -0
  21. package/.claude/skills/software-manual/phases/02.5-api-extraction.md +161 -0
  22. package/.claude/skills/software-manual/phases/03-parallel-analysis.md +183 -0
  23. package/.claude/skills/software-manual/phases/03.5-consolidation.md +82 -0
  24. package/.claude/skills/software-manual/phases/04-screenshot-capture.md +89 -0
  25. package/.claude/skills/software-manual/phases/05-html-assembly.md +132 -0
  26. package/.claude/skills/software-manual/phases/06-iterative-refinement.md +259 -0
  27. package/.claude/skills/software-manual/scripts/api-extractor.md +245 -0
  28. package/.claude/skills/software-manual/scripts/bundle-libraries.md +85 -0
  29. package/.claude/skills/software-manual/scripts/extract_apis.py +270 -0
  30. package/.claude/skills/software-manual/scripts/screenshot-helper.md +447 -0
  31. package/.claude/skills/software-manual/scripts/swagger-runner.md +419 -0
  32. package/.claude/skills/software-manual/scripts/typedoc-runner.md +357 -0
  33. package/.claude/skills/software-manual/specs/html-template.md +325 -0
  34. package/.claude/skills/software-manual/specs/quality-standards.md +253 -0
  35. package/.claude/skills/software-manual/specs/writing-style.md +298 -0
  36. package/.claude/skills/software-manual/templates/css/wiki-base.css +788 -0
  37. package/.claude/skills/software-manual/templates/css/wiki-dark.css +278 -0
  38. package/.claude/skills/software-manual/templates/tiddlywiki-shell.html +327 -0
  39. package/.claude/workflows/cli-templates/schemas/discovery-finding-schema.json +219 -0
  40. package/.claude/workflows/cli-templates/schemas/discovery-state-schema.json +125 -0
  41. package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +168 -74
  42. package/.claude/workflows/cli-templates/schemas/queue-schema.json +225 -108
  43. package/.claude/workflows/cli-templates/schemas/solution-schema.json +6 -28
  44. package/.claude/workflows/context-tools.md +17 -25
  45. package/.codex/AGENTS.md +10 -5
  46. package/.codex/prompts/issue-execute.md +174 -84
  47. package/.codex/prompts/issue-plan.md +106 -0
  48. package/.codex/prompts/issue-queue.md +225 -0
  49. package/ccw/dist/cli.d.ts.map +1 -1
  50. package/ccw/dist/cli.js +1 -0
  51. package/ccw/dist/cli.js.map +1 -1
  52. package/ccw/dist/commands/issue.d.ts.map +1 -1
  53. package/ccw/dist/commands/issue.js +443 -123
  54. package/ccw/dist/commands/issue.js.map +1 -1
  55. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  56. package/ccw/dist/core/dashboard-generator.js +4 -1
  57. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  58. package/ccw/dist/core/data-aggregator.d.ts +32 -0
  59. package/ccw/dist/core/data-aggregator.d.ts.map +1 -1
  60. package/ccw/dist/core/data-aggregator.js +55 -11
  61. package/ccw/dist/core/data-aggregator.js.map +1 -1
  62. package/ccw/dist/core/routes/discovery-routes.d.ts +37 -0
  63. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -0
  64. package/ccw/dist/core/routes/discovery-routes.js +514 -0
  65. package/ccw/dist/core/routes/discovery-routes.js.map +1 -0
  66. package/ccw/dist/core/server.d.ts.map +1 -1
  67. package/ccw/dist/core/server.js +9 -1
  68. package/ccw/dist/core/server.js.map +1 -1
  69. package/ccw/dist/tools/codex-lens.d.ts +12 -1
  70. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  71. package/ccw/dist/tools/codex-lens.js +56 -7
  72. package/ccw/dist/tools/codex-lens.js.map +1 -1
  73. package/ccw/src/cli.ts +1 -0
  74. package/ccw/src/commands/issue.ts +498 -158
  75. package/ccw/src/core/dashboard-generator.ts +4 -1
  76. package/ccw/src/core/data-aggregator.ts +94 -11
  77. package/ccw/src/core/routes/discovery-routes.ts +607 -0
  78. package/ccw/src/core/server.ts +9 -1
  79. package/ccw/src/templates/dashboard-css/34-discovery.css +783 -0
  80. package/ccw/src/templates/dashboard-js/components/cli-status.js +1 -78
  81. package/ccw/src/templates/dashboard-js/components/navigation.js +8 -0
  82. package/ccw/src/templates/dashboard-js/i18n.js +140 -4
  83. package/ccw/src/templates/dashboard-js/views/cli-manager.js +0 -18
  84. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +13 -3
  85. package/ccw/src/templates/dashboard-js/views/issue-discovery.js +730 -0
  86. package/ccw/src/templates/dashboard-js/views/issue-manager.js +57 -26
  87. package/ccw/src/templates/dashboard-js/views/project-overview.js +153 -0
  88. package/ccw/src/templates/dashboard.html +5 -0
  89. package/ccw/src/tools/codex-lens.ts +75 -9
  90. package/package.json +1 -1
  91. package/.claude/workflows/context-tools-ace.md +0 -105
@@ -0,0 +1,253 @@
1
+ # Quality Standards
2
+
3
+ Quality gates and standards for software manual generation.
4
+
5
+ ## Quality Dimensions
6
+
7
+ ### 1. Completeness (25%)
8
+
9
+ All required sections present and adequately covered.
10
+
11
+ | Requirement | Weight | Criteria |
12
+ |-------------|--------|----------|
13
+ | Overview section | 5 | Product intro, features, quick start |
14
+ | UI Guide | 5 | All major screens documented |
15
+ | API Reference | 5 | All public APIs documented |
16
+ | Configuration | 4 | All config options explained |
17
+ | Troubleshooting | 3 | Common issues addressed |
18
+ | Examples | 3 | Multi-level examples provided |
19
+
20
+ **Scoring**:
21
+ - 100%: All sections present with adequate depth
22
+ - 80%: All sections present, some lacking depth
23
+ - 60%: Missing 1-2 sections
24
+ - 40%: Missing 3+ sections
25
+ - 0%: Critical sections missing (overview, UI guide)
26
+
27
+ ### 2. Consistency (25%)
28
+
29
+ Terminology, style, and structure uniform across sections.
30
+
31
+ | Aspect | Check |
32
+ |--------|-------|
33
+ | Terminology | Same term for same concept throughout |
34
+ | Formatting | Consistent heading levels, code block styles |
35
+ | Tone | Consistent formality level |
36
+ | Cross-references | All internal links valid |
37
+ | Screenshot naming | Follow `ss-{feature}-{action}` pattern |
38
+
39
+ **Scoring**:
40
+ - 100%: Zero inconsistencies
41
+ - 80%: 1-3 minor inconsistencies
42
+ - 60%: 4-6 inconsistencies
43
+ - 40%: 7-10 inconsistencies
44
+ - 0%: Pervasive inconsistencies
45
+
46
+ ### 3. Depth (25%)
47
+
48
+ Content provides sufficient detail for target audience.
49
+
50
+ | Level | Criteria |
51
+ |-------|----------|
52
+ | Shallow | Basic descriptions only |
53
+ | Standard | Descriptions + usage examples |
54
+ | Deep | Descriptions + examples + edge cases + best practices |
55
+
56
+ **Per-Section Depth Check**:
57
+ - [ ] Explains "what" (definition)
58
+ - [ ] Explains "why" (rationale)
59
+ - [ ] Explains "how" (procedure)
60
+ - [ ] Provides examples
61
+ - [ ] Covers edge cases
62
+ - [ ] Includes tips/best practices
63
+
64
+ **Scoring**:
65
+ - 100%: Deep coverage on all critical sections
66
+ - 80%: Standard coverage on all sections
67
+ - 60%: Shallow coverage on some sections
68
+ - 40%: Missing depth in critical areas
69
+ - 0%: Superficial throughout
70
+
71
+ ### 4. Readability (25%)
72
+
73
+ Clear, user-friendly writing that's easy to follow.
74
+
75
+ | Metric | Target |
76
+ |--------|--------|
77
+ | Sentence length | Average < 20 words |
78
+ | Paragraph length | Average < 5 sentences |
79
+ | Heading hierarchy | Proper H1 > H2 > H3 nesting |
80
+ | Code blocks | Language specified |
81
+ | Lists | Used for 3+ items |
82
+ | Screenshots | Placed near relevant text |
83
+
84
+ **Structural Elements**:
85
+ - [ ] Clear section headers
86
+ - [ ] Numbered steps for procedures
87
+ - [ ] Bullet lists for options/features
88
+ - [ ] Tables for comparisons
89
+ - [ ] Code blocks with syntax highlighting
90
+ - [ ] Screenshots with captions
91
+
92
+ **Scoring**:
93
+ - 100%: All readability criteria met
94
+ - 80%: Minor structural issues
95
+ - 60%: Some sections hard to follow
96
+ - 40%: Significant readability problems
97
+ - 0%: Unclear, poorly structured
98
+
99
+ ## Overall Quality Score
100
+
101
+ ```
102
+ Overall = (Completeness × 0.25) + (Consistency × 0.25) +
103
+ (Depth × 0.25) + (Readability × 0.25)
104
+ ```
105
+
106
+ **Quality Gates**:
107
+
108
+ | Gate | Threshold | Action |
109
+ |------|-----------|--------|
110
+ | Pass | ≥ 80% | Proceed to HTML generation |
111
+ | Review | 60-79% | Address warnings, proceed with caution |
112
+ | Fail | < 60% | Must address errors before continuing |
113
+
114
+ ## Issue Classification
115
+
116
+ ### Errors (Must Fix)
117
+
118
+ - Missing required sections
119
+ - Invalid cross-references
120
+ - Broken screenshot markers
121
+ - Code blocks without language
122
+ - Incomplete procedures (missing steps)
123
+
124
+ ### Warnings (Should Fix)
125
+
126
+ - Terminology inconsistencies
127
+ - Sections lacking depth
128
+ - Missing examples
129
+ - Long paragraphs (> 7 sentences)
130
+ - Screenshots missing captions
131
+
132
+ ### Info (Nice to Have)
133
+
134
+ - Optimization suggestions
135
+ - Additional example opportunities
136
+ - Alternative explanations
137
+ - Enhancement ideas
138
+
139
+ ## Quality Checklist
140
+
141
+ ### Pre-Generation
142
+
143
+ - [ ] All agents completed successfully
144
+ - [ ] No errors in consolidation report
145
+ - [ ] Overall score ≥ 60%
146
+
147
+ ### Post-Generation
148
+
149
+ - [ ] HTML renders correctly
150
+ - [ ] Search returns relevant results
151
+ - [ ] All screenshots display
152
+ - [ ] Theme toggle works
153
+ - [ ] Print preview looks good
154
+
155
+ ### Final Review
156
+
157
+ - [ ] User previewed and approved
158
+ - [ ] File size reasonable (< 10MB)
159
+ - [ ] No console errors in browser
160
+ - [ ] Accessible (keyboard navigation works)
161
+
162
+ ## Automated Checks
163
+
164
+ ```javascript
165
+ function runQualityChecks(workDir) {
166
+ const results = {
167
+ completeness: checkCompleteness(workDir),
168
+ consistency: checkConsistency(workDir),
169
+ depth: checkDepth(workDir),
170
+ readability: checkReadability(workDir)
171
+ };
172
+
173
+ results.overall = (
174
+ results.completeness * 0.25 +
175
+ results.consistency * 0.25 +
176
+ results.depth * 0.25 +
177
+ results.readability * 0.25
178
+ );
179
+
180
+ return results;
181
+ }
182
+
183
+ function checkCompleteness(workDir) {
184
+ const requiredSections = [
185
+ 'section-overview.md',
186
+ 'section-ui-guide.md',
187
+ 'section-api-reference.md',
188
+ 'section-configuration.md',
189
+ 'section-troubleshooting.md',
190
+ 'section-examples.md'
191
+ ];
192
+
193
+ const existing = Glob(`${workDir}/sections/section-*.md`);
194
+ const found = requiredSections.filter(s =>
195
+ existing.some(e => e.endsWith(s))
196
+ );
197
+
198
+ return (found.length / requiredSections.length) * 100;
199
+ }
200
+
201
+ function checkConsistency(workDir) {
202
+ // Check terminology, cross-references, naming conventions
203
+ const issues = [];
204
+
205
+ // ... implementation ...
206
+
207
+ return Math.max(0, 100 - issues.length * 10);
208
+ }
209
+
210
+ function checkDepth(workDir) {
211
+ // Check content length, examples, edge cases
212
+ const sections = Glob(`${workDir}/sections/section-*.md`);
213
+ let totalScore = 0;
214
+
215
+ for (const section of sections) {
216
+ const content = Read(section);
217
+ let sectionScore = 0;
218
+
219
+ if (content.length > 500) sectionScore += 20;
220
+ if (content.includes('```')) sectionScore += 20;
221
+ if (content.includes('Example')) sectionScore += 20;
222
+ if (content.match(/\d+\./g)?.length > 3) sectionScore += 20;
223
+ if (content.includes('Note:') || content.includes('Tip:')) sectionScore += 20;
224
+
225
+ totalScore += sectionScore;
226
+ }
227
+
228
+ return totalScore / sections.length;
229
+ }
230
+
231
+ function checkReadability(workDir) {
232
+ // Check structure, formatting, organization
233
+ const sections = Glob(`${workDir}/sections/section-*.md`);
234
+ let issues = 0;
235
+
236
+ for (const section of sections) {
237
+ const content = Read(section);
238
+
239
+ // Check heading hierarchy
240
+ if (!content.startsWith('# ')) issues++;
241
+
242
+ // Check code block languages
243
+ const codeBlocks = content.match(/```\w*/g);
244
+ if (codeBlocks?.some(b => b === '```')) issues++;
245
+
246
+ // Check paragraph length
247
+ const paragraphs = content.split('\n\n');
248
+ if (paragraphs.some(p => p.split('. ').length > 7)) issues++;
249
+ }
250
+
251
+ return Math.max(0, 100 - issues * 10);
252
+ }
253
+ ```
@@ -0,0 +1,298 @@
1
+ # Writing Style Guide
2
+
3
+ User-friendly writing standards for software manuals.
4
+
5
+ ## Core Principles
6
+
7
+ ### 1. User-Centered
8
+
9
+ Write for the user, not the developer.
10
+
11
+ **Do**:
12
+ - "Click the **Save** button to save your changes"
13
+ - "Enter your email address in the login form"
14
+
15
+ **Don't**:
16
+ - "The onClick handler triggers the save mutation"
17
+ - "POST to /api/auth/login with email in body"
18
+
19
+ ### 2. Action-Oriented
20
+
21
+ Focus on what users can **do**, not what the system does.
22
+
23
+ **Do**:
24
+ - "You can export your data as CSV"
25
+ - "To create a new project, click **New Project**"
26
+
27
+ **Don't**:
28
+ - "The system exports data in CSV format"
29
+ - "A new project is created when the button is clicked"
30
+
31
+ ### 3. Clear and Direct
32
+
33
+ Use simple, straightforward language.
34
+
35
+ **Do**:
36
+ - "Select a file to upload"
37
+ - "The maximum file size is 10MB"
38
+
39
+ **Don't**:
40
+ - "Utilize the file selection interface to designate a file for uploading"
41
+ - "File size constraints limit uploads to 10 megabytes"
42
+
43
+ ## Tone
44
+
45
+ ### Friendly but Professional
46
+
47
+ - Conversational but not casual
48
+ - Helpful but not condescending
49
+ - Confident but not arrogant
50
+
51
+ **Examples**:
52
+
53
+ | Too Casual | Just Right | Too Formal |
54
+ |------------|------------|------------|
55
+ | "Yo, here's how..." | "Here's how to..." | "The following procedure describes..." |
56
+ | "Easy peasy!" | "That's all you need to do." | "The procedure has been completed." |
57
+ | "Don't worry about it" | "You don't need to change this" | "This parameter does not require modification" |
58
+
59
+ ### Second Person
60
+
61
+ Address the user directly as "you".
62
+
63
+ **Do**: "You can customize your dashboard..."
64
+ **Don't**: "Users can customize their dashboards..."
65
+
66
+ ## Structure
67
+
68
+ ### Headings
69
+
70
+ Use clear, descriptive headings that tell users what they'll learn.
71
+
72
+ **Good Headings**:
73
+ - "Getting Started"
74
+ - "Creating Your First Project"
75
+ - "Configuring Email Notifications"
76
+ - "Troubleshooting Login Issues"
77
+
78
+ **Weak Headings**:
79
+ - "Overview"
80
+ - "Step 1"
81
+ - "Settings"
82
+ - "FAQ"
83
+
84
+ ### Procedures
85
+
86
+ Number steps for sequential tasks.
87
+
88
+ ```markdown
89
+ ## Creating a New User
90
+
91
+ 1. Navigate to **Settings** > **Users**.
92
+ 2. Click the **Add User** button.
93
+ 3. Enter the user's email address.
94
+ 4. Select a role from the dropdown.
95
+ 5. Click **Save**.
96
+
97
+ The new user will receive an invitation email.
98
+ ```
99
+
100
+ ### Features/Options
101
+
102
+ Use bullet lists for non-sequential items.
103
+
104
+ ```markdown
105
+ ## Export Options
106
+
107
+ You can export your data in several formats:
108
+
109
+ - **CSV**: Compatible with spreadsheets
110
+ - **JSON**: Best for developers
111
+ - **PDF**: Ideal for sharing reports
112
+ ```
113
+
114
+ ### Comparisons
115
+
116
+ Use tables for comparing options.
117
+
118
+ ```markdown
119
+ ## Plan Comparison
120
+
121
+ | Feature | Free | Pro | Enterprise |
122
+ |---------|------|-----|------------|
123
+ | Projects | 3 | Unlimited | Unlimited |
124
+ | Storage | 1GB | 10GB | 100GB |
125
+ | Support | Community | Email | Dedicated |
126
+ ```
127
+
128
+ ## Content Types
129
+
130
+ ### Conceptual (What Is)
131
+
132
+ Explain what something is and why it matters.
133
+
134
+ ```markdown
135
+ ## What is a Workspace?
136
+
137
+ A workspace is a container for your projects and team members. Each workspace
138
+ has its own settings, billing, and permissions. You might create separate
139
+ workspaces for different clients or departments.
140
+ ```
141
+
142
+ ### Procedural (How To)
143
+
144
+ Step-by-step instructions for completing a task.
145
+
146
+ ```markdown
147
+ ## How to Create a Workspace
148
+
149
+ 1. Click your profile icon in the top-right corner.
150
+ 2. Select **Create Workspace**.
151
+ 3. Enter a name for your workspace.
152
+ 4. Choose a plan (you can upgrade later).
153
+ 5. Click **Create**.
154
+
155
+ Your new workspace is ready to use.
156
+ ```
157
+
158
+ ### Reference (API/Config)
159
+
160
+ Detailed specifications and parameters.
161
+
162
+ ```markdown
163
+ ## Configuration Options
164
+
165
+ ### `DATABASE_URL`
166
+
167
+ - **Type**: String (required)
168
+ - **Format**: `postgresql://user:password@host:port/database`
169
+ - **Example**: `postgresql://admin:secret@localhost:5432/myapp`
170
+
171
+ Database connection string for PostgreSQL.
172
+ ```
173
+
174
+ ## Formatting
175
+
176
+ ### Bold
177
+
178
+ Use for:
179
+ - UI elements: Click **Save**
180
+ - First use of key terms: **Workspaces** contain projects
181
+ - Emphasis: **Never** share your API key
182
+
183
+ ### Italic
184
+
185
+ Use for:
186
+ - Introducing new terms: A *workspace* is...
187
+ - Placeholders: Replace *your-api-key* with...
188
+ - Emphasis (sparingly): This is *really* important
189
+
190
+ ### Code
191
+
192
+ Use for:
193
+ - Commands: Run `npm install`
194
+ - File paths: Edit `config/settings.json`
195
+ - Environment variables: Set `DATABASE_URL`
196
+ - API endpoints: POST `/api/users`
197
+ - Code references: The `handleSubmit` function
198
+
199
+ ### Code Blocks
200
+
201
+ Always specify the language.
202
+
203
+ ```javascript
204
+ // Example: Fetching user data
205
+ const response = await fetch('/api/user');
206
+ const user = await response.json();
207
+ ```
208
+
209
+ ### Notes and Warnings
210
+
211
+ Use for important callouts.
212
+
213
+ ```markdown
214
+ > **Note**: This feature requires a Pro plan.
215
+
216
+ > **Warning**: Deleting a workspace cannot be undone.
217
+
218
+ > **Tip**: Use keyboard shortcuts to work faster.
219
+ ```
220
+
221
+ ## Screenshots
222
+
223
+ ### When to Include
224
+
225
+ - First time showing a UI element
226
+ - Complex interfaces
227
+ - Before/after comparisons
228
+ - Error states
229
+
230
+ ### Guidelines
231
+
232
+ - Capture just the relevant area
233
+ - Use consistent dimensions
234
+ - Highlight important elements
235
+ - Add descriptive captions
236
+
237
+ ```markdown
238
+ <!-- SCREENSHOT: id="ss-dashboard" description="Main dashboard showing project list" -->
239
+
240
+ *The dashboard displays all your projects with their status.*
241
+ ```
242
+
243
+ ## Examples
244
+
245
+ ### Good Section Example
246
+
247
+ ```markdown
248
+ ## Inviting Team Members
249
+
250
+ You can invite colleagues to collaborate on your projects.
251
+
252
+ ### To invite a team member:
253
+
254
+ 1. Open **Settings** > **Team**.
255
+ 2. Click **Invite Member**.
256
+ 3. Enter their email address.
257
+ 4. Select their role:
258
+ - **Admin**: Full access to all settings
259
+ - **Editor**: Can edit projects
260
+ - **Viewer**: Read-only access
261
+ 5. Click **Send Invite**.
262
+
263
+ The person will receive an email with a link to join your workspace.
264
+
265
+ > **Note**: You can have up to 5 team members on the Free plan.
266
+
267
+ <!-- SCREENSHOT: id="ss-invite-team" description="Team invitation dialog" -->
268
+ ```
269
+
270
+ ## Language Guidelines
271
+
272
+ ### Avoid Jargon
273
+
274
+ | Technical | User-Friendly |
275
+ |-----------|---------------|
276
+ | Execute | Run |
277
+ | Terminate | Stop, End |
278
+ | Instantiate | Create |
279
+ | Invoke | Call, Use |
280
+ | Parameterize | Set, Configure |
281
+ | Persist | Save |
282
+
283
+ ### Be Specific
284
+
285
+ | Vague | Specific |
286
+ |-------|----------|
287
+ | "Click the button" | "Click **Save**" |
288
+ | "Enter information" | "Enter your email address" |
289
+ | "An error occurred" | "Your password must be at least 8 characters" |
290
+ | "It takes a moment" | "This typically takes 2-3 seconds" |
291
+
292
+ ### Use Active Voice
293
+
294
+ | Passive | Active |
295
+ |---------|--------|
296
+ | "The file is uploaded" | "Upload the file" |
297
+ | "Settings are saved" | "Click **Save** to keep your changes" |
298
+ | "Errors are displayed" | "The form shows any errors" |