@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.
Files changed (45) hide show
  1. package/.claude-plugin/plugin.json +4 -2
  2. package/.cursor-plugin/index.json +5 -0
  3. package/.grok-plugin/index.json +5 -0
  4. package/.kiro/steering/website-analytics-bootstrap.md +159 -0
  5. package/.kiro/steering/wikipedia-uk-editor.md +24 -3
  6. package/.windsurf/rules/website-analytics-bootstrap.md +158 -0
  7. package/.windsurf/rules/wikipedia-uk-editor.md +24 -3
  8. package/README.md +8 -6
  9. package/catalog/skills.json +42 -0
  10. package/collections/marketing.json +1 -1
  11. package/collections/software-development.json +2 -1
  12. package/package.json +1 -1
  13. package/packages/marketing/website-analytics-bootstrap/SKILL.md +171 -0
  14. package/packages/marketing/website-analytics-bootstrap/adapters/claude/plugin.json +5 -0
  15. package/packages/marketing/website-analytics-bootstrap/adapters/claude/skills/website-analytics-bootstrap/SKILL.md +172 -0
  16. package/packages/marketing/website-analytics-bootstrap/adapters/cursor/plugin.json +6 -0
  17. package/packages/marketing/website-analytics-bootstrap/adapters/cursor/skills/website-analytics-bootstrap/SKILL.md +172 -0
  18. package/packages/marketing/website-analytics-bootstrap/adapters/grok/plugin.json +6 -0
  19. package/packages/marketing/website-analytics-bootstrap/adapters/grok/skills/website-analytics-bootstrap/SKILL.md +172 -0
  20. package/packages/marketing/website-analytics-bootstrap/adapters/kiro/steering/website-analytics-bootstrap.md +159 -0
  21. package/packages/marketing/website-analytics-bootstrap/adapters/windsurf/rules/website-analytics-bootstrap.md +158 -0
  22. package/packages/software-development/shared-knowledge-artifact/SKILL.md +89 -0
  23. package/packages/software-development/shared-knowledge-artifact/adapters/claude/plugin.json +5 -0
  24. package/packages/software-development/shared-knowledge-artifact/adapters/claude/skills/shared-knowledge-artifact/SKILL.md +90 -0
  25. package/packages/software-development/shared-knowledge-artifact/adapters/claude/skills/shared-knowledge-artifact/references/prompt.txt +78 -0
  26. package/packages/software-development/shared-knowledge-artifact/references/prompt.txt +78 -0
  27. package/packages/software-development/wikipedia-uk-editor/SKILL.md +24 -3
  28. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/SKILL.md +24 -3
  29. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  30. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/references/strategy.md +10 -0
  31. package/packages/software-development/wikipedia-uk-editor/adapters/claude/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
  32. package/packages/software-development/wikipedia-uk-editor/adapters/codex/README.md +39 -9
  33. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/SKILL.md +24 -3
  34. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  35. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/references/strategy.md +10 -0
  36. package/packages/software-development/wikipedia-uk-editor/adapters/cursor/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
  37. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/SKILL.md +24 -3
  38. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  39. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/references/strategy.md +10 -0
  40. package/packages/software-development/wikipedia-uk-editor/adapters/grok/skills/wikipedia-uk-editor/scripts/wiki.sh +58 -2
  41. package/packages/software-development/wikipedia-uk-editor/adapters/kiro/steering/wikipedia-uk-editor.md +24 -3
  42. package/packages/software-development/wikipedia-uk-editor/adapters/windsurf/rules/wikipedia-uk-editor.md +24 -3
  43. package/packages/software-development/wikipedia-uk-editor/references/newcomer-tasks.md +80 -0
  44. package/packages/software-development/wikipedia-uk-editor/references/strategy.md +10 -0
  45. package/packages/software-development/wikipedia-uk-editor/scripts/wiki.sh +58 -2
@@ -0,0 +1,172 @@
1
+ ---
2
+ name: website-analytics-bootstrap
3
+ description: Set up a website's first SEO analytics loop end-to-end: persistent SerpBear rank tracking, Google Search Console, seeded keywords, read-only technical audits, and Telegram alerts on a local host or NAS.
4
+ license: MIT
5
+ allowed-tools: Bash, Read, Write, Edit
6
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires network access, a reachable deployment host, and owner-provided Search Console and alert credentials.
7
+ metadata:
8
+ targets: [_source-only]
9
+ author: Oleg Koval
10
+ tags:
11
+ - seo
12
+ - analytics
13
+ - google-search-console
14
+ - serpbear
15
+ - nas
16
+ - telegram
17
+ - monitoring
18
+ ---
19
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
20
+
21
+ > 🤖 *Auto-generated by **weekly-pattern-learner** · reusable first-run website analytics onboarding workflow derived from a validated local/NAS setup pattern*
22
+
23
+ # website-analytics-bootstrap
24
+
25
+ Build a repeatable, observable SEO analytics loop for a website without making unapproved content or code changes.
26
+
27
+ ## Outcome
28
+
29
+ At completion, the operator has:
30
+
31
+ - persistent rank tracking for the target domain and a small, evidence-based keyword seed set;
32
+ - Google Search Console connected to the correct property and verified with a real API query;
33
+ - daily rank/Search Console refreshes;
34
+ - a read-only technical audit for key pages, `robots.txt`, and `sitemap.xml`;
35
+ - Telegram alerts for failures and a weekly health summary;
36
+ - saved reports, raw HTTP responses, logs, schedules, credentials locations, and a concise handoff.
37
+
38
+ This skill automates observation and reporting. Website edits, SEO copy changes, indexing submissions, and deployments remain approval-gated.
39
+
40
+ ## First-run questions
41
+
42
+ Ask at most three questions only when the answer cannot be discovered safely:
43
+
44
+ 1. What is the canonical website URL and which host/NAS should run the service?
45
+ 2. Which Google Search Console property should be used: Domain or URL-prefix?
46
+ 3. Should alerts use an existing Telegram bot/chat, or should the owner create one?
47
+
48
+ Never ask the user to paste private keys, bot tokens, passwords, or app passwords into chat. Accept them through the target UI, a secure secret store, or a protected host file.
49
+
50
+ ## Workflow
51
+
52
+ ### 1. Inspect before changing anything
53
+
54
+ - Read project-local agent instructions and inspect `.claude/scripts/` before making HTTP tooling.
55
+ - Check the current repository, remote, dirty worktree, deployment files, and existing analytics/monitoring integrations.
56
+ - Resolve the host using read-only checks. Prefer the reachable VPN/Tailscale address when the LAN address is unavailable.
57
+ - Check Docker/Container Manager, Node, Python/uv, systemd, and the host's supported scheduler.
58
+ - Preserve unrelated worktree changes. Do not reset, delete, or overwrite broad directories.
59
+ - Check whether an existing skill already covers post-connection GSC indexing analysis; use `search-console-indexing-audit` for that later phase instead of duplicating it.
60
+
61
+ ### 2. Choose the deployment path
62
+
63
+ Prefer a persistent container when Docker is healthy. If Docker is unavailable or broken, use the supported native runtime as a deliberate fallback:
64
+
65
+ - pin the application version used for the setup;
66
+ - store application source separately from persistent data;
67
+ - set a non-default port and an explicit application URL;
68
+ - run under a least-privilege service user;
69
+ - keep secrets in a protected environment file, never in source, shell history, logs, or reports;
70
+ - build and run the production application before configuring automation.
71
+
72
+ Before applying any persistent setup, credential or permission changes, enabling the scheduler, or performing Telegram delivery or test actions, require explicit owner confirmation for that specific action. If confirmation is absent, default to a no-op and do not perform the action. Record the confirmation outcome alongside the actual path, runtime, port, service user, and rollback/restart command.
73
+
74
+ ### 3. Configure SerpBear
75
+
76
+ - Create or verify the admin account without printing the password.
77
+ - Configure a supported scraper/proxy such as SerpApi through the UI or protected settings.
78
+ - Set daily scraping with a conservative strategy and retry behavior appropriate to API quotas.
79
+ - Add the canonical domain exactly once.
80
+ - Seed 8–12 phrases from visible services, locations, and positioning. Start with a mix of branded, service, and location queries; do not invent volume or ranking claims.
81
+ - Verify at least one real rank result and record the initial baseline.
82
+
83
+ Keyword seed examples should be generated from the target site's actual language, for example `{service} photographer`, `{service} {city}`, and the brand name. Expand the list only after Search Console supplies real queries or the owner confirms the market.
84
+
85
+ ### 4. Connect Google Search Console
86
+
87
+ Use a Google Cloud service account created for this integration:
88
+
89
+ 1. Create a JSON key in the service account's **Keys** tab. Keyless authentication is preferred when supported; otherwise document owner-approved rotation schedule, replacement procedure in SerpBear, and immediate disable/delete revocation steps for compromised or retired JSON keys.
90
+ 2. Enable the Google Search Console API in that same Cloud project.
91
+ 3. Add the service account's `client_email` as a **Restricted** user (with read-only access) on the exact Search Console property, retaining the existing `webmasters.readonly` scope and query-validation steps.
92
+ 4. Enter `client_email` and the JSON `private_key` into SerpBear through its protected settings UI.
93
+ 5. Match the property type precisely:
94
+ - Domain property → `sc-domain:example.com`.
95
+ - URL-prefix property → configure the exact URL, including protocol and trailing slash when required.
96
+ 6. Trigger a real query and inspect the response. A saved credential flag is not proof of connectivity.
97
+
98
+ Diagnose in this order:
99
+
100
+ - `403 accessNotConfigured` → enable the Search Console API;
101
+ - `403 Forbidden` → verify the property type and service-account user on that exact property;
102
+ - key/decoder errors → verify the full PEM value and newline handling;
103
+ - empty rows with a successful request → report “connected, no data yet,” not a failure.
104
+
105
+ ### 5. Add the read-only technical audit
106
+
107
+ Use a reusable project-local script or the target runtime's equivalent for repeated HTTP checks. Save every raw response and reproduction metadata before analysis. At minimum check:
108
+
109
+ - `/`, `/work` or the primary portfolio route;
110
+ - the main service/booking route;
111
+ - `/about` and `/contact`;
112
+ - `/robots.txt`;
113
+ - `/sitemap.xml`.
114
+
115
+ For HTML pages, inspect status, title, meta description, canonical, and accidental `noindex`. For robots and sitemap, inspect status, content type, parseability, and sitemap URL count. Do not infer indexation from a 200 response; use Search Console for index status.
116
+
117
+ Before saving artifacts, sanitize HTTP response headers and body fields by removing session-bearing Set-Cookie values and personal data. Restrict artifact file permissions to owner-read-write only and enforce bounded retention with automatic deletion of artifacts older than the documented retention period. Write a JSON report with timestamp, checked URLs, status, latency, issue list, sitemap count, and artifact paths using only sanitized data. Logs must be structured and must not contain credentials or full secret-bearing request data.
118
+
119
+ ### 6. Schedule and alert
120
+
121
+ Prefer a persistent systemd service/timer. If the host cannot install a system unit, use the host's supported scheduler or stop and ask for an operator-approved scheduler change; do not silently assume a user crontab exists.
122
+
123
+ Recommended behavior:
124
+
125
+ - daily audit;
126
+ - immediate Telegram notification only when an actionable issue appears;
127
+ - one weekly healthy/degraded summary;
128
+ - forced test notification during setup;
129
+ - bounded report/artifact retention so daily raw responses cannot fill the NAS.
130
+
131
+ Reuse an existing Telegram bot only when it is explicitly in the same owner scope. Keep bot token and chat ID in a protected environment file and redact them from all output.
132
+
133
+ ### 7. Verify every gate
134
+
135
+ Before claiming completion, verify all of the following:
136
+
137
+ - the web service responds with HTTP 200 on its configured port;
138
+ - the target domain and initial keywords are visible in SerpBear;
139
+ - at least one rank query succeeds;
140
+ - Search Console API query succeeds or returns a clearly documented no-data result;
141
+ - the audit runs successfully and writes a report plus raw artifacts;
142
+ - the scheduler is enabled and its next run is visible;
143
+ - a forced Telegram test succeeds;
144
+ - a simulated or observed failure produces a bounded, actionable notification;
145
+ - logs contain no passwords, private keys, bot tokens, or raw credential payloads;
146
+ - the final report identifies what is automatic, what remains approval-gated, and where to find logs/reports.
147
+
148
+ ## Failure boundaries
149
+
150
+ Stop and ask for direction when:
151
+
152
+ - the target host or property cannot be identified without guessing;
153
+ - credentials are missing and cannot be entered through a secure UI or host file;
154
+ - the desired alert destination is ambiguous;
155
+ - enabling a scheduler requires a destructive or broad privilege change;
156
+ - the requested automation would edit or publish site content without approval.
157
+
158
+ Do not claim “connected” because settings were saved. Do not claim “indexed” because a page returned 200. Do not claim SEO improvement before a baseline and a later comparison exist.
159
+
160
+ ## Handoff format
161
+
162
+ Return a compact handoff containing:
163
+
164
+ - target domain and deployment URL/port;
165
+ - SerpBear version and scraper mode;
166
+ - keyword count and initial baseline;
167
+ - Search Console property type and verification result;
168
+ - audit scope and latest issue count;
169
+ - Telegram schedule and test result;
170
+ - report/log/artifact locations;
171
+ - any manual action still required;
172
+ - explicit statement that no site content or code was changed unless approved.
@@ -0,0 +1,159 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Set up a website's first SEO analytics loop with persistent SerpBear rank tracking, Google Search Console, seeded keywords, read-only technical audits, and Telegram alerts on a local host or NAS."
6
+ ---
7
+
8
+ > 🤖 *Auto-generated by **weekly-pattern-learner** · reusable first-run website analytics onboarding workflow derived from a validated local/NAS setup pattern*
9
+
10
+ # website-analytics-bootstrap
11
+
12
+ Build a repeatable, observable SEO analytics loop for a website without making unapproved content or code changes.
13
+
14
+ ## Outcome
15
+
16
+ At completion, the operator has:
17
+
18
+ - persistent rank tracking for the target domain and a small, evidence-based keyword seed set;
19
+ - Google Search Console connected to the correct property and verified with a real API query;
20
+ - daily rank/Search Console refreshes;
21
+ - a read-only technical audit for key pages, `robots.txt`, and `sitemap.xml`;
22
+ - Telegram alerts for failures and a weekly health summary;
23
+ - saved reports, raw HTTP responses, logs, schedules, credentials locations, and a concise handoff.
24
+
25
+ This skill automates observation and reporting. Website edits, SEO copy changes, indexing submissions, and deployments remain approval-gated.
26
+
27
+ ## First-run questions
28
+
29
+ Ask at most three questions only when the answer cannot be discovered safely:
30
+
31
+ 1. What is the canonical website URL and which host/NAS should run the service?
32
+ 2. Which Google Search Console property should be used: Domain or URL-prefix?
33
+ 3. Should alerts use an existing Telegram bot/chat, or should the owner create one?
34
+
35
+ Never ask the user to paste private keys, bot tokens, passwords, or app passwords into chat. Accept them through the target UI, a secure secret store, or a protected host file.
36
+
37
+ ## Workflow
38
+
39
+ ### 1. Inspect before changing anything
40
+
41
+ - Read project-local agent instructions and inspect `.claude/scripts/` before making HTTP tooling.
42
+ - Check the current repository, remote, dirty worktree, deployment files, and existing analytics/monitoring integrations.
43
+ - Resolve the host using read-only checks. Prefer the reachable VPN/Tailscale address when the LAN address is unavailable.
44
+ - Check Docker/Container Manager, Node, Python/uv, systemd, and the host's supported scheduler.
45
+ - Preserve unrelated worktree changes. Do not reset, delete, or overwrite broad directories.
46
+ - Check whether an existing skill already covers post-connection GSC indexing analysis; use `search-console-indexing-audit` for that later phase instead of duplicating it.
47
+
48
+ ### 2. Choose the deployment path
49
+
50
+ Prefer a persistent container when Docker is healthy. If Docker is unavailable or broken, use the supported native runtime as a deliberate fallback:
51
+
52
+ - pin the application version used for the setup;
53
+ - store application source separately from persistent data;
54
+ - set a non-default port and an explicit application URL;
55
+ - run under a least-privilege service user;
56
+ - keep secrets in a protected environment file, never in source, shell history, logs, or reports;
57
+ - build and run the production application before configuring automation.
58
+
59
+ Before applying any persistent setup, credential or permission changes, enabling the scheduler, or performing Telegram delivery or test actions, require explicit owner confirmation for that specific action. If confirmation is absent, default to a no-op and do not perform the action. Record the confirmation outcome alongside the actual path, runtime, port, service user, and rollback/restart command.
60
+
61
+ ### 3. Configure SerpBear
62
+
63
+ - Create or verify the admin account without printing the password.
64
+ - Configure a supported scraper/proxy such as SerpApi through the UI or protected settings.
65
+ - Set daily scraping with a conservative strategy and retry behavior appropriate to API quotas.
66
+ - Add the canonical domain exactly once.
67
+ - Seed 8–12 phrases from visible services, locations, and positioning. Start with a mix of branded, service, and location queries; do not invent volume or ranking claims.
68
+ - Verify at least one real rank result and record the initial baseline.
69
+
70
+ Keyword seed examples should be generated from the target site's actual language, for example `{service} photographer`, `{service} {city}`, and the brand name. Expand the list only after Search Console supplies real queries or the owner confirms the market.
71
+
72
+ ### 4. Connect Google Search Console
73
+
74
+ Use a Google Cloud service account created for this integration:
75
+
76
+ 1. Create a JSON key in the service account's **Keys** tab. Keyless authentication is preferred when supported; otherwise document owner-approved rotation schedule, replacement procedure in SerpBear, and immediate disable/delete revocation steps for compromised or retired JSON keys.
77
+ 2. Enable the Google Search Console API in that same Cloud project.
78
+ 3. Add the service account's `client_email` as a **Restricted** user (with read-only access) on the exact Search Console property, retaining the existing `webmasters.readonly` scope and query-validation steps.
79
+ 4. Enter `client_email` and the JSON `private_key` into SerpBear through its protected settings UI.
80
+ 5. Match the property type precisely:
81
+ - Domain property → `sc-domain:example.com`.
82
+ - URL-prefix property → configure the exact URL, including protocol and trailing slash when required.
83
+ 6. Trigger a real query and inspect the response. A saved credential flag is not proof of connectivity.
84
+
85
+ Diagnose in this order:
86
+
87
+ - `403 accessNotConfigured` → enable the Search Console API;
88
+ - `403 Forbidden` → verify the property type and service-account user on that exact property;
89
+ - key/decoder errors → verify the full PEM value and newline handling;
90
+ - empty rows with a successful request → report “connected, no data yet,” not a failure.
91
+
92
+ ### 5. Add the read-only technical audit
93
+
94
+ Use a reusable project-local script or the target runtime's equivalent for repeated HTTP checks. Save every raw response and reproduction metadata before analysis. At minimum check:
95
+
96
+ - `/`, `/work` or the primary portfolio route;
97
+ - the main service/booking route;
98
+ - `/about` and `/contact`;
99
+ - `/robots.txt`;
100
+ - `/sitemap.xml`.
101
+
102
+ For HTML pages, inspect status, title, meta description, canonical, and accidental `noindex`. For robots and sitemap, inspect status, content type, parseability, and sitemap URL count. Do not infer indexation from a 200 response; use Search Console for index status.
103
+
104
+ Before saving artifacts, sanitize HTTP response headers and body fields by removing session-bearing Set-Cookie values and personal data. Restrict artifact file permissions to owner-read-write only and enforce bounded retention with automatic deletion of artifacts older than the documented retention period. Write a JSON report with timestamp, checked URLs, status, latency, issue list, sitemap count, and artifact paths using only sanitized data. Logs must be structured and must not contain credentials or full secret-bearing request data.
105
+
106
+ ### 6. Schedule and alert
107
+
108
+ Prefer a persistent systemd service/timer. If the host cannot install a system unit, use the host's supported scheduler or stop and ask for an operator-approved scheduler change; do not silently assume a user crontab exists.
109
+
110
+ Recommended behavior:
111
+
112
+ - daily audit;
113
+ - immediate Telegram notification only when an actionable issue appears;
114
+ - one weekly healthy/degraded summary;
115
+ - forced test notification during setup;
116
+ - bounded report/artifact retention so daily raw responses cannot fill the NAS.
117
+
118
+ Reuse an existing Telegram bot only when it is explicitly in the same owner scope. Keep bot token and chat ID in a protected environment file and redact them from all output.
119
+
120
+ ### 7. Verify every gate
121
+
122
+ Before claiming completion, verify all of the following:
123
+
124
+ - the web service responds with HTTP 200 on its configured port;
125
+ - the target domain and initial keywords are visible in SerpBear;
126
+ - at least one rank query succeeds;
127
+ - Search Console API query succeeds or returns a clearly documented no-data result;
128
+ - the audit runs successfully and writes a report plus raw artifacts;
129
+ - the scheduler is enabled and its next run is visible;
130
+ - a forced Telegram test succeeds;
131
+ - a simulated or observed failure produces a bounded, actionable notification;
132
+ - logs contain no passwords, private keys, bot tokens, or raw credential payloads;
133
+ - the final report identifies what is automatic, what remains approval-gated, and where to find logs/reports.
134
+
135
+ ## Failure boundaries
136
+
137
+ Stop and ask for direction when:
138
+
139
+ - the target host or property cannot be identified without guessing;
140
+ - credentials are missing and cannot be entered through a secure UI or host file;
141
+ - the desired alert destination is ambiguous;
142
+ - enabling a scheduler requires a destructive or broad privilege change;
143
+ - the requested automation would edit or publish site content without approval.
144
+
145
+ Do not claim “connected” because settings were saved. Do not claim “indexed” because a page returned 200. Do not claim SEO improvement before a baseline and a later comparison exist.
146
+
147
+ ## Handoff format
148
+
149
+ Return a compact handoff containing:
150
+
151
+ - target domain and deployment URL/port;
152
+ - SerpBear version and scraper mode;
153
+ - keyword count and initial baseline;
154
+ - Search Console property type and verification result;
155
+ - audit scope and latest issue count;
156
+ - Telegram schedule and test result;
157
+ - report/log/artifact locations;
158
+ - any manual action still required;
159
+ - explicit statement that no site content or code was changed unless approved.
@@ -0,0 +1,158 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Set up a website's first SEO analytics loop with persistent SerpBear rank tracking, Google Search Console, seeded keywords, read-only technical audits, and Telegram alerts on a local host or NAS."
5
+ ---
6
+
7
+ > 🤖 *Auto-generated by **weekly-pattern-learner** · reusable first-run website analytics onboarding workflow derived from a validated local/NAS setup pattern*
8
+
9
+ # website-analytics-bootstrap
10
+
11
+ Build a repeatable, observable SEO analytics loop for a website without making unapproved content or code changes.
12
+
13
+ ## Outcome
14
+
15
+ At completion, the operator has:
16
+
17
+ - persistent rank tracking for the target domain and a small, evidence-based keyword seed set;
18
+ - Google Search Console connected to the correct property and verified with a real API query;
19
+ - daily rank/Search Console refreshes;
20
+ - a read-only technical audit for key pages, `robots.txt`, and `sitemap.xml`;
21
+ - Telegram alerts for failures and a weekly health summary;
22
+ - saved reports, raw HTTP responses, logs, schedules, credentials locations, and a concise handoff.
23
+
24
+ This skill automates observation and reporting. Website edits, SEO copy changes, indexing submissions, and deployments remain approval-gated.
25
+
26
+ ## First-run questions
27
+
28
+ Ask at most three questions only when the answer cannot be discovered safely:
29
+
30
+ 1. What is the canonical website URL and which host/NAS should run the service?
31
+ 2. Which Google Search Console property should be used: Domain or URL-prefix?
32
+ 3. Should alerts use an existing Telegram bot/chat, or should the owner create one?
33
+
34
+ Never ask the user to paste private keys, bot tokens, passwords, or app passwords into chat. Accept them through the target UI, a secure secret store, or a protected host file.
35
+
36
+ ## Workflow
37
+
38
+ ### 1. Inspect before changing anything
39
+
40
+ - Read project-local agent instructions and inspect `.claude/scripts/` before making HTTP tooling.
41
+ - Check the current repository, remote, dirty worktree, deployment files, and existing analytics/monitoring integrations.
42
+ - Resolve the host using read-only checks. Prefer the reachable VPN/Tailscale address when the LAN address is unavailable.
43
+ - Check Docker/Container Manager, Node, Python/uv, systemd, and the host's supported scheduler.
44
+ - Preserve unrelated worktree changes. Do not reset, delete, or overwrite broad directories.
45
+ - Check whether an existing skill already covers post-connection GSC indexing analysis; use `search-console-indexing-audit` for that later phase instead of duplicating it.
46
+
47
+ ### 2. Choose the deployment path
48
+
49
+ Prefer a persistent container when Docker is healthy. If Docker is unavailable or broken, use the supported native runtime as a deliberate fallback:
50
+
51
+ - pin the application version used for the setup;
52
+ - store application source separately from persistent data;
53
+ - set a non-default port and an explicit application URL;
54
+ - run under a least-privilege service user;
55
+ - keep secrets in a protected environment file, never in source, shell history, logs, or reports;
56
+ - build and run the production application before configuring automation.
57
+
58
+ Before applying any persistent setup, credential or permission changes, enabling the scheduler, or performing Telegram delivery or test actions, require explicit owner confirmation for that specific action. If confirmation is absent, default to a no-op and do not perform the action. Record the confirmation outcome alongside the actual path, runtime, port, service user, and rollback/restart command.
59
+
60
+ ### 3. Configure SerpBear
61
+
62
+ - Create or verify the admin account without printing the password.
63
+ - Configure a supported scraper/proxy such as SerpApi through the UI or protected settings.
64
+ - Set daily scraping with a conservative strategy and retry behavior appropriate to API quotas.
65
+ - Add the canonical domain exactly once.
66
+ - Seed 8–12 phrases from visible services, locations, and positioning. Start with a mix of branded, service, and location queries; do not invent volume or ranking claims.
67
+ - Verify at least one real rank result and record the initial baseline.
68
+
69
+ Keyword seed examples should be generated from the target site's actual language, for example `{service} photographer`, `{service} {city}`, and the brand name. Expand the list only after Search Console supplies real queries or the owner confirms the market.
70
+
71
+ ### 4. Connect Google Search Console
72
+
73
+ Use a Google Cloud service account created for this integration:
74
+
75
+ 1. Create a JSON key in the service account's **Keys** tab. Keyless authentication is preferred when supported; otherwise document owner-approved rotation schedule, replacement procedure in SerpBear, and immediate disable/delete revocation steps for compromised or retired JSON keys.
76
+ 2. Enable the Google Search Console API in that same Cloud project.
77
+ 3. Add the service account's `client_email` as a **Restricted** user (with read-only access) on the exact Search Console property, retaining the existing `webmasters.readonly` scope and query-validation steps.
78
+ 4. Enter `client_email` and the JSON `private_key` into SerpBear through its protected settings UI.
79
+ 5. Match the property type precisely:
80
+ - Domain property → `sc-domain:example.com`.
81
+ - URL-prefix property → configure the exact URL, including protocol and trailing slash when required.
82
+ 6. Trigger a real query and inspect the response. A saved credential flag is not proof of connectivity.
83
+
84
+ Diagnose in this order:
85
+
86
+ - `403 accessNotConfigured` → enable the Search Console API;
87
+ - `403 Forbidden` → verify the property type and service-account user on that exact property;
88
+ - key/decoder errors → verify the full PEM value and newline handling;
89
+ - empty rows with a successful request → report “connected, no data yet,” not a failure.
90
+
91
+ ### 5. Add the read-only technical audit
92
+
93
+ Use a reusable project-local script or the target runtime's equivalent for repeated HTTP checks. Save every raw response and reproduction metadata before analysis. At minimum check:
94
+
95
+ - `/`, `/work` or the primary portfolio route;
96
+ - the main service/booking route;
97
+ - `/about` and `/contact`;
98
+ - `/robots.txt`;
99
+ - `/sitemap.xml`.
100
+
101
+ For HTML pages, inspect status, title, meta description, canonical, and accidental `noindex`. For robots and sitemap, inspect status, content type, parseability, and sitemap URL count. Do not infer indexation from a 200 response; use Search Console for index status.
102
+
103
+ Before saving artifacts, sanitize HTTP response headers and body fields by removing session-bearing Set-Cookie values and personal data. Restrict artifact file permissions to owner-read-write only and enforce bounded retention with automatic deletion of artifacts older than the documented retention period. Write a JSON report with timestamp, checked URLs, status, latency, issue list, sitemap count, and artifact paths using only sanitized data. Logs must be structured and must not contain credentials or full secret-bearing request data.
104
+
105
+ ### 6. Schedule and alert
106
+
107
+ Prefer a persistent systemd service/timer. If the host cannot install a system unit, use the host's supported scheduler or stop and ask for an operator-approved scheduler change; do not silently assume a user crontab exists.
108
+
109
+ Recommended behavior:
110
+
111
+ - daily audit;
112
+ - immediate Telegram notification only when an actionable issue appears;
113
+ - one weekly healthy/degraded summary;
114
+ - forced test notification during setup;
115
+ - bounded report/artifact retention so daily raw responses cannot fill the NAS.
116
+
117
+ Reuse an existing Telegram bot only when it is explicitly in the same owner scope. Keep bot token and chat ID in a protected environment file and redact them from all output.
118
+
119
+ ### 7. Verify every gate
120
+
121
+ Before claiming completion, verify all of the following:
122
+
123
+ - the web service responds with HTTP 200 on its configured port;
124
+ - the target domain and initial keywords are visible in SerpBear;
125
+ - at least one rank query succeeds;
126
+ - Search Console API query succeeds or returns a clearly documented no-data result;
127
+ - the audit runs successfully and writes a report plus raw artifacts;
128
+ - the scheduler is enabled and its next run is visible;
129
+ - a forced Telegram test succeeds;
130
+ - a simulated or observed failure produces a bounded, actionable notification;
131
+ - logs contain no passwords, private keys, bot tokens, or raw credential payloads;
132
+ - the final report identifies what is automatic, what remains approval-gated, and where to find logs/reports.
133
+
134
+ ## Failure boundaries
135
+
136
+ Stop and ask for direction when:
137
+
138
+ - the target host or property cannot be identified without guessing;
139
+ - credentials are missing and cannot be entered through a secure UI or host file;
140
+ - the desired alert destination is ambiguous;
141
+ - enabling a scheduler requires a destructive or broad privilege change;
142
+ - the requested automation would edit or publish site content without approval.
143
+
144
+ Do not claim “connected” because settings were saved. Do not claim “indexed” because a page returned 200. Do not claim SEO improvement before a baseline and a later comparison exist.
145
+
146
+ ## Handoff format
147
+
148
+ Return a compact handoff containing:
149
+
150
+ - target domain and deployment URL/port;
151
+ - SerpBear version and scraper mode;
152
+ - keyword count and initial baseline;
153
+ - Search Console property type and verification result;
154
+ - audit scope and latest issue count;
155
+ - Telegram schedule and test result;
156
+ - report/log/artifact locations;
157
+ - any manual action still required;
158
+ - explicit statement that no site content or code was changed unless approved.
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: shared-knowledge-artifact
3
+ description: Build a shared, self-persisting knowledge ledger as a Claude Artifact — a private page that stores its own data, renders itself from that data, and saves new versions of itself, so several agents can read the same lessons before starting work and append to them afterwards. Use when the user wants agents to learn from each other, asks for a shared knowledge base, lessons-learned log, gotcha ledger, or cross-agent memory page they can hand to other sessions.
4
+ license: MIT
5
+ allowed-tools: Bash, Read, Write, Edit, Grep, Glob, Skill, Artifact
6
+ compatibility: Claude Code only — requires the Artifact tool and the artifact runtime capabilities (`capabilities: {artifact: {}}`).
7
+ metadata:
8
+ author: Oleg Koval
9
+ package: shared-knowledge-artifact
10
+ tags:
11
+ - artifacts
12
+ - knowledge-base
13
+ - multi-agent
14
+ - memory
15
+ - lessons-learned
16
+ - documentation
17
+ ---
18
+
19
+ # shared-knowledge-artifact
20
+
21
+ Publish one private Artifact page that acts as an append-only knowledge ledger which multiple agents (and the user) read before starting work and write to when reality corrects them. The page **is** the record: it stores its own data and publishes new versions of itself, so nothing depends on a server or on local files.
22
+
23
+ ## Trigger phrases
24
+
25
+ - create a shared artifact my other agents can learn from
26
+ - shared knowledge base / lessons-learned log / gotcha ledger for agents
27
+ - cross-agent memory page
28
+ - somewhere agents can record what they learned so they don't repeat it
29
+
30
+ ## Before writing any code
31
+
32
+ 1. Invoke the `artifact-capabilities` skill — mandatory before declaring `capabilities` or writing any `window.claude.*` code.
33
+ 2. Invoke the `artifact-design` skill — calibrates the design treatment.
34
+ 3. Read the user's actual rules (`CLAUDE.md`, any verification/preferences doc, agent memory) and **seed the ledger with 6-10 real lessons already recorded there**. No lorem, no invented examples — a ledger that opens with fake entries never gets used.
35
+
36
+ ## Persistence mechanism
37
+
38
+ - Declare `capabilities: {artifact: {}}` at publish time.
39
+ - Store the data as a JSON object inside `<script type="application/json" id="ledger-state">`. That block is the authoritative record; the visible page is **rendered from it** at load. Never serialize the live DOM to save.
40
+ - To persist: snapshot `document.documentElement.outerHTML` **once at script start** (pristine source, before any rendering), then on save splice the new JSON into that snapshot's `#ledger-state` block, prepend `<!doctype html>`, and call `artifact.publish(doc)`.
41
+ - Get the namespace with `const artifact = await claude.use("artifact")`; branch on `null` (this view cannot write) and render a read-only state instead of a broken control.
42
+ - Handle publish errors by code: `conflict` means someone published first and every view reloads to the winner — no retry, tell the person to re-add; `not_granted` / `not_writer` means read-only.
43
+ - Publish only after an explicit user action, never on load; batch rapid edits into one publish.
44
+ - Escape `</script` when writing the JSON back, and escape every interpolated note field on render.
45
+
46
+ ## Note schema
47
+
48
+ One fact per entry:
49
+
50
+ ```json
51
+ {"id":"n9","kind":"lesson|trap|pref","scope":"shell|review|github|...",
52
+ "title":"the rule in one line",
53
+ "body":"the concrete behaviour, specific enough to act on",
54
+ "why":"the failure that made this a rule",
55
+ "author":"model or agent name","date":"YYYY-MM-DD"}
56
+ ```
57
+
58
+ Kinds: **lesson** = a habit that holds; **trap** = something that silently produces a *wrong* answer; **pref** = how the user wants the work done.
59
+
60
+ ## UI the page must have
61
+
62
+ - Header: name, one paragraph on what the ledger is for, and live counts (total, traps, lessons, preferences) in `tabular-nums`.
63
+ - Note list, newest first: kind tag, scope tag, author, date, title, body, and a `Why:` line. Kind tags use semantic colour (trap = critical, pref = warning, lesson = accent), separate from the page accent.
64
+ - Scope filter chips derived from the data, including an `all` chip, with `aria-pressed` state.
65
+ - An "Add a note" form (kind, scope, author, title, body, why) that appends to the JSON and publishes, with an inline status line reporting published / conflict / read-only.
66
+ - A "Protocol for agents" section **on the page itself**: read the page with the Artifact tool `action: "read"` before substantive work; parse the `#ledger-state` JSON, never scrape the DOM; **append, don't rewrite**; re-read before writing because another agent may have published since; one fact per note with the failure that caused it. Include the schema snippet.
67
+ - Gatekeeping copy: only non-obvious, durable, cross-cutting lessons. If a repo's `CLAUDE.md` already says it, or a review bot already catches it, leave it out — a littered ledger is worse than a thin one.
68
+
69
+ ## Design constraints
70
+
71
+ - Utilitarian but genuinely polished: this is a reference document, not a landing page. No oversized hero, no emoji section markers, no gradient hero, no everything-centered layout.
72
+ - Avoid the AI-default looks: warm cream + serif + terracotta, near-black + acid green, Inter or Space Grotesk as the "safe" face.
73
+ - Pair a display face, a body face, and a mono utility face from Google Fonts (the only permitted external host), each with a real fallback stack.
74
+ - Theme-aware in all three states: full light palette as tokens on bare `:root`; redefined under `@media (prefers-color-scheme: dark)` guarded as `:root:not([data-theme="light"])`; redefined again under `:root[data-theme="dark"]`. Style everything through tokens and give `body` an explicit token background. No colour whose only definition sits inside a media or `[data-theme]` block.
75
+ - Layout with flex/grid + `gap`, not per-element margins. Wide content in its own `overflow-x: auto` container. Visible focus states. Respect `prefers-reduced-motion`.
76
+ - Title: a short, specific noun-phrase product name (2-4 words), no dash-explainer. Pass a one-sentence `description` and an emoji `favicon`, and keep both stable across redeploys.
77
+
78
+ ## Deliverable
79
+
80
+ Write the HTML to a file, publish it with the Artifact tool, then report:
81
+
82
+ - the URL;
83
+ - that it stays private until shared from the page's share menu;
84
+ - the exact instructions another agent needs — read via Artifact `action: "read"` with that URL, and write by appending to `notes` and republishing **with `url` set to that URL** (a publish *without* `url` forks a separate artifact instead of updating this one).
85
+
86
+ ## Notes
87
+
88
+ - The full copy-paste prompt version of this workflow lives in `references/prompt.txt` — hand it to another agent or session verbatim.
89
+ - Redeploy by republishing the same file path in the same conversation, or by passing `url` from any other conversation.
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "olko-shared-knowledge-artifact",
3
+ "description": "Build a shared, self-persisting knowledge ledger as a Claude Artifact: a private page that stores its own data, renders itself from it, and publishes new versions of itself so several agents read the same lessons before working and append to them afterwards.",
4
+ "skills": "./skills"
5
+ }