Skip to content

Custom Function directory/project scaffolding - #519

Merged
bencmbrook merged 54 commits into
mainfrom
benbrook/link-8250-custom-function-scaffolding
Sep 8, 2026
Merged

bencmbrook merged 54 commits into
mainfrom
benbrook/link-8250-custom-function-scaffolding

Conversation

@bencmbrook

@bencmbrook bencmbrook commented Sep 7, 2026 •

Copy link
Copy Markdown
Member

Closes LINK-8250: Add interactive Custom Function scaffolding to the CLI

Screen.Recording.2026-09-07.at.8.54.10.PM.mov

Summary

Add a credential-free local workflow for developing Transcend Custom Functions.

  • transcend custom-functions init creates a project under the explicit default transcend/custom-functions. It can add Deno configuration, editor recommendations, the transcend-custom-functions AI authoring skill, and validation-only GitHub Actions.
  • transcend custom-functions new adds a typed General or data subject request (DSR) starter, representative test payloads, and the matching manifest entry to an initialized project.
  • transcend custom-functions run executes configured fixtures in a local Deno 2 simulator and prints function logs. It mirrors Sombra's export selection, payload preparation, environment isolation, timeout, software development kit (SDK), and key-value (KV) shape without requiring credentials. sdk.fetch is simulated, and native network access requires an explicit --allowNetwork opt-in.
  • transcend custom-functions check validates the manifest, files, payload schemas, exports, types, lint, and formatting with Deno 2 before the project is pushed. Generated configuration pins the production Deno version; other Deno 2 versions produce a compatibility warning.
  • Manifest placeholders retain the existing <<parameters.*>> syntax and are supplied through the backward-compatible --variables flag. Local runs and checks require explicit values, while generated commands provide non-secret placeholders.

Each scaffold command previews one transactional plan, preserves existing configuration, carries custom manifest paths through follow-up commands, and finishes with a compact AI handoff. Source and test payload paths remain within the manifest directory across run, check, and push, including through symlinks. Customized workflows are left unchanged. In a bare project, repository-level .vscode and .agents setup is placed at the invocation root while Custom Function files remain isolated under the target directory.

The AI guidance is also published as a literal repository skill, so it can be installed before setup with npx skills add transcend-io/tools --skill transcend-custom-functions.

Validation

  • Targeted Custom Function suite (186 tests)
  • Isolated CLI example-command suite (308 tests)
  • Real Deno 2.4.5 end-to-end checks for validation and local execution
  • Local simulator coverage for payload/export selection, SDK/KV behavior, permissions, timeouts, output safety, and multi-payload failures
  • Generated workflow YAML parsing and security assertions
  • CLI typecheck, lint, production build, and export checks
  • Bundled Agent Skill asset check
  • Pre-commit quality checks

LINK-8250

@linear-code

linear-code Bot commented Sep 7, 2026

Copy link
Copy Markdown

LINK-8250

@bencmbrook
bencmbrook changed the base branch from main to docs/cli-command-boundaries-rule September 7, 2026 20:55
@pkg-pr-new

pkg-pr-new Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

@transcend-io/airgap.js-types

pnpm add https://pkg.pr.new/@transcend-io/airgap.js-types@519
yarn add https://pkg.pr.new/@transcend-io/airgap.js-types@519.tgz

@transcend-io/cli

pnpm add https://pkg.pr.new/@transcend-io/cli@519
yarn add https://pkg.pr.new/@transcend-io/cli@519.tgz

@transcend-io/custom-function-types

pnpm add https://pkg.pr.new/@transcend-io/custom-function-types@519
yarn add https://pkg.pr.new/@transcend-io/custom-function-types@519.tgz

@transcend-io/design-tokens

pnpm add https://pkg.pr.new/@transcend-io/design-tokens@519
yarn add https://pkg.pr.new/@transcend-io/design-tokens@519.tgz

@transcend-io/internationalization

pnpm add https://pkg.pr.new/@transcend-io/internationalization@519
yarn add https://pkg.pr.new/@transcend-io/internationalization@519.tgz

