@mokoconsulting/mcp-windows 3.0.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 (184) hide show
  1. package/.gitattributes +94 -0
  2. package/.gitmessage +9 -0
  3. package/.mokogitea/ISSUE_TEMPLATE/adr.md +110 -0
  4. package/.mokogitea/ISSUE_TEMPLATE/bug_report.md +48 -0
  5. package/.mokogitea/ISSUE_TEMPLATE/config.yml +18 -0
  6. package/.mokogitea/ISSUE_TEMPLATE/documentation.md +52 -0
  7. package/.mokogitea/ISSUE_TEMPLATE/feature_request.md +51 -0
  8. package/.mokogitea/ISSUE_TEMPLATE/mcp_api_integration.md +48 -0
  9. package/.mokogitea/ISSUE_TEMPLATE/mcp_connection_issue.md +67 -0
  10. package/.mokogitea/ISSUE_TEMPLATE/mcp_tool_request.md +49 -0
  11. package/.mokogitea/ISSUE_TEMPLATE/question.md +82 -0
  12. package/.mokogitea/ISSUE_TEMPLATE/rfc.md +126 -0
  13. package/.mokogitea/ISSUE_TEMPLATE/security.md +51 -0
  14. package/.mokogitea/ISSUE_TEMPLATE/version.md +24 -0
  15. package/.mokogitea/branch-protection.yml +251 -0
  16. package/.mokogitea/workflows/auto-assign.yml +76 -0
  17. package/.mokogitea/workflows/auto-bump.yml +66 -0
  18. package/.mokogitea/workflows/auto-dev-issue.yml +207 -0
  19. package/.mokogitea/workflows/auto-release.yml +421 -0
  20. package/.mokogitea/workflows/branch-cleanup.yml +48 -0
  21. package/.mokogitea/workflows/cascade-dev.yml +10 -0
  22. package/.mokogitea/workflows/changelog-validation.yml +101 -0
  23. package/.mokogitea/workflows/ci-generic.yml +191 -0
  24. package/.mokogitea/workflows/cleanup.yml +87 -0
  25. package/.mokogitea/workflows/codeql-analysis.yml +115 -0
  26. package/.mokogitea/workflows/copilot-agent.yml +44 -0
  27. package/.mokogitea/workflows/deploy-manual.yml +126 -0
  28. package/.mokogitea/workflows/enterprise-firewall-setup.yml +758 -0
  29. package/.mokogitea/workflows/gitleaks.yml +92 -0
  30. package/.mokogitea/workflows/issue-branch.yml +73 -0
  31. package/.mokogitea/workflows/mcp-auto-release.yml +278 -0
  32. package/.mokogitea/workflows/mcp-build-test.yml +65 -0
  33. package/.mokogitea/workflows/mcp-sdk-check.yml +109 -0
  34. package/.mokogitea/workflows/mcp-tool-inventory.yml +61 -0
  35. package/.mokogitea/workflows/notify.yml +70 -0
  36. package/.mokogitea/workflows/npm-publish.yml +113 -0
  37. package/.mokogitea/workflows/pr-check.yml +534 -0
  38. package/.mokogitea/workflows/pre-release.yml +252 -0
  39. package/.mokogitea/workflows/rc-revert.yml +66 -0
  40. package/.mokogitea/workflows/repo-health.yml +712 -0
  41. package/.mokogitea/workflows/repository-cleanup.yml +525 -0
  42. package/.mokogitea/workflows/security-audit.yml +82 -0
  43. package/.mokogitea/workflows/standards-compliance.yml +2614 -0
  44. package/.mokogitea/workflows/sync-version-on-merge.yml +133 -0
  45. package/.mokogitea/workflows/update-server.yml +312 -0
  46. package/.mokogitea/workflows/workflow-sync-trigger.yml +73 -0
  47. package/CHANGELOG.md +130 -0
  48. package/CLAUDE.md +49 -0
  49. package/CONTRIBUTING.md +161 -0
  50. package/ISSUES.md +601 -0
  51. package/Makefile +70 -0
  52. package/README.md +80 -0
  53. package/automation/ci-issue-reporter.sh +237 -0
  54. package/config.example.json +18 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.js +111 -0
  57. package/dist/shell.d.ts +50 -0
  58. package/dist/shell.js +209 -0
  59. package/dist/tools/apps.d.ts +3 -0
  60. package/dist/tools/apps.js +63 -0
  61. package/dist/tools/audio.d.ts +3 -0
  62. package/dist/tools/audio.js +142 -0
  63. package/dist/tools/audio_apps.d.ts +3 -0
  64. package/dist/tools/audio_apps.js +86 -0
  65. package/dist/tools/automation.d.ts +3 -0
  66. package/dist/tools/automation.js +261 -0
  67. package/dist/tools/bluetooth.d.ts +3 -0
  68. package/dist/tools/bluetooth.js +96 -0
  69. package/dist/tools/clipboard.d.ts +3 -0
  70. package/dist/tools/clipboard.js +118 -0
  71. package/dist/tools/config.d.ts +3 -0
  72. package/dist/tools/config.js +85 -0
  73. package/dist/tools/dialog.d.ts +3 -0
  74. package/dist/tools/dialog.js +72 -0
  75. package/dist/tools/display.d.ts +3 -0
  76. package/dist/tools/display.js +256 -0
  77. package/dist/tools/drives.d.ts +3 -0
  78. package/dist/tools/drives.js +98 -0
  79. package/dist/tools/environment.d.ts +3 -0
  80. package/dist/tools/environment.js +129 -0
  81. package/dist/tools/execute.d.ts +3 -0
  82. package/dist/tools/execute.js +28 -0
  83. package/dist/tools/filesystem.d.ts +3 -0
  84. package/dist/tools/filesystem.js +230 -0
  85. package/dist/tools/firewall.d.ts +3 -0
  86. package/dist/tools/firewall.js +108 -0
  87. package/dist/tools/hosts.d.ts +3 -0
  88. package/dist/tools/hosts.js +119 -0
  89. package/dist/tools/maintenance.d.ts +3 -0
  90. package/dist/tools/maintenance.js +236 -0
  91. package/dist/tools/netstat.d.ts +3 -0
  92. package/dist/tools/netstat.js +56 -0
  93. package/dist/tools/network.d.ts +3 -0
  94. package/dist/tools/network.js +70 -0
  95. package/dist/tools/notification.d.ts +3 -0
  96. package/dist/tools/notification.js +41 -0
  97. package/dist/tools/power.d.ts +3 -0
  98. package/dist/tools/power.js +104 -0
  99. package/dist/tools/printer.d.ts +3 -0
  100. package/dist/tools/printer.js +97 -0
  101. package/dist/tools/process.d.ts +3 -0
  102. package/dist/tools/process.js +54 -0
  103. package/dist/tools/process_kill.d.ts +3 -0
  104. package/dist/tools/process_kill.js +48 -0
  105. package/dist/tools/recycle_bin.d.ts +3 -0
  106. package/dist/tools/recycle_bin.js +108 -0
  107. package/dist/tools/registry.d.ts +3 -0
  108. package/dist/tools/registry.js +136 -0
  109. package/dist/tools/scheduler.d.ts +3 -0
  110. package/dist/tools/scheduler.js +116 -0
  111. package/dist/tools/service.d.ts +3 -0
  112. package/dist/tools/service.js +79 -0
  113. package/dist/tools/startup.d.ts +3 -0
  114. package/dist/tools/startup.js +159 -0
  115. package/dist/tools/storage.d.ts +3 -0
  116. package/dist/tools/storage.js +129 -0
  117. package/dist/tools/system.d.ts +3 -0
  118. package/dist/tools/system.js +84 -0
  119. package/dist/tools/system_mgmt.d.ts +3 -0
  120. package/dist/tools/system_mgmt.js +174 -0
  121. package/dist/tools/terminal.d.ts +3 -0
  122. package/dist/tools/terminal.js +80 -0
  123. package/dist/tools/theme.d.ts +3 -0
  124. package/dist/tools/theme.js +165 -0
  125. package/dist/tools/usb.d.ts +3 -0
  126. package/dist/tools/usb.js +52 -0
  127. package/dist/tools/virtual_desktop.d.ts +3 -0
  128. package/dist/tools/virtual_desktop.js +112 -0
  129. package/dist/tools/wifi.d.ts +3 -0
  130. package/dist/tools/wifi.js +136 -0
  131. package/dist/tools/window.d.ts +3 -0
  132. package/dist/tools/window.js +189 -0
  133. package/dist/tools/winget.d.ts +3 -0
  134. package/dist/tools/winget.js +79 -0
  135. package/dist/tools/wsl.d.ts +3 -0
  136. package/dist/tools/wsl.js +99 -0
  137. package/docs/API.md +63 -0
  138. package/docs/ARCHITECTURE.md +73 -0
  139. package/docs/INSTALLATION.md +102 -0
  140. package/docs/index.md +12 -0
  141. package/package.json +35 -0
  142. package/scripts/setup.mjs +123 -0
  143. package/src/index.ts +125 -0
  144. package/src/shell.ts +253 -0
  145. package/src/tools/apps.ts +76 -0
  146. package/src/tools/audio.ts +161 -0
  147. package/src/tools/audio_apps.ts +98 -0
  148. package/src/tools/automation.ts +297 -0
  149. package/src/tools/bluetooth.ts +114 -0
  150. package/src/tools/clipboard.ts +138 -0
  151. package/src/tools/config.ts +105 -0
  152. package/src/tools/dialog.ts +87 -0
  153. package/src/tools/display.ts +285 -0
  154. package/src/tools/drives.ts +124 -0
  155. package/src/tools/environment.ts +146 -0
  156. package/src/tools/execute.ts +35 -0
  157. package/src/tools/filesystem.ts +273 -0
  158. package/src/tools/firewall.ts +125 -0
  159. package/src/tools/hosts.ts +135 -0
  160. package/src/tools/maintenance.ts +299 -0
  161. package/src/tools/netstat.ts +72 -0
  162. package/src/tools/network.ts +84 -0
  163. package/src/tools/notification.ts +50 -0
  164. package/src/tools/power.ts +123 -0
  165. package/src/tools/printer.ts +114 -0
  166. package/src/tools/process.ts +80 -0
  167. package/src/tools/process_kill.ts +57 -0
  168. package/src/tools/recycle_bin.ts +126 -0
  169. package/src/tools/registry.ts +165 -0
  170. package/src/tools/scheduler.ts +140 -0
  171. package/src/tools/service.ts +102 -0
  172. package/src/tools/startup.ts +180 -0
  173. package/src/tools/storage.ts +141 -0
  174. package/src/tools/system.ts +99 -0
  175. package/src/tools/system_mgmt.ts +190 -0
  176. package/src/tools/terminal.ts +117 -0
  177. package/src/tools/theme.ts +205 -0
  178. package/src/tools/usb.ts +65 -0
  179. package/src/tools/virtual_desktop.ts +122 -0
  180. package/src/tools/wifi.ts +157 -0
  181. package/src/tools/window.ts +211 -0
  182. package/src/tools/winget.ts +100 -0
  183. package/src/tools/wsl.ts +112 -0
  184. package/tsconfig.json +19 -0
@@ -0,0 +1,10 @@
1
+ # DISABLED — auto-release Step 11 recreates dev from main after every release.
2
+ # Cascade-dev is redundant and causes version conflicts when both main and dev
3
+ # have different version numbers in templateDetails.xml / manifest.xml.
4
+ name: "Cascade Main → Dev (DISABLED)"
5
+ on: workflow_dispatch
6
+ jobs:
7
+ noop:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - run: echo "Cascade disabled — auto-release handles dev recreation"
@@ -0,0 +1,101 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # This file is part of a Moko Consulting project.
4
+ #
5
+ # SPDX-License-Identifier: GPL-3.0-or-later
6
+ #
7
+ # FILE INFORMATION
8
+ # DEFGROUP: GitHub.Workflow.Template
9
+ # INGROUP: MokoStandards.CI
10
+ # REPO: https://github.com/mokoconsulting-tech/MokoStandards
11
+ # PATH: /templates/workflows/shared/changelog-validation.yml.template
12
+ # VERSION: 04.06.00
13
+ # BRIEF: Validates CHANGELOG.md format and version consistency
14
+ # NOTE: Deployed to .mokogitea/workflows/changelog-validation.yml in governed repos.
15
+
16
+ name: "Universal: Changelog Validation"
17
+
18
+ on:
19
+ push:
20
+ branches:
21
+ - main
22
+ pull_request:
23
+ branches:
24
+ - main
25
+ workflow_dispatch:
26
+
27
+ permissions:
28
+ contents: read
29
+
30
+ env:
31
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
32
+
33
+ jobs:
34
+ validate-changelog:
35
+ name: Validate CHANGELOG.md
36
+ runs-on: ubuntu-latest
37
+
38
+ steps:
39
+ - name: Checkout repository
40
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
41
+
42
+ - name: Check CHANGELOG.md exists
43
+ run: |
44
+ echo "### Changelog Validation" >> $GITHUB_STEP_SUMMARY
45
+ if [ ! -f "CHANGELOG.md" ]; then
46
+ echo "CHANGELOG.md not found in repository root." >> $GITHUB_STEP_SUMMARY
47
+ exit 1
48
+ fi
49
+ echo "CHANGELOG.md exists." >> $GITHUB_STEP_SUMMARY
50
+
51
+ - name: Check VERSION header matches README.md
52
+ run: |
53
+ # Extract version from README.md FILE INFORMATION block
54
+ README_VERSION=$(grep -oP '^\s*VERSION:\s*\K[0-9]{2}\.[0-9]{2}\.[0-9]{2}' README.md | head -1)
55
+ if [ -z "$README_VERSION" ]; then
56
+ echo "No VERSION found in README.md FILE INFORMATION block." >> $GITHUB_STEP_SUMMARY
57
+ exit 1
58
+ fi
59
+
60
+ # Check that CHANGELOG.md has a matching version header
61
+ CHANGELOG_VERSION=$(grep -oP '^\#\#\s*\[\K[0-9]{2}\.[0-9]{2}\.[0-9]{2}' CHANGELOG.md | head -1)
62
+ if [ -z "$CHANGELOG_VERSION" ]; then
63
+ echo "No version header found in CHANGELOG.md (expected \`## [XX.YY.ZZ] - YYYY-MM-DD\`)." >> $GITHUB_STEP_SUMMARY
64
+ exit 1
65
+ fi
66
+
67
+ if [ "$CHANGELOG_VERSION" != "$README_VERSION" ]; then
68
+ echo "CHANGELOG latest version \`${CHANGELOG_VERSION}\` does not match README VERSION \`${README_VERSION}\`." >> $GITHUB_STEP_SUMMARY
69
+ exit 1
70
+ fi
71
+
72
+ echo "CHANGELOG version \`${CHANGELOG_VERSION}\` matches README VERSION." >> $GITHUB_STEP_SUMMARY
73
+
74
+ - name: Validate conventional changelog format
75
+ run: |
76
+ ERRORS=0
77
+
78
+ # Check that version entries follow ## [XX.YY.ZZ] - YYYY-MM-DD format
79
+ while IFS= read -r LINE; do
80
+ if ! echo "$LINE" | grep -qP '^\#\#\s*\[[0-9]{2}\.[0-9]{2}\.[0-9]{2}\]\s*-\s*[0-9]{4}-[0-9]{2}-[0-9]{2}'; then
81
+ echo "Malformed version header: \`${LINE}\`" >> $GITHUB_STEP_SUMMARY
82
+ echo " Expected format: \`## [XX.YY.ZZ] - YYYY-MM-DD\`" >> $GITHUB_STEP_SUMMARY
83
+ ERRORS=$((ERRORS + 1))
84
+ fi
85
+ done < <(grep -P '^\#\#\s*\[' CHANGELOG.md)
86
+
87
+ ENTRY_COUNT=$(grep -cP '^\#\#\s*\[' CHANGELOG.md || echo "0")
88
+ if [ "$ENTRY_COUNT" -eq 0 ]; then
89
+ echo "No version entries found in CHANGELOG.md." >> $GITHUB_STEP_SUMMARY
90
+ ERRORS=$((ERRORS + 1))
91
+ else
92
+ echo "Found ${ENTRY_COUNT} version entr(ies) in CHANGELOG.md." >> $GITHUB_STEP_SUMMARY
93
+ fi
94
+
95
+ echo "" >> $GITHUB_STEP_SUMMARY
96
+ if [ "${ERRORS}" -gt 0 ]; then
97
+ echo "**${ERRORS} format issue(s) found.**" >> $GITHUB_STEP_SUMMARY
98
+ exit 1
99
+ else
100
+ echo "**Changelog format validation passed.**" >> $GITHUB_STEP_SUMMARY
101
+ fi
@@ -0,0 +1,191 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+ #
5
+ # FILE INFORMATION
6
+ # DEFGROUP: Gitea.Workflow
7
+ # INGROUP: MokoStandards.CI
8
+ # REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Generic
9
+ # PATH: /.gitea/workflows/ci-generic.yml
10
+ # VERSION: 01.00.00
11
+ # BRIEF: CI pipeline — lint, validate, and test for generic projects (PHP + Node.js)
12
+
13
+ name: "Generic: Project CI"
14
+
15
+ on:
16
+ workflow_dispatch:
17
+
18
+ permissions:
19
+ contents: read
20
+
21
+ env:
22
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
23
+
24
+ jobs:
25
+ # ── Lint & Validate ───────────────────────────────────────────────────
26
+ lint:
27
+ name: Lint & Validate
28
+ runs-on: ubuntu-latest
29
+
30
+ steps:
31
+ - name: Checkout
32
+ uses: actions/checkout@v4
33
+
34
+ - name: Detect toolchain
35
+ id: detect
36
+ run: |
37
+ HAS_PHP=false
38
+ HAS_NODE=false
39
+ [ -f "composer.json" ] && HAS_PHP=true
40
+ [ -f "package.json" ] && HAS_NODE=true
41
+ echo "has_php=$HAS_PHP" >> "$GITHUB_OUTPUT"
42
+ echo "has_node=$HAS_NODE" >> "$GITHUB_OUTPUT"
43
+ echo "Toolchain: PHP=$HAS_PHP Node=$HAS_NODE"
44
+
45
+ - name: Setup PHP
46
+ if: steps.detect.outputs.has_php == 'true'
47
+ run: |
48
+ if ! command -v php &> /dev/null; then
49
+ sudo apt-get update -qq
50
+ sudo apt-get install -y -qq php-cli php-mbstring php-xml >/dev/null 2>&1
51
+ fi
52
+ php -v
53
+
54
+ - name: Setup Node.js
55
+ if: steps.detect.outputs.has_node == 'true'
56
+ uses: actions/setup-node@v4
57
+ with:
58
+ node-version: '20'
59
+
60
+ - name: Install PHP dependencies
61
+ if: steps.detect.outputs.has_php == 'true'
62
+ run: |
63
+ if [ -f "composer.json" ]; then
64
+ composer install --no-interaction --prefer-dist --quiet 2>/dev/null || true
65
+ fi
66
+
67
+ - name: Install Node.js dependencies
68
+ if: steps.detect.outputs.has_node == 'true'
69
+ run: |
70
+ if [ -f "package.json" ]; then
71
+ npm ci --quiet 2>/dev/null || npm install --quiet 2>/dev/null || true
72
+ fi
73
+
74
+ - name: PHP syntax check
75
+ if: steps.detect.outputs.has_php == 'true'
76
+ run: |
77
+ ERRORS=0
78
+ while IFS= read -r -d '' file; do
79
+ if ! php -l "$file" 2>&1 | grep -q "No syntax errors"; then
80
+ echo "::error file=${file}::PHP syntax error"
81
+ ERRORS=$((ERRORS + 1))
82
+ fi
83
+ done < <(find . -name "*.php" -not -path "./.git/*" -not -path "./vendor/*" -not -path "./node_modules/*" -print0)
84
+
85
+ echo "## PHP Lint" >> $GITHUB_STEP_SUMMARY
86
+ if [ "$ERRORS" -eq 0 ]; then
87
+ echo "All PHP files passed syntax check." >> $GITHUB_STEP_SUMMARY
88
+ else
89
+ echo "${ERRORS} file(s) with syntax errors." >> $GITHUB_STEP_SUMMARY
90
+ exit 1
91
+ fi
92
+
93
+ - name: TypeScript/JavaScript lint
94
+ if: steps.detect.outputs.has_node == 'true'
95
+ run: |
96
+ if [ -f "node_modules/.bin/eslint" ]; then
97
+ npx eslint src/ --quiet 2>&1 || { echo "::error::ESLint errors found"; exit 1; }
98
+ echo "## ESLint" >> $GITHUB_STEP_SUMMARY
99
+ echo "All files passed ESLint." >> $GITHUB_STEP_SUMMARY
100
+ elif [ -f ".eslintrc.json" ] || [ -f ".eslintrc.js" ] || [ -f "eslint.config.js" ]; then
101
+ echo "::warning::ESLint config found but eslint not installed"
102
+ else
103
+ echo "No ESLint configured — skipping"
104
+ fi
105
+
106
+ - name: TypeScript compile check
107
+ if: steps.detect.outputs.has_node == 'true'
108
+ run: |
109
+ if [ -f "tsconfig.json" ] && [ -f "node_modules/.bin/tsc" ]; then
110
+ npx tsc --noEmit 2>&1 || { echo "::error::TypeScript compilation errors"; exit 1; }
111
+ echo "## TypeScript" >> $GITHUB_STEP_SUMMARY
112
+ echo "TypeScript compilation passed." >> $GITHUB_STEP_SUMMARY
113
+ fi
114
+
115
+ - name: PHPStan static analysis
116
+ if: steps.detect.outputs.has_php == 'true'
117
+ run: |
118
+ if [ -f "phpstan.neon" ] && [ -f "vendor/bin/phpstan" ]; then
119
+ vendor/bin/phpstan analyse --no-progress 2>&1 || { echo "::warning::PHPStan found issues"; }
120
+ fi
121
+
122
+ # ── Tests ─────────────────────────────────────────────────────────────
123
+ test:
124
+ name: Tests
125
+ runs-on: ubuntu-latest
126
+ needs: lint
127
+
128
+ steps:
129
+ - name: Checkout
130
+ uses: actions/checkout@v4
131
+
132
+ - name: Detect toolchain
133
+ id: detect
134
+ run: |
135
+ HAS_PHP=false
136
+ HAS_NODE=false
137
+ [ -f "composer.json" ] && HAS_PHP=true
138
+ [ -f "package.json" ] && HAS_NODE=true
139
+ echo "has_php=$HAS_PHP" >> "$GITHUB_OUTPUT"
140
+ echo "has_node=$HAS_NODE" >> "$GITHUB_OUTPUT"
141
+
142
+ - name: Setup PHP
143
+ if: steps.detect.outputs.has_php == 'true'
144
+ run: |
145
+ if ! command -v php &> /dev/null; then
146
+ sudo apt-get update -qq
147
+ sudo apt-get install -y -qq php-cli php-mbstring php-xml >/dev/null 2>&1
148
+ fi
149
+
150
+ - name: Setup Node.js
151
+ if: steps.detect.outputs.has_node == 'true'
152
+ uses: actions/setup-node@v4
153
+ with:
154
+ node-version: '20'
155
+
156
+ - name: Install dependencies
157
+ run: |
158
+ [ -f "composer.json" ] && composer install --no-interaction --prefer-dist --quiet 2>/dev/null || true
159
+ [ -f "package.json" ] && { npm ci --quiet 2>/dev/null || npm install --quiet 2>/dev/null || true; }
160
+
161
+ - name: Run PHP tests
162
+ if: steps.detect.outputs.has_php == 'true'
163
+ run: |
164
+ if [ -f "vendor/bin/phpunit" ]; then
165
+ vendor/bin/phpunit --testdox 2>&1
166
+ echo "## PHPUnit" >> $GITHUB_STEP_SUMMARY
167
+ echo "Tests passed." >> $GITHUB_STEP_SUMMARY
168
+ elif [ -f "phpunit.xml" ] || [ -f "phpunit.xml.dist" ]; then
169
+ echo "::warning::PHPUnit config found but phpunit not installed"
170
+ else
171
+ echo "No PHPUnit configured — skipping"
172
+ fi
173
+
174
+ - name: Run Node.js tests
175
+ if: steps.detect.outputs.has_node == 'true'
176
+ run: |
177
+ if jq -e '.scripts.test' package.json > /dev/null 2>&1; then
178
+ npm test 2>&1
179
+ echo "## Node.js Tests" >> $GITHUB_STEP_SUMMARY
180
+ echo "Tests passed." >> $GITHUB_STEP_SUMMARY
181
+ else
182
+ echo "No test script in package.json — skipping"
183
+ fi
184
+
185
+ - name: Build check
186
+ run: |
187
+ if [ -f "Makefile" ]; then
188
+ make build 2>&1 || echo "::warning::Build failed or not configured"
189
+ elif [ -f "package.json" ] && jq -e '.scripts.build' package.json > /dev/null 2>&1; then
190
+ npm run build 2>&1 || echo "::warning::Build failed"
191
+ fi
@@ -0,0 +1,87 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+ #
5
+ # FILE INFORMATION
6
+ # DEFGROUP: Gitea.Workflow
7
+ # INGROUP: MokoStandards.Maintenance
8
+ # REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards
9
+ # PATH: /.gitea/workflows/cleanup.yml
10
+ # VERSION: 01.00.00
11
+ # BRIEF: Scheduled cleanup — delete merged branches and old workflow runs
12
+
13
+ name: "Universal: Repository Cleanup"
14
+
15
+ on:
16
+ schedule:
17
+ - cron: '0 3 * * 0' # Weekly on Sunday at 03:00 UTC
18
+ workflow_dispatch:
19
+
20
+ permissions:
21
+ contents: write
22
+
23
+ env:
24
+ GITEA_URL: ${{ vars.GITEA_URL || 'https://git.mokoconsulting.tech' }}
25
+
26
+ jobs:
27
+ cleanup:
28
+ name: Clean Merged Branches
29
+ runs-on: ubuntu-latest
30
+
31
+ steps:
32
+ - name: Checkout
33
+ uses: actions/checkout@v4
34
+ with:
35
+ fetch-depth: 0
36
+ token: ${{ secrets.GA_TOKEN }}
37
+
38
+ - name: Delete merged branches
39
+ env:
40
+ GA_TOKEN: ${{ secrets.GA_TOKEN }}
41
+ run: |
42
+ echo "=== Merged Branch Cleanup ==="
43
+ API="${GITEA_URL}/api/v1/repos/${{ github.repository }}"
44
+
45
+ # List branches via API
46
+ BRANCHES=$(curl -sS -H "Authorization: token ${GA_TOKEN}" \
47
+ "${API}/branches?limit=50" | jq -r '.[].name')
48
+
49
+ DELETED=0
50
+ for BRANCH in $BRANCHES; do
51
+ # Skip protected branches
52
+ case "$BRANCH" in
53
+ main|master|develop|release/*|hotfix/*) continue ;;
54
+ esac
55
+
56
+ # Check if branch is merged into main
57
+ if git merge-base --is-ancestor "origin/${BRANCH}" origin/main 2>/dev/null; then
58
+ echo " Deleting merged branch: ${BRANCH}"
59
+ curl -sS -X DELETE -H "Authorization: token ${GA_TOKEN}" \
60
+ "${API}/branches/${BRANCH}" 2>/dev/null || true
61
+ DELETED=$((DELETED + 1))
62
+ fi
63
+ done
64
+
65
+ echo "Deleted ${DELETED} merged branch(es)"
66
+
67
+ - name: Clean old workflow runs
68
+ env:
69
+ GA_TOKEN: ${{ secrets.GA_TOKEN }}
70
+ run: |
71
+ echo "=== Workflow Run Cleanup ==="
72
+ API="${GITEA_URL}/api/v1/repos/${{ github.repository }}"
73
+ CUTOFF=$(date -d "30 days ago" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -v-30d +%Y-%m-%dT%H:%M:%SZ)
74
+
75
+ # Get old completed runs
76
+ RUNS=$(curl -sS -H "Authorization: token ${GA_TOKEN}" \
77
+ "${API}/actions/runs?status=completed&limit=50" | \
78
+ jq -r ".workflow_runs[] | select(.created_at < \"${CUTOFF}\") | .id" 2>/dev/null)
79
+
80
+ DELETED=0
81
+ for RUN_ID in $RUNS; do
82
+ curl -sS -X DELETE -H "Authorization: token ${GA_TOKEN}" \
83
+ "${API}/actions/runs/${RUN_ID}" 2>/dev/null || true
84
+ DELETED=$((DELETED + 1))
85
+ done
86
+
87
+ echo "Deleted ${DELETED} old workflow run(s)"
@@ -0,0 +1,115 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # This file is part of a Moko Consulting project.
4
+ #
5
+ # SPDX-License-Identifier: GPL-3.0-or-later
6
+ #
7
+ # FILE INFORMATION
8
+ # DEFGROUP: GitHub.Workflow.Template
9
+ # INGROUP: MokoStandards.Security
10
+ # REPO: https://github.com/mokoconsulting-tech/MokoStandards
11
+ # PATH: /templates/workflows/generic/codeql-analysis.yml.template
12
+ # VERSION: 04.05.00
13
+ # BRIEF: CodeQL security scanning workflow (generic — all repo types)
14
+ # NOTE: Deployed to .mokogitea/workflows/codeql-analysis.yml in governed repos.
15
+ # CodeQL does not support PHP directly; JavaScript scans JSON/YAML/shell.
16
+ # For PHP-specific security scanning see standards-compliance.yml.
17
+
18
+ name: "Universal: CodeQL Analysis"
19
+
20
+ on:
21
+ push:
22
+ branches:
23
+ - main
24
+ - dev/**
25
+ - rc/**
26
+ - version/**
27
+ pull_request:
28
+ branches:
29
+ - main
30
+ - dev/**
31
+ - rc/**
32
+ schedule:
33
+ # Weekly on Monday at 06:00 UTC
34
+ - cron: '0 6 * * 1'
35
+ workflow_dispatch:
36
+
37
+ permissions:
38
+ actions: read
39
+ contents: read
40
+ security-events: write
41
+ pull-requests: read
42
+
43
+ jobs:
44
+ analyze:
45
+ name: Analyze (${{ matrix.language }})
46
+ runs-on: ubuntu-latest
47
+ timeout-minutes: 360
48
+
49
+ strategy:
50
+ fail-fast: false
51
+ matrix:
52
+ # CodeQL does not support PHP. Use 'javascript' to scan JSON, YAML,
53
+ # and shell scripts. Add 'actions' to scan GitHub Actions workflows.
54
+ language: ['javascript', 'actions']
55
+
56
+ steps:
57
+ - name: Checkout repository
58
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
59
+
60
+ - name: Initialize CodeQL
61
+ uses: github/codeql-action/init@v3
62
+ with:
63
+ languages: ${{ matrix.language }}
64
+ queries: security-extended,security-and-quality
65
+
66
+ - name: Autobuild
67
+ uses: github/codeql-action/autobuild@v3
68
+
69
+ - name: Perform CodeQL Analysis
70
+ uses: github/codeql-action/analyze@v3
71
+ with:
72
+ category: "/language:${{ matrix.language }}"
73
+ upload: true
74
+ output: sarif-results
75
+ wait-for-processing: true
76
+
77
+ - name: Upload SARIF results
78
+ if: always()
79
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.5.0
80
+ with:
81
+ name: codeql-results-${{ matrix.language }}
82
+ path: sarif-results
83
+ retention-days: 30
84
+
85
+ - name: Step summary
86
+ if: always()
87
+ run: |
88
+ echo "### 🔍 CodeQL — ${{ matrix.language }}" >> $GITHUB_STEP_SUMMARY
89
+ echo "" >> $GITHUB_STEP_SUMMARY
90
+ URL="https://github.com/${{ github.repository }}/security/code-scanning"
91
+ echo "See the [Security tab]($URL) for findings." >> $GITHUB_STEP_SUMMARY
92
+ echo "" >> $GITHUB_STEP_SUMMARY
93
+ echo "| Severity | SLA |" >> $GITHUB_STEP_SUMMARY
94
+ echo "|----------|-----|" >> $GITHUB_STEP_SUMMARY
95
+ echo "| Critical | 7 days |" >> $GITHUB_STEP_SUMMARY
96
+ echo "| High | 14 days |" >> $GITHUB_STEP_SUMMARY
97
+ echo "| Medium | 30 days |" >> $GITHUB_STEP_SUMMARY
98
+ echo "| Low | 60 days / next release |" >> $GITHUB_STEP_SUMMARY
99
+
100
+ summary:
101
+ name: Security Scan Summary
102
+ runs-on: ubuntu-latest
103
+ needs: analyze
104
+ if: always()
105
+
106
+ steps:
107
+ - name: Summary
108
+ run: |
109
+ echo "### 🛡️ CodeQL Complete" >> $GITHUB_STEP_SUMMARY
110
+ echo "" >> $GITHUB_STEP_SUMMARY
111
+ echo "**Trigger:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
112
+ echo "**Branch:** ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
113
+ SECURITY_URL="https://github.com/${{ github.repository }}/security"
114
+ echo "" >> $GITHUB_STEP_SUMMARY
115
+ echo "📊 [View all security alerts]($SECURITY_URL)" >> $GITHUB_STEP_SUMMARY
@@ -0,0 +1,44 @@
1
+ # Copyright (C) 2025 Moko Consulting <hello@mokoconsulting.tech>
2
+ # SPDX-LICENSE-IDENTIFIER: GPL-3.0-or-later
3
+ #
4
+ # GitHub Actions workflow for Copilot coding agent
5
+ # This workflow demonstrates how to use the firewall configuration
6
+
7
+ name: "MCP: Copilot Agent"
8
+
9
+ on:
10
+ pull_request:
11
+ types: [opened, synchronize, reopened]
12
+ issue_comment:
13
+ types: [created]
14
+
15
+ permissions:
16
+ contents: write
17
+ pull-requests: write
18
+ issues: write
19
+
20
+ jobs:
21
+ copilot-agent:
22
+ name: Run Copilot Coding Agent
23
+ runs-on: ubuntu-latest
24
+
25
+ steps:
26
+ - name: Checkout repository
27
+ uses: actions/checkout@v4
28
+ with:
29
+ fetch-depth: 0
30
+
31
+ - name: Configure Copilot Firewall
32
+ run: |
33
+ echo "Configuring firewall allowlist for enterprise-ready sites..."
34
+ bash .github/copilot/setup-firewall.sh
35
+ echo "Firewall configuration completed"
36
+
37
+ - name: Run Copilot Agent
38
+ uses: github/copilot-swe-agent@v1
39
+ with:
40
+ token: ${{ secrets.GITHUB_TOKEN }}
41
+ issue_number: ${{ github.event.issue.number || github.event.pull_request.number }}
42
+ env:
43
+ # Environment variables are set by setup-firewall.sh
44
+ COPILOT_FIREWALL_ALLOWLIST: ${{ env.COPILOT_FIREWALL_ALLOWLIST }}
@@ -0,0 +1,126 @@
1
+ # Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+ #
5
+ # FILE INFORMATION
6
+ # DEFGROUP: Gitea.Workflow
7
+ # INGROUP: MokoStandards.Deploy
8
+ # REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoStandards-API
9
+ # PATH: /templates/workflows/joomla/deploy-manual.yml.template
10
+ # VERSION: 04.07.00
11
+ # BRIEF: Manual SFTP deploy to dev server for Joomla repos
12
+
13
+ name: "Universal: Deploy to Dev (Manual)"
14
+
15
+ on:
16
+ workflow_dispatch:
17
+ inputs:
18
+ clear_remote:
19
+ description: 'Delete all remote files before uploading'
20
+ required: false
21
+ default: 'false'
22
+ type: boolean
23
+
24
+ env:
25
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
26
+
27
+ permissions:
28
+ contents: read
29
+
30
+ jobs:
31
+ deploy:
32
+ name: SFTP Deploy to Dev
33
+ runs-on: ubuntu-latest
34
+
35
+ steps:
36
+ - name: Checkout repository
37
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
38
+
39
+ - name: Setup PHP
40
+ run: |
41
+ php -v && composer --version
42
+
43
+ - name: Setup MokoStandards tools
44
+ env:
45
+ GA_TOKEN: ${{ secrets.GA_TOKEN || secrets.GA_TOKEN || github.token }}
46
+ MOKO_CLONE_TOKEN: ${{ secrets.GA_TOKEN || secrets.GA_TOKEN || github.token }}
47
+ MOKO_CLONE_HOST: ${{ secrets.GA_TOKEN && 'git.mokoconsulting.tech/MokoConsulting' || 'github.com/mokoconsulting-tech' }}
48
+ COMPOSER_AUTH: '{"github-oauth":{"github.com":"${{ secrets.GA_TOKEN || github.token }}"}}'
49
+ run: |
50
+ git clone --depth 1 --branch main --quiet \
51
+ "https://x-access-token:${MOKO_CLONE_TOKEN}@${MOKO_CLONE_HOST}/MokoStandards-API.git" \
52
+ /tmp/mokostandards-api 2>/dev/null || true
53
+ if [ -d "/tmp/mokostandards-api" ] && [ -f "/tmp/mokostandards-api/composer.json" ]; then
54
+ cd /tmp/mokostandards-api && composer install --no-dev --no-interaction --quiet 2>/dev/null || true
55
+ fi
56
+
57
+ - name: Check FTP configuration
58
+ id: check
59
+ env:
60
+ HOST: ${{ vars.DEV_FTP_HOST }}
61
+ PATH_VAR: ${{ vars.DEV_FTP_PATH }}
62
+ PORT: ${{ vars.DEV_FTP_PORT }}
63
+ run: |
64
+ if [ -z "$HOST" ] || [ -z "$PATH_VAR" ]; then
65
+ echo "DEV_FTP_HOST or DEV_FTP_PATH not configured -- cannot deploy"
66
+ echo "skip=true" >> "$GITHUB_OUTPUT"
67
+ exit 0
68
+ fi
69
+ echo "skip=false" >> "$GITHUB_OUTPUT"
70
+ echo "host=$HOST" >> "$GITHUB_OUTPUT"
71
+
72
+ REMOTE="${PATH_VAR%/}"
73
+ echo "remote=$REMOTE" >> "$GITHUB_OUTPUT"
74
+
75
+ [ -z "$PORT" ] && PORT="22"
76
+ echo "port=$PORT" >> "$GITHUB_OUTPUT"
77
+
78
+ - name: Deploy via SFTP
79
+ if: steps.check.outputs.skip != 'true'
80
+ env:
81
+ SFTP_KEY: ${{ secrets.DEV_FTP_KEY }}
82
+ SFTP_PASS: ${{ secrets.DEV_FTP_PASSWORD }}
83
+ SFTP_USER: ${{ vars.DEV_FTP_USERNAME }}
84
+ run: |
85
+ SOURCE_DIR="src"
86
+ [ ! -d "$SOURCE_DIR" ] && SOURCE_DIR="htdocs"
87
+ [ ! -d "$SOURCE_DIR" ] && { echo "No src/ or htdocs/ -- nothing to deploy"; exit 0; }
88
+
89
+ printf '{"host":"%s","port":%s,"username":"%s","remotePath":"%s"' \
90
+ "${{ steps.check.outputs.host }}" "${{ steps.check.outputs.port }}" "$SFTP_USER" "${{ steps.check.outputs.remote }}" \
91
+ > /tmp/sftp-config.json
92
+
93
+ if [ -n "$SFTP_KEY" ]; then
94
+ echo "$SFTP_KEY" > /tmp/deploy_key
95
+ chmod 600 /tmp/deploy_key
96
+ printf ',"privateKeyPath":"/tmp/deploy_key"}' >> /tmp/sftp-config.json
97
+ else
98
+ printf ',"password":"%s"}' "$SFTP_PASS" >> /tmp/sftp-config.json
99
+ fi
100
+
101
+ DEPLOY_ARGS=(--path . --src-dir "$SOURCE_DIR" --config /tmp/sftp-config.json)
102
+ [ "${{ inputs.clear_remote }}" = "true" ] && DEPLOY_ARGS+=(--clear-remote)
103
+
104
+ PLATFORM=$(php /tmp/mokostandards-api/cli/platform_detect.php --path . 2>/dev/null || true)
105
+ if [ "$PLATFORM" = "waas-component" ] && [ -f "/tmp/mokostandards-api/deploy/deploy-joomla.php" ]; then
106
+ php /tmp/mokostandards-api/deploy/deploy-joomla.php "${DEPLOY_ARGS[@]}"
107
+ else
108
+ php /tmp/mokostandards-api/deploy/deploy-sftp.php "${DEPLOY_ARGS[@]}"
109
+ fi
110
+
111
+ rm -f /tmp/deploy_key /tmp/sftp-config.json
112
+
113
+ - name: Summary
114
+ if: always()
115
+ run: |
116
+ if [ "${{ steps.check.outputs.skip }}" = "true" ]; then
117
+ echo "### Deploy Skipped -- FTP not configured" >> $GITHUB_STEP_SUMMARY
118
+ else
119
+ echo "### Manual Dev Deploy Complete" >> $GITHUB_STEP_SUMMARY
120
+ echo "" >> $GITHUB_STEP_SUMMARY
121
+ echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY
122
+ echo "|-------|-------|" >> $GITHUB_STEP_SUMMARY
123
+ echo "| Host | \`${{ steps.check.outputs.host }}\` |" >> $GITHUB_STEP_SUMMARY
124
+ echo "| Remote | \`${{ steps.check.outputs.remote }}\` |" >> $GITHUB_STEP_SUMMARY
125
+ echo "| Clear | ${{ inputs.clear_remote }} |" >> $GITHUB_STEP_SUMMARY
126
+ fi