bmad-module-skill-forge 0.8.4 → 0.9.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 +5 -3
- package/docs/bmad-synergy.md +183 -0
- package/docs/concepts.md +30 -2
- package/docs/examples.md +57 -17
- package/docs/getting-started.md +17 -0
- package/docs/how-it-works.md +143 -29
- package/docs/index.md +1 -1
- package/docs/workflows.md +43 -5
- package/package.json +1 -1
- package/src/README.md +47 -0
- package/src/agents/forger.agent.yaml +8 -0
- package/src/knowledge/agentskills-spec.md +3 -0
- package/src/knowledge/overview.md +1 -0
- package/src/knowledge/provenance-tracking.md +3 -0
- package/src/knowledge/skf-knowledge-index.csv +1 -0
- package/src/knowledge/skill-lifecycle.md +19 -7
- package/src/knowledge/version-paths.md +243 -0
- package/src/module-help.csv +2 -0
- package/src/workflows/README.md +9 -1
- package/src/workflows/analyze-source/data/skill-brief-schema.md +4 -0
- package/src/workflows/audit-skill/steps-c/step-01-init.md +10 -6
- package/src/workflows/audit-skill/steps-c/step-02-re-index.md +1 -1
- package/src/workflows/audit-skill/steps-c/step-03-structural-diff.md +1 -1
- package/src/workflows/audit-skill/steps-c/step-04-semantic-diff.md +1 -1
- package/src/workflows/audit-skill/steps-c/step-05-severity-classify.md +1 -1
- package/src/workflows/audit-skill/steps-c/step-06-report.md +1 -1
- package/src/workflows/brief-skill/data/skill-brief-schema.md +11 -0
- package/src/workflows/brief-skill/steps-c/step-01-gather-intent.md +24 -1
- package/src/workflows/brief-skill/steps-c/step-02-analyze-target.md +10 -0
- package/src/workflows/brief-skill/steps-c/step-04-confirm-brief.md +9 -0
- package/src/workflows/brief-skill/steps-c/step-05-write-brief.md +14 -1
- package/src/workflows/create-skill/data/skill-sections.md +2 -0
- package/src/workflows/create-skill/data/source-resolution-protocols.md +40 -4
- package/src/workflows/create-skill/steps-c/step-03-extract.md +1 -1
- package/src/workflows/create-skill/steps-c/step-05-compile.md +1 -0
- package/src/workflows/create-skill/steps-c/step-07-generate-artifacts.md +48 -32
- package/src/workflows/create-skill/steps-c/step-08-report.md +8 -7
- package/src/workflows/create-stack-skill/data/compose-mode-rules.md +12 -6
- package/src/workflows/create-stack-skill/steps-c/step-01-init.md +4 -1
- package/src/workflows/create-stack-skill/steps-c/step-02-detect-manifests.md +11 -5
- package/src/workflows/create-stack-skill/steps-c/step-04-parallel-extract.md +1 -1
- package/src/workflows/create-stack-skill/steps-c/step-05-detect-integrations.md +1 -1
- package/src/workflows/create-stack-skill/steps-c/step-07-generate-output.md +40 -23
- package/src/workflows/create-stack-skill/steps-c/step-08-validate.md +6 -3
- package/src/workflows/create-stack-skill/steps-c/step-09-report.md +5 -3
- package/src/workflows/drop-skill/steps-c/step-01-select.md +298 -0
- package/src/workflows/drop-skill/steps-c/step-02-execute.md +290 -0
- package/src/workflows/drop-skill/steps-c/step-03-report.md +135 -0
- package/src/workflows/drop-skill/workflow.md +63 -0
- package/src/workflows/export-skill/data/managed-section-format.md +33 -8
- package/src/workflows/export-skill/data/snippet-format.md +16 -4
- package/src/workflows/export-skill/steps-c/step-01-load-skill.md +46 -7
- package/src/workflows/export-skill/steps-c/step-02-package.md +2 -2
- package/src/workflows/export-skill/steps-c/step-03-generate-snippet.md +39 -7
- package/src/workflows/export-skill/steps-c/step-04-update-context.md +185 -13
- package/src/workflows/export-skill/steps-c/step-05-token-report.md +2 -2
- package/src/workflows/export-skill/steps-c/step-06-summary.md +26 -7
- package/src/workflows/quick-skill/steps-c/step-01-resolve-target.md +10 -0
- package/src/workflows/quick-skill/steps-c/step-03-quick-extract.md +2 -0
- package/src/workflows/quick-skill/steps-c/step-05-validate.md +1 -1
- package/src/workflows/quick-skill/steps-c/step-06-write.md +30 -14
- package/src/workflows/refine-architecture/steps-c/step-01-init.md +8 -3
- package/src/workflows/rename-skill/steps-c/step-01-select.md +281 -0
- package/src/workflows/rename-skill/steps-c/step-02-execute.md +391 -0
- package/src/workflows/rename-skill/steps-c/step-03-report.md +132 -0
- package/src/workflows/rename-skill/workflow.md +64 -0
- package/src/workflows/test-skill/steps-c/step-01-init.md +14 -6
- package/src/workflows/test-skill/steps-c/step-02-detect-mode.md +1 -1
- package/src/workflows/update-skill/data/remote-source-resolution.md +18 -4
- package/src/workflows/update-skill/steps-c/step-01-init.md +15 -8
- package/src/workflows/update-skill/steps-c/step-06-write.md +43 -13
- package/src/workflows/update-skill/steps-c/step-07-report.md +7 -5
- package/src/workflows/verify-stack/steps-c/step-01-init.md +8 -3
- package/tools/cli/lib/ui.js +24 -2
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'step-01-select'
|
|
3
|
+
description: 'Select skill to rename and validate the new name'
|
|
4
|
+
nextStepFile: './step-02-execute.md'
|
|
5
|
+
versionPathsKnowledge: '../../../knowledge/version-paths.md'
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Step 1: Select Rename Target
|
|
9
|
+
|
|
10
|
+
## STEP GOAL:
|
|
11
|
+
|
|
12
|
+
Identify the skill the user wants to rename, validate the new name against the agentskills.io spec (kebab-case, length, uniqueness), warn about source authority implications, enumerate every version that will be touched, and obtain explicit user confirmation before any filesystem operation is scheduled. Every selection decision is stored in context so step-02 can execute the rename transactionally.
|
|
13
|
+
|
|
14
|
+
## MANDATORY EXECUTION RULES (READ FIRST):
|
|
15
|
+
|
|
16
|
+
### Universal Rules:
|
|
17
|
+
|
|
18
|
+
- 🛑 NEVER schedule a rename without explicit user confirmation
|
|
19
|
+
- 🛑 NEVER accept a new name that collides with an existing skill
|
|
20
|
+
- 📖 CRITICAL: Read the complete step file before taking any action
|
|
21
|
+
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
|
|
22
|
+
- 📋 YOU ARE A FACILITATOR, not a content generator
|
|
23
|
+
- ⚙️ TOOL/SUBPROCESS FALLBACK: If any instruction references a subprocess, subagent, or tool you do not have access to, you MUST still achieve the outcome in your main context thread
|
|
24
|
+
- ✅ YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`
|
|
25
|
+
|
|
26
|
+
### Role Reinforcement:
|
|
27
|
+
|
|
28
|
+
- ✅ You are Ferris in Management mode — a precision surgeon for transactional renames
|
|
29
|
+
- ✅ You validate the new name against agentskills.io spec constraints before anything moves
|
|
30
|
+
- ✅ You enumerate the full blast radius (every affected version and directory) before asking for confirmation
|
|
31
|
+
- ✅ Safety via copy-before-delete — the old skill is untouched until step-02 finishes verification
|
|
32
|
+
|
|
33
|
+
### Step-Specific Rules:
|
|
34
|
+
|
|
35
|
+
- 🎯 Focus only on selection, validation, and confirmation
|
|
36
|
+
- 🚫 FORBIDDEN to proceed without explicit user confirmation at the final gate
|
|
37
|
+
- 🚫 FORBIDDEN to modify the manifest, copy, or delete any files in this step — execution happens in step-02
|
|
38
|
+
- 🚫 FORBIDDEN to accept a new name that fails validation (kebab-case, length, uniqueness)
|
|
39
|
+
- 💬 Present the list of affected versions clearly so the user understands the scope before committing
|
|
40
|
+
|
|
41
|
+
## EXECUTION PROTOCOLS:
|
|
42
|
+
|
|
43
|
+
- 🎯 Load version-paths knowledge and the export manifest (if present) alongside an on-disk skill scan
|
|
44
|
+
- 💾 Gather all selection decisions into context for step-02
|
|
45
|
+
- 📖 Show the full list of affected versions and the resolved paths clearly
|
|
46
|
+
- 🚫 Halt only if neither the manifest nor an on-disk scan yields any skill — rename must still work for draft skills that were never exported, so a missing or empty manifest is not fatal
|
|
47
|
+
|
|
48
|
+
## CONTEXT BOUNDARIES:
|
|
49
|
+
|
|
50
|
+
- Available: Export manifest v2, SKF module config variables, on-disk skill directory listing, version-paths knowledge (Rename section)
|
|
51
|
+
- Focus: Selection, validation, and user confirmation
|
|
52
|
+
- Limits: Do not write to the manifest, do not copy or delete any files — execution is deferred to step-02
|
|
53
|
+
- Dependencies: At least one skill must exist in the export manifest (or on disk); otherwise the workflow halts
|
|
54
|
+
|
|
55
|
+
## MANDATORY SEQUENCE
|
|
56
|
+
|
|
57
|
+
**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.
|
|
58
|
+
|
|
59
|
+
### 1. Load Knowledge
|
|
60
|
+
|
|
61
|
+
Read `{versionPathsKnowledge}` completely and extract:
|
|
62
|
+
|
|
63
|
+
- Path templates: `{skill_package}`, `{skill_group}`, `{forge_version}`, `{forge_group}`
|
|
64
|
+
- Export manifest v2 schema (`schema_version`, `exports`, `active_version`, `versions` map, `status` field values)
|
|
65
|
+
- The Rename section under "Skill Management Operations" — the complete list of 9 locations that must be updated coherently
|
|
66
|
+
|
|
67
|
+
You will use these templates and rules to build directory paths, enumerate affected versions, and plan the transactional rename in step-02.
|
|
68
|
+
|
|
69
|
+
### 2. Read Export Manifest
|
|
70
|
+
|
|
71
|
+
Load `{skills_output_folder}/.export-manifest.json` if it exists.
|
|
72
|
+
|
|
73
|
+
**If the file is missing or empty:** Treat as an empty manifest — proceed to section 3 and rely entirely on the on-disk directory scan. Drafted or never-exported skills can still be renamed. Store `manifest_exists = false` for later use in step-02 (section 6 will not attempt to update a manifest that does not exist).
|
|
74
|
+
|
|
75
|
+
**If the file exists but contains no `exports` entries:** Same handling — proceed to section 3 with the directory scan. Store `manifest_exists = true` so step-02 still touches the (empty) manifest on write.
|
|
76
|
+
|
|
77
|
+
**If the file exists with entries:** Parse JSON and verify `schema_version` is `"2"`. If the manifest is v1 (no `schema_version` field), note this but continue — treat every entry as having a single active version derived from its current state. Store `manifest_exists = true`.
|
|
78
|
+
|
|
79
|
+
**Hard halt condition:** If the file exists but is malformed (not valid JSON), halt with: "**Export manifest is corrupt** at `{skills_output_folder}/.export-manifest.json` — fix or remove the file before renaming."
|
|
80
|
+
|
|
81
|
+
### 3. List Available Skills
|
|
82
|
+
|
|
83
|
+
Build and display a summary of every skill available for rename. Start with the manifest (if any), then augment with on-disk scan.
|
|
84
|
+
|
|
85
|
+
For each skill in the manifest's `exports` (if `manifest_exists` and entries exist):
|
|
86
|
+
|
|
87
|
+
1. Read `active_version` from the manifest entry
|
|
88
|
+
2. Count the number of versions in the skill's `versions` map
|
|
89
|
+
3. Display `{skill-name} ({n} versions, active: {active_version})`
|
|
90
|
+
|
|
91
|
+
Also scan `{skills_output_folder}/` for any top-level directories that are NOT present in the manifest's `exports` object. Record these as "(not in manifest)" — they represent draft or orphaned skills that the rename workflow can also handle. When the manifest is missing or empty, every on-disk skill appears in this category.
|
|
92
|
+
|
|
93
|
+
**If the combined list is empty** (no manifest entries AND no on-disk skill directories): halt with "**Rename Skill — nothing to rename.** No skills found in `{skills_output_folder}/`. Run `[CS] Create Skill` first."
|
|
94
|
+
|
|
95
|
+
Display the combined list:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
**Rename Skill — select target**
|
|
99
|
+
|
|
100
|
+
Available skills:
|
|
101
|
+
1. cognee (3 versions, active: 0.6.0)
|
|
102
|
+
2. express (1 version, active: 4.18.0)
|
|
103
|
+
3. legacy-helper (not in manifest)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 4. Ask Which Skill
|
|
107
|
+
|
|
108
|
+
"**Which skill would you like to rename?**
|
|
109
|
+
Enter the skill name or its number from the list above."
|
|
110
|
+
|
|
111
|
+
Wait for user input. Accept either the numeric index or the skill name (exact match).
|
|
112
|
+
|
|
113
|
+
**If the user's input does not match any listed skill:** Re-display the list and ask again.
|
|
114
|
+
|
|
115
|
+
Store the selection as `old_name`.
|
|
116
|
+
|
|
117
|
+
### 5. Ask for New Name
|
|
118
|
+
|
|
119
|
+
"**What is the new name for this skill?**
|
|
120
|
+
The new name must be kebab-case: lowercase alphanumeric with hyphens, 1-64 characters, matching the regex `^[a-z][a-z0-9-]*[a-z0-9]$` (single-character names may be a single lowercase letter or digit)."
|
|
121
|
+
|
|
122
|
+
Wait for user input. Trim whitespace. Apply the following validations in order:
|
|
123
|
+
|
|
124
|
+
1. **Kebab-case format:** Must match `^[a-z][a-z0-9-]*[a-z0-9]$` (or `^[a-z0-9]$` for the single-character case). If it fails:
|
|
125
|
+
"**Invalid name format.** The new name must be lowercase alphanumeric with hyphens, starting with a letter and ending with a letter or digit. Try again."
|
|
126
|
+
Re-ask.
|
|
127
|
+
|
|
128
|
+
2. **Length:** Must be 1-64 characters per the agentskills.io spec. If it fails:
|
|
129
|
+
"**Invalid name length.** The new name must be 1-64 characters. Try again."
|
|
130
|
+
Re-ask.
|
|
131
|
+
|
|
132
|
+
3. **Same as old name:** If the new name equals `old_name`:
|
|
133
|
+
"**The new name is identical to the current name.** Nothing to rename. Try again or abort the workflow."
|
|
134
|
+
Re-ask.
|
|
135
|
+
|
|
136
|
+
4. **Collision check:** The new name MUST NOT collide with any existing skill:
|
|
137
|
+
- It must not appear as a key in `exports` in the manifest
|
|
138
|
+
- It must not exist as a top-level directory in `{skills_output_folder}/`
|
|
139
|
+
- It must not exist as a top-level directory in `{forge_data_folder}/`
|
|
140
|
+
|
|
141
|
+
If any collision is detected:
|
|
142
|
+
"**Name collision.** `{new-name}` already exists at: {list the colliding locations}. Pick a different name."
|
|
143
|
+
Re-ask.
|
|
144
|
+
|
|
145
|
+
Only after all four validations pass, store the input as `new_name`.
|
|
146
|
+
|
|
147
|
+
### 6. Source Authority Check
|
|
148
|
+
|
|
149
|
+
Resolve `{skill_package}` for the active version using the manifest:
|
|
150
|
+
`{skills_output_folder}/{old_name}/{active_version}/{old_name}/metadata.json`
|
|
151
|
+
|
|
152
|
+
Read the `source_authority` field (if present).
|
|
153
|
+
|
|
154
|
+
**If `source_authority == "official"`:**
|
|
155
|
+
|
|
156
|
+
Display the warning:
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
⚠️ **source_authority: "official"**
|
|
160
|
+
This skill has `source_authority: "official"`. Renaming locally will diverge from any
|
|
161
|
+
published skill at agentskills.io under this name. Consumers fetching from the
|
|
162
|
+
registry will still get the original name. Rename is a LOCAL operation only — it
|
|
163
|
+
does not rename anything at the registry.
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Ask: "**Continue anyway?** [Y/N]"
|
|
167
|
+
|
|
168
|
+
Wait for response.
|
|
169
|
+
- **If `N`** or anything other than `Y` → "**Cancelled.** No changes were made." HALT the workflow.
|
|
170
|
+
- **If `Y`** → proceed.
|
|
171
|
+
|
|
172
|
+
**If `source_authority` is absent, or any value other than `"official"`:** skip the warning and proceed.
|
|
173
|
+
|
|
174
|
+
### 7. Enumerate Affected Versions
|
|
175
|
+
|
|
176
|
+
List all versions for `old_name`:
|
|
177
|
+
|
|
178
|
+
1. Read every key under `exports.{old_name}.versions` in the manifest
|
|
179
|
+
2. Also list every directory under `{skills_output_folder}/{old_name}/` that looks like a version (any entry that is not `active`)
|
|
180
|
+
3. Union the two sets — this handles both manifest-tracked and orphaned on-disk versions
|
|
181
|
+
4. Sort descending where possible (newest first)
|
|
182
|
+
|
|
183
|
+
Store the sorted list as `affected_versions` and count it as `affected_versions_count`.
|
|
184
|
+
|
|
185
|
+
Also resolve the four outer paths using the templates from `{versionPathsKnowledge}`:
|
|
186
|
+
|
|
187
|
+
- `old_skill_group` = `{skills_output_folder}/{old_name}/`
|
|
188
|
+
- `new_skill_group` = `{skills_output_folder}/{new_name}/`
|
|
189
|
+
- `old_forge_group` = `{forge_data_folder}/{old_name}/`
|
|
190
|
+
- `new_forge_group` = `{forge_data_folder}/{new_name}/`
|
|
191
|
+
|
|
192
|
+
### 8. Confirmation Gate
|
|
193
|
+
|
|
194
|
+
Display the full operation summary:
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
**About to rename:**
|
|
198
|
+
|
|
199
|
+
From: {old_name}
|
|
200
|
+
To: {new_name}
|
|
201
|
+
Versions affected: {affected_versions_count} ({comma-separated affected_versions})
|
|
202
|
+
|
|
203
|
+
Directories that will be copied then removed:
|
|
204
|
+
{old_skill_group} → {new_skill_group}
|
|
205
|
+
{old_forge_group} → {new_forge_group}
|
|
206
|
+
|
|
207
|
+
Inside each version, the inner `{old_name}/` directory will be renamed to `{new_name}/`,
|
|
208
|
+
and the following files will be updated:
|
|
209
|
+
- SKILL.md (frontmatter `name` field)
|
|
210
|
+
- metadata.json (`name` field)
|
|
211
|
+
- context-snippet.md (display name and root paths)
|
|
212
|
+
- provenance-map.json (`skill_name` field, under {old_forge_group})
|
|
213
|
+
|
|
214
|
+
Manifest `exports.{old_name}` will be re-keyed to `exports.{new_name}`.
|
|
215
|
+
Platform context files (CLAUDE.md, .cursorrules, AGENTS.md) will be rebuilt so
|
|
216
|
+
the managed section references `{new_name}` instead of `{old_name}`.
|
|
217
|
+
|
|
218
|
+
Operation is **transactional** — the new name will be fully materialized and verified
|
|
219
|
+
before the old name is removed. If any step fails before the final delete, the new
|
|
220
|
+
directories are removed and the old skill remains intact.
|
|
221
|
+
|
|
222
|
+
Proceed? [Y/N]
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Wait for explicit user response.
|
|
226
|
+
|
|
227
|
+
- **If `Y`** → proceed to section 9
|
|
228
|
+
- **If `N`** → "**Cancelled.** No changes were made." HALT the workflow
|
|
229
|
+
- **Any other input** → re-display the confirmation and ask again
|
|
230
|
+
|
|
231
|
+
### 9. Store Decisions in Context
|
|
232
|
+
|
|
233
|
+
Store the following decisions in workflow context for step-02:
|
|
234
|
+
|
|
235
|
+
- `old_name` — the current skill name
|
|
236
|
+
- `new_name` — the validated new name
|
|
237
|
+
- `affected_versions` — list of version strings for every version that must be updated
|
|
238
|
+
- `affected_versions_count` — integer count of the above
|
|
239
|
+
- `old_skill_group` — absolute path `{skills_output_folder}/{old_name}/`
|
|
240
|
+
- `new_skill_group` — absolute path `{skills_output_folder}/{new_name}/`
|
|
241
|
+
- `old_forge_group` — absolute path `{forge_data_folder}/{old_name}/`
|
|
242
|
+
- `new_forge_group` — absolute path `{forge_data_folder}/{new_name}/`
|
|
243
|
+
- `source_authority_override` — boolean (true if the user acknowledged the `"official"` warning, false/absent otherwise)
|
|
244
|
+
|
|
245
|
+
### 10. Load Next Step
|
|
246
|
+
|
|
247
|
+
Load, read the full file, and then execute `{nextStepFile}`.
|
|
248
|
+
|
|
249
|
+
## CRITICAL STEP COMPLETION NOTE
|
|
250
|
+
|
|
251
|
+
ONLY WHEN the user has confirmed with `Y` at the confirmation gate AND all selection decisions have been stored in context, will you then load and read fully `{nextStepFile}` to execute the rename.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
|
|
256
|
+
|
|
257
|
+
### ✅ SUCCESS:
|
|
258
|
+
|
|
259
|
+
- Version-paths knowledge loaded and the Rename section internalized before any decision
|
|
260
|
+
- Export manifest read and validated (halt if empty/missing)
|
|
261
|
+
- Complete skill list displayed with version counts and active version
|
|
262
|
+
- Old name selected by explicit user input
|
|
263
|
+
- New name validated against kebab-case regex, length, identity, and collision checks
|
|
264
|
+
- `source_authority: "official"` warning shown and acknowledged when applicable
|
|
265
|
+
- `affected_versions` enumerated from both the manifest and the on-disk directory listing
|
|
266
|
+
- All four outer paths resolved from templates (no hardcoding)
|
|
267
|
+
- Explicit user confirmation (`Y`) received at the confirmation gate
|
|
268
|
+
- All selection decisions stored in context for step-02
|
|
269
|
+
|
|
270
|
+
### ❌ SYSTEM FAILURE:
|
|
271
|
+
|
|
272
|
+
- Proceeding without reading version-paths knowledge
|
|
273
|
+
- Halting when the manifest is missing but on-disk skills exist — the fallback on-disk scan MUST be attempted before any "nothing to rename" halt
|
|
274
|
+
- Accepting a new name that fails any of the four validation checks
|
|
275
|
+
- Missing the source_authority warning when `"official"` is present
|
|
276
|
+
- Hardcoding directory paths instead of using `{skill_package}`, `{skill_group}`, `{forge_version}`, `{forge_group}` templates
|
|
277
|
+
- Modifying the manifest, copying, or deleting files in this step (execution belongs to step-02)
|
|
278
|
+
- Skipping the confirmation gate or proceeding on any response other than `Y`
|
|
279
|
+
- Not storing decisions in context for step-02
|
|
280
|
+
|
|
281
|
+
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. No filesystem operation proceeds without explicit user confirmation, and no invalid new name is ever accepted.
|