gowalk-cicd 1.0.114 → 1.0.115

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -216,6 +216,8 @@ node /path/to/gowalk-cicd/bin/cli.mjs
216
216
  signals. Unknown signals remain unclassified; never copy child output or commands into annotations.
217
217
  Timeout and cancellation retain the existing bounded sanitized diagnostic after owned-child cleanup;
218
218
  preserve the failure code, install deadline and retry fences.
219
+ Within the bounded capture, retain the CocoaPods primary exception alongside the tail when a long
220
+ stack or secondary issue-search failure hides it. Redact before selecting the bounded excerpt.
219
221
  - The mobile workflow's feature-branch-only `backend-preview` job bootstraps a
220
222
  new app before GitHub registers `deploy-backend.yml` on the default branch.
221
223
  Default-branch deploys continue through the separate backend workflow.
@@ -1 +1 @@
1
- 1.0.114
1
+ 1.0.115
@@ -23,6 +23,20 @@ def values(environment: dict[str, str]) -> set[str]:
23
23
  return {value for value in found if value}
24
24
 
25
25
 
26
+ def excerpt(text: str) -> str:
27
+ lines = text.splitlines()
28
+ tail = "\n".join(lines[-30:])[-4000:]
29
+ start = next((index for index in range(len(lines) - 1, -1, -1)
30
+ if lines[index].strip() == "### Error"), None)
31
+ if start is None:
32
+ return tail
33
+ primary = "\n".join(lines[start:start + 6])[:1200]
34
+ if primary in tail:
35
+ return tail
36
+ tail = "\n".join(lines[-(29 - len(primary.splitlines())):])[-(3995 - len(primary)):]
37
+ return primary + "\n...\n" + tail
38
+
39
+
26
40
  def diagnostic(log, environment: dict[str, str] | None = None) -> str:
27
41
  log.flush()
28
42
  log.seek(0, os.SEEK_END)
@@ -44,7 +58,7 @@ def diagnostic(log, environment: dict[str, str] | None = None) -> str:
44
58
  text = re.sub(r"\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+", "[token redacted]", text)
45
59
  text = re.sub(r"https?://[^\s\"'<>]+", "[URL redacted]", text)
46
60
  text = re.sub(r"[A-Za-z0-9_+/=-]{32,}", "[long value redacted]", text)
47
- return "\n".join(text.splitlines()[-30:])[-4000:]
61
+ return excerpt(text)
48
62
 
49
63
 
50
64
  def refuse(code: str, log, exception):
@@ -37,3 +37,30 @@ class DiagnosticsTests(unittest.TestCase):
37
37
  self.assertLessEqual(len(result.splitlines()), 30)
38
38
  pem = b"-----BEGIN PRIVATE KEY-----\nPRIVATE_PEM_VALUE\n-----END PRIVATE KEY-----\n"
39
39
  self.assertNotIn("PRIVATE_PEM_VALUE", diagnostic(io.BytesIO(pem), {}))
40
+
41
+ def test_cocoapods_primary_exception_survives_long_stack_and_secondary_failure(self):
42
+ body = ('Analyzing dependencies\n### Error\n\n```\n'
43
+ 'FixturePodError - cannot install dependency 12.3\n'
44
+ 'Authorization: Bearer fixture-private-value\n'
45
+ 'https://fixture-user:fixture-password@example.invalid/private\n')
46
+ body += ''.join(f'/ruby/gems/example/file_{index}.rb:12:in helper_{index}\n' for index in range(80))
47
+ body += '```\nTEMPLATE END\nSearching for inspections failed: secondary query refused\n'
48
+ result = diagnostic(io.BytesIO(body.encode()), {})
49
+ self.assertIn('FixturePodError - cannot install dependency 12.3', result)
50
+ self.assertIn('secondary query refused', result)
51
+ self.assertNotIn('fixture-private-value', result)
52
+ self.assertNotIn('fixture-password', result)
53
+ self.assertNotIn('example.invalid', result)
54
+ self.assertLessEqual(len(result), 4000)
55
+ self.assertLessEqual(len(result.splitlines()), 30)
56
+ self.assertEqual(diagnostic(io.BytesIO(result.encode()), {}), result)
57
+
58
+ def test_primary_exception_survives_character_bound_as_well_as_line_bound(self):
59
+ body = '### Error\n\n```\nFixturePodError - initial failure\n'
60
+ body += ('frame with many ordinary path components ' * 8 + '\n') * 28
61
+ body += 'secondary cleanup failure\n'
62
+ result = diagnostic(io.BytesIO(body.encode()), {})
63
+ self.assertIn('FixturePodError - initial failure', result)
64
+ self.assertIn('secondary cleanup failure', result)
65
+ self.assertLessEqual(len(result), 4000)
66
+ self.assertLessEqual(len(result.splitlines()), 30)
@@ -1 +1 @@
1
- 1.0.114
1
+ 1.0.115
@@ -1 +1 @@
1
- 1.0.114
1
+ 1.0.115
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gowalk-cicd",
3
- "version": "1.0.114",
3
+ "version": "1.0.115",
4
4
  "description": "Zero-config GitHub Actions delivery for iOS TestFlight and Android Google Play.",
5
5
  "type": "module",
6
6
  "bin": {