@transcend-io/privacy-types

pnpm add https://pkg.pr.new/@transcend-io/privacy-types@519
yarn add https://pkg.pr.new/@transcend-io/privacy-types@519.tgz

@transcend-io/sdk

pnpm add https://pkg.pr.new/@transcend-io/sdk@519
yarn add https://pkg.pr.new/@transcend-io/sdk@519.tgz

@transcend-io/type-utils

pnpm add https://pkg.pr.new/@transcend-io/type-utils@519
yarn add https://pkg.pr.new/@transcend-io/type-utils@519.tgz

@transcend-io/utils

pnpm add https://pkg.pr.new/@transcend-io/utils@519
yarn add https://pkg.pr.new/@transcend-io/utils@519.tgz

@transcend-io/mcp

pnpm add https://pkg.pr.new/@transcend-io/mcp@519
yarn add https://pkg.pr.new/@transcend-io/mcp@519.tgz

@transcend-io/mcp-server-admin

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-admin@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-admin@519.tgz

@transcend-io/mcp-server-assessment

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-assessment@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-assessment@519.tgz

@transcend-io/mcp-server-base

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-base@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-base@519.tgz

@transcend-io/mcp-server-consent

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-consent@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-consent@519.tgz

@transcend-io/mcp-server-discovery

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-discovery@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-discovery@519.tgz

@transcend-io/mcp-server-docs

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-docs@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-docs@519.tgz

@transcend-io/mcp-server-dsr

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-dsr@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-dsr@519.tgz

@transcend-io/mcp-server-inventory

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-inventory@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-inventory@519.tgz

@transcend-io/mcp-server-preferences

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-preferences@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-preferences@519.tgz

@transcend-io/mcp-server-workflows

pnpm add https://pkg.pr.new/@transcend-io/mcp-server-workflows@519
yarn add https://pkg.pr.new/@transcend-io/mcp-server-workflows@519.tgz

commit: 70b224b

@bencmbrook bencmbrook changed the title benbrook/link 8250 custom function scaffolding Custom Function project scaffolding Sep 7, 2026
@bencmbrook bencmbrook changed the title Custom Function project scaffolding Custom Function directory/project scaffolding Sep 7, 2026
@bencmbrook
bencmbrook marked this pull request as ready for review September 8, 2026 01:10
@bencmbrook
bencmbrook requested review from a team as code owners September 8, 2026 01:10
giacaglia
giacaglia previously approved these changes Sep 8, 2026

@giacaglia giacaglia left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

@bencmbrook
bencmbrook force-pushed the benbrook/link-8250-custom-function-scaffolding branch from bd430ee to 5696e13 Compare September 8, 2026 02:22
Base automatically changed from docs/cli-command-boundaries-rule to main September 8, 2026 02:32
@bencmbrook
bencmbrook force-pushed the benbrook/link-8250-custom-function-scaffolding branch from 5696e13 to ee9dfef Compare September 8, 2026 02:32
dmattia
dmattia previously approved these changes Sep 8, 2026
Comment thread .github/workflows/ci.yml Outdated
ecton-transcend
ecton-transcend previously approved these changes Sep 8, 2026

@ecton-transcend ecton-transcend left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So cool! Thanks for putting this together. The onboard experience is much cleaner now

Keep the established --variables interface while retaining the
<<parameters.*>> manifest syntax. Require explicit values in local
validation and execution, and surface safe placeholders in generated
guidance.
Require source and test payload paths to remain under the manifest
directory for push, run, and check. Document the shared contract with
the relevant manifest fields.
@bencmbrook
bencmbrook force-pushed the benbrook/link-8250-custom-function-scaffolding branch from cfc8ec1 to 70b224b Compare September 8, 2026 21:45
@bencmbrook
bencmbrook merged commit 7384caa into main Sep 8, 2026
4 checks passed
@bencmbrook
bencmbrook deleted the benbrook/link-8250-custom-function-scaffolding branch September 8, 2026 22:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants