Skip to content

feat(create): fetch remote manifest after linking app during create#585

Open
srtaalej wants to merge 12 commits into
mainfrom
ale-fetch-remote-manifest
Open

feat(create): fetch remote manifest after linking app during create#585
srtaalej wants to merge 12 commits into
mainfrom
ale-fetch-remote-manifest

Conversation

@srtaalej

@srtaalej srtaalej commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Changelog

slack create --app now fetches the app's manifest from remote settings and writes it to the project's manifest.json, replacing the template's generic manifest with the actual app configuration.

Summary

Follow-up to #565. After linking an existing app during slack create --app --template, the CLI now fetches the remote manifest from App Settings and overwrites the template's manifest.json with it.

This also updates LinkExistingApp to return (*types.SlackAuth, error) so callers can use the auth token for subsequent API calls (like manifest fetching).

Design decisions:

  • Manifest source remains local in .slack/config.json — the remote content is written locally
  • Only manifest.json is overwritten (not manifest.ts/.js which are code files in Deno projects)
  • On fetch failure, a warning is printed and the command continues — the project and link still succeed

Testing

make test testdir=cmd/project testname=TestCreateCommand_AppFlag_FetchesRemoteManifest
make test testdir=cmd/project testname=TestCreateCommand_AppFlag
make test testdir=cmd/project testname=Test_Project_InitCommand
make test testdir=cmd/app testname=TestLinkCommand

Manual:

  1. make build
  2. ./bin/slack create my-test -t slack-samples/bolt-js-starter-template --app <real-app-id> --environment local
  3. Verify my-test/manifest.json contains the remote app's manifest
  4. Test with an invalid app ID to confirm the warning is shown and the project is still created

Notes 🔴

  • Open question: should we set manifest.source to remote in .slack/config.json after writing the fetched manifest? Currently left as local so the user "owns" the file going forward.

A future PR could add merging logic between template and remote manifests.

  • manifest.ts/.js (Deno SDK) projects are not supported

Requirements

@srtaalej srtaalej self-assigned this Jun 9, 2026
@srtaalej srtaalej requested a review from a team as a code owner June 9, 2026 00:27
@srtaalej srtaalej added enhancement M-T: A feature request for new functionality changelog Use on updates to be included in the release notes semver:minor Use on pull requests to describe the release version increment labels Jun 9, 2026
@codecov

codecov Bot commented Jun 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 76.47059% with 8 lines in your changes missing coverage. Please review.
✅ Project coverage is 71.70%. Comparing base (4b1bf3b) to head (f984c33).
⚠️ Report is 4 commits behind head on main.

Files with missing lines Patch % Lines
cmd/app/link.go 55.55% 4 Missing ⚠️
cmd/project/create.go 83.33% 2 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #585      +/-   ##
==========================================
+ Coverage   71.64%   71.70%   +0.05%     
==========================================
  Files         226      226              
  Lines       19176    19198      +22     
==========================================
+ Hits        13739    13765      +26     
+ Misses       4222     4221       -1     
+ Partials     1215     1212       -3     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

srtaalej and others added 3 commits June 12, 2026 13:57
Resolve conflicts by integrating main's stricter --app/--environment
validation with the remote manifest fetch feature.

Co-Authored-By: Claude <svc-devxp-claude@slack-corp.com>
@srtaalej srtaalej requested review from mwbrooks and zimeg June 18, 2026 16:50

@zimeg zimeg 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.

@srtaalej Thanks for sharing these changes 👾 ✨

I'm leaving a few comments on a first run experience around prompts and earlier errors. Other comments are on code organization with thoughts around the difference between create and link logic that might be interesting to clear up ✂️ 📠

Testing is solid for me too but I leave a note around escaped values that are unsettling to me. I'm unsure what caused that 👻

Comment thread cmd/project/create.go
Comment on lines +310 to +324
// fetchAndWriteRemoteManifest fetches the app manifest from remote settings and writes it to the project.
func fetchAndWriteRemoteManifest(ctx context.Context, clients *shared.ClientFactory, token, appID, projectPath string) error {
slackYaml, err := clients.AppClient().Manifest.GetManifestRemote(ctx, token, appID)
if err != nil {
return err
}
data, err := json.MarshalIndent(slackYaml.AppManifest, "", " ")
if err != nil {
return err
}
data = append(data, '\n')
manifestPath := filepath.Join(projectPath, "manifest.json")
return afero.WriteFile(clients.Fs, manifestPath, data, 0644)
}

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.

📠 suggestion: We might find a new file better for this? It might be shared in other commands or PRs #591!

internal/manifest/export.go

Comment thread cmd/project/create.go
Comment on lines +244 to +250
clients.IO.PrintWarning(ctx, "%s", style.Sectionf(style.TextSection{
Text: "Could not fetch the remote app manifest",
Secondary: []string{
fetchErr.Error(),
"The template manifest was kept unchanged",
},
}))

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.

⚠️ question: Could returning the error here bring more confidence for scripts? I'm unsure when this might fail but would hope that invalid app IDs error overall to start

Comment thread cmd/app/link.go
LinkAppFooterSection(ctx, clients, app)

return nil
return auth, nil

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.

🔗 question: Instead of returning an auth to calling functions that's often ignored, would setting up the manifest as part of the link command if no apps are saved make sense?

👾 ramble: I'm wanting to avoid mixing concepts with the create command which should be from a project template I think while link is seeming more app specific.

Comment thread cmd/project/create.go
if err != nil {
return err
}
data, err := json.MarshalIndent(slackYaml.AppManifest, "", " ")

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.

🔬 note: I'm finding some values are escaped but this hasn't caused an error when testing the custom step template:

-           "type": "slack#/types/user_id",
+           "type": "slack#\/types\/user_id",

Comment thread cmd/project/create.go
}
data = append(data, '\n')
manifestPath := filepath.Join(projectPath, "manifest.json")
return afero.WriteFile(clients.Fs, manifestPath, data, 0644)

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.

🏁 suggestion: We should save the hash alongside this to avoid a confusing prompt of a changed manifest on the first "run" command:

hash, err := clients.Config.ProjectConfig.Cache().NewManifestHash(ctx, upstream.Manifest.AppManifest)
if err != nil {
return types.App{}, "", err
}
if !hash.Equals(saved) {
err := clients.Config.ProjectConfig.Cache().SetManifestHash(ctx, app.AppID, hash)
if err != nil {
return types.App{}, "", err
}
}

$ cd my-test
$ slack run

📚 App Manifest
   Manifest values for this app are overwritten on reinstall

┃ Overwrite manifest on app settings with the project's manifest file?
┃   Yes
┃ ❱ No

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog Use on updates to be included in the release notes enhancement M-T: A feature request for new functionality semver:minor Use on pull requests to describe the release version increment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants