@guilz-dev/sdlc-gh 0.1.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 (176) hide show
  1. package/.github/CODEOWNERS +5 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.yml +68 -0
  3. package/.github/ISSUE_TEMPLATE/config.yml +1 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.yml +39 -0
  5. package/.github/ISSUE_TEMPLATE/support.yml +56 -0
  6. package/.github/ISSUE_TEMPLATE/task.yml +89 -0
  7. package/.github/agents/implementer.agent.md +17 -0
  8. package/.github/agents/reviewer.agent.md +18 -0
  9. package/.github/agents/triager.agent.md +13 -0
  10. package/.github/aw/actions-lock.json +9 -0
  11. package/.github/copilot-instructions.md +35 -0
  12. package/.github/hooks/hooks.json +12 -0
  13. package/.github/instructions/core.instructions.md +11 -0
  14. package/.github/instructions/profiles/go.instructions.md +10 -0
  15. package/.github/instructions/profiles/php.instructions.md +11 -0
  16. package/.github/instructions/profiles/python.instructions.md +11 -0
  17. package/.github/instructions/profiles/ruby.instructions.md +11 -0
  18. package/.github/instructions/profiles/typescript.instructions.md +11 -0
  19. package/.github/labels.yml +55 -0
  20. package/.github/pull_request_template.md +33 -0
  21. package/.github/ruleset.example.json +33 -0
  22. package/.github/ruleset.harness-eval.example.json +29 -0
  23. package/.github/skills/quality-loop/SKILL.md +23 -0
  24. package/.github/workflows/agent-retry-orchestrator.yml +161 -0
  25. package/.github/workflows/copilot-setup-steps.yml +64 -0
  26. package/.github/workflows/eval-ci.yml +169 -0
  27. package/.github/workflows/eval-drift.yml +75 -0
  28. package/.github/workflows/gh-aw-dogfood-ci.yml +73 -0
  29. package/.github/workflows/harness-ci.yml +244 -0
  30. package/.github/workflows/harness-sync.yml +28 -0
  31. package/.github/workflows/l1-readiness-check.yml +45 -0
  32. package/.github/workflows/labels-sync.yml +24 -0
  33. package/.github/workflows/nightly-harness-review.lock.yml +1643 -0
  34. package/.github/workflows/nightly-harness-review.md +87 -0
  35. package/.github/workflows/nightly-harness-review.yml +63 -0
  36. package/.github/workflows/npm-publish.yml +49 -0
  37. package/.github/workflows/pr-context-comment.yml +138 -0
  38. package/.github/workflows/product-ci-go.yml +33 -0
  39. package/.github/workflows/product-ci-php.yml +39 -0
  40. package/.github/workflows/product-ci-python.yml +34 -0
  41. package/.github/workflows/product-ci-ruby.yml +35 -0
  42. package/.github/workflows/product-ci-ts.yml +37 -0
  43. package/.github/workflows/task-issue-label-sync.yml +50 -0
  44. package/.github/workflows/weekly-redteam.lock.yml +1571 -0
  45. package/.github/workflows/weekly-redteam.md +76 -0
  46. package/.github/zizmor.yml +11 -0
  47. package/AGENTS.md +54 -0
  48. package/LICENSE +21 -0
  49. package/README.md +366 -0
  50. package/config/stacks.json +55 -0
  51. package/docs/adoption.md +126 -0
  52. package/docs/arch.md +535 -0
  53. package/docs/auth-boundaries.md +16 -0
  54. package/docs/coding-agent-l1.md +152 -0
  55. package/docs/exceptions/README.md +25 -0
  56. package/docs/exceptions/TEMPLATE.md +8 -0
  57. package/docs/failure-taxonomy.md +23 -0
  58. package/docs/gh-aw-dogfood.md +109 -0
  59. package/docs/kpi-baseline.md +9 -0
  60. package/docs/nightly-harness-review.md +94 -0
  61. package/docs/operations.md +108 -0
  62. package/docs/publishing.md +79 -0
  63. package/docs/revert-playbook.md +44 -0
  64. package/docs/shared-config.md +30 -0
  65. package/docs/telemetry-artifacts.md +78 -0
  66. package/docs/telemetry-schema.md +60 -0
  67. package/evals/.score-baseline.json +6 -0
  68. package/evals/e2e-bench/README.md +28 -0
  69. package/evals/e2e-bench/manifest.json +16 -0
  70. package/evals/e2e-bench/tasks/e2e-001.yml +10 -0
  71. package/evals/e2e-bench/tasks/e2e-002.yml +11 -0
  72. package/evals/e2e-bench/tasks/e2e-003.yml +10 -0
  73. package/evals/e2e-bench/tasks/e2e-004.yml +14 -0
  74. package/evals/e2e-bench/tasks/e2e-005.yml +11 -0
  75. package/evals/e2e-bench/tasks/e2e-006.yml +10 -0
  76. package/evals/e2e-bench/tasks/e2e-007.yml +10 -0
  77. package/evals/e2e-bench/tasks/e2e-008.yml +10 -0
  78. package/evals/e2e-bench/tasks/e2e-009.yml +10 -0
  79. package/evals/trajectories/rubric.md +12 -0
  80. package/evals/trajectories/test_harness_conventions.py +271 -0
  81. package/infra/README.md +49 -0
  82. package/infra/langfuse/docker-compose.yml +25 -0
  83. package/infra/otel/collector-config.yml +24 -0
  84. package/infra/samples/gh-aw-dogfood-report.json +44 -0
  85. package/infra/samples/harness-review-routing-plan.json +19 -0
  86. package/infra/samples/harness-review-summary.json +61 -0
  87. package/infra/samples/telemetry-artifact.json +29 -0
  88. package/infra/samples/telemetry-payload.json +19 -0
  89. package/package.json +85 -0
  90. package/prompts/triager-classify.prompt.yml +10 -0
  91. package/sample/go/add.go +5 -0
  92. package/sample/go/add_test.go +9 -0
  93. package/sample/go/go.mod +3 -0
  94. package/sample/php/composer.json +26 -0
  95. package/sample/php/composer.lock +1881 -0
  96. package/sample/php/phpunit.xml +8 -0
  97. package/sample/php/src/Add.php +13 -0
  98. package/sample/php/tests/AddTest.php +16 -0
  99. package/sample/python/requirements-dev.txt +2 -0
  100. package/sample/python/src/__init__.py +0 -0
  101. package/sample/python/src/greet.py +3 -0
  102. package/sample/python/tests/conftest.py +4 -0
  103. package/sample/python/tests/test_greet.py +5 -0
  104. package/sample/ruby/.rubocop.yml +10 -0
  105. package/sample/ruby/Gemfile +6 -0
  106. package/sample/ruby/Gemfile.lock +58 -0
  107. package/sample/ruby/lib/add.rb +9 -0
  108. package/sample/ruby/spec/add_spec.rb +11 -0
  109. package/sample/ts/biome.json +6 -0
  110. package/sample/ts/package-lock.json +1763 -0
  111. package/sample/ts/package.json +15 -0
  112. package/sample/ts/src/add.ts +3 -0
  113. package/sample/ts/tests/add.test.ts +8 -0
  114. package/sample/ts/tsconfig.json +12 -0
  115. package/scripts/aggregate-harness-review.mjs +48 -0
  116. package/scripts/bootstrap-harness.sh +411 -0
  117. package/scripts/check-diff-size.mjs +46 -0
  118. package/scripts/check-e2e-manifest.mjs +35 -0
  119. package/scripts/check-eval-score-drift.mjs +31 -0
  120. package/scripts/check-gh-aw-dogfood-scope.mjs +51 -0
  121. package/scripts/check-issue-spec.mjs +215 -0
  122. package/scripts/check-l1-readiness.mjs +82 -0
  123. package/scripts/check-open-pr-limit.mjs +34 -0
  124. package/scripts/doctor.mjs +177 -0
  125. package/scripts/emit-gh-aw-dogfood-report.mjs +112 -0
  126. package/scripts/emit-telemetry-artifact.mjs +99 -0
  127. package/scripts/fetch-telemetry-artifacts.mjs +176 -0
  128. package/scripts/harness-drift-report.mjs +99 -0
  129. package/scripts/lib/bootstrap-copy.mjs +123 -0
  130. package/scripts/lib/ccsd-contract.mjs +212 -0
  131. package/scripts/lib/diff-size.mjs +103 -0
  132. package/scripts/lib/doctor-local.mjs +179 -0
  133. package/scripts/lib/e2e-manifest.mjs +76 -0
  134. package/scripts/lib/gh-aw-dogfood.mjs +293 -0
  135. package/scripts/lib/github-config.mjs +94 -0
  136. package/scripts/lib/harness-ci-fragments.mjs +98 -0
  137. package/scripts/lib/harness-review-routing.mjs +244 -0
  138. package/scripts/lib/harness-review.mjs +388 -0
  139. package/scripts/lib/issue-form-label-sync.mjs +56 -0
  140. package/scripts/lib/l1-readiness.mjs +258 -0
  141. package/scripts/lib/merge-harness-package.mjs +36 -0
  142. package/scripts/lib/npm-package.mjs +129 -0
  143. package/scripts/lib/setup-wizard.mjs +224 -0
  144. package/scripts/lib/stacks.mjs +138 -0
  145. package/scripts/lib/telemetry-artifact.mjs +253 -0
  146. package/scripts/lib/template-root.mjs +39 -0
  147. package/scripts/merge-harness-package.mjs +14 -0
  148. package/scripts/route-harness-review.mjs +168 -0
  149. package/scripts/run-e2e-bench.mjs +216 -0
  150. package/scripts/sdlc-gh-cli.mjs +91 -0
  151. package/scripts/select-eval-jobs.mjs +41 -0
  152. package/scripts/setup-github.mjs +242 -0
  153. package/scripts/setup-github.sh +4 -0
  154. package/scripts/setup-wizard.mjs +426 -0
  155. package/scripts/test-bootstrap-guidance-scenarios.mjs +94 -0
  156. package/scripts/test-diff-size-scenarios.mjs +88 -0
  157. package/scripts/test-doctor-scenarios.mjs +70 -0
  158. package/scripts/test-e2e-manifest-scenarios.mjs +65 -0
  159. package/scripts/test-gh-aw-dogfood-scenarios.mjs +74 -0
  160. package/scripts/test-harness-review-routing-scenarios.mjs +130 -0
  161. package/scripts/test-harness-review-scenarios.mjs +92 -0
  162. package/scripts/test-hooks-scenarios.mjs +44 -0
  163. package/scripts/test-issue-form-label-sync-scenarios.mjs +48 -0
  164. package/scripts/test-issue-spec-scenarios.mjs +258 -0
  165. package/scripts/test-l1-readiness-scenarios.mjs +204 -0
  166. package/scripts/test-merge-harness-package-scenarios.mjs +53 -0
  167. package/scripts/test-npm-package-scenarios.mjs +31 -0
  168. package/scripts/test-sdlc-gh-cli-scenarios.mjs +54 -0
  169. package/scripts/test-setup-github-scenarios.mjs +103 -0
  170. package/scripts/test-setup-wizard-scenarios.mjs +114 -0
  171. package/scripts/test-telemetry-artifact-scenarios.mjs +69 -0
  172. package/scripts/trim-harness-ci.mjs +18 -0
  173. package/scripts/validate-gh-aw-compile.mjs +64 -0
  174. package/scripts/validate-harness.mjs +199 -0
  175. package/scripts/validate-telemetry.mjs +21 -0
  176. package/scripts/verify-bootstrap-stacks.sh +192 -0
@@ -0,0 +1,25 @@
1
+ services:
2
+ langfuse-server:
3
+ image: langfuse/langfuse:2
4
+ depends_on:
5
+ - db
6
+ ports:
7
+ - "3000:3000"
8
+ environment:
9
+ DATABASE_URL: postgresql://langfuse:langfuse@db:5432/langfuse
10
+ NEXTAUTH_SECRET: change-me-in-production
11
+ SALT: change-me-in-production
12
+ NEXTAUTH_URL: http://localhost:3000
13
+ TELEMETRY_ENABLED: "false"
14
+
15
+ db:
16
+ image: postgres:15
17
+ environment:
18
+ POSTGRES_USER: langfuse
19
+ POSTGRES_PASSWORD: langfuse
20
+ POSTGRES_DB: langfuse
21
+ volumes:
22
+ - langfuse-db:/var/lib/postgresql/data
23
+
24
+ volumes:
25
+ langfuse-db:
@@ -0,0 +1,24 @@
1
+ receivers:
2
+ otlp:
3
+ protocols:
4
+ grpc:
5
+ endpoint: 0.0.0.0:4317
6
+ http:
7
+ endpoint: 0.0.0.0:4318
8
+
9
+ processors:
10
+ batch:
11
+
12
+ exporters:
13
+ debug:
14
+ verbosity: basic
15
+ # Uncomment when Langfuse OTLP endpoint is configured:
16
+ # otlphttp:
17
+ # endpoint: http://langfuse-server:3000/api/public/otel
18
+
19
+ service:
20
+ pipelines:
21
+ traces:
22
+ receivers: [otlp]
23
+ processors: [batch]
24
+ exporters: [debug]
@@ -0,0 +1,44 @@
1
+ {
2
+ "schema_version": "1",
3
+ "generated_at": "2026-07-04T12:00:00.000Z",
4
+ "repo": "guilz-dev/sdlc-gh",
5
+ "track": "gh-aw-dogfood",
6
+ "pass": true,
7
+ "criteria": {
8
+ "scope": {
9
+ "pass": true,
10
+ "issues": []
11
+ },
12
+ "safe_outputs": {
13
+ "pass": true,
14
+ "workflows": {
15
+ "nightly-harness-review": {
16
+ "ok": true,
17
+ "issues": []
18
+ },
19
+ "weekly-redteam": {
20
+ "ok": true,
21
+ "issues": []
22
+ }
23
+ }
24
+ },
25
+ "compile": {
26
+ "pass": true,
27
+ "skipped": false,
28
+ "issues": []
29
+ },
30
+ "lock_drift": {
31
+ "pass": true,
32
+ "issues": []
33
+ },
34
+ "reviewability": {
35
+ "pass": true,
36
+ "note": "Outputs limited to PRs, summaries, compile results, or issues — no auto-merge"
37
+ }
38
+ },
39
+ "rollback": {
40
+ "trigger": "gh-aw preview regression, compile failure, or safe-output policy breach on dogfood track",
41
+ "action": "Revert .md/.lock.yml pair and disable gh-aw-dogfood-ci until upstream fix; keep GHA outer loop",
42
+ "doc": "docs/gh-aw-dogfood.md#rollback"
43
+ }
44
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "schema_version": "1",
3
+ "generated_at": "2026-07-04T02:05:00.000Z",
4
+ "source_summary_at": "2026-07-04T02:00:00.000Z",
5
+ "repo": "org/product",
6
+ "actions": [
7
+ {
8
+ "action": "open_or_update_issue",
9
+ "kind": "harness-revision",
10
+ "dedupe_key": "org/product:harness-revision:lint:task:test-fix|wall:lint",
11
+ "signature": "lint",
12
+ "scope": "task:test-fix|wall:lint",
13
+ "labels": ["outer-loop:harness-revision", "autonomy:L0"],
14
+ "title": "[outer-loop] Harness revision needed (lint / task:test-fix|wall:lint)",
15
+ "evidence_count": 1
16
+ }
17
+ ],
18
+ "skipped": []
19
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "schema_version": "1",
3
+ "generated_at": "2026-07-04T02:00:00.000Z",
4
+ "repo": "org/product",
5
+ "window_hours": 24,
6
+ "rollup": {
7
+ "telemetry_records": 4,
8
+ "task_groups": 2,
9
+ "failure_groups": 2,
10
+ "by_wall_failure_type": {
11
+ "test": 1,
12
+ "lint": 1
13
+ },
14
+ "repeated_failure_signatures": [
15
+ {
16
+ "wall_failure_type": "lint",
17
+ "record_count": 2,
18
+ "task_count": 1,
19
+ "task_ids": ["7"]
20
+ }
21
+ ],
22
+ "retry_exhaustion_count": 1,
23
+ "review_rejection_proxy_count": 0,
24
+ "by_classification": {
25
+ "モデル限界": 1,
26
+ "FF不足": 1
27
+ }
28
+ },
29
+ "classifications": [
30
+ {
31
+ "repo": "org/product",
32
+ "task_id": "42",
33
+ "pr_number": 101,
34
+ "task_class": "docs",
35
+ "autonomy_level": "L1",
36
+ "classification": "モデル限界",
37
+ "rationale": "Retry budget exhausted or escalated (max_retry_count=3)",
38
+ "wall_failure_types": ["test"],
39
+ "max_retry_count": 3,
40
+ "final_outcome": "escalated",
41
+ "review_outcome": "pending",
42
+ "sources": ["agent-retry-orchestrator"],
43
+ "workflow_run_ids": [123456789]
44
+ },
45
+ {
46
+ "repo": "org/product",
47
+ "task_id": "7",
48
+ "pr_number": 102,
49
+ "task_class": "test-fix",
50
+ "autonomy_level": "L1",
51
+ "classification": "FF不足",
52
+ "rationale": "Repeated lint or issue-spec convention failures",
53
+ "wall_failure_types": ["lint"],
54
+ "max_retry_count": 1,
55
+ "final_outcome": "in_progress",
56
+ "review_outcome": "pending",
57
+ "sources": ["harness-ci", "agent-retry-orchestrator"],
58
+ "workflow_run_ids": [123456790, 123456791]
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "schema_version": "1",
3
+ "emitted_at": "2026-07-04T12:00:00.000Z",
4
+ "source": "harness-ci",
5
+ "workflow": "Harness CI",
6
+ "workflow_run_id": 123456789,
7
+ "run_attempt": 1,
8
+ "event_name": "pull_request",
9
+ "placeholders": ["agent_type", "execution_mode", "model", "tool_calls", "cost", "elapsed_time", "review_outcome"],
10
+ "payload": {
11
+ "task_id": "42",
12
+ "pr_number": 101,
13
+ "repo": "org/product",
14
+ "agent_type": "n/a",
15
+ "execution_mode": "ci",
16
+ "model": "n/a",
17
+ "task_class": "docs",
18
+ "autonomy_level": "L1",
19
+ "tool_calls": -1,
20
+ "retry_count": 0,
21
+ "wall_failure_type": "",
22
+ "cost": -1,
23
+ "elapsed_time": -1,
24
+ "changed_files": 2,
25
+ "diff_loc": 48,
26
+ "final_outcome": "in_progress",
27
+ "review_outcome": "pending"
28
+ }
29
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "task_id": "42",
3
+ "pr_number": 101,
4
+ "repo": "org/product",
5
+ "agent_type": "implementer",
6
+ "execution_mode": "coding_agent",
7
+ "model": "gpt-4.1",
8
+ "task_class": "docs",
9
+ "autonomy_level": "L1",
10
+ "tool_calls": 12,
11
+ "retry_count": 0,
12
+ "wall_failure_type": "",
13
+ "cost": 0.42,
14
+ "elapsed_time": 95,
15
+ "changed_files": 2,
16
+ "diff_loc": 48,
17
+ "final_outcome": "in_progress",
18
+ "review_outcome": "pending"
19
+ }
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@guilz-dev/sdlc-gh",
3
+ "version": "0.1.0",
4
+ "description": "GitHub Copilot agent harness template — CI walls, evals, and operations for coding agents",
5
+ "license": "MIT",
6
+ "private": false,
7
+ "type": "module",
8
+ "engines": {
9
+ "node": ">=22"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/guilz-dev/sdlc-gh.git"
17
+ },
18
+ "homepage": "https://github.com/guilz-dev/sdlc-gh#readme",
19
+ "bugs": {
20
+ "url": "https://github.com/guilz-dev/sdlc-gh/issues"
21
+ },
22
+ "keywords": [
23
+ "github-copilot",
24
+ "coding-agent",
25
+ "agent-harness",
26
+ "sdlc",
27
+ "ci",
28
+ "github-actions"
29
+ ],
30
+ "bin": {
31
+ "sdlc-gh": "./scripts/sdlc-gh-cli.mjs"
32
+ },
33
+ "files": [
34
+ "AGENTS.md",
35
+ "config",
36
+ "docs",
37
+ "evals",
38
+ "infra",
39
+ "prompts",
40
+ "scripts",
41
+ ".github",
42
+ "sample/go",
43
+ "sample/python",
44
+ "sample/ruby",
45
+ "sample/php/composer.json",
46
+ "sample/php/composer.lock",
47
+ "sample/php/phpunit.xml",
48
+ "sample/php/src",
49
+ "sample/php/tests",
50
+ "sample/ts/biome.json",
51
+ "sample/ts/package.json",
52
+ "sample/ts/package-lock.json",
53
+ "sample/ts/tsconfig.json",
54
+ "sample/ts/src",
55
+ "sample/ts/tests"
56
+ ],
57
+ "scripts": {
58
+ "prepack": "npm run validate && npm run test-sdlc-gh-cli",
59
+ "prepublishOnly": "npm run check-e2e",
60
+ "validate": "node scripts/validate-harness.mjs",
61
+ "check": "npm run validate && npm run test-hooks && npm run test-issue-spec && npm run test-diff-size && npm run test-e2e-manifest && npm run test-setup-github && npm run test-doctor && npm run test-telemetry-artifact && npm run test-harness-review && npm run test-harness-review-routing && npm run test-gh-aw-dogfood && npm run test-bootstrap-guidance && npm run test-merge-harness-package && npm run test-l1-readiness && npm run test-setup-wizard && npm run test-sdlc-gh-cli && npm run test-npm-package && npm run check-e2e && npm run run-e2e",
62
+ "check-l1-readiness": "node scripts/check-l1-readiness.mjs",
63
+ "check-e2e": "node scripts/check-e2e-manifest.mjs",
64
+ "test-diff-size": "node scripts/test-diff-size-scenarios.mjs",
65
+ "test-e2e-manifest": "node scripts/test-e2e-manifest-scenarios.mjs",
66
+ "test-hooks": "node scripts/test-hooks-scenarios.mjs",
67
+ "test-issue-spec": "node scripts/test-issue-spec-scenarios.mjs",
68
+ "test-setup-github": "node scripts/test-setup-github-scenarios.mjs",
69
+ "test-doctor": "node scripts/test-doctor-scenarios.mjs",
70
+ "test-bootstrap-guidance": "node scripts/test-bootstrap-guidance-scenarios.mjs",
71
+ "test-merge-harness-package": "node scripts/test-merge-harness-package-scenarios.mjs",
72
+ "test-l1-readiness": "node scripts/test-l1-readiness-scenarios.mjs",
73
+ "test-setup-wizard": "node scripts/test-setup-wizard-scenarios.mjs",
74
+ "test-sdlc-gh-cli": "node scripts/test-sdlc-gh-cli-scenarios.mjs",
75
+ "test-npm-package": "node scripts/test-npm-package-scenarios.mjs",
76
+ "test-telemetry-artifact": "node scripts/test-telemetry-artifact-scenarios.mjs",
77
+ "test-harness-review": "node scripts/test-harness-review-scenarios.mjs",
78
+ "test-harness-review-routing": "node scripts/test-harness-review-routing-scenarios.mjs",
79
+ "test-gh-aw-dogfood": "node scripts/test-gh-aw-dogfood-scenarios.mjs",
80
+ "check-open-prs": "node scripts/check-open-pr-limit.mjs",
81
+ "drift-report": "node scripts/harness-drift-report.mjs",
82
+ "run-e2e": "node scripts/run-e2e-bench.mjs",
83
+ "verify-bootstrap": "bash scripts/verify-bootstrap-stacks.sh"
84
+ }
85
+ }
@@ -0,0 +1,10 @@
1
+ name: triager-classify
2
+ description: Classify issue task class from title and body
3
+ messages:
4
+ - role: user
5
+ content: |
6
+ Given this issue, respond with one task class only: docs, test-fix, refactor, feature-small, dependency-bump, infra, security-sensitive.
7
+ Issue: {{issue_body}}
8
+ evaluators:
9
+ - type: similarity
10
+ expected: docs
@@ -0,0 +1,5 @@
1
+ package main
2
+
3
+ func Sum(a, b int) int {
4
+ return a + b
5
+ }
@@ -0,0 +1,9 @@
1
+ package main
2
+
3
+ import "testing"
4
+
5
+ func TestAdd(t *testing.T) {
6
+ if got := Sum(2, 3); got != 5 {
7
+ t.Fatalf("got %d want 5", got)
8
+ }
9
+ }
@@ -0,0 +1,3 @@
1
+ module github.com/example/harness-sample
2
+
3
+ go 1.22
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "example/harness-sample",
3
+ "description": "Minimal PHP sample for sdlc-gh product CI",
4
+ "type": "project",
5
+ "require": {
6
+ "php": "^8.2"
7
+ },
8
+ "require-dev": {
9
+ "phpunit/phpunit": "^11.0",
10
+ "squizlabs/php_codesniffer": "^3.10"
11
+ },
12
+ "autoload": {
13
+ "psr-4": {
14
+ "App\\": "src/"
15
+ }
16
+ },
17
+ "autoload-dev": {
18
+ "psr-4": {
19
+ "Tests\\": "tests/"
20
+ }
21
+ },
22
+ "scripts": {
23
+ "lint": "phpcs --standard=PSR12 src tests",
24
+ "test": "phpunit"
25
+ }
26
+ }