@olegkoval/agent-skills 1.53.0 → 1.54.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.
@@ -21,6 +21,7 @@ Available reusable prompt files:
21
21
  - copilotloop: .github/prompts/copilotloop.prompt.md
22
22
  - geminiloop: .github/prompts/geminiloop.prompt.md
23
23
  - ci-fix-loop: .github/prompts/ci-fix-loop.prompt.md
24
+ - nas-actions-migration: .github/prompts/nas-actions-migration.prompt.md
24
25
  - dependabot-triage: .github/prompts/dependabot-triage.prompt.md
25
26
  - git-commit: .github/prompts/git-commit.prompt.md
26
27
  - gh-cli: .github/prompts/gh-cli.prompt.md
@@ -0,0 +1,74 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Safely migrates trusted GitHub Actions jobs to a repository-scoped NAS runner, with fork guards, credential boundaries, rollback, and verified activation."
5
+ ---
6
+
7
+ Use the olko:nas-actions-migration skill.
8
+
9
+ # NAS Actions Migration
10
+
11
+ Migrate eligible GitHub Actions jobs from hosted runners to a dedicated, repository-scoped NAS runner, following the proven Roazon and Funda Radar pattern. This workflow prepares repository changes and documents runner provisioning; it does not claim migration complete until jobs actually execute on the named NAS runner. Never put deployment credentials on a persistent self-hosted runner unless the user explicitly approves that trust boundary.
12
+
13
+ ## When to Use
14
+
15
+ Use when asked to move Actions/CI jobs to a NAS, copy the Roazon/Funda Radar runner setup, or establish a repeatable NAS migration for another repository.
16
+
17
+ ## Prerequisites
18
+
19
+ - Authenticated `gh` with access to the target repo and its Actions settings.
20
+ - SSH/admin access to the NAS and an approved secret manager for durable runner credentials.
21
+ - Read repository instructions and the target workflows before changing them.
22
+ - Inspect existing comparable repos; treat runner names, labels, commands, and service-specific workflow behavior as examples, not copy-ready values.
23
+
24
+ ## Procedure
25
+
26
+ 1. **Inventory the target.** Record every workflow, job, `runs-on`, trigger, fork behavior, required secrets, runtime/dependency setup, timeouts, deploy side effects, and current status. Determine the repository default branch and ensure the checkout is clean. Check existing repository runners and variables:
27
+
28
+ ```sh
29
+ gh api repos/OWNER/REPO/actions/runners --jq '.runners[] | {name,status,labels:[.labels[].name]}'
30
+ gh variable list --repo OWNER/REPO
31
+ ```
32
+
33
+ 2. **Inspect a known-good migration.** Compare the requested repository with the live `roazon` and `funda-radar` workflows and runner docs. Use a unique runner label for the target repo: repository-scoped runners cannot be shared across repositories. Never assume a label, runner container, or variable is already present.
34
+
35
+ 3. **Classify jobs.** Move builds/tests/lint and other trusted, non-secret CI work first. Keep deploy jobs on hosted runners by default so deploy credentials never reach the NAS. Move additional jobs only after assessing credential exposure, untrusted code paths, network/data access, persistence, and resource requirements. Preserve existing required checks and non-blocking semantics.
36
+
37
+ 4. **Route through an explicit opt-in variable.** Use a repository variable such as `CI_RUNNER=nas`, with a hosted-runner fallback until activation:
38
+
39
+ ```yaml
40
+ runs-on: ${{ vars.CI_RUNNER == 'nas' && fromJSON('["self-hosted","linux","REPO-nas"]') || 'ubuntu-latest' }}
41
+ ```
42
+
43
+ For every job that can execute repository-controlled code on the NAS, add a fork guard:
44
+
45
+ ```yaml
46
+ if: >-
47
+ github.event_name != 'pull_request'
48
+ || github.event.pull_request.head.repo.full_name == github.repository
49
+ ```
50
+
51
+ Guard each job independently. Never rely on a downstream job's guard to protect an unguarded dependency. Add exact toolchain setup because runner images may not contain Node, Bun, browsers, Docker, or compatible system libraries.
52
+
53
+ 5. **Document provisioning and rollback.** Provide the target repo's exact runner name, label, container/image, dedicated work directory, ephemeral/restart settings, required tool installation, safe secret storage, and health check. For persistent runners, use a narrowly scoped fine-grained PAT with repository Administration read/write in the NAS secret store; pass it as `ACCESS_TOKEN` only via a root-readable env file. Do not print, commit, message, or substitute a short-lived registration token for a restart-persistent credential. Never reuse another repo's `/_work` or token.
54
+
55
+ Document rollback as deleting the opt-in variable, which routes eligible jobs back to `ubuntu-latest`. State that this fallback still depends on GitHub Actions billing being available.
56
+
57
+ 6. **Provision before activation.** Confirm the target repository runner is online and has `self-hosted`, `Linux`, and the exact repo label. If there is no approved NAS access/token, stop before registration and leave the variable unset. Never create a fake runner or assume an online runner in another repo is usable.
58
+
59
+ 7. **Activate and exercise the real path.** Set the repository variable only after runner readiness. Dispatch each affected workflow on a trusted branch, then inspect run/job details and confirm every moved job reports the intended `runner_name`, expected runner labels, and passes. A green result on `ubuntu-latest`, a skipped job, or a successful deployment-provider status does not verify NAS execution.
60
+
61
+ 8. **Recheck safety and report.** Review the final diff, validate workflow syntax, run any local lint/tests available, and inspect for unsafe fork access, missing setup, accidental secret exposure, and unintended deploy changes. Report changed workflows, moved and intentionally unmoved jobs, runner readiness, verification run URLs and runner names, rollback command, and blockers. Do not say “migrated” while registration or NAS execution remains unverified.
62
+
63
+ ## Pitfalls
64
+
65
+ - GitHub repository runners are scoped to their repository unless deliberately configured as organization runners; the Roazon and Funda runners do not automatically serve a third repo.
66
+ - `CI_RUNNER=nas` is opt-in routing, not runner provisioning. Setting it before registration leaves jobs queued or failed.
67
+ - Self-hosted runners execute untrusted code with the runner host's access. Fork guards are mandatory, and persistent workspaces must be isolated.
68
+ - The current runner container may lack a runtime or compatible glibc. Test project-specific integration jobs on the exact image before declaring success.
69
+ - A billing-blocked hosted fallback cannot rescue a failed/offline NAS runner.
70
+ - Do not migrate deploy credentials or mutate production service settings as incidental cleanup.
71
+
72
+ ## Verification
73
+
74
+ Migration is complete only when (a) the target runner is online with the expected repo-specific label, (b) every intended job's run metadata names that runner, (c) the required jobs pass on a trusted ref, (d) fork-origin jobs are skipped before reaching NAS, and (e) rollback to hosted routing is documented and can be applied. Otherwise report **prepared, not activated/verified** with the exact missing prerequisite.
package/README.md CHANGED
@@ -206,6 +206,7 @@ Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descripti
206
206
  | [copilotloop](plugins/olko-github-pr/skills/copilotloop/SKILL.md) | Iteratively drives a GitHub PR to zero unresolved GitHub Copilot review comments, verifying each finding against the real code first and rebutting false positives instead of editing correct code | Clearing a Copilot review without cargo-culting its suggestions |
207
207
  | [geminiloop](plugins/olko-github-pr/skills/geminiloop/SKILL.md) | Iteratively drives a GitHub PR to zero unresolved Gemini Code Assist comments, treating each as a claim to verify, fixing the correct ones and rebutting the rest with evidence | Clearing a Gemini Code Assist review whose findings need checking first |
208
208
  | [ci-fix-loop](plugins/olko-github-pr/skills/ci-fix-loop/SKILL.md) | Diagnoses GitHub Actions CI failures in a loop: fetches failing check logs, applies a targeted fix, pushes, and waits for the next run, repeating until green or a blocker needs a human | CI is red after a push and you want it driven to green automatically |
209
+ | [nas-actions-migration](plugins/olko-github-pr/skills/nas-actions-migration/SKILL.md) | Safely migrates trusted GitHub Actions jobs to a repository-scoped NAS runner, with fork guards, credential boundaries, rollback, and verified activation | Moving CI jobs from hosted runners to a NAS, following the Roazon/Funda Radar pattern |
209
210
  | [dependabot-triage](plugins/olko-github-pr/skills/dependabot-triage/SKILL.md) | Triages open Dependabot and Renovate PRs in bulk: classifies by risk tier, auto-approves safe patch bumps, flags breaking major upgrades for human review, and posts a digest | Clearing a backlog of dependency update PRs during a maintenance window |
210
211
  | [lekker-review](plugins/olko-github-pr/skills/lekker-review/SKILL.md) | Runs a FAANG-quality PR review in an isolated worktree: parallel specialist agents, adversarial finding verification, proof-of-bug tests for Criticals, and an optional --fix mode that applies and commits its own findings (Claude Workflow or Codex native collaboration) | Reviewing a GitHub PR beyond what a single-pass review or a bot reviewer catches |
211
212
 
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: nas-actions-migration
3
+ description: Migrate GitHub Actions jobs to a repository-scoped NAS runner safely.
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 authenticated GitHub CLI, repository access, and NAS runner administration.
7
+ metadata:
8
+ targets: [_source-only]
9
+ author: Oleg Koval
10
+ tags:
11
+ - github-actions
12
+ - self-hosted-runner
13
+ - nas
14
+ - ci
15
+ - deployment
16
+ - migration
17
+ ---
18
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
19
+
20
+ # NAS Actions Migration
21
+
22
+ Migrate eligible GitHub Actions jobs from hosted runners to a dedicated, repository-scoped NAS runner, following the proven Roazon and Funda Radar pattern. This workflow prepares repository changes and documents runner provisioning; it does not claim migration complete until jobs actually execute on the named NAS runner. Never put deployment credentials on a persistent self-hosted runner unless the user explicitly approves that trust boundary.
23
+
24
+ ## When to Use
25
+
26
+ Use when asked to move Actions/CI jobs to a NAS, copy the Roazon/Funda Radar runner setup, or establish a repeatable NAS migration for another repository.
27
+
28
+ ## Prerequisites
29
+
30
+ - Authenticated `gh` with access to the target repo and its Actions settings.
31
+ - SSH/admin access to the NAS and an approved secret manager for durable runner credentials.
32
+ - Read repository instructions and the target workflows before changing them.
33
+ - Inspect existing comparable repos; treat runner names, labels, commands, and service-specific workflow behavior as examples, not copy-ready values.
34
+
35
+ ## Procedure
36
+
37
+ 1. **Inventory the target.** Record every workflow, job, `runs-on`, trigger, fork behavior, required secrets, runtime/dependency setup, timeouts, deploy side effects, and current status. Determine the repository default branch and ensure the checkout is clean. Check existing repository runners and variables:
38
+
39
+ ```sh
40
+ gh api repos/OWNER/REPO/actions/runners --jq '.runners[] | {name,status,labels:[.labels[].name]}'
41
+ gh variable list --repo OWNER/REPO
42
+ ```
43
+
44
+ 2. **Inspect a known-good migration.** Compare the requested repository with the live `roazon` and `funda-radar` workflows and runner docs. Use a unique runner label for the target repo: repository-scoped runners cannot be shared across repositories. Never assume a label, runner container, or variable is already present.
45
+
46
+ 3. **Classify jobs.** Move builds/tests/lint and other trusted, non-secret CI work first. Keep deploy jobs on hosted runners by default so deploy credentials never reach the NAS. Move additional jobs only after assessing credential exposure, untrusted code paths, network/data access, persistence, and resource requirements. Preserve existing required checks and non-blocking semantics.
47
+
48
+ 4. **Route through an explicit opt-in variable.** Use a repository variable such as `CI_RUNNER=nas`, with a hosted-runner fallback until activation:
49
+
50
+ ```yaml
51
+ runs-on: ${{ vars.CI_RUNNER == 'nas' && fromJSON('["self-hosted","linux","REPO-nas"]') || 'ubuntu-latest' }}
52
+ ```
53
+
54
+ For every job that can execute repository-controlled code on the NAS, add a fork guard:
55
+
56
+ ```yaml
57
+ if: >-
58
+ github.event_name != 'pull_request'
59
+ || github.event.pull_request.head.repo.full_name == github.repository
60
+ ```
61
+
62
+ Guard each job independently. Never rely on a downstream job's guard to protect an unguarded dependency. Add exact toolchain setup because runner images may not contain Node, Bun, browsers, Docker, or compatible system libraries.
63
+
64
+ 5. **Document provisioning and rollback.** Provide the target repo's exact runner name, label, container/image, dedicated work directory, ephemeral/restart settings, required tool installation, safe secret storage, and health check. For persistent runners, use a narrowly scoped fine-grained PAT with repository Administration read/write in the NAS secret store; pass it as `ACCESS_TOKEN` only via a root-readable env file. Do not print, commit, message, or substitute a short-lived registration token for a restart-persistent credential. Never reuse another repo's `/_work` or token.
65
+
66
+ Document rollback as deleting the opt-in variable, which routes eligible jobs back to `ubuntu-latest`. State that this fallback still depends on GitHub Actions billing being available.
67
+
68
+ 6. **Provision before activation.** Confirm the target repository runner is online and has `self-hosted`, `Linux`, and the exact repo label. If there is no approved NAS access/token, stop before registration and leave the variable unset. Never create a fake runner or assume an online runner in another repo is usable.
69
+
70
+ 7. **Activate and exercise the real path.** Set the repository variable only after runner readiness. Dispatch each affected workflow on a trusted branch, then inspect run/job details and confirm every moved job reports the intended `runner_name`, expected runner labels, and passes. A green result on `ubuntu-latest`, a skipped job, or a successful deployment-provider status does not verify NAS execution.
71
+
72
+ 8. **Recheck safety and report.** Review the final diff, validate workflow syntax, run any local lint/tests available, and inspect for unsafe fork access, missing setup, accidental secret exposure, and unintended deploy changes. Report changed workflows, moved and intentionally unmoved jobs, runner readiness, verification run URLs and runner names, rollback command, and blockers. Do not say “migrated” while registration or NAS execution remains unverified.
73
+
74
+ ## Pitfalls
75
+
76
+ - GitHub repository runners are scoped to their repository unless deliberately configured as organization runners; the Roazon and Funda runners do not automatically serve a third repo.
77
+ - `CI_RUNNER=nas` is opt-in routing, not runner provisioning. Setting it before registration leaves jobs queued or failed.
78
+ - Self-hosted runners execute untrusted code with the runner host's access. Fork guards are mandatory, and persistent workspaces must be isolated.
79
+ - The current runner container may lack a runtime or compatible glibc. Test project-specific integration jobs on the exact image before declaring success.
80
+ - A billing-blocked hosted fallback cannot rescue a failed/offline NAS runner.
81
+ - Do not migrate deploy credentials or mutate production service settings as incidental cleanup.
82
+
83
+ ## Verification
84
+
85
+ Migration is complete only when (a) the target runner is online with the expected repo-specific label, (b) every intended job's run metadata names that runner, (c) the required jobs pass on a trusted ref, (d) fork-origin jobs are skipped before reaching NAS, and (e) rollback to hosted routing is documented and can be applied. Otherwise report **prepared, not activated/verified** with the exact missing prerequisite.
@@ -14,5 +14,6 @@ Use the canonical skills directly:
14
14
  - `plugins/olko-github-pr/skills/copilotloop/SKILL.md`
15
15
  - `plugins/olko-github-pr/skills/geminiloop/SKILL.md`
16
16
  - `plugins/olko-github-pr/skills/ci-fix-loop/SKILL.md`
17
+ - `plugins/olko-github-pr/skills/nas-actions-migration/SKILL.md`
17
18
  - `plugins/olko-github-pr/skills/dependabot-triage/SKILL.md`
18
19
  - `plugins/olko-github-pr/skills/lekker-review/SKILL.md`
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: nas-actions-migration
3
+ description: Migrate GitHub Actions jobs to a repository-scoped NAS runner safely.
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 authenticated GitHub CLI, repository access, and NAS runner administration.
7
+ metadata:
8
+ targets: [_source-only]
9
+ author: Oleg Koval
10
+ tags:
11
+ - github-actions
12
+ - self-hosted-runner
13
+ - nas
14
+ - ci
15
+ - deployment
16
+ - migration
17
+ ---
18
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
19
+
20
+ # NAS Actions Migration
21
+
22
+ Migrate eligible GitHub Actions jobs from hosted runners to a dedicated, repository-scoped NAS runner, following the proven Roazon and Funda Radar pattern. This workflow prepares repository changes and documents runner provisioning; it does not claim migration complete until jobs actually execute on the named NAS runner. Never put deployment credentials on a persistent self-hosted runner unless the user explicitly approves that trust boundary.
23
+
24
+ ## When to Use
25
+
26
+ Use when asked to move Actions/CI jobs to a NAS, copy the Roazon/Funda Radar runner setup, or establish a repeatable NAS migration for another repository.
27
+
28
+ ## Prerequisites
29
+
30
+ - Authenticated `gh` with access to the target repo and its Actions settings.
31
+ - SSH/admin access to the NAS and an approved secret manager for durable runner credentials.
32
+ - Read repository instructions and the target workflows before changing them.
33
+ - Inspect existing comparable repos; treat runner names, labels, commands, and service-specific workflow behavior as examples, not copy-ready values.
34
+
35
+ ## Procedure
36
+
37
+ 1. **Inventory the target.** Record every workflow, job, `runs-on`, trigger, fork behavior, required secrets, runtime/dependency setup, timeouts, deploy side effects, and current status. Determine the repository default branch and ensure the checkout is clean. Check existing repository runners and variables:
38
+
39
+ ```sh
40
+ gh api repos/OWNER/REPO/actions/runners --jq '.runners[] | {name,status,labels:[.labels[].name]}'
41
+ gh variable list --repo OWNER/REPO
42
+ ```
43
+
44
+ 2. **Inspect a known-good migration.** Compare the requested repository with the live `roazon` and `funda-radar` workflows and runner docs. Use a unique runner label for the target repo: repository-scoped runners cannot be shared across repositories. Never assume a label, runner container, or variable is already present.
45
+
46
+ 3. **Classify jobs.** Move builds/tests/lint and other trusted, non-secret CI work first. Keep deploy jobs on hosted runners by default so deploy credentials never reach the NAS. Move additional jobs only after assessing credential exposure, untrusted code paths, network/data access, persistence, and resource requirements. Preserve existing required checks and non-blocking semantics.
47
+
48
+ 4. **Route through an explicit opt-in variable.** Use a repository variable such as `CI_RUNNER=nas`, with a hosted-runner fallback until activation:
49
+
50
+ ```yaml
51
+ runs-on: ${{ vars.CI_RUNNER == 'nas' && fromJSON('["self-hosted","linux","REPO-nas"]') || 'ubuntu-latest' }}
52
+ ```
53
+
54
+ For every job that can execute repository-controlled code on the NAS, add a fork guard:
55
+
56
+ ```yaml
57
+ if: >-
58
+ github.event_name != 'pull_request'
59
+ || github.event.pull_request.head.repo.full_name == github.repository
60
+ ```
61
+
62
+ Guard each job independently. Never rely on a downstream job's guard to protect an unguarded dependency. Add exact toolchain setup because runner images may not contain Node, Bun, browsers, Docker, or compatible system libraries.
63
+
64
+ 5. **Document provisioning and rollback.** Provide the target repo's exact runner name, label, container/image, dedicated work directory, ephemeral/restart settings, required tool installation, safe secret storage, and health check. For persistent runners, use a narrowly scoped fine-grained PAT with repository Administration read/write in the NAS secret store; pass it as `ACCESS_TOKEN` only via a root-readable env file. Do not print, commit, message, or substitute a short-lived registration token for a restart-persistent credential. Never reuse another repo's `/_work` or token.
65
+
66
+ Document rollback as deleting the opt-in variable, which routes eligible jobs back to `ubuntu-latest`. State that this fallback still depends on GitHub Actions billing being available.
67
+
68
+ 6. **Provision before activation.** Confirm the target repository runner is online and has `self-hosted`, `Linux`, and the exact repo label. If there is no approved NAS access/token, stop before registration and leave the variable unset. Never create a fake runner or assume an online runner in another repo is usable.
69
+
70
+ 7. **Activate and exercise the real path.** Set the repository variable only after runner readiness. Dispatch each affected workflow on a trusted branch, then inspect run/job details and confirm every moved job reports the intended `runner_name`, expected runner labels, and passes. A green result on `ubuntu-latest`, a skipped job, or a successful deployment-provider status does not verify NAS execution.
71
+
72
+ 8. **Recheck safety and report.** Review the final diff, validate workflow syntax, run any local lint/tests available, and inspect for unsafe fork access, missing setup, accidental secret exposure, and unintended deploy changes. Report changed workflows, moved and intentionally unmoved jobs, runner readiness, verification run URLs and runner names, rollback command, and blockers. Do not say “migrated” while registration or NAS execution remains unverified.
73
+
74
+ ## Pitfalls
75
+
76
+ - GitHub repository runners are scoped to their repository unless deliberately configured as organization runners; the Roazon and Funda runners do not automatically serve a third repo.
77
+ - `CI_RUNNER=nas` is opt-in routing, not runner provisioning. Setting it before registration leaves jobs queued or failed.
78
+ - Self-hosted runners execute untrusted code with the runner host's access. Fork guards are mandatory, and persistent workspaces must be isolated.
79
+ - The current runner container may lack a runtime or compatible glibc. Test project-specific integration jobs on the exact image before declaring success.
80
+ - A billing-blocked hosted fallback cannot rescue a failed/offline NAS runner.
81
+ - Do not migrate deploy credentials or mutate production service settings as incidental cleanup.
82
+
83
+ ## Verification
84
+
85
+ Migration is complete only when (a) the target runner is online with the expected repo-specific label, (b) every intended job's run metadata names that runner, (c) the required jobs pass on a trusted ref, (d) fork-origin jobs are skipped before reaching NAS, and (e) rollback to hosted routing is documented and can be applied. Otherwise report **prepared, not activated/verified** with the exact missing prerequisite.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: nas-actions-migration
3
+ description: Migrate GitHub Actions jobs to a repository-scoped NAS runner safely.
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 authenticated GitHub CLI, repository access, and NAS runner administration.
7
+ metadata:
8
+ targets: [_source-only]
9
+ author: Oleg Koval
10
+ tags:
11
+ - github-actions
12
+ - self-hosted-runner
13
+ - nas
14
+ - ci
15
+ - deployment
16
+ - migration
17
+ ---
18
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
19
+
20
+ # NAS Actions Migration
21
+
22
+ Migrate eligible GitHub Actions jobs from hosted runners to a dedicated, repository-scoped NAS runner, following the proven Roazon and Funda Radar pattern. This workflow prepares repository changes and documents runner provisioning; it does not claim migration complete until jobs actually execute on the named NAS runner. Never put deployment credentials on a persistent self-hosted runner unless the user explicitly approves that trust boundary.
23
+
24
+ ## When to Use
25
+
26
+ Use when asked to move Actions/CI jobs to a NAS, copy the Roazon/Funda Radar runner setup, or establish a repeatable NAS migration for another repository.
27
+
28
+ ## Prerequisites
29
+
30
+ - Authenticated `gh` with access to the target repo and its Actions settings.
31
+ - SSH/admin access to the NAS and an approved secret manager for durable runner credentials.
32
+ - Read repository instructions and the target workflows before changing them.
33
+ - Inspect existing comparable repos; treat runner names, labels, commands, and service-specific workflow behavior as examples, not copy-ready values.
34
+
35
+ ## Procedure
36
+
37
+ 1. **Inventory the target.** Record every workflow, job, `runs-on`, trigger, fork behavior, required secrets, runtime/dependency setup, timeouts, deploy side effects, and current status. Determine the repository default branch and ensure the checkout is clean. Check existing repository runners and variables:
38
+
39
+ ```sh
40
+ gh api repos/OWNER/REPO/actions/runners --jq '.runners[] | {name,status,labels:[.labels[].name]}'
41
+ gh variable list --repo OWNER/REPO
42
+ ```
43
+
44
+ 2. **Inspect a known-good migration.** Compare the requested repository with the live `roazon` and `funda-radar` workflows and runner docs. Use a unique runner label for the target repo: repository-scoped runners cannot be shared across repositories. Never assume a label, runner container, or variable is already present.
45
+
46
+ 3. **Classify jobs.** Move builds/tests/lint and other trusted, non-secret CI work first. Keep deploy jobs on hosted runners by default so deploy credentials never reach the NAS. Move additional jobs only after assessing credential exposure, untrusted code paths, network/data access, persistence, and resource requirements. Preserve existing required checks and non-blocking semantics.
47
+
48
+ 4. **Route through an explicit opt-in variable.** Use a repository variable such as `CI_RUNNER=nas`, with a hosted-runner fallback until activation:
49
+
50
+ ```yaml
51
+ runs-on: ${{ vars.CI_RUNNER == 'nas' && fromJSON('["self-hosted","linux","REPO-nas"]') || 'ubuntu-latest' }}
52
+ ```
53
+
54
+ For every job that can execute repository-controlled code on the NAS, add a fork guard:
55
+
56
+ ```yaml
57
+ if: >-
58
+ github.event_name != 'pull_request'
59
+ || github.event.pull_request.head.repo.full_name == github.repository
60
+ ```
61
+
62
+ Guard each job independently. Never rely on a downstream job's guard to protect an unguarded dependency. Add exact toolchain setup because runner images may not contain Node, Bun, browsers, Docker, or compatible system libraries.
63
+
64
+ 5. **Document provisioning and rollback.** Provide the target repo's exact runner name, label, container/image, dedicated work directory, ephemeral/restart settings, required tool installation, safe secret storage, and health check. For persistent runners, use a narrowly scoped fine-grained PAT with repository Administration read/write in the NAS secret store; pass it as `ACCESS_TOKEN` only via a root-readable env file. Do not print, commit, message, or substitute a short-lived registration token for a restart-persistent credential. Never reuse another repo's `/_work` or token.
65
+
66
+ Document rollback as deleting the opt-in variable, which routes eligible jobs back to `ubuntu-latest`. State that this fallback still depends on GitHub Actions billing being available.
67
+
68
+ 6. **Provision before activation.** Confirm the target repository runner is online and has `self-hosted`, `Linux`, and the exact repo label. If there is no approved NAS access/token, stop before registration and leave the variable unset. Never create a fake runner or assume an online runner in another repo is usable.
69
+
70
+ 7. **Activate and exercise the real path.** Set the repository variable only after runner readiness. Dispatch each affected workflow on a trusted branch, then inspect run/job details and confirm every moved job reports the intended `runner_name`, expected runner labels, and passes. A green result on `ubuntu-latest`, a skipped job, or a successful deployment-provider status does not verify NAS execution.
71
+
72
+ 8. **Recheck safety and report.** Review the final diff, validate workflow syntax, run any local lint/tests available, and inspect for unsafe fork access, missing setup, accidental secret exposure, and unintended deploy changes. Report changed workflows, moved and intentionally unmoved jobs, runner readiness, verification run URLs and runner names, rollback command, and blockers. Do not say “migrated” while registration or NAS execution remains unverified.
73
+
74
+ ## Pitfalls
75
+
76
+ - GitHub repository runners are scoped to their repository unless deliberately configured as organization runners; the Roazon and Funda runners do not automatically serve a third repo.
77
+ - `CI_RUNNER=nas` is opt-in routing, not runner provisioning. Setting it before registration leaves jobs queued or failed.
78
+ - Self-hosted runners execute untrusted code with the runner host's access. Fork guards are mandatory, and persistent workspaces must be isolated.
79
+ - The current runner container may lack a runtime or compatible glibc. Test project-specific integration jobs on the exact image before declaring success.
80
+ - A billing-blocked hosted fallback cannot rescue a failed/offline NAS runner.
81
+ - Do not migrate deploy credentials or mutate production service settings as incidental cleanup.
82
+
83
+ ## Verification
84
+
85
+ Migration is complete only when (a) the target runner is online with the expected repo-specific label, (b) every intended job's run metadata names that runner, (c) the required jobs pass on a trusted ref, (d) fork-origin jobs are skipped before reaching NAS, and (e) rollback to hosted routing is documented and can be applied. Otherwise report **prepared, not activated/verified** with the exact missing prerequisite.
@@ -232,6 +232,27 @@
232
232
  "grok"
233
233
  ]
234
234
  },
235
+ {
236
+ "name": "nas-actions-migration",
237
+ "lookupName": "olko:nas-actions-migration",
238
+ "path": "plugins/olko-github-pr/skills/nas-actions-migration",
239
+ "description": "Safely migrates trusted GitHub Actions jobs to a repository-scoped NAS runner, with fork guards, credential boundaries, rollback, and verified activation.",
240
+ "tags": [
241
+ "github-actions",
242
+ "self-hosted-runner",
243
+ "nas",
244
+ "ci",
245
+ "deployment",
246
+ "migration"
247
+ ],
248
+ "adapters": [
249
+ "codex",
250
+ "claude",
251
+ "cursor",
252
+ "copilot",
253
+ "grok"
254
+ ]
255
+ },
235
256
  {
236
257
  "name": "dependabot-triage",
237
258
  "lookupName": "olko:dependabot-triage",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olegkoval/agent-skills",
3
- "version": "1.53.0",
3
+ "version": "1.54.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-apple-kit",
3
3
  "description": "Build and ship Apple platform apps: macOS menubar apps, App Store submissions.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-creative",
3
3
  "description": "Creative and personal projects: photo galleries, music players, listings, wiki editing.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-garmin-kit",
3
3
  "description": "Build, test and publish Garmin Connect IQ watch faces.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-git-tools",
3
3
  "description": "Everyday git and GitHub CLI operations: conventional commits, branch hygiene.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-github-pr",
3
3
  "description": "Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descriptions, dependency triage.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: nas-actions-migration
3
+ description: Migrate GitHub Actions jobs to a repository-scoped NAS runner safely.
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 authenticated GitHub CLI, repository access, and NAS runner administration.
7
+ metadata:
8
+ targets: [_source-only]
9
+ author: Oleg Koval
10
+ tags:
11
+ - github-actions
12
+ - self-hosted-runner
13
+ - nas
14
+ - ci
15
+ - deployment
16
+ - migration
17
+ ---
18
+
19
+ # NAS Actions Migration
20
+
21
+ Migrate eligible GitHub Actions jobs from hosted runners to a dedicated, repository-scoped NAS runner, following the proven Roazon and Funda Radar pattern. This workflow prepares repository changes and documents runner provisioning; it does not claim migration complete until jobs actually execute on the named NAS runner. Never put deployment credentials on a persistent self-hosted runner unless the user explicitly approves that trust boundary.
22
+
23
+ ## When to Use
24
+
25
+ Use when asked to move Actions/CI jobs to a NAS, copy the Roazon/Funda Radar runner setup, or establish a repeatable NAS migration for another repository.
26
+
27
+ ## Prerequisites
28
+
29
+ - Authenticated `gh` with access to the target repo and its Actions settings.
30
+ - SSH/admin access to the NAS and an approved secret manager for durable runner credentials.
31
+ - Read repository instructions and the target workflows before changing them.
32
+ - Inspect existing comparable repos; treat runner names, labels, commands, and service-specific workflow behavior as examples, not copy-ready values.
33
+
34
+ ## Procedure
35
+
36
+ 1. **Inventory the target.** Record every workflow, job, `runs-on`, trigger, fork behavior, required secrets, runtime/dependency setup, timeouts, deploy side effects, and current status. Determine the repository default branch and ensure the checkout is clean. Check existing repository runners and variables:
37
+
38
+ ```sh
39
+ gh api repos/OWNER/REPO/actions/runners --jq '.runners[] | {name,status,labels:[.labels[].name]}'
40
+ gh variable list --repo OWNER/REPO
41
+ ```
42
+
43
+ 2. **Inspect a known-good migration.** Compare the requested repository with the live `roazon` and `funda-radar` workflows and runner docs. Use a unique runner label for the target repo: repository-scoped runners cannot be shared across repositories. Never assume a label, runner container, or variable is already present.
44
+
45
+ 3. **Classify jobs.** Move builds/tests/lint and other trusted, non-secret CI work first. Keep deploy jobs on hosted runners by default so deploy credentials never reach the NAS. Move additional jobs only after assessing credential exposure, untrusted code paths, network/data access, persistence, and resource requirements. Preserve existing required checks and non-blocking semantics.
46
+
47
+ 4. **Route through an explicit opt-in variable.** Use a repository variable such as `CI_RUNNER=nas`, with a hosted-runner fallback until activation:
48
+
49
+ ```yaml
50
+ runs-on: ${{ vars.CI_RUNNER == 'nas' && fromJSON('["self-hosted","linux","REPO-nas"]') || 'ubuntu-latest' }}
51
+ ```
52
+
53
+ For every job that can execute repository-controlled code on the NAS, add a fork guard:
54
+
55
+ ```yaml
56
+ if: >-
57
+ github.event_name != 'pull_request'
58
+ || github.event.pull_request.head.repo.full_name == github.repository
59
+ ```
60
+
61
+ Guard each job independently. Never rely on a downstream job's guard to protect an unguarded dependency. Add exact toolchain setup because runner images may not contain Node, Bun, browsers, Docker, or compatible system libraries.
62
+
63
+ 5. **Document provisioning and rollback.** Provide the target repo's exact runner name, label, container/image, dedicated work directory, ephemeral/restart settings, required tool installation, safe secret storage, and health check. For persistent runners, use a narrowly scoped fine-grained PAT with repository Administration read/write in the NAS secret store; pass it as `ACCESS_TOKEN` only via a root-readable env file. Do not print, commit, message, or substitute a short-lived registration token for a restart-persistent credential. Never reuse another repo's `/_work` or token.
64
+
65
+ Document rollback as deleting the opt-in variable, which routes eligible jobs back to `ubuntu-latest`. State that this fallback still depends on GitHub Actions billing being available.
66
+
67
+ 6. **Provision before activation.** Confirm the target repository runner is online and has `self-hosted`, `Linux`, and the exact repo label. If there is no approved NAS access/token, stop before registration and leave the variable unset. Never create a fake runner or assume an online runner in another repo is usable.
68
+
69
+ 7. **Activate and exercise the real path.** Set the repository variable only after runner readiness. Dispatch each affected workflow on a trusted branch, then inspect run/job details and confirm every moved job reports the intended `runner_name`, expected runner labels, and passes. A green result on `ubuntu-latest`, a skipped job, or a successful deployment-provider status does not verify NAS execution.
70
+
71
+ 8. **Recheck safety and report.** Review the final diff, validate workflow syntax, run any local lint/tests available, and inspect for unsafe fork access, missing setup, accidental secret exposure, and unintended deploy changes. Report changed workflows, moved and intentionally unmoved jobs, runner readiness, verification run URLs and runner names, rollback command, and blockers. Do not say “migrated” while registration or NAS execution remains unverified.
72
+
73
+ ## Pitfalls
74
+
75
+ - GitHub repository runners are scoped to their repository unless deliberately configured as organization runners; the Roazon and Funda runners do not automatically serve a third repo.
76
+ - `CI_RUNNER=nas` is opt-in routing, not runner provisioning. Setting it before registration leaves jobs queued or failed.
77
+ - Self-hosted runners execute untrusted code with the runner host's access. Fork guards are mandatory, and persistent workspaces must be isolated.
78
+ - The current runner container may lack a runtime or compatible glibc. Test project-specific integration jobs on the exact image before declaring success.
79
+ - A billing-blocked hosted fallback cannot rescue a failed/offline NAS runner.
80
+ - Do not migrate deploy credentials or mutate production service settings as incidental cleanup.
81
+
82
+ ## Verification
83
+
84
+ Migration is complete only when (a) the target runner is online with the expected repo-specific label, (b) every intended job's run metadata names that runner, (c) the required jobs pass on a trusted ref, (d) fork-origin jobs are skipped before reaching NAS, and (e) rollback to hosted routing is documented and can be applied. Otherwise report **prepared, not activated/verified** with the exact missing prerequisite.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-obsidian",
3
3
  "description": "Keep an Obsidian vault in sync with work: PR sync, task rollover, morning routine.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-product",
3
3
  "description": "Take a product idea to a shippable build: MVP passes, full-stack scaffolds, UX/UI quality loops, launch plans.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-reflection",
3
3
  "description": "Look back and improve: self-critique, retrospectives, performance review, rapid learning.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-release",
3
3
  "description": "Ship a release: semantic-release setup, changelogs, store listing copy, release-day routine.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-skill-meta",
3
3
  "description": "Author and maintain agent skills and the AI toolchain itself.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-web-ops",
3
3
  "description": "Operate a website: WAF rules, search console audits, analytics bootstrap, docs indexes.",
4
- "version": "1.53.0",
4
+ "version": "1.54.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -7,7 +7,7 @@ export const PLUGIN_ASSIGNMENT = {
7
7
  description: 'Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descriptions, dependency triage.',
8
8
  skills: ['pr-finalize', 'pr-finalize-complete', 'pr-to-green', 'pr-description-writer',
9
9
  'qodoloop', 'coderabbitloop', 'codexloop', 'copilotloop', 'geminiloop', 'ci-fix-loop',
10
- 'dependabot-triage', 'lekker-review'],
10
+ 'dependabot-triage', 'lekker-review', 'nas-actions-migration'],
11
11
  },
12
12
  'olko-git-tools': {
13
13
  description: 'Everyday git and GitHub CLI operations: conventional commits, branch hygiene.',