@olegkoval/agent-skills 1.30.0 → 1.32.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/.claude-plugin/plugin.json +4 -2
- package/.cursor-plugin/index.json +5 -0
- package/.grok-plugin/index.json +5 -0
- package/.kiro/steering/website-analytics-bootstrap.md +159 -0
- package/.kiro/steering/wikipedia-uk-editor.md +24 -3
- package/.windsurf/rules/website-analytics-bootstrap.md +158 -0
- package/.windsurf/rules/wikipedia-uk-editor.md +24 -3
- package/README.md +8 -6
- package/catalog/skills.json +42 -0
- package/collections/marketing.json +1 -1
- package/collections/software-development.json +2 -1
- package/package.json +1 -1
- package/packages/marketing/website-analytics-bootstrap/SKILL.md +171 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/claude/plugin.json +5 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/claude/skills/website-analytics-bootstrap/SKILL.md +172 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/cursor/plugin.json +6 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/cursor/skills/website-analytics-bootstrap/SKILL.md +172 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/grok/plugin.json +6 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/grok/skills/website-analytics-bootstrap/SKILL.md +172 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/kiro/steering/website-analytics-bootstrap.md +159 -0
- package/packages/marketing/website-analytics-bootstrap/adapters/windsurf/rules/website-analytics-bootstrap.md +158 -0
- package/packages/software-development/shared-knowledge-artifact/SKILL.md +89 -0
- package/packages/software-development/shared-knowledge-artifact/adapters/claude/plugin.json +5 -0
- package/packages/software-development/shared-knowledge-artifact/adapters/claude/skills/shared-knowledge-artifact/SKILL.md +90 -0
- package/packages/software-development/shared-knowledge-artifact/adapters/claude/skills/shared-knowledge-artifact/references/prompt.txt +78 -0
- package/packages/software-development/shared-knowledge-artifact/references/prompt.txt +78 -0
- package/packages/software-development/wikipedia-uk-editor/SKILL.md +24 -3
- package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/SKILL.md +24 -3
- package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
- package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/references/strategy.md +10 -0
- package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
- package/packages/software-development/wikipedia-uk-editor/adapters/codex/README.md +39 -9
- package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/SKILL.md +24 -3
- package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
- package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/references/strategy.md +10 -0
- package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
- package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/SKILL.md +24 -3
- package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
- package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/references/strategy.md +10 -0
- package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
- package/packages/software-development/wikipedia-uk-editor/adapters/kiro/steering/wikipedia-uk-editor.md +24 -3
- package/packages/software-development/wikipedia-uk-editor/adapters/windsurf/rules/wikipedia-uk-editor.md +24 -3
- package/packages/software-development/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
- package/packages/software-development/wikipedia-uk-editor/references/strategy.md +10 -0
- package/packages/software-development/wikipedia-uk-editor/scripts/wiki.sh +58 -2
|
@@ -35,7 +35,7 @@ Turn a URL or article title into a complete, policy-compliant Ukrainian Wikipedi
|
|
|
35
35
|
A single deliverable written to a scratch file and echoed in chat:
|
|
36
36
|
|
|
37
37
|
- the **target page** (exact ukwiki title, and whether it exists)
|
|
38
|
-
- the **wikitext** —
|
|
38
|
+
- the **wikitext** — always the complete final article in one `.wiki` file, ready to paste over the whole edit box; never a diff, never a БУЛО/СТАЛО list of manual replacements
|
|
39
39
|
- the **edit summary** in Ukrainian (≤ 200 chars)
|
|
40
40
|
- the **source list** with the URL, publisher, and date actually fetched for each
|
|
41
41
|
- **risk notes**: notability (ВП:ЗН) standing, anything a patroller will challenge, what still needs a human check
|
|
@@ -46,12 +46,15 @@ A single deliverable written to a scratch file and echoed in chat:
|
|
|
46
46
|
|
|
47
47
|
| Input | Mode |
|
|
48
48
|
|---|---|
|
|
49
|
+
| explicit newcomer task (tier + type, e.g. "Середні → Оновлювати статті") | mode set by task type — see below |
|
|
49
50
|
| en.wikipedia.org URL, no uk equivalent | **Translate** — new uk article |
|
|
50
51
|
| uk.wikipedia.org URL, stub or thin | **Expand** |
|
|
51
52
|
| uk.wikipedia.org URL with `{{Без джерел}}` / `{{Джерело}}` | **Source** |
|
|
52
53
|
| uk.wikipedia.org URL, prose/format problems | **Cleanup** |
|
|
53
54
|
| "what should I edit next" | **Plan** — read `references/strategy.md`, propose a ranked list |
|
|
54
55
|
|
|
56
|
+
When a newcomer task type is given, it **overrides** the state-based guess above. The per-type scope contract in `references/newcomer-tasks.md` is binding — an assigned type is a ceiling on what the edit may touch, not a floor.
|
|
57
|
+
|
|
55
58
|
Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft against the wrong title.
|
|
56
59
|
|
|
57
60
|
### 2. Read before writing
|
|
@@ -61,6 +64,7 @@ Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft aga
|
|
|
61
64
|
./scripts/wiki.sh get en "Title" # source-language wikitext
|
|
62
65
|
./scripts/wiki.sh langlink en "Title" uk # does a uk version already exist?
|
|
63
66
|
./scripts/wiki.sh check uk "Шаблон:Особа" # does this template/page exist?
|
|
67
|
+
./scripts/wiki.sh tasks <type> [n] # list candidates for a newcomer task type: copyedit|links|references|update|expand
|
|
64
68
|
```
|
|
65
69
|
|
|
66
70
|
Stop and report if:
|
|
@@ -95,21 +99,38 @@ Run every item. Report failures rather than hiding them.
|
|
|
95
99
|
- [ ] No original synthesis (ВП:ОД)
|
|
96
100
|
- [ ] Dates, numbers, and name transliterations are Ukrainian-correct
|
|
97
101
|
- [ ] Edit summary written in Ukrainian and states what changed and why
|
|
102
|
+
- [ ] The edit stayed inside the assigned task type's allowed scope
|
|
103
|
+
- [ ] Any maintenance template removed was actually earned — the underlying problem is genuinely fixed
|
|
98
104
|
|
|
99
105
|
### 6. Deliver
|
|
100
106
|
|
|
101
|
-
|
|
107
|
+
For Expand / Source / Cleanup: fetch the current wikitext, apply the changes programmatically (a small Python pass over the fetched file, asserting each anchor string matched exactly once), and write the whole resulting article out. Verify it before delivering — section list intact, every intended change landed, nothing else dropped.
|
|
108
|
+
|
|
109
|
+
Write the draft to a scratch file: the raw `.wiki` file contains nothing but article wikitext (the full final article, ready to paste over the whole edit box); the human-readable explanation of what changed goes in a separate `.md`. Print the edit summary, and tell the human exactly where to paste it:
|
|
102
110
|
|
|
103
111
|
- new article → `https://uk.wikipedia.org/wiki/Тайтл?action=edit`
|
|
104
|
-
-
|
|
112
|
+
- existing article → `https://uk.wikipedia.org/w/index.php?title=Тайтл&action=edit`, replace the whole edit box
|
|
105
113
|
- test first → `Вікіпедія:Пісочниця` or the user's own `Користувач:Ім'я/Чернетка`
|
|
106
114
|
|
|
115
|
+
End the delivery with a copy-to-clipboard command in its own fenced block, using a quoted absolute path — quoted because scratchpad paths contain characters the shell will otherwise mangle — always the raw `.wiki` file, never the `.md`:
|
|
116
|
+
|
|
117
|
+
```sh
|
|
118
|
+
pbcopy < "/absolute/path/to/slug.wiki"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Add an optional second line when the edit summary is long enough to be worth copying:
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
printf '%s' 'Опис редагування…' | pbcopy
|
|
125
|
+
```
|
|
126
|
+
|
|
107
127
|
Then stop. Do not offer to save it.
|
|
108
128
|
|
|
109
129
|
## References
|
|
110
130
|
|
|
111
131
|
- `references/strategy.md` — the contribution strategy: what to farm, in what order, and how to build standing without getting flagged
|
|
112
132
|
- `references/wikitext-uk.md` — verified uk templates, citation formats, article skeletons, policy shortcuts
|
|
133
|
+
- `references/newcomer-tasks.md` — the newcomer task tiers (Легкі/Середні/Важкі) and the binding scope contract for each task type
|
|
113
134
|
- `scripts/wiki.sh` — read-only MediaWiki API helper
|
|
114
135
|
|
|
115
136
|
## Verification
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Ukrainian Wikipedia newcomer task types
|
|
2
|
+
|
|
3
|
+
Verified against the live `uk.wikipedia.org` API, 2026-08-20.
|
|
4
|
+
|
|
5
|
+
`MediaWiki:NewcomerTasks.json` is the authoritative GrowthExperiments "Suggested edits"
|
|
6
|
+
(Пропоновані редагування) task-type → maintenance-template map on ukwiki. The table below is
|
|
7
|
+
that map.
|
|
8
|
+
|
|
9
|
+
## Task-type mapping
|
|
10
|
+
|
|
11
|
+
| ukwiki UI label | Tier | task type | Backing template(s) |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| Вичитувати | Легкі / easy | `copyedit` | `Шаблон:Мовні помилки` |
|
|
14
|
+
| (not offered in UI — structured) | easy | `link-recommendation` | none |
|
|
15
|
+
| (not offered in that UI list) | easy | `links` | `Шаблон:Упорядкувати`, `Шаблон:Брак посилань` |
|
|
16
|
+
| Шукати зовнішні посилання | Середні / medium | `references` | `Шаблон:Без джерел` |
|
|
17
|
+
| Оновлювати статті | Середні / medium | `update` | `Шаблон:Оновити` |
|
|
18
|
+
| (not offered — structured) | medium | `image-recommendation`, `section-image-recommendation` | none |
|
|
19
|
+
| Розширювати короткі статті | Важкі / hard | `expand` | `Шаблон:Доробити` |
|
|
20
|
+
|
|
21
|
+
All six templates confirmed EXISTS. `Шаблон:Доробити` is a REDIRECT to `Шаблон:Заготовка`
|
|
22
|
+
(see `references/wikitext-uk.md`).
|
|
23
|
+
|
|
24
|
+
## Scope contract per task type
|
|
25
|
+
|
|
26
|
+
An assigned task type is a **ceiling**, not a suggestion — overreach on a young account is what
|
|
27
|
+
draws patrollers (see `references/strategy.md` Phase 1). Stay inside the type you picked.
|
|
28
|
+
|
|
29
|
+
### `copyedit` — Вичитувати
|
|
30
|
+
|
|
31
|
+
- IS: language, grammar, punctuation, typography fixes only.
|
|
32
|
+
- NOT: no new facts, no new refs, no restructuring, no adding/removing/reordering sections.
|
|
33
|
+
- Remove `{{Мовні помилки}}` in the same edit only if the whole article was actually proofread.
|
|
34
|
+
- Edit summary shape: `Вичитка: виправлено [конкретні помилки]`.
|
|
35
|
+
|
|
36
|
+
### `links` — Упорядкувати / Брак посилань
|
|
37
|
+
|
|
38
|
+
- IS: wikilinks and formatting only.
|
|
39
|
+
- NOT: no prose rewriting.
|
|
40
|
+
- Edit summary shape: `Впорядкування посилань: [що додано/виправлено]`.
|
|
41
|
+
|
|
42
|
+
### `references` — Шукати зовнішні посилання
|
|
43
|
+
|
|
44
|
+
- IS: add inline `<ref>` to claims that are **already there**.
|
|
45
|
+
- NOT: never rewrite a claim to fit a source you happened to find. If no source supports it as
|
|
46
|
+
written, report it — do not reshape it.
|
|
47
|
+
- Remove `{{Без джерел}}` only when every substantive claim is cited.
|
|
48
|
+
- Edit summary shape: `Додано джерела: [що саме підтверджено]`.
|
|
49
|
+
|
|
50
|
+
### `update` — Оновлювати статті
|
|
51
|
+
|
|
52
|
+
- IS: replace outdated values/dates/status with sourced current ones, plus the minimum prose the
|
|
53
|
+
change forces.
|
|
54
|
+
- NOT: no scope expansion, no new sections.
|
|
55
|
+
- Every updated number needs a source actually fetched this session — this is the highest
|
|
56
|
+
fabrication-risk type in the set and SKILL.md Hard Rule 2 applies with no exceptions.
|
|
57
|
+
- Edit summary shape: `Оновлено дані: [що змінено] за станом на [дата]`.
|
|
58
|
+
|
|
59
|
+
### `expand` — Розширювати короткі статті
|
|
60
|
+
|
|
61
|
+
- IS: the **only** type permitted to add sections and substantial new sourced prose. Routes into
|
|
62
|
+
the existing **Expand** mode in SKILL.md.
|
|
63
|
+
- `{{Заготовка}}` comes off only when the article genuinely stops being a stub.
|
|
64
|
+
- Edit summary shape: `Розширено статтю: додано [розділи/теми], джерела`.
|
|
65
|
+
|
|
66
|
+
## Out of scope: structured task types
|
|
67
|
+
|
|
68
|
+
`link-recommendation`, `image-recommendation`, and `section-image-recommendation` are served
|
|
69
|
+
through the Growth UI's own accept/reject widget on ukwiki, not by pasting wikitext. This skill
|
|
70
|
+
does not improvise a manual equivalent for them — say so plainly and decline rather than draft
|
|
71
|
+
around it.
|
|
72
|
+
|
|
73
|
+
## Finding candidates
|
|
74
|
+
|
|
75
|
+
`action=query&list=growthtasks` requires login, so this read-only skill cannot use it. Find
|
|
76
|
+
candidate articles for a task type instead with:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
./scripts/wiki.sh tasks <type> [n]
|
|
80
|
+
```
|
|
@@ -31,6 +31,16 @@ Rules for this phase: one change per edit, always an edit summary in Ukrainian,
|
|
|
31
31
|
|
|
32
32
|
Target: ~30–50 edits, **zero reverts**. A revert in this phase costs more than 50 edits gain.
|
|
33
33
|
|
|
34
|
+
### Newcomer tasks as a ready-made Phase 1 queue
|
|
35
|
+
|
|
36
|
+
Ukrainian Wikipedia's own GrowthExperiments "Suggested edits" (Пропоновані редагування) tiers a
|
|
37
|
+
maintenance backlog into Легкі / Середні / Важкі — see `references/newcomer-tasks.md` for the
|
|
38
|
+
full mapping and per-type scope contract. Легкі (`copyedit`) and Середні (`references`, `update`)
|
|
39
|
+
are lower-risk, community-endorsed work for this phase, but they are not zero-revert-risk:
|
|
40
|
+
sourcing and fabrication risks still require verification. Pick candidates
|
|
41
|
+
with `./scripts/wiki.sh tasks <type>` and stay strictly inside the assigned scope. Важкі
|
|
42
|
+
(`expand`) is not Phase 1 work — it belongs in Phase 2 stream A/B, once autoconfirmed.
|
|
43
|
+
|
|
34
44
|
## Phase 2 — the volume engine (weeks 2–8)
|
|
35
45
|
|
|
36
46
|
Four streams, run in parallel, roughly in this priority order. Value per unit of effort, highest first:
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
# wiki.sh search <lang> <query> [n] search article titles
|
|
11
11
|
# wiki.sh backlog <category> [n] list pages in a uk category (maintenance backlogs)
|
|
12
12
|
# wiki.sh info <lang> <title> length, last edit, categories, templates used
|
|
13
|
+
# wiki.sh tasks <type> [n] candidate articles for a newcomer task type
|
|
13
14
|
set -eu
|
|
14
15
|
|
|
15
16
|
UA="wikipedia-uk-editor-skill/1.0 (https://github.com/oleg-koval/agent-skills)"
|
|
@@ -24,7 +25,7 @@ api() {
|
|
|
24
25
|
jqp() { python3 -c "$1"; }
|
|
25
26
|
|
|
26
27
|
cmd=${1:-}
|
|
27
|
-
[ -n "$cmd" ] || { sed -n '2,
|
|
28
|
+
[ -n "$cmd" ] || { sed -n '2,13p' "$0"; exit 1; }
|
|
28
29
|
shift
|
|
29
30
|
|
|
30
31
|
case "$cmd" in
|
|
@@ -92,7 +93,62 @@ print('touched:',p.get('touched'))
|
|
|
92
93
|
print('cats :', ', '.join(c['title'] for c in p.get('categories',[])) or '(none)')
|
|
93
94
|
print('tmpls :', ', '.join(t['title'] for t in p.get('templates',[])) or '(none)')"
|
|
94
95
|
;;
|
|
96
|
+
tasks)
|
|
97
|
+
type=${1:-}
|
|
98
|
+
n=${2:-20}
|
|
99
|
+
case "$n" in
|
|
100
|
+
''|*[!0-9]*) echo "Invalid task limit: '$n' (expected a non-negative integer)" >&2; exit 1 ;;
|
|
101
|
+
esac
|
|
102
|
+
case "$type" in
|
|
103
|
+
copyedit) templates="Шаблон:Мовні помилки" ;;
|
|
104
|
+
links) templates="Шаблон:Упорядкувати|Шаблон:Брак посилань" ;;
|
|
105
|
+
references) templates="Шаблон:Без джерел" ;;
|
|
106
|
+
update) templates="Шаблон:Оновити" ;;
|
|
107
|
+
expand) templates="Шаблон:Доробити" ;;
|
|
108
|
+
*)
|
|
109
|
+
echo "Unknown task type: '$type'. Valid types: copyedit, links, references, update, expand" >&2
|
|
110
|
+
exit 1
|
|
111
|
+
;;
|
|
112
|
+
esac
|
|
113
|
+
[ "$n" -gt 0 ] || exit 0
|
|
114
|
+
results=$(mktemp)
|
|
115
|
+
trap 'rm -f "$results"' EXIT
|
|
116
|
+
oldifs=$IFS
|
|
117
|
+
IFS='|'
|
|
118
|
+
for tmpl in $templates; do
|
|
119
|
+
IFS=$oldifs
|
|
120
|
+
api uk --data-urlencode "action=query" --data-urlencode "list=embeddedin" \
|
|
121
|
+
--data-urlencode "eititle=$tmpl" --data-urlencode "einamespace=0" \
|
|
122
|
+
--data-urlencode "eilimit=$n" |
|
|
123
|
+
jqp "import json,sys
|
|
124
|
+
d=json.load(sys.stdin)
|
|
125
|
+
if 'error' in d: sys.exit('NOT FOUND: '+d['error'].get('info',''))
|
|
126
|
+
for m in d['query']['embeddedin']: print(m['title'])" |
|
|
127
|
+
while IFS= read -r title; do printf '%s\t%s\n' "$tmpl" "$title"; done >> "$results"
|
|
128
|
+
done
|
|
129
|
+
python3 - "$results" "$n" <<'PY'
|
|
130
|
+
import sys
|
|
131
|
+
from collections import OrderedDict
|
|
132
|
+
|
|
133
|
+
path, limit_text = sys.argv[1:]
|
|
134
|
+
limit = int(limit_text)
|
|
135
|
+
groups = OrderedDict()
|
|
136
|
+
seen = set()
|
|
137
|
+
with open(path, encoding="utf-8") as handle:
|
|
138
|
+
for line in handle:
|
|
139
|
+
template, title = line.rstrip("\n").split("\t", 1)
|
|
140
|
+
if title in seen:
|
|
141
|
+
continue
|
|
142
|
+
seen.add(title)
|
|
143
|
+
groups.setdefault(template, []).append(title)
|
|
144
|
+
if len(seen) == limit:
|
|
145
|
+
break
|
|
146
|
+
for template, titles in groups.items():
|
|
147
|
+
print(f"== {template} ==")
|
|
148
|
+
print("\n".join(titles))
|
|
149
|
+
PY
|
|
150
|
+
;;
|
|
95
151
|
*)
|
|
96
|
-
sed -n '2,
|
|
152
|
+
sed -n '2,13p' "$0"; exit 1
|
|
97
153
|
;;
|
|
98
154
|
esac
|
|
@@ -35,7 +35,7 @@ Turn a URL or article title into a complete, policy-compliant Ukrainian Wikipedi
|
|
|
35
35
|
A single deliverable written to a scratch file and echoed in chat:
|
|
36
36
|
|
|
37
37
|
- the **target page** (exact ukwiki title, and whether it exists)
|
|
38
|
-
- the **wikitext** —
|
|
38
|
+
- the **wikitext** — always the complete final article in one `.wiki` file, ready to paste over the whole edit box; never a diff, never a БУЛО/СТАЛО list of manual replacements
|
|
39
39
|
- the **edit summary** in Ukrainian (≤ 200 chars)
|
|
40
40
|
- the **source list** with the URL, publisher, and date actually fetched for each
|
|
41
41
|
- **risk notes**: notability (ВП:ЗН) standing, anything a patroller will challenge, what still needs a human check
|
|
@@ -46,12 +46,15 @@ A single deliverable written to a scratch file and echoed in chat:
|
|
|
46
46
|
|
|
47
47
|
| Input | Mode |
|
|
48
48
|
|---|---|
|
|
49
|
+
| explicit newcomer task (tier + type, e.g. "Середні → Оновлювати статті") | mode set by task type — see below |
|
|
49
50
|
| en.wikipedia.org URL, no uk equivalent | **Translate** — new uk article |
|
|
50
51
|
| uk.wikipedia.org URL, stub or thin | **Expand** |
|
|
51
52
|
| uk.wikipedia.org URL with `{{Без джерел}}` / `{{Джерело}}` | **Source** |
|
|
52
53
|
| uk.wikipedia.org URL, prose/format problems | **Cleanup** |
|
|
53
54
|
| "what should I edit next" | **Plan** — read `references/strategy.md`, propose a ranked list |
|
|
54
55
|
|
|
56
|
+
When a newcomer task type is given, it **overrides** the state-based guess above. The per-type scope contract in `references/newcomer-tasks.md` is binding — an assigned type is a ceiling on what the edit may touch, not a floor.
|
|
57
|
+
|
|
55
58
|
Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft against the wrong title.
|
|
56
59
|
|
|
57
60
|
### 2. Read before writing
|
|
@@ -61,6 +64,7 @@ Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft aga
|
|
|
61
64
|
./scripts/wiki.sh get en "Title" # source-language wikitext
|
|
62
65
|
./scripts/wiki.sh langlink en "Title" uk # does a uk version already exist?
|
|
63
66
|
./scripts/wiki.sh check uk "Шаблон:Особа" # does this template/page exist?
|
|
67
|
+
./scripts/wiki.sh tasks <type> [n] # list candidates for a newcomer task type: copyedit|links|references|update|expand
|
|
64
68
|
```
|
|
65
69
|
|
|
66
70
|
Stop and report if:
|
|
@@ -95,21 +99,38 @@ Run every item. Report failures rather than hiding them.
|
|
|
95
99
|
- [ ] No original synthesis (ВП:ОД)
|
|
96
100
|
- [ ] Dates, numbers, and name transliterations are Ukrainian-correct
|
|
97
101
|
- [ ] Edit summary written in Ukrainian and states what changed and why
|
|
102
|
+
- [ ] The edit stayed inside the assigned task type's allowed scope
|
|
103
|
+
- [ ] Any maintenance template removed was actually earned — the underlying problem is genuinely fixed
|
|
98
104
|
|
|
99
105
|
### 6. Deliver
|
|
100
106
|
|
|
101
|
-
|
|
107
|
+
For Expand / Source / Cleanup: fetch the current wikitext, apply the changes programmatically (a small Python pass over the fetched file, asserting each anchor string matched exactly once), and write the whole resulting article out. Verify it before delivering — section list intact, every intended change landed, nothing else dropped.
|
|
108
|
+
|
|
109
|
+
Write the draft to a scratch file: the raw `.wiki` file contains nothing but article wikitext (the full final article, ready to paste over the whole edit box); the human-readable explanation of what changed goes in a separate `.md`. Print the edit summary, and tell the human exactly where to paste it:
|
|
102
110
|
|
|
103
111
|
- new article → `https://uk.wikipedia.org/wiki/Тайтл?action=edit`
|
|
104
|
-
-
|
|
112
|
+
- existing article → `https://uk.wikipedia.org/w/index.php?title=Тайтл&action=edit`, replace the whole edit box
|
|
105
113
|
- test first → `Вікіпедія:Пісочниця` or the user's own `Користувач:Ім'я/Чернетка`
|
|
106
114
|
|
|
115
|
+
End the delivery with a copy-to-clipboard command in its own fenced block, using a quoted absolute path — quoted because scratchpad paths contain characters the shell will otherwise mangle — always the raw `.wiki` file, never the `.md`:
|
|
116
|
+
|
|
117
|
+
```sh
|
|
118
|
+
pbcopy < "/absolute/path/to/slug.wiki"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Add an optional second line when the edit summary is long enough to be worth copying:
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
printf '%s' 'Опис редагування…' | pbcopy
|
|
125
|
+
```
|
|
126
|
+
|
|
107
127
|
Then stop. Do not offer to save it.
|
|
108
128
|
|
|
109
129
|
## References
|
|
110
130
|
|
|
111
131
|
- `references/strategy.md` — the contribution strategy: what to farm, in what order, and how to build standing without getting flagged
|
|
112
132
|
- `references/wikitext-uk.md` — verified uk templates, citation formats, article skeletons, policy shortcuts
|
|
133
|
+
- `references/newcomer-tasks.md` — the newcomer task tiers (Легкі/Середні/Важкі) and the binding scope contract for each task type
|
|
113
134
|
- `scripts/wiki.sh` — read-only MediaWiki API helper
|
|
114
135
|
|
|
115
136
|
## Verification
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Ukrainian Wikipedia newcomer task types
|
|
2
|
+
|
|
3
|
+
Verified against the live `uk.wikipedia.org` API, 2026-08-20.
|
|
4
|
+
|
|
5
|
+
`MediaWiki:NewcomerTasks.json` is the authoritative GrowthExperiments "Suggested edits"
|
|
6
|
+
(Пропоновані редагування) task-type → maintenance-template map on ukwiki. The table below is
|
|
7
|
+
that map.
|
|
8
|
+
|
|
9
|
+
## Task-type mapping
|
|
10
|
+
|
|
11
|
+
| ukwiki UI label | Tier | task type | Backing template(s) |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| Вичитувати | Легкі / easy | `copyedit` | `Шаблон:Мовні помилки` |
|
|
14
|
+
| (not offered in UI — structured) | easy | `link-recommendation` | none |
|
|
15
|
+
| (not offered in that UI list) | easy | `links` | `Шаблон:Упорядкувати`, `Шаблон:Брак посилань` |
|
|
16
|
+
| Шукати зовнішні посилання | Середні / medium | `references` | `Шаблон:Без джерел` |
|
|
17
|
+
| Оновлювати статті | Середні / medium | `update` | `Шаблон:Оновити` |
|
|
18
|
+
| (not offered — structured) | medium | `image-recommendation`, `section-image-recommendation` | none |
|
|
19
|
+
| Розширювати короткі статті | Важкі / hard | `expand` | `Шаблон:Доробити` |
|
|
20
|
+
|
|
21
|
+
All six templates confirmed EXISTS. `Шаблон:Доробити` is a REDIRECT to `Шаблон:Заготовка`
|
|
22
|
+
(see `references/wikitext-uk.md`).
|
|
23
|
+
|
|
24
|
+
## Scope contract per task type
|
|
25
|
+
|
|
26
|
+
An assigned task type is a **ceiling**, not a suggestion — overreach on a young account is what
|
|
27
|
+
draws patrollers (see `references/strategy.md` Phase 1). Stay inside the type you picked.
|
|
28
|
+
|
|
29
|
+
### `copyedit` — Вичитувати
|
|
30
|
+
|
|
31
|
+
- IS: language, grammar, punctuation, typography fixes only.
|
|
32
|
+
- NOT: no new facts, no new refs, no restructuring, no adding/removing/reordering sections.
|
|
33
|
+
- Remove `{{Мовні помилки}}` in the same edit only if the whole article was actually proofread.
|
|
34
|
+
- Edit summary shape: `Вичитка: виправлено [конкретні помилки]`.
|
|
35
|
+
|
|
36
|
+
### `links` — Упорядкувати / Брак посилань
|
|
37
|
+
|
|
38
|
+
- IS: wikilinks and formatting only.
|
|
39
|
+
- NOT: no prose rewriting.
|
|
40
|
+
- Edit summary shape: `Впорядкування посилань: [що додано/виправлено]`.
|
|
41
|
+
|
|
42
|
+
### `references` — Шукати зовнішні посилання
|
|
43
|
+
|
|
44
|
+
- IS: add inline `<ref>` to claims that are **already there**.
|
|
45
|
+
- NOT: never rewrite a claim to fit a source you happened to find. If no source supports it as
|
|
46
|
+
written, report it — do not reshape it.
|
|
47
|
+
- Remove `{{Без джерел}}` only when every substantive claim is cited.
|
|
48
|
+
- Edit summary shape: `Додано джерела: [що саме підтверджено]`.
|
|
49
|
+
|
|
50
|
+
### `update` — Оновлювати статті
|
|
51
|
+
|
|
52
|
+
- IS: replace outdated values/dates/status with sourced current ones, plus the minimum prose the
|
|
53
|
+
change forces.
|
|
54
|
+
- NOT: no scope expansion, no new sections.
|
|
55
|
+
- Every updated number needs a source actually fetched this session — this is the highest
|
|
56
|
+
fabrication-risk type in the set and SKILL.md Hard Rule 2 applies with no exceptions.
|
|
57
|
+
- Edit summary shape: `Оновлено дані: [що змінено] за станом на [дата]`.
|
|
58
|
+
|
|
59
|
+
### `expand` — Розширювати короткі статті
|
|
60
|
+
|
|
61
|
+
- IS: the **only** type permitted to add sections and substantial new sourced prose. Routes into
|
|
62
|
+
the existing **Expand** mode in SKILL.md.
|
|
63
|
+
- `{{Заготовка}}` comes off only when the article genuinely stops being a stub.
|
|
64
|
+
- Edit summary shape: `Розширено статтю: додано [розділи/теми], джерела`.
|
|
65
|
+
|
|
66
|
+
## Out of scope: structured task types
|
|
67
|
+
|
|
68
|
+
`link-recommendation`, `image-recommendation`, and `section-image-recommendation` are served
|
|
69
|
+
through the Growth UI's own accept/reject widget on ukwiki, not by pasting wikitext. This skill
|
|
70
|
+
does not improvise a manual equivalent for them — say so plainly and decline rather than draft
|
|
71
|
+
around it.
|
|
72
|
+
|
|
73
|
+
## Finding candidates
|
|
74
|
+
|
|
75
|
+
`action=query&list=growthtasks` requires login, so this read-only skill cannot use it. Find
|
|
76
|
+
candidate articles for a task type instead with:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
./scripts/wiki.sh tasks <type> [n]
|
|
80
|
+
```
|
|
@@ -31,6 +31,16 @@ Rules for this phase: one change per edit, always an edit summary in Ukrainian,
|
|
|
31
31
|
|
|
32
32
|
Target: ~30–50 edits, **zero reverts**. A revert in this phase costs more than 50 edits gain.
|
|
33
33
|
|
|
34
|
+
### Newcomer tasks as a ready-made Phase 1 queue
|
|
35
|
+
|
|
36
|
+
Ukrainian Wikipedia's own GrowthExperiments "Suggested edits" (Пропоновані редагування) tiers a
|
|
37
|
+
maintenance backlog into Легкі / Середні / Важкі — see `references/newcomer-tasks.md` for the
|
|
38
|
+
full mapping and per-type scope contract. Легкі (`copyedit`) and Середні (`references`, `update`)
|
|
39
|
+
are lower-risk, community-endorsed work for this phase, but they are not zero-revert-risk:
|
|
40
|
+
sourcing and fabrication risks still require verification. Pick candidates
|
|
41
|
+
with `./scripts/wiki.sh tasks <type>` and stay strictly inside the assigned scope. Важкі
|
|
42
|
+
(`expand`) is not Phase 1 work — it belongs in Phase 2 stream A/B, once autoconfirmed.
|
|
43
|
+
|
|
34
44
|
## Phase 2 — the volume engine (weeks 2–8)
|
|
35
45
|
|
|
36
46
|
Four streams, run in parallel, roughly in this priority order. Value per unit of effort, highest first:
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
# wiki.sh search <lang> <query> [n] search article titles
|
|
11
11
|
# wiki.sh backlog <category> [n] list pages in a uk category (maintenance backlogs)
|
|
12
12
|
# wiki.sh info <lang> <title> length, last edit, categories, templates used
|
|
13
|
+
# wiki.sh tasks <type> [n] candidate articles for a newcomer task type
|
|
13
14
|
set -eu
|
|
14
15
|
|
|
15
16
|
UA="wikipedia-uk-editor-skill/1.0 (https://github.com/oleg-koval/agent-skills)"
|
|
@@ -24,7 +25,7 @@ api() {
|
|
|
24
25
|
jqp() { python3 -c "$1"; }
|
|
25
26
|
|
|
26
27
|
cmd=${1:-}
|
|
27
|
-
[ -n "$cmd" ] || { sed -n '2,
|
|
28
|
+
[ -n "$cmd" ] || { sed -n '2,13p' "$0"; exit 1; }
|
|
28
29
|
shift
|
|
29
30
|
|
|
30
31
|
case "$cmd" in
|
|
@@ -92,7 +93,62 @@ print('touched:',p.get('touched'))
|
|
|
92
93
|
print('cats :', ', '.join(c['title'] for c in p.get('categories',[])) or '(none)')
|
|
93
94
|
print('tmpls :', ', '.join(t['title'] for t in p.get('templates',[])) or '(none)')"
|
|
94
95
|
;;
|
|
96
|
+
tasks)
|
|
97
|
+
type=${1:-}
|
|
98
|
+
n=${2:-20}
|
|
99
|
+
case "$n" in
|
|
100
|
+
''|*[!0-9]*) echo "Invalid task limit: '$n' (expected a non-negative integer)" >&2; exit 1 ;;
|
|
101
|
+
esac
|
|
102
|
+
case "$type" in
|
|
103
|
+
copyedit) templates="Шаблон:Мовні помилки" ;;
|
|
104
|
+
links) templates="Шаблон:Упорядкувати|Шаблон:Брак посилань" ;;
|
|
105
|
+
references) templates="Шаблон:Без джерел" ;;
|
|
106
|
+
update) templates="Шаблон:Оновити" ;;
|
|
107
|
+
expand) templates="Шаблон:Доробити" ;;
|
|
108
|
+
*)
|
|
109
|
+
echo "Unknown task type: '$type'. Valid types: copyedit, links, references, update, expand" >&2
|
|
110
|
+
exit 1
|
|
111
|
+
;;
|
|
112
|
+
esac
|
|
113
|
+
[ "$n" -gt 0 ] || exit 0
|
|
114
|
+
results=$(mktemp)
|
|
115
|
+
trap 'rm -f "$results"' EXIT
|
|
116
|
+
oldifs=$IFS
|
|
117
|
+
IFS='|'
|
|
118
|
+
for tmpl in $templates; do
|
|
119
|
+
IFS=$oldifs
|
|
120
|
+
api uk --data-urlencode "action=query" --data-urlencode "list=embeddedin" \
|
|
121
|
+
--data-urlencode "eititle=$tmpl" --data-urlencode "einamespace=0" \
|
|
122
|
+
--data-urlencode "eilimit=$n" |
|
|
123
|
+
jqp "import json,sys
|
|
124
|
+
d=json.load(sys.stdin)
|
|
125
|
+
if 'error' in d: sys.exit('NOT FOUND: '+d['error'].get('info',''))
|
|
126
|
+
for m in d['query']['embeddedin']: print(m['title'])" |
|
|
127
|
+
while IFS= read -r title; do printf '%s\t%s\n' "$tmpl" "$title"; done >> "$results"
|
|
128
|
+
done
|
|
129
|
+
python3 - "$results" "$n" <<'PY'
|
|
130
|
+
import sys
|
|
131
|
+
from collections import OrderedDict
|
|
132
|
+
|
|
133
|
+
path, limit_text = sys.argv[1:]
|
|
134
|
+
limit = int(limit_text)
|
|
135
|
+
groups = OrderedDict()
|
|
136
|
+
seen = set()
|
|
137
|
+
with open(path, encoding="utf-8") as handle:
|
|
138
|
+
for line in handle:
|
|
139
|
+
template, title = line.rstrip("\n").split("\t", 1)
|
|
140
|
+
if title in seen:
|
|
141
|
+
continue
|
|
142
|
+
seen.add(title)
|
|
143
|
+
groups.setdefault(template, []).append(title)
|
|
144
|
+
if len(seen) == limit:
|
|
145
|
+
break
|
|
146
|
+
for template, titles in groups.items():
|
|
147
|
+
print(f"== {template} ==")
|
|
148
|
+
print("\n".join(titles))
|
|
149
|
+
PY
|
|
150
|
+
;;
|
|
95
151
|
*)
|
|
96
|
-
sed -n '2,
|
|
152
|
+
sed -n '2,13p' "$0"; exit 1
|
|
97
153
|
;;
|
|
98
154
|
esac
|
|
@@ -23,7 +23,7 @@ Turn a URL or article title into a complete, policy-compliant Ukrainian Wikipedi
|
|
|
23
23
|
A single deliverable written to a scratch file and echoed in chat:
|
|
24
24
|
|
|
25
25
|
- the **target page** (exact ukwiki title, and whether it exists)
|
|
26
|
-
- the **wikitext** —
|
|
26
|
+
- the **wikitext** — always the complete final article in one `.wiki` file, ready to paste over the whole edit box; never a diff, never a БУЛО/СТАЛО list of manual replacements
|
|
27
27
|
- the **edit summary** in Ukrainian (≤ 200 chars)
|
|
28
28
|
- the **source list** with the URL, publisher, and date actually fetched for each
|
|
29
29
|
- **risk notes**: notability (ВП:ЗН) standing, anything a patroller will challenge, what still needs a human check
|
|
@@ -34,12 +34,15 @@ A single deliverable written to a scratch file and echoed in chat:
|
|
|
34
34
|
|
|
35
35
|
| Input | Mode |
|
|
36
36
|
|---|---|
|
|
37
|
+
| explicit newcomer task (tier + type, e.g. "Середні → Оновлювати статті") | mode set by task type — see below |
|
|
37
38
|
| en.wikipedia.org URL, no uk equivalent | **Translate** — new uk article |
|
|
38
39
|
| uk.wikipedia.org URL, stub or thin | **Expand** |
|
|
39
40
|
| uk.wikipedia.org URL with `{{Без джерел}}` / `{{Джерело}}` | **Source** |
|
|
40
41
|
| uk.wikipedia.org URL, prose/format problems | **Cleanup** |
|
|
41
42
|
| "what should I edit next" | **Plan** — read `references/strategy.md`, propose a ranked list |
|
|
42
43
|
|
|
44
|
+
When a newcomer task type is given, it **overrides** the state-based guess above. The per-type scope contract in `references/newcomer-tasks.md` is binding — an assigned type is a ceiling on what the edit may touch, not a floor.
|
|
45
|
+
|
|
43
46
|
Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft against the wrong title.
|
|
44
47
|
|
|
45
48
|
### 2. Read before writing
|
|
@@ -49,6 +52,7 @@ Resolve the title first — `scripts/wiki.sh` handles redirects. Never draft aga
|
|
|
49
52
|
./scripts/wiki.sh get en "Title" # source-language wikitext
|
|
50
53
|
./scripts/wiki.sh langlink en "Title" uk # does a uk version already exist?
|
|
51
54
|
./scripts/wiki.sh check uk "Шаблон:Особа" # does this template/page exist?
|
|
55
|
+
./scripts/wiki.sh tasks <type> [n] # list candidates for a newcomer task type: copyedit|links|references|update|expand
|
|
52
56
|
```
|
|
53
57
|
|
|
54
58
|
Stop and report if:
|
|
@@ -83,21 +87,38 @@ Run every item. Report failures rather than hiding them.
|
|
|
83
87
|
- [ ] No original synthesis (ВП:ОД)
|
|
84
88
|
- [ ] Dates, numbers, and name transliterations are Ukrainian-correct
|
|
85
89
|
- [ ] Edit summary written in Ukrainian and states what changed and why
|
|
90
|
+
- [ ] The edit stayed inside the assigned task type's allowed scope
|
|
91
|
+
- [ ] Any maintenance template removed was actually earned — the underlying problem is genuinely fixed
|
|
86
92
|
|
|
87
93
|
### 6. Deliver
|
|
88
94
|
|
|
89
|
-
|
|
95
|
+
For Expand / Source / Cleanup: fetch the current wikitext, apply the changes programmatically (a small Python pass over the fetched file, asserting each anchor string matched exactly once), and write the whole resulting article out. Verify it before delivering — section list intact, every intended change landed, nothing else dropped.
|
|
96
|
+
|
|
97
|
+
Write the draft to a scratch file: the raw `.wiki` file contains nothing but article wikitext (the full final article, ready to paste over the whole edit box); the human-readable explanation of what changed goes in a separate `.md`. Print the edit summary, and tell the human exactly where to paste it:
|
|
90
98
|
|
|
91
99
|
- new article → `https://uk.wikipedia.org/wiki/Тайтл?action=edit`
|
|
92
|
-
-
|
|
100
|
+
- existing article → `https://uk.wikipedia.org/w/index.php?title=Тайтл&action=edit`, replace the whole edit box
|
|
93
101
|
- test first → `Вікіпедія:Пісочниця` or the user's own `Користувач:Ім'я/Чернетка`
|
|
94
102
|
|
|
103
|
+
End the delivery with a copy-to-clipboard command in its own fenced block, using a quoted absolute path — quoted because scratchpad paths contain characters the shell will otherwise mangle — always the raw `.wiki` file, never the `.md`:
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
pbcopy < "/absolute/path/to/slug.wiki"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Add an optional second line when the edit summary is long enough to be worth copying:
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
printf '%s' 'Опис редагування…' | pbcopy
|
|
113
|
+
```
|
|
114
|
+
|
|
95
115
|
Then stop. Do not offer to save it.
|
|
96
116
|
|
|
97
117
|
## References
|
|
98
118
|
|
|
99
119
|
- `references/strategy.md` — the contribution strategy: what to farm, in what order, and how to build standing without getting flagged
|
|
100
120
|
- `references/wikitext-uk.md` — verified uk templates, citation formats, article skeletons, policy shortcuts
|
|
121
|
+
- `references/newcomer-tasks.md` — the newcomer task tiers (Легкі/Середні/Важкі) and the binding scope contract for each task type
|
|
101
122
|
- `scripts/wiki.sh` — read-only MediaWiki API helper
|
|
102
123
|
|
|
103
124
|
## Verification
|