Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
c73c9c0
quick edit to readme (#37)
donald-pinckney Mar 12, 2026
c013b87
Fix saga compensations to run under cancellation protection (#43)
donald-pinckney Mar 17, 2026
291f4e5
Update readme for public preview (#45)
donald-pinckney Mar 18, 2026
21d1d41
a few more readme tweaks (#46)
donald-pinckney Mar 18, 2026
6cd40f2
Add MIT License to the project (#47)
donald-pinckney Mar 18, 2026
e16c9b8
Add Go (supersedes other PR) (#38)
donald-pinckney Mar 19, 2026
b9a0728
Setup CODEOWNERS to AI SDK team (#48)
donald-pinckney Mar 19, 2026
29e4600
Align version number in SKILL.md and plugin.json. (#49)
donald-pinckney Mar 19, 2026
b5719bc
PR Tracking Initial Release (#4)
donald-pinckney Mar 19, 2026
6137e38
hotfix: clean up skills.sh instruction (#51)
donald-pinckney Mar 19, 2026
1cc4591
Merge branch 'main' into dev
donald-pinckney Mar 19, 2026
e4afb09
Add packaging workflow to release a public version and support Claude…
MasonEgger Mar 25, 2026
68ebe14
Fix typos and broken references across skill docs (#56)
jacksonlo Mar 31, 2026
b040ae1
Fix Python reference bugs: incorrect API name, syntax error, broken c…
trevoryao Mar 31, 2026
57c08ef
Add `@workflow.init` decorator to python.md Key Concepts (#57)
brianstrauch Mar 31, 2026
8369c65
Remove ASCII diagram, replace with prose. (#66)
donald-pinckney Apr 2, 2026
9b97cee
[fix] Add missing section to TS's observability (#65)
donald-pinckney Apr 2, 2026
3d4ea71
Merge pull request #58 from temporalio/release
donald-pinckney Apr 2, 2026
0c8586b
Add Java SDK support (#42)
donald-pinckney Apr 2, 2026
7d5ae76
Reduce repetition in determinism sans sandboxing (#67)
donald-pinckney Apr 2, 2026
25eb553
Bump to 0.2.0 for Java release (#72)
donald-pinckney Apr 3, 2026
26b4362
Merge pull request #73 from temporalio/dev
donald-pinckney Apr 3, 2026
33747f0
Auto-formatting: ran `mdformat --extensions frontmatter --number .` (…
donald-pinckney Apr 17, 2026
9715547
Upstreaming https://github.com/temporalio/codex-temporal-plugin/pull/…
donald-pinckney Apr 17, 2026
f4926d5
Add skill to plugin syncing workflow (#78)
donald-pinckney Apr 17, 2026
c92f5ec
Update to latest versions of actions, to address deprecation warnings…
donald-pinckney Apr 17, 2026
418cbd7
Improved Syncing UX: Changelogs + Step Summaries (#83)
donald-pinckney Apr 17, 2026
44eba4e
Add .NET SDK support to temporal-developer skill (#39)
donald-pinckney Apr 17, 2026
0843752
Run formatter over .NET (#87)
donald-pinckney Apr 17, 2026
d68413a
Minor fixes to versioning.md (#64)
donald-pinckney Apr 17, 2026
999af78
Update version of temporal-developer skill to 0.3.0 (#88)
donald-pinckney Apr 17, 2026
b4fe783
Change to use the app tokens, so hopefully the sync workflow gets tri…
donald-pinckney Apr 17, 2026
801a48d
Bump version to 0.3.1 in SKILL.md (#90)
donald-pinckney Apr 17, 2026
127d400
merge into 1 workflow (#92)
donald-pinckney Apr 18, 2026
73fc5f0
Improve syncing PR changelogs: include changelog from previous versio…
donald-pinckney Apr 20, 2026
150c733
docs: update go observability reference with up-to-date logging appro…
ptdewey Apr 20, 2026
c98e05a
Update version of temporal-developer skill to 0.3.2 (#94)
donald-pinckney Apr 20, 2026
62957d1
Fix permission for "reading" changelogs (#95)
donald-pinckney Apr 20, 2026
cf34710
Update README to reflect new plugin packaging (#96)
starfleeth Apr 21, 2026
73dee64
Merge remote-tracking branch 'origin/main' into claude/merge-master-u…
claude Apr 25, 2026
e77b3e4
Merge pull request #1 from mesilov/claude/merge-master-update-F6LWh
mesilov Apr 25, 2026
2a1d8b3
Update README.md
mesilov Apr 25, 2026
26955d9
Add Task Queue Priority and Fairness reference (#98)
starfleeth Apr 29, 2026
8d05f55
Add Spring Boot integration reference for Java SDK (#74)
smaldd14 Apr 30, 2026
0e7a312
Small tweak to worker setup wording (#100)
donald-pinckney Apr 30, 2026
6495e59
Cleanup and correct language of workflow initializers (#101)
donald-pinckney Apr 30, 2026
bd513b1
Separate out CLI installation instructions to file (#102)
donald-pinckney Apr 30, 2026
72e67c0
Merge branch 'temporalio:main' into main
mesilov May 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @temporalio/ai-sdk
222 changes: 222 additions & 0 deletions .github/workflows/package-skill.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
# ABOUTME: Packages the skill on every push to main (as a ZIP artifact) and, if the version in SKILL.md
# ABOUTME: has been bumped, creates a GitHub Release and syncs the skill contents to three plugin repos
# ABOUTME: (cursor-temporal-plugin, codex-temporal-plugin, claude-temporal-plugin) via PRs.
# ABOUTME: Required secrets (used only by the sync job for cross-repo PRs):
# ABOUTME: SKILL_T_DEV_APP_ID — the GitHub App's ID
# ABOUTME: SKILL_T_DEV_KEY — the GitHub App's private key
# ABOUTME: The app must be installed on the three plugin repos with Contents (write) and Pull Requests (write).

name: Package and Sync Skill

on:
push:
branches: [main]
workflow_dispatch:

jobs:
package:
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
version: ${{ steps.version.outputs.version }}
tag: ${{ steps.version.outputs.tag }}
released: ${{ steps.tag_check.outputs.exists == 'false' }}

steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Read version from SKILL.md
id: version
run: |
version=$(grep '^version:' SKILL.md | sed 's/version:[[:space:]]*//')
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "tag=v$version" >> "$GITHUB_OUTPUT"

- name: Check if tag exists
id: tag_check
run: |
if git rev-parse "refs/tags/${{ steps.version.outputs.tag }}" >/dev/null 2>&1; then
echo "exists=true" >> "$GITHUB_OUTPUT"
else
echo "exists=false" >> "$GITHUB_OUTPUT"
fi

- name: Package skill
run: |
zip -r temporal-developer-skill.zip \
SKILL.md \
references/ \
-x '*.DS_Store'

- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: temporal-developer-skill
path: temporal-developer-skill.zip

- name: Create release
if: steps.tag_check.outputs.exists == 'false'
uses: softprops/action-gh-release@v3
with:
tag_name: ${{ steps.version.outputs.tag }}
name: ${{ steps.version.outputs.tag }}
files: temporal-developer-skill.zip
generate_release_notes: true

sync:
needs: package
if: needs.package.outputs.released == 'true' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
permissions:
# contents: write is required by the POST /releases/generate-notes endpoint,
# even though it only returns text and doesn't actually write anything.
contents: write
strategy:
fail-fast: false
matrix:
include:
- repo: temporalio/cursor-temporal-plugin
target_path: skills/temporal-developer
- repo: temporalio/codex-temporal-plugin
target_path: plugins/temporal-developer/skills/temporal-developer
- repo: temporalio/claude-temporal-plugin
target_path: skills/temporal-developer

steps:
- name: Generate token from GitHub App
id: app-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.SKILL_T_DEV_APP_ID }}
private-key: ${{ secrets.SKILL_T_DEV_KEY }}
owner: ${{ github.repository_owner }}

- name: Checkout source
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Checkout target repo
uses: actions/checkout@v6
with:
repository: ${{ matrix.repo }}
token: ${{ steps.app-token.outputs.token }}
path: target-repo

- name: Sync skill contents
working-directory: target-repo
run: |
BRANCH="sync/temporal-developer-skill"
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"

# Create or reset the sync branch based on current main.
# -B ensures the branch always starts from main's tip, even if a
# stale remote branch exists from a previously merged PR.
git checkout -B "$BRANCH" origin/main

# Remove old contents and copy current
rm -rf "${{ matrix.target_path }}/SKILL.md" \
"${{ matrix.target_path }}/references"
cp ../SKILL.md "${{ matrix.target_path }}/"
cp -r ../references "${{ matrix.target_path }}/"

# Check for changes against main
git add "${{ matrix.target_path }}"
if git diff --cached --quiet; then
echo "no_changes=true" >> "$GITHUB_ENV"
echo "No changes to sync"
else
echo "no_changes=false" >> "$GITHUB_ENV"
version="${{ needs.package.outputs.tag }}"
git commit -m "sync temporal-developer skill ${version} from source repo"
git push --force origin "$BRANCH"
fi

- name: Build changelog
if: env.no_changes == 'false'
env:
GH_TOKEN: ${{ github.token }}
run: |
current_tag="${{ needs.package.outputs.tag }}"

# Determine the base for the changelog: the version currently on the
# target repo's main branch. This represents what was last merged, so
# the changelog spans every release since then — correctly accumulating
# unmerged versions if a prior sync PR is still open.
#
# Read the old SKILL.md from git (it's been overwritten on disk by the
# sync step) via `git show origin/main:...`.
target_version=$(git -C target-repo show "origin/main:${{ matrix.target_path }}/SKILL.md" 2>/dev/null \
| grep '^version:' | sed 's/version:[[:space:]]*//' || echo "")

if [ -n "$target_version" ]; then
base_tag="v${target_version}"
else
base_tag=""
fi

# Prefer GitHub's auto-generated notes for the range (nicely formatted
# with PR links and contributors). Fall back to git log if unavailable.
echo "Base tag: ${base_tag:-<none>} / Current tag: ${current_tag}"
if [ -n "$base_tag" ]; then
if notes=$(gh api \
--method POST \
"/repos/${{ github.repository }}/releases/generate-notes" \
-f tag_name="${current_tag}" \
-f previous_tag_name="${base_tag}" \
--jq '.body') && [ -n "$notes" ]; then
echo "Using auto-generated release notes"
echo "$notes" > /tmp/changelog.md
else
echo "generate-notes API call failed or empty; falling back to git log"
git log --oneline "${base_tag}..HEAD" > /tmp/changelog.md
fi
else
echo "No base tag found; using last 20 commits"
git log --oneline -20 > /tmp/changelog.md
fi

- name: Create or update PR
if: env.no_changes == 'false'
working-directory: target-repo
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
BRANCH="sync/temporal-developer-skill"
version="${{ needs.package.outputs.tag }}"
changelog=$(cat /tmp/changelog.md)

# Check if a PR already exists from this branch
existing_pr=$(gh pr list --head "$BRANCH" --state open --json number --jq '.[0].number')

if [ -n "$existing_pr" ]; then
echo "PR #${existing_pr} already exists — updated by the force-push"
gh pr edit "$existing_pr" \
--title "Sync temporal-developer skill ${version}" \
--body "Automated sync of the temporal-developer skill ${version} from [skill-temporal-developer](https://github.com/${{ github.repository }}).

This PR was updated automatically by the [sync workflow](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}).

## Changelog
${changelog}"
gh pr comment "$existing_pr" --body "Updated to ${version} from [skill-temporal-developer](https://github.com/${{ github.repository }})."
pr_url=$(gh pr view "$existing_pr" --json url --jq '.url')
echo "### ${{ matrix.repo }}" >> "$GITHUB_STEP_SUMMARY"
echo "Updated [PR #${existing_pr}](${pr_url})" >> "$GITHUB_STEP_SUMMARY"
else
pr_url=$(gh pr create \
--title "Sync temporal-developer skill ${version}" \
--body "Automated sync of the temporal-developer skill ${version} from [skill-temporal-developer](https://github.com/${{ github.repository }}).

This PR was created automatically by the [sync workflow](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}).

## Changelog
${changelog}")
echo "### ${{ matrix.repo }}" >> "$GITHUB_STEP_SUMMARY"
echo "Created ${pr_url}" >> "$GITHUB_STEP_SUMMARY"
fi
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Temporal Technologies Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
42 changes: 30 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,44 @@
# Temporal Development Skill

A comprehensive skill for building Temporal applications.
A comprehensive skill for developers to use when building [Temporal](https://temporal.io/) applications.

> [!WARNING]
> This Skill is currently in Public Preview, and will continue to evolve and improve.
> We would love to hear your feedback - positive or negative - over in the [Community Slack](https://t.mp/slack), in the [#topic-ai channel](https://temporalio.slack.com/archives/C0818FQPYKY)

## Installation

### As a Claude Code Plugin
### As a Plugin

This skill is packaged as a plugin for major coding agents, which provides a simple way to install and receive future updates:

- **Claude Code**: [temporalio/claude-temporal-plugin](https://github.com/temporalio/claude-temporal-plugin)
- **Cursor**: [temporalio/cursor-temporal-plugin](https://github.com/temporalio/cursor-temporal-plugin)
- **OpenAI Codex**: [temporalio/codex-temporal-plugin](https://github.com/temporalio/codex-temporal-plugin)

See each repo's README for installation instructions.

1. Run `/plugin marketplace add temporalio/agent-skills`
2. Run `/plugin` to open the plugin manager
3. Select **Marketplaces**
4. Choose `temporal-marketplace` from the list
5. Select **Enable auto-update** or **Disable auto-update**
6. run `/plugin install temporal-developer@temporalio-agent-skills`
7. Restart Claude Code
### Standalone Installation

### Via `npx skills` - supports all major coding agents
If you prefer to install the skill directly without the plugin wrapper:

#### Via `npx skills` — supports all major coding agents

1. `npx skills add temporalio/skill-temporal-developer`
2. Follow prompts

### Via manually cloning the skill repo:
#### Via manually cloning the skill repo

1. `mkdir -p ~/.claude/skills && git clone https://github.com/temporalio/skill-temporal-developer ~/.claude/skills/temporal-developer`

Appropriately adjust the installation directory based on your coding agent.
Appropriately adjust the installation directory based on your coding agent.

## Currently Supported Temporal SDK Langages

- [x] Python ✅
- [x] TypeScript ✅
- [x] Go ✅
- [x] Java ✅
- [x] .NET ✅
- [ ] Ruby 🚧 ([PR](https://github.com/temporalio/skill-temporal-developer/pull/41))
- [x] PHP ✅
Loading