Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
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
9 changes: 7 additions & 2 deletions .github/actions/setup-releasekit/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,13 @@ runs:
- name: Configure git identity
shell: bash
run: |
git config user.name "${{ inputs.git-user-name }}"
git config user.email "${{ inputs.git-user-email }}"
git config user.name "${INPUTS_GIT_USER_NAME}"
git config user.email "${INPUTS_GIT_USER_EMAIL}"

env:
INPUTS_GIT_USER_NAME: ${{ inputs.git-user-name }}

INPUTS_GIT_USER_EMAIL: ${{ inputs.git-user-email }}

# ── 8. Restore clean worktree ────────────────────────────────────
# uv sync may regenerate uv.lock (e.g. --no-dev vs full install)
Expand Down
14 changes: 10 additions & 4 deletions .github/workflows/build-cli-binaries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -146,20 +146,26 @@ jobs:
shell: bash
run: |
echo "Testing genkit --help"
./genkit-${{ matrix.target }}${{ steps.binary.outputs.ext }} --help
./genkit-${{ matrix.target }}${STEPS_BINARY_OUTPUTS_EXT} --help
env:
STEPS_BINARY_OUTPUTS_EXT: ${{ steps.binary.outputs.ext }}

- name: Test --version command
shell: bash
run: |
echo "Testing genkit --version"
./genkit-${{ matrix.target }}${{ steps.binary.outputs.ext }} --version
./genkit-${{ matrix.target }}${STEPS_BINARY_OUTPUTS_EXT} --version
env:
STEPS_BINARY_OUTPUTS_EXT: ${{ steps.binary.outputs.ext }}

- name: Verify UI commands exist
shell: bash
run: |
echo "Verifying UI commands are available"
./genkit-${{ matrix.target }}${{ steps.binary.outputs.ext }} ui:start --help
./genkit-${{ matrix.target }}${{ steps.binary.outputs.ext }} ui:stop --help
./genkit-${{ matrix.target }}${STEPS_BINARY_OUTPUTS_EXT} ui:start --help
./genkit-${{ matrix.target }}${STEPS_BINARY_OUTPUTS_EXT} ui:stop --help
env:
STEPS_BINARY_OUTPUTS_EXT: ${{ steps.binary.outputs.ext }}

- name: Test UI start functionality (Unix only)
if: runner.os != 'Windows'
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/bump-cli-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ jobs:

- name: Bump and Tag
run: |
js/scripts/bump_and_tag_cli.sh ${{ inputs.releaseType }} ${{ inputs.preid }}
js/scripts/bump_and_tag_cli.sh ${{ inputs.releaseType }} ${INPUTS_PREID}
env:
INPUTS_PREID: ${{ inputs.preid }}

- name: Push
shell: bash
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/bump-js-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ jobs:

- name: Bump and Tag
run: |
js/scripts/bump_and_tag_js.sh ${{ inputs.releaseType }} ${{ inputs.preid }}
js/scripts/bump_and_tag_js.sh ${{ inputs.releaseType }} ${INPUTS_PREID}
env:
INPUTS_PREID: ${{ inputs.preid }}

- name: Push
shell: bash
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/bump-package-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,11 @@ jobs:

- name: Bump and Tag
run: |
js/scripts/bump_and_tag.sh ${{ inputs.packageDir }} ${{ inputs.packageName }} ${{ inputs.releaseType }} ${{ inputs.preid }}
js/scripts/bump_and_tag.sh ${INPUTS_PACKAGEDIR} ${INPUTS_PACKAGENAME} ${{ inputs.releaseType }} ${INPUTS_PREID}
env:
INPUTS_PACKAGEDIR: ${{ inputs.packageDir }}
INPUTS_PACKAGENAME: ${{ inputs.packageName }}
INPUTS_PREID: ${{ inputs.preid }}

- name: Push
shell: bash
Expand Down
11 changes: 8 additions & 3 deletions .github/workflows/publish_python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -245,16 +245,16 @@ jobs:
echo "**Dry Run:** ${{ inputs.dry_run }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY

if [ "${{ needs.publish.result }}" == "success" ]; then
if [ "${NEEDS_PUBLISH_RESULT}" == "success" ]; then
echo "### ✅ Publish Status: Success" >> $GITHUB_STEP_SUMMARY
else
echo "### ❌ Publish Status: Failed" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY

if [ "${{ needs.verify.result }}" == "success" ]; then
if [ "${NEEDS_VERIFY_RESULT}" == "success" ]; then
echo "### ✅ Verification: Passed" >> $GITHUB_STEP_SUMMARY
elif [ "${{ needs.verify.result }}" == "failure" ]; then
elif [ "${NEEDS_VERIFY_RESULT}" == "failure" ]; then
echo "### ⚠️ Verification: Some packages failed" >> $GITHUB_STEP_SUMMARY
else
echo "### ⏭️ Verification: Skipped" >> $GITHUB_STEP_SUMMARY
Expand All @@ -265,3 +265,8 @@ jobs:
echo "1. Verify on PyPI: https://pypi.org/project/genkit/$VERSION/" >> $GITHUB_STEP_SUMMARY
echo "2. Test installation: \`pip install genkit==$VERSION\`" >> $GITHUB_STEP_SUMMARY
echo "3. Update documentation if needed" >> $GITHUB_STEP_SUMMARY

env:
NEEDS_PUBLISH_RESULT: ${{ needs.publish.result }}

NEEDS_VERIFY_RESULT: ${{ needs.verify.result }}
3 changes: 2 additions & 1 deletion .github/workflows/release_js_main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ jobs:
registry-url: 'https://wombat-dressing-room.appspot.com/'
- name: release script
shell: bash
run: RELEASE_BRANCH=${{ steps.extract_branch.outputs.branch }} RELEASE_TAG=${{ inputs.releaseTag }} scripts/release_main.sh
run: RELEASE_BRANCH=${STEPS_EXTRACT_BRANCH_OUTPUTS_BRANCH} RELEASE_TAG=${{ inputs.releaseTag }} scripts/release_main.sh
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
STEPS_EXTRACT_BRANCH_OUTPUTS_BRANCH: ${{ steps.extract_branch.outputs.branch }}
6 changes: 4 additions & 2 deletions .github/workflows/release_js_package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ jobs:
- name: release script
shell: bash
run: |
cd ${{ inputs.packageDir }}
pnpm publish --tag ${{ inputs.releaseTag }} --publish-branch ${{ steps.extract_branch.outputs.branch }} --access=public --registry https://wombat-dressing-room.appspot.com
cd ${INPUTS_PACKAGEDIR}
pnpm publish --tag ${{ inputs.releaseTag }} --publish-branch ${STEPS_EXTRACT_BRANCH_OUTPUTS_BRANCH} --access=public --registry https://wombat-dressing-room.appspot.com
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
INPUTS_PACKAGEDIR: ${{ inputs.packageDir }}
STEPS_EXTRACT_BRANCH_OUTPUTS_BRANCH: ${{ steps.extract_branch.outputs.branch }}
14 changes: 10 additions & 4 deletions .github/workflows/releasekit-uv.yml
Original file line number Diff line number Diff line change
Expand Up @@ -341,14 +341,16 @@ jobs:
if: steps.app-token.outcome == 'success'
id: app-user
run: |
if ! user_id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id 2>/dev/null); then
if ! user_id=$(gh api "/users/${STEPS_APP_TOKEN_OUTPUTS_APP_SLUG}[bot]" --jq .id 2>/dev/null); then
echo "::warning::Failed to fetch App bot user ID — using 0 as fallback"
user_id=0
fi
echo "user-id=$user_id" >> "$GITHUB_OUTPUT"
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}

STEPS_APP_TOKEN_OUTPUTS_APP_SLUG: ${{ steps.app-token.outputs.app-slug }}

# Resolve: App > PAT > GITHUB_TOKEN (respects auth_method override).
- name: Resolve token and identity
id: resolve
Expand All @@ -359,10 +361,10 @@ jobs:
if [ "$AUTH" = "app" ] || { [ "$AUTH" = "auto" ] && [ -n "$APP_TOKEN" ]; }; then
{ echo "token=$APP_TOKEN"
echo "auth-method=app"
echo "git-user-name=${{ steps.app-token.outputs.app-slug }}[bot]"
echo "git-user-email=${{ steps.app-user.outputs.user-id }}+${{ steps.app-token.outputs.app-slug }}[bot]@users.noreply.github.com"
echo "git-user-name=${STEPS_APP_TOKEN_OUTPUTS_APP_SLUG}[bot]"
echo "git-user-email=${STEPS_APP_USER_OUTPUTS_USER_ID}+${STEPS_APP_TOKEN_OUTPUTS_APP_SLUG}[bot]@users.noreply.github.com"
} >> "$GITHUB_OUTPUT"
echo "::notice::Using GitHub App token (${{ steps.app-token.outputs.app-slug }})"
echo "::notice::Using GitHub App token (${STEPS_APP_TOKEN_OUTPUTS_APP_SLUG})"

# PAT — used when auth=auto (and available) or auth=pat.
elif [ "$AUTH" = "pat" ] || { [ "$AUTH" = "auto" ] && [ -n "$PAT_TOKEN" ]; }; then
Expand Down Expand Up @@ -396,6 +398,10 @@ jobs:
GIT_USER_NAME: ${{ vars.RELEASEKIT_GIT_USER_NAME }}
GIT_USER_EMAIL: ${{ vars.RELEASEKIT_GIT_USER_EMAIL }}

STEPS_APP_TOKEN_OUTPUTS_APP_SLUG: ${{ steps.app-token.outputs.app-slug }}

STEPS_APP_USER_OUTPUTS_USER_ID: ${{ steps.app-user.outputs.user-id }}

# ═══════════════════════════════════════════════════════════════════════
# PREPARE: Compute bumps and open/update Release PR
# ═══════════════════════════════════════════════════════════════════════
Expand Down
2 changes: 1 addition & 1 deletion genkit-tools/cli/src/commands/dev-test-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ export const devTestModel = new Command('dev:test-model')
);
manager = result.manager;
} else {
manager = await startManager(projectRoot, false);
manager = await startManager({ projectRoot, manageHealth: false });
}

await waitForRuntime(manager);
Expand Down
5 changes: 4 additions & 1 deletion genkit-tools/cli/src/commands/server-harness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ export const serverHarness = new Command('__server-harness')
});

const portNum = Number.parseInt(port) || 4100;
const manager = await startManager(await findProjectRoot(), true);
const manager = await startManager({
projectRoot: await findProjectRoot(),
manageHealth: true,
});
await startServer(manager, portNum);
});
16 changes: 14 additions & 2 deletions genkit-tools/cli/src/commands/start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ interface RunOptions {
port?: string;
open?: boolean;
disableRealtimeTelemetry?: boolean;
corsOrigin?: string;
}

/** Command to run code in dev mode and/or the Dev UI. */
Expand All @@ -39,6 +40,10 @@ export const start = new Command('start')
'--disable-realtime-telemetry',
'Disable real-time telemetry streaming'
)
.option(
'--cors-origin <origin>',
'specify the allowed origin for CORS requests'
)
.action(async (options: RunOptions) => {
const projectRoot = await findProjectRoot();
if (projectRoot.includes('/.Trash/')) {
Expand All @@ -55,12 +60,19 @@ export const start = new Command('start')
projectRoot,
start.args[0],
start.args.slice(1),
{ disableRealtimeTelemetry: options.disableRealtimeTelemetry }
{
disableRealtimeTelemetry: options.disableRealtimeTelemetry,
corsOrigin: options.corsOrigin,
}
);
manager = result.manager;
processPromise = result.processPromise;
} else {
manager = await startManager(projectRoot, true);
manager = await startManager({
projectRoot,
manageHealth: true,
corsOrigin: options.corsOrigin,
});
processPromise = new Promise(() => {});
}
if (!options.noui) {
Expand Down
5 changes: 4 additions & 1 deletion genkit-tools/cli/src/mcp/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,10 @@ export class McpRuntimeManager {
if (this.manager) {
await this.manager.stop();
}
this.manager = await startManager(projectRoot, true /* manageHealth */);
this.manager = await startManager({
projectRoot,
manageHealth: true,
});
this.currentProjectRoot = projectRoot;
return this.manager;
}
Expand Down
36 changes: 22 additions & 14 deletions genkit-tools/cli/src/utils/manager-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,21 @@ import getPort, { makeRange } from 'get-port';
*
* This function is not idempotent. Typically you want to make sure it's called only once per cli instance.
*/
export async function resolveTelemetryServer(
projectRoot: string
): Promise<string> {
export async function resolveTelemetryServer(options: {
projectRoot: string;
corsOrigin?: string;
}): Promise<string> {
let telemetryServerUrl = process.env.GENKIT_TELEMETRY_SERVER;
if (!telemetryServerUrl) {
const telemetryPort = await getPort({ port: makeRange(4033, 4999) });
telemetryServerUrl = `http://localhost:${telemetryPort}`;
await startTelemetryServer({
port: telemetryPort,
traceStore: new LocalFileTraceStore({
storeRoot: projectRoot,
indexRoot: projectRoot,
storeRoot: options.projectRoot,
indexRoot: options.projectRoot,
}),
corsOrigin: options.corsOrigin,
});
}
return telemetryServerUrl;
Expand All @@ -54,15 +56,16 @@ export async function resolveTelemetryServer(
/**
* Starts the runtime manager and its dependencies.
*/
export async function startManager(
projectRoot: string,
manageHealth?: boolean
): Promise<RuntimeManager> {
const telemetryServerUrl = await resolveTelemetryServer(projectRoot);
export async function startManager(options: {
projectRoot: string;
manageHealth?: boolean;
corsOrigin?: string;
}): Promise<RuntimeManager> {
const telemetryServerUrl = await resolveTelemetryServer(options);
const manager = RuntimeManager.create({
telemetryServerUrl,
manageHealth,
projectRoot,
manageHealth: options.manageHealth,
projectRoot: options.projectRoot,
});
return manager;
}
Expand All @@ -73,6 +76,7 @@ export interface DevProcessManagerOptions {
healthCheck?: boolean;
timeout?: number;
cwd?: string;
corsOrigin?: string;
}

export async function startDevProcessManager(
Expand All @@ -81,7 +85,10 @@ export async function startDevProcessManager(
args: string[],
options?: DevProcessManagerOptions
): Promise<{ manager: RuntimeManager; processPromise: Promise<void> }> {
const telemetryServerUrl = await resolveTelemetryServer(projectRoot);
const telemetryServerUrl = await resolveTelemetryServer({
projectRoot,
corsOrigin: options?.corsOrigin,
});
const disableRealtimeTelemetry = options?.disableRealtimeTelemetry ?? false;
const envVars: Record<string, string> = {
GENKIT_TELEMETRY_SERVER: telemetryServerUrl,
Expand All @@ -90,6 +97,7 @@ export async function startDevProcessManager(
if (!disableRealtimeTelemetry) {
envVars.GENKIT_ENABLE_REALTIME_TELEMETRY = 'true';
}

const processManager = new ProcessManager(command, args, envVars);
const manager = await RuntimeManager.create({
telemetryServerUrl,
Expand Down Expand Up @@ -169,7 +177,7 @@ export async function runWithManager(
) {
let manager: RuntimeManager;
try {
manager = await startManager(projectRoot, false); // Don't manage health in this case.
manager = await startManager({ projectRoot, manageHealth: false }); // Don't manage health in this case.
} catch (e) {
process.exit(1);
}
Expand Down
6 changes: 5 additions & 1 deletion genkit-tools/cli/tests/commands/start_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,11 @@ describe('start command', () => {

await serverStartedPromise;

expect(startManagerSpy).toHaveBeenCalledWith('/mock/root', true);
expect(startManagerSpy).toHaveBeenCalledWith({
projectRoot: '/mock/root',
manageHealth: true,
corsOrigin: undefined,
});
expect(startDevProcessManagerSpy).not.toHaveBeenCalled();
expect(startServerSpy).toHaveBeenCalled();
});
Expand Down
15 changes: 15 additions & 0 deletions genkit-tools/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading