Skip to content

Commit abe1de5

Browse files
v1truv1usclaude
andcommitted
feat: add Apple code signing and notarization support
- Add macOS code signing with Developer ID Application certificate - Implement notarization workflow using App Store Connect API - Create signing script for automated build process - Update GoReleaser configuration for signed releases - Add proper entitlements for CLI tool functionality - Fix all context.TODO linting issues in logger tests 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 97fc489 commit abe1de5

File tree

14 files changed

+245
-132
lines changed

14 files changed

+245
-132
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,7 @@ docs-site/node_modules/
127127
*.gif
128128
demo_project/
129129
test_project/
130+
131+
# Certificate files
132+
*.p8
133+
*.cer

.goreleaser.yaml

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,7 @@ builds:
2424
mod_timestamp: '{{ .CommitTimestamp }}'
2525
hooks:
2626
post:
27-
- cmd: |
28-
if [[ "{{ .Os }}" == "darwin" && -n "{{ .Env.MACOS_SIGN_IDENTITY }}" ]]; then
29-
echo "Signing macOS binary: {{ .Path }}"
30-
codesign --sign "{{ .Env.MACOS_SIGN_IDENTITY }}" --timestamp --options=runtime --entitlements ./entitlements.plist "{{ .Path }}"
31-
32-
# Notarize if we have notarization credentials
33-
if [[ -n "{{ .Env.MACOS_NOTARY_ISSUER_ID }}" && -n "{{ .Env.MACOS_NOTARY_KEY_ID }}" ]]; then
34-
echo "Notarizing macOS binary: {{ .Path }}"
35-
# Create a temporary zip for notarization
36-
NOTARY_ZIP="/tmp/{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}.zip"
37-
ditto -c -k --keepParent "{{ .Path }}" "$NOTARY_ZIP"
38-
39-
# Submit for notarization
40-
xcrun notarytool submit "$NOTARY_ZIP" \
41-
--issuer "{{ .Env.MACOS_NOTARY_ISSUER_ID }}" \
42-
--key-id "{{ .Env.MACOS_NOTARY_KEY_ID }}" \
43-
--key "{{ .Env.MACOS_NOTARY_KEY }}" \
44-
--wait \
45-
--timeout 10m
46-
47-
# Clean up temporary zip
48-
rm -f "$NOTARY_ZIP"
49-
echo "Notarization completed for: {{ .Path }}"
50-
fi
51-
fi
52-
env:
53-
- GOOS={{ .Os }}
54-
- GOARCH={{ .Arch }}
27+
- ./scripts/sign-macos.sh "{{ .Path }}" "{{ .Os }}"
5528

5629
archives:
5730
- formats: [tar.gz]
@@ -119,9 +92,7 @@ homebrew_casks:
11992
commit_msg_template: "Brew formula update for {{ .ProjectName }} version {{ .Tag }}"
12093
dependencies:
12194
- formula: git
122-
# Apple code signing verification
123-
signed: true
124-
verified: true
95+
# Note: GoReleaser will automatically detect signed binaries
12596
completions:
12697
bash: completions/rune.bash
12798
zsh: completions/rune.zsh

docs-site/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,4 @@ Thumbs.db
101101
*~
102102

103103
# Astro specific
104-
.astro/
104+
.astro/

docs-site/src/layouts/BaseLayout.astro

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
---
2+
import "../styles/global.css";
23
export interface Props {
34
title: string;
45
description?: string;
@@ -8,9 +9,9 @@ export interface Props {
89
type?: string;
910
}
1011
11-
const {
12-
title,
13-
description = "Ancient wisdom for modern workflows - Rune CLI Documentation",
12+
const {
13+
title,
14+
description = "Ancient wisdom for modern workflows - Rune CLI Documentation",
1415
image = "/og-image.png",
1516
canonical,
1617
noindex = false,
@@ -26,18 +27,18 @@ const fullImageUrl = new URL(image, Astro.site || Astro.url.origin).href;
2627
<head>
2728
<meta charset="UTF-8" />
2829
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
29-
30+
3031
<!-- Primary Meta Tags -->
3132
<title>{title}</title>
3233
<meta name="title" content={title} />
3334
<meta name="description" content={description} />
3435
<meta name="keywords" content="developer time tracking CLI, command line productivity tools, Watson alternative, Timewarrior alternative, CLI time tracker, developer productivity, workflow automation, focus mode, project time tracking, code time tracking, git time tracking" />
3536
<meta name="author" content="Rune CLI Team" />
3637
<meta name="robots" content={noindex ? "noindex, nofollow" : "index, follow"} />
37-
38+
3839
<!-- Canonical URL -->
3940
{canonical && <link rel="canonical" href={canonical} />}
40-
41+
4142
<!-- Open Graph / Facebook -->
4243
<meta property="og:type" content={type} />
4344
<meta property="og:url" content={currentUrl} />
@@ -49,7 +50,7 @@ const fullImageUrl = new URL(image, Astro.site || Astro.url.origin).href;
4950
<meta property="og:image:alt" content="Rune CLI - Ancient wisdom for modern workflows" />
5051
<meta property="og:site_name" content="Rune CLI" />
5152
<meta property="og:locale" content="en_US" />
52-
53+
5354
<!-- Twitter -->
5455
<meta property="twitter:card" content="summary_large_image" />
5556
<meta property="twitter:url" content={currentUrl} />
@@ -59,7 +60,7 @@ const fullImageUrl = new URL(image, Astro.site || Astro.url.origin).href;
5960
<meta property="twitter:image:alt" content="Rune CLI - Ancient wisdom for modern workflows" />
6061
<meta property="twitter:creator" content="@RuneCLI" />
6162
<meta property="twitter:site" content="@RuneCLI" />
62-
63+
6364
<!-- Favicons -->
6465
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6566
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
@@ -68,14 +69,14 @@ const fullImageUrl = new URL(image, Astro.site || Astro.url.origin).href;
6869
<link rel="manifest" href="/site.webmanifest" />
6970
<meta name="theme-color" content="#0f172a" />
7071
<meta name="msapplication-TileColor" content="#0f172a" />
71-
72+
7273
<!-- Global CSS -->
7374
<link rel="stylesheet" href="/src/styles/global.css" />
74-
75+
7576
<!-- Additional Meta -->
7677
<meta name="generator" content={Astro.generator} />
7778
<meta name="format-detection" content="telephone=no" />
78-
79+
7980
<!-- Structured Data -->
8081
<script type="application/ld+json">
8182
{JSON.stringify({
@@ -121,11 +122,11 @@ const fullImageUrl = new URL(image, Astro.site || Astro.url.origin).href;
121122
</div>
122123
</div>
123124
</nav>
124-
125+
125126
<main id="main">
126127
<slot />
127128
</main>
128-
129+
129130
<footer class="footer">
130131
<div class="footer-container">
131132
<div class="footer-grid">
@@ -162,4 +163,4 @@ const fullImageUrl = new URL(image, Astro.site || Astro.url.origin).href;
162163
</div>
163164
</footer>
164165
</body>
165-
</html>
166+
</html>

docs-site/src/layouts/DocsLayout.astro

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
---
2+
import "../styles/global.css";
23
export interface Props {
34
title: string;
45
description?: string;
@@ -9,9 +10,9 @@ export interface Props {
910
category?: string;
1011
}
1112
12-
const {
13-
title,
14-
description = "Ancient wisdom for modern workflows - Rune CLI Documentation",
13+
const {
14+
title,
15+
description = "Ancient wisdom for modern workflows - Rune CLI Documentation",
1516
image = "/og-docs.png",
1617
canonical,
1718
noindex = false,
@@ -22,11 +23,11 @@ const {
2223
const currentUrl = canonical || Astro.url.href;
2324
const fullImageUrl = new URL(image, Astro.site || Astro.url.origin).href;
2425
const keywords = [
25-
"CLI documentation",
26-
"developer tools guide",
27-
"productivity automation",
28-
"time tracking setup",
29-
"workflow automation",
26+
"CLI documentation",
27+
"developer tools guide",
28+
"productivity automation",
29+
"time tracking setup",
30+
"workflow automation",
3031
"focus mode configuration",
3132
"ritual automation",
3233
"project detection",
@@ -39,7 +40,7 @@ const keywords = [
3940
<head>
4041
<meta charset="UTF-8" />
4142
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
42-
43+
4344
<!-- Primary Meta Tags -->
4445
<title>{title}</title>
4546
<meta name="title" content={title} />
@@ -48,10 +49,10 @@ const keywords = [
4849
<meta name="author" content="Rune CLI Team" />
4950
<meta name="robots" content={noindex ? "noindex, nofollow" : "index, follow"} />
5051
{lastModified && <meta name="article:modified_time" content={lastModified} />}
51-
52+
5253
<!-- Canonical URL -->
5354
{canonical && <link rel="canonical" href={canonical} />}
54-
55+
5556
<!-- Open Graph / Facebook -->
5657
<meta property="og:type" content="article" />
5758
<meta property="og:url" content={currentUrl} />
@@ -67,7 +68,7 @@ const keywords = [
6768
<meta property="article:tag" content="CLI" />
6869
<meta property="article:tag" content="Documentation" />
6970
<meta property="article:tag" content="Developer Tools" />
70-
71+
7172
<!-- Twitter -->
7273
<meta property="twitter:card" content="summary_large_image" />
7374
<meta property="twitter:url" content={currentUrl} />
@@ -77,7 +78,7 @@ const keywords = [
7778
<meta property="twitter:image:alt" content={`${title} - Rune CLI Documentation`} />
7879
<meta property="twitter:creator" content="@RuneCLI" />
7980
<meta property="twitter:site" content="@RuneCLI" />
80-
81+
8182
<!-- Favicons -->
8283
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8384
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
@@ -86,14 +87,14 @@ const keywords = [
8687
<link rel="manifest" href="/site.webmanifest" />
8788
<meta name="theme-color" content="#0f172a" />
8889
<meta name="msapplication-TileColor" content="#0f172a" />
89-
90+
9091
<!-- Global CSS -->
9192
<link rel="stylesheet" href="/src/styles/global.css" />
92-
93+
9394
<!-- Additional Meta -->
9495
<meta name="generator" content={Astro.generator} />
9596
<meta name="format-detection" content="telephone=no" />
96-
97+
9798
<!-- Structured Data for Documentation -->
9899
<script type="application/ld+json">
99100
{JSON.stringify({
@@ -152,7 +153,7 @@ const keywords = [
152153
</div>
153154
</div>
154155
</nav>
155-
156+
156157
<main id="main">
157158
<!-- Documentation Hero Section -->
158159
<div class="docs-hero">
@@ -183,7 +184,7 @@ const keywords = [
183184
</div>
184185
</div>
185186
</main>
186-
187+
187188
<footer class="footer">
188189
<div class="footer-container">
189190
<div class="footer-grid">
@@ -220,4 +221,4 @@ const keywords = [
220221
</div>
221222
</footer>
222223
</body>
223-
</html>
224+
</html>

0 commit comments

Comments
 (0)