sitevision-cli 1.0.0-beta.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/LICENSE +21 -0
  3. package/dist/cli.js +194 -70
  4. package/dist/commands/TaskScreen.js +32 -0
  5. package/dist/commands/build.js +6 -185
  6. package/dist/commands/deploy.js +95 -212
  7. package/dist/commands/dev.js +87 -416
  8. package/dist/commands/info.js +1 -1
  9. package/dist/commands/setup-signing.js +50 -33
  10. package/dist/commands/sign.js +9 -86
  11. package/dist/commands/use-finish.js +17 -0
  12. package/dist/commands/watch.js +5 -31
  13. package/dist/components/AnimatedLogo.js +8 -2
  14. package/dist/components/AuthLoginScreen.js +33 -15
  15. package/dist/components/PasswordInput.js +2 -1
  16. package/dist/scaffold/inquirer-stub.js +119 -0
  17. package/dist/scaffold/register.js +15 -0
  18. package/dist/shell/AddonPicker.js +54 -0
  19. package/dist/shell/Changelog.js +44 -0
  20. package/dist/shell/CommandPalette.js +63 -0
  21. package/dist/shell/ConfigForm.js +703 -0
  22. package/dist/shell/Frame.js +138 -0
  23. package/dist/shell/Help.js +96 -0
  24. package/dist/shell/Popover.js +15 -0
  25. package/dist/shell/Settings.js +149 -0
  26. package/dist/shell/Shell.js +953 -0
  27. package/dist/shell/Tabs.js +96 -0
  28. package/dist/shell/actions.js +493 -0
  29. package/dist/utils/config.js +62 -2
  30. package/dist/utils/create-app.js +231 -0
  31. package/dist/utils/debug.js +32 -0
  32. package/dist/utils/environments.js +74 -0
  33. package/dist/utils/i18n.js +369 -0
  34. package/dist/utils/jsonc.js +2 -1
  35. package/dist/utils/keychain.js +54 -6
  36. package/dist/utils/oauth2-auth.js +146 -43
  37. package/dist/utils/password-prompt.js +37 -3
  38. package/dist/utils/process-runner.js +77 -38
  39. package/dist/utils/project-detection.js +457 -112
  40. package/dist/utils/session-cookie-auth.js +10 -6
  41. package/dist/utils/sitevision-api.js +134 -25
  42. package/dist/utils/sitevision-scripts-runner.js +50 -22
  43. package/dist/utils/tasks.js +510 -0
  44. package/dist/utils/version-check.js +3 -3
  45. package/dist/utils/webpack-runner.js +9 -5
  46. package/dist/utils/workspace.js +105 -0
  47. package/dist/utils/zip.js +18 -19
  48. package/package.json +27 -4
  49. package/readme.md +113 -141
  50. package/dist/app.d.ts +0 -6
  51. package/dist/app.js +0 -307
  52. package/dist/cli.d.ts +0 -2
  53. package/dist/commands/build.d.ts +0 -12
  54. package/dist/commands/deploy.d.ts +0 -16
  55. package/dist/commands/dev.d.ts +0 -16
  56. package/dist/commands/index.d.ts +0 -4
  57. package/dist/commands/info.d.ts +0 -2
  58. package/dist/commands/setup-signing.d.ts +0 -2
  59. package/dist/commands/sign.d.ts +0 -14
  60. package/dist/commands/types.d.ts +0 -18
  61. package/dist/commands/watch.d.ts +0 -2
  62. package/dist/components/AnimatedLogo.d.ts +0 -10
  63. package/dist/components/AuthLoginScreen.d.ts +0 -21
  64. package/dist/components/DevPropertiesForm.d.ts +0 -10
  65. package/dist/components/DevPropertiesForm.js +0 -210
  66. package/dist/components/InfoScreen.d.ts +0 -7
  67. package/dist/components/InfoScreen.js +0 -14
  68. package/dist/components/KeychainPasswordChoice.d.ts +0 -8
  69. package/dist/components/KeychainPasswordChoice.js +0 -30
  70. package/dist/components/MainMenu.d.ts +0 -7
  71. package/dist/components/MainMenu.js +0 -83
  72. package/dist/components/PasswordInput.d.ts +0 -10
  73. package/dist/components/ProcessOutput.d.ts +0 -6
  74. package/dist/components/ProcessOutput.js +0 -30
  75. package/dist/components/SetupFlow.d.ts +0 -8
  76. package/dist/components/SetupFlow.js +0 -233
  77. package/dist/components/SigningPropertiesForm.d.ts +0 -7
  78. package/dist/components/SigningPropertiesForm.js +0 -38
  79. package/dist/components/StatusIndicator.d.ts +0 -8
  80. package/dist/components/TextInput.d.ts +0 -10
  81. package/dist/components/TextInput.js +0 -29
  82. package/dist/components/WelcomeScreen.d.ts +0 -14
  83. package/dist/types/index.d.ts +0 -284
  84. package/dist/utils/branding.d.ts +0 -28
  85. package/dist/utils/config.d.ts +0 -17
  86. package/dist/utils/jsonc.d.ts +0 -19
  87. package/dist/utils/keychain.d.ts +0 -15
  88. package/dist/utils/oauth2-auth.d.ts +0 -27
  89. package/dist/utils/password-prompt.d.ts +0 -14
  90. package/dist/utils/process-runner.d.ts +0 -22
  91. package/dist/utils/project-detection.d.ts +0 -151
  92. package/dist/utils/session-cookie-auth.d.ts +0 -34
  93. package/dist/utils/signing-password.d.ts +0 -12
  94. package/dist/utils/signing-step.d.ts +0 -15
  95. package/dist/utils/signing-step.js +0 -16
  96. package/dist/utils/sitevision-api.d.ts +0 -112
  97. package/dist/utils/sitevision-scripts-runner.d.ts +0 -83
  98. package/dist/utils/version-check.d.ts +0 -9
  99. package/dist/utils/webpack-runner.d.ts +0 -76
  100. package/dist/utils/zip.d.ts +0 -71
package/dist/utils/zip.js CHANGED
@@ -114,7 +114,7 @@ async function buildZipBuffer(entries) {
114
114
  const localHeader = Buffer.alloc(30);
115
115
  localHeader.writeUInt32LE(0x04034b50, 0);
116
116
  localHeader.writeUInt16LE(20, 4); // version needed to extract
117
- localHeader.writeUInt16LE(0, 6); // general purpose flag
117
+ localHeader.writeUInt16LE(0x08_00, 6); // general purpose flag: UTF-8 names
118
118
  localHeader.writeUInt16LE(method, 8);
119
119
  localHeader.writeUInt16LE(dosTime, 10);
120
120
  localHeader.writeUInt16LE(dosDate, 12);
@@ -130,7 +130,7 @@ async function buildZipBuffer(entries) {
130
130
  centralHeader.writeUInt32LE(0x02014b50, 0);
131
131
  centralHeader.writeUInt16LE(20, 4); // version made by
132
132
  centralHeader.writeUInt16LE(20, 6); // version needed
133
- centralHeader.writeUInt16LE(0, 8); // general purpose flag
133
+ centralHeader.writeUInt16LE(0x08_00, 8); // general purpose flag: UTF-8 names
134
134
  centralHeader.writeUInt16LE(method, 10);
135
135
  centralHeader.writeUInt16LE(dosTime, 12);
136
136
  centralHeader.writeUInt16LE(dosDate, 14);
@@ -228,6 +228,9 @@ export async function createBuildZip(projectRoot, appId) {
228
228
  if (!fs.existsSync(buildDir)) {
229
229
  throw new Error(`Build directory not found: ${buildDir}. Run build first.`);
230
230
  }
231
+ if (!fs.existsSync(path.join(buildDir, 'manifest.json'))) {
232
+ throw new Error(`${buildDir} has no manifest.json, so the zip would not be an app. manifest.json belongs in static/ (or src/ for an app that is not bundled).`);
233
+ }
231
234
  return createZip(buildDir, zipPath);
232
235
  }
233
236
  // =============================================================================
@@ -268,15 +271,17 @@ export function copyChunksToResources(buildDir) {
268
271
  export function copyStaticToBuild(projectRoot) {
269
272
  const staticDir = path.join(projectRoot, 'static');
270
273
  const buildDir = path.join(projectRoot, 'build');
271
- if (!fs.existsSync(staticDir)) {
272
- return;
273
- }
274
- // Ensure build directory exists
275
- if (!fs.existsSync(buildDir)) {
276
- fs.mkdirSync(buildDir, { recursive: true });
274
+ fs.mkdirSync(buildDir, { recursive: true });
275
+ if (fs.existsSync(staticDir))
276
+ copyDirRecursive(staticDir, buildDir);
277
+ // Every build ends here. A manifest kept at the project root is detected,
278
+ // so it ships when neither src/ nor static/ brought one.
279
+ const manifestIn = (dir) => path.join(projectRoot, dir, 'manifest.json');
280
+ if (fs.existsSync(manifestIn('.')) &&
281
+ !fs.existsSync(manifestIn('src')) &&
282
+ !fs.existsSync(manifestIn('static'))) {
283
+ fs.copyFileSync(manifestIn('.'), path.join(buildDir, 'manifest.json'));
277
284
  }
278
- // Copy static directory contents to build
279
- copyDirRecursive(staticDir, buildDir);
280
285
  }
281
286
  /**
282
287
  * Copy source files to build directory (for non-bundled apps)
@@ -286,15 +291,9 @@ export function copyStaticToBuild(projectRoot) {
286
291
  export function copySrcToBuild(projectRoot) {
287
292
  const srcDir = path.join(projectRoot, 'src');
288
293
  const buildDir = path.join(projectRoot, 'build');
289
- if (!fs.existsSync(srcDir)) {
290
- return;
291
- }
292
- // Ensure build directory exists
293
- if (!fs.existsSync(buildDir)) {
294
- fs.mkdirSync(buildDir, { recursive: true });
295
- }
296
- // Copy src directory contents to build
297
- copyDirRecursive(srcDir, buildDir);
294
+ fs.mkdirSync(buildDir, { recursive: true });
295
+ if (fs.existsSync(srcDir))
296
+ copyDirRecursive(srcDir, buildDir);
298
297
  }
299
298
  /**
300
299
  * Recursively copy a directory
package/package.json CHANGED
@@ -1,7 +1,22 @@
1
1
  {
2
2
  "name": "sitevision-cli",
3
- "version": "1.0.0-beta.9",
3
+ "version": "1.0.0",
4
+ "description": "Build, sign and deploy Sitevision apps from the terminal",
4
5
  "license": "MIT",
6
+ "author": "Rasmus Söderström",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/xrasod/SitevisionCli.git"
10
+ },
11
+ "homepage": "https://github.com/xrasod/SitevisionCli#readme",
12
+ "bugs": "https://github.com/xrasod/SitevisionCli/issues",
13
+ "keywords": [
14
+ "sitevision",
15
+ "cli",
16
+ "webapp",
17
+ "restapp",
18
+ "deploy"
19
+ ],
5
20
  "bin": {
6
21
  "svc": "dist/cli.js"
7
22
  },
@@ -10,20 +25,23 @@
10
25
  "node": ">=22"
11
26
  },
12
27
  "scripts": {
13
- "build": "tsc",
28
+ "build": "node -e \"fs.rmSync('dist',{recursive:true,force:true})\" && tsc && node -e \"fs.chmodSync('dist/cli.js',0o755)\"",
14
29
  "dev": "tsc --watch",
15
30
  "test": "prettier --check . && xo && ava",
31
+ "prepublishOnly": "npm test && npm run build",
16
32
  "release": "./scripts/publish.sh",
17
33
  "release:beta": "./scripts/publish-beta.sh"
18
34
  },
19
35
  "files": [
20
- "dist"
36
+ "dist",
37
+ "CHANGELOG.md"
21
38
  ],
22
39
  "dependencies": {
23
40
  "@napi-rs/keyring": "^1.3.0",
24
41
  "ink": "^7.1.0",
25
42
  "ink-spinner": "^5.0.0",
26
43
  "meow": "^14.1.0",
44
+ "open": "^11.0.3",
27
45
  "puppeteer-core": "^25.10.0",
28
46
  "react": "^19.2.7"
29
47
  },
@@ -50,7 +68,12 @@
50
68
  ],
51
69
  "nodeArguments": [
52
70
  "--import=tsx"
53
- ]
71
+ ],
72
+ "environmentVariables": {
73
+ "FORCE_COLOR": "0",
74
+ "SVC_NO_KEYCHAIN": "memory",
75
+ "XDG_CONFIG_HOME": "test/.xdg"
76
+ }
54
77
  },
55
78
  "prettier": "@vdemedes/prettier-config"
56
79
  }
package/readme.md CHANGED
@@ -1,181 +1,153 @@
1
1
  # Sitevision CLI
2
2
 
3
- This CLI was largely built on the back of the [sitevision-scripts](https://github.com/sitevision/sitevision-scripts) project.
4
- However, these scripts have some limitations:
5
-
6
- - Clunky for use with environments requiring signed packages
7
- - Clunkly management of credentials and unsecure handling of credentials
8
- - No type safety
9
-
10
- ## Features
11
-
12
- - **Interactive Menu** - Full-screen TUI with arrow key navigation
13
- - **Project Detection** - Automatically detects Sitevision projects
14
- - **Two Modes** - Interactive menu OR direct command execution
15
- - **Automatic Setup** - Guided setup for dev properties and signing credentials
16
- - **Secure Credentials** - Passwords live in the OS keychain (macOS Keychain / Windows Credential Manager / Linux libsecret), never on disk
3
+ `svc` builds, signs and deploys Sitevision apps (WebApp, Widget, RESTApp,
4
+ MCPServer) from a full-screen terminal shell or as plain commands.
5
+
6
+ - **One shell for one app or a whole repo.** Run it inside an app, or at the
7
+ root of a repo with many apps and switch between them. Dev and watch keep
8
+ running in the background.
9
+ - **Three ways to authenticate deploys:** username and password, OAuth2 (PKCE,
10
+ works with SSO), or a captured browser session for SAML-only sites.
11
+ - **No secrets on disk.** Passwords, tokens and cookies live in the OS keychain.
12
+ - **Environments.** dev, test and prod in one config; production deploys use
13
+ the signed zip, confirm and activate.
14
+ - **Shared config in git.** Site and auth settings for the whole team live in
15
+ `package.json`, once at the repo root; your username stays in a local
16
+ `.dev_properties.json`. Compatible with plain sitevision-scripts.
17
+ - **Builds the way Sitevision does.** Bundled apps without their own webpack
18
+ config are built by `@sitevision/sitevision-scripts`.
19
+ - English and Swedish UI.
20
+
21
+ 📖 **[User guide](docs/user-guide.md)** · **[Användarguide (svenska)](docs/anvandarguide.md)**
17
22
 
18
23
  ## Install
19
24
 
25
+ Requires Node.js 22+.
26
+
20
27
  ```bash
21
28
  npm install --global sitevision-cli
22
29
  ```
23
30
 
24
- ## Usage
25
-
26
- The CLI must be run inside a Sitevision project directory (containing a `manifest.json`).
27
-
28
- ### Interactive Mode
29
-
30
- Simply run `svc` to launch the interactive menu:
31
+ ## Quick start
31
32
 
32
33
  ```bash
34
+ cd my-repo # or cd into a single app
33
35
  svc
34
36
  ```
35
37
 
36
- On first run (or if setup is incomplete), the CLI will:
37
-
38
- 1. Check if `node_modules` exists and offer to run `npm install` if missing
39
- 2. Check if dev properties are configured and offer to set them up if missing
40
- 3. Check if you have setup signing credentials and offer to do so if missing
41
- 4. Display project information
42
- 5. Show the main menu
43
-
44
- Use arrow keys to navigate and Enter to select:
45
-
46
- - **Dev** - Start development server with watch mode
47
- - **Dev (Signed)** - Development with automatic signing before each deploy
48
- - **Build** - Build a dist bundle
49
- - **Sign** - Sign built dist bundle
50
- - **Deploy** - Deploy to configured development environment
51
- - **Deploy (Force)** - Force deploy (overwrite existing)
52
- - **Deploy Production** - Deploy signed app to configured production environment
53
- - **Info** - Show project info
54
- - **Exit**
55
-
56
- ### Direct Commands
57
-
58
- You can also run commands directly:
59
-
60
- #### Development
61
-
62
- ```bash
63
- # Start development server with watch mode
64
- svc dev
65
-
66
- # Start development server with automatic signing
67
- svc dev --signed
68
- ```
69
-
70
- #### Building
71
-
72
- ```bash
73
- # Build the application for production
74
- svc build
75
- ```
76
-
77
- #### Signing
38
+ 1. Pick an app in the navigator and press `Enter`. (In a new repo the shell
39
+ opens on **Workspace settings** first.)
40
+ 2. Press `2` for the **Config** tab and fill in domain, site name, addon name,
41
+ username and auth method. Each field saves on `Enter`.
42
+ 3. Press `i` to install dependencies if needed, then `d` to start dev: build on
43
+ every change and deploy. Output is in the **Log** tab (`4`).
44
+
45
+ For production: switch environment with `v`, press `b` to build, `s` to sign
46
+ and `p` to deploy and activate.
47
+
48
+ ## The shell
49
+
50
+ | Key | Action |
51
+ | --------------- | --------------------------------------------------- |
52
+ | `d` / `w` | Dev (build + deploy on change) / Watch (build only) |
53
+ | `b` / `s` | Build / Sign |
54
+ | `p` / `P` | Deploy / force deploy to the active environment |
55
+ | `a` | Versions: list and activate uploaded versions |
56
+ | `v` | Switch environment |
57
+ | `e` / `y` / `i` | Config tab / sync `package.json` / `npm install` |
58
+ | `l` | Log in again |
59
+ | `K` | Stop running tasks |
60
+ | `1`–`4` | Overview · Config · Versions · Log |
61
+ | `/` | Command palette |
62
+ | `?` | Help: every key in one place |
63
+ | `,` | Settings (language, update check, hints) |
64
+ | `Tab` / `Esc` | Switch pane / back |
65
+ | `q` | Quit |
66
+
67
+ In the navigator, typing filters the app list; action keys work once `Enter` or
68
+ `Tab` has moved focus to the content pane. The bottom bar always shows the keys
69
+ that apply. `svc --minimal` gives a compact layout for small panes.
70
+ `svc --debug` writes a log of everything svc does, for bug reports.
71
+
72
+ ## Commands
78
73
 
79
74
  ```bash
80
- # Sign the app for production deployment
81
- svc sign
75
+ svc # interactive shell
76
+ svc build [--no-zip] # build to dist/<id>.zip
77
+ svc sign # sign to dist/<id>-signed.zip
78
+ svc deploy [--force] # deploy the zip
79
+ svc deploy --production [--activate] # deploy the signed zip
80
+ svc dev [--signed] # build + deploy on change
81
+ svc watch [--signed] # build on change, no deploy
82
+ svc info # project information
83
+ svc setup-signing [--global] # save the signing username and certificate
82
84
  ```
83
85
 
84
- #### Deployment
86
+ Short flags: `-f` force, `-p` production, `-a` activate, `-s` signed. An unknown
87
+ flag is an error.
85
88
 
86
- ```bash
87
- # Deploy to development server
88
- svc deploy
89
-
90
- # Force deploy (overwrite existing)
91
- svc deploy --force
92
-
93
- # Deploy to production (requires signed app)
94
- svc deploy --production
95
- ```
96
-
97
- #### Setup
98
-
99
- ```bash
100
- # Configure signing credentials
101
- svc setup-signing
102
- ```
103
-
104
- #### Project Info
105
-
106
- ```bash
107
- # Show project information and configuration
108
- svc info
109
- ```
89
+ Direct commands use the base environment, run without a terminal, and exit
90
+ non-zero when a step fails, so `svc build && svc sign && svc deploy -p -a` is
91
+ safe in CI. `SITEVISION_DEPLOY_PASSWORD` and `SITEVISION_SIGNING_PASSWORD`
92
+ supply the passwords; `SITEVISION_ACCESS_TOKEN` and `SITEVISION_SESSION_COOKIE`
93
+ pass an OAuth2 token or session cookie for one run.
110
94
 
111
95
  ## Configuration
112
96
 
113
- ### Development Properties (`.dev_properties.json`)
114
-
115
- Create this file in your project root for deployment configuration:
97
+ `.dev_properties.json` is your local config and the main source; keep it out of
98
+ git. Shared values are committed in `package.json` and act as defaults
99
+ underneath it:
116
100
 
117
101
  ```json
118
102
  {
119
- "domain": "your-site.sitevision.se",
120
- "siteName": "YourSite",
121
- "addonName": "your-addon",
122
- "username": "your-email@example.com",
123
- "useHTTPForDevDeploy": false,
124
- "signingUsername": "your-developer-account@example.com",
125
- "certificateName": "optional-certificate-name"
103
+ "developmentDomain": "acme-use.sitevision-cloud.se",
104
+ "siteName": "Intranet",
105
+ "addonName": "my-addon",
106
+ "svc": {
107
+ "authMethod": "oauth2",
108
+ "environments": {"prod": {"domain": "acme.sitevision-cloud.se"}}
109
+ }
126
110
  }
127
111
  ```
128
112
 
129
- ### Keeping `package.json` in sync
113
+ `username`, `signingUsername` and `certificateName` are user-specific and only
114
+ live in `.dev_properties.json`. `y` copies shared values from
115
+ `.dev_properties.json` into `package.json`. In a workspace, shared values go in
116
+ the root `package.json` and each app's `package.json` only needs `addonName`.
130
117
 
131
- `sitevision-scripts` reads `developmentDomain`, `siteName` and `addonName`
132
- from `package.json`, which duplicates three fields of
133
- `.dev_properties.json`. When they disagree — or when a fresh setup has just
134
- written `.dev_properties.json` — `svc` shows the differences and offers to
135
- update `package.json` from `.dev_properties.json`. Nothing is written without
136
- confirmation, and `.dev_properties.json` is always the source of truth for
137
- the copy. Existing indentation and unrelated fields are left alone.
118
+ ## Authentication in short
138
119
 
139
- After answering, `svc` offers to remember the choice in a `.svcconfig` file
140
- in the project root:
120
+ There are two separate credentials:
141
121
 
142
- ```json
143
- {
144
- "syncPackageJson": true
145
- }
146
- ```
122
+ - **Deploy**: your account on the site. `authMethod` is `basic` (password),
123
+ `oauth2` (browser login against the site's OAuth2 provider, refreshed
124
+ silently afterwards) or `cookie` (log in with SSO in a Chrome window, the
125
+ session is captured).
126
+ - **Signing**: your developer.sitevision.se account, always username and
127
+ password.
147
128
 
148
- With `true`, `svc` updates `package.json` automatically without asking; with
149
- `false`, the check is skipped entirely. Delete the key (or the file) to be
150
- asked again. The file contains no secrets, so it is safe to commit.
129
+ Everything secret goes in the OS keychain under `sitevision-cli`. For CI, set
130
+ `SITEVISION_DEPLOY_PASSWORD`, `SITEVISION_SIGNING_PASSWORD`,
131
+ `SITEVISION_ACCESS_TOKEN` or `SITEVISION_SESSION_COOKIE`.
151
132
 
152
- ### Password storage
133
+ OAuth2 needs a client registered on the site with the redirect URI
134
+ `http://127.0.0.1:8137/callback`. The [user guide](docs/user-guide.md#5-authentication)
135
+ covers the setup, the pitfalls, and which method works with which command.
153
136
 
154
- Passwords are stored in the OS-native secret store (macOS Keychain, Windows
155
- Credential Manager, Linux libsecret) under the `sitevision-cli` service —
156
- never in `.dev_properties.json`. Run `svc` and complete the setup form (or
157
- enter the password when prompted at deploy/sign time and toggle "save to
158
- keychain") to populate it.
137
+ ## Development
159
138
 
160
- If an existing `.dev_properties.json` contains a plaintext `password` field,
161
- the CLI offers to migrate it to the keychain on next launch and strip the
162
- field from the file. The migration prompt only appears in interactive mode
163
- (plain `svc`) — if you only ever invoke commands directly (`svc deploy`,
164
- `svc dev`), run `svc` once to migrate.
165
-
166
- For CI / headless use, set `SITEVISION_DEPLOY_PASSWORD` and/or
167
- `SITEVISION_SIGNING_PASSWORD` — these take precedence over the keychain and
168
- are never written anywhere.
169
-
170
- ### Signing Credentials
171
-
172
- Signing credentials are used to sign apps via developer.sitevision.se:
139
+ ```bash
140
+ npm install
141
+ npm run build # tsc → dist/
142
+ npm test # prettier, xo, ava
143
+ ```
173
144
 
174
- - `signingUsername` - Your developer.sitevision.se account
175
- - `certificateName` - Optional, if you have multiple certificates
145
+ To run your local build as `svc`, link it once with `npm link`, then keep
146
+ `npm run dev` running in the repo: every save recompiles `dist/`, so `svc` in
147
+ any Sitevision app reflects your changes. `npm unlink -g sitevision-cli` and
148
+ `npm install -g sitevision-cli` restore the published version.
176
149
 
177
- The signing password is prompted on first use, with an option to save it to
178
- the OS keychain for future runs.
150
+ Releasing: see [RELEASING.md](RELEASING.md).
179
151
 
180
152
  ## License
181
153
 
package/dist/app.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { type ProjectInfo } from './utils/project-detection.js';
2
- type Props = {
3
- project: ProjectInfo;
4
- };
5
- export default function App({ project: initialProject }: Props): import("react").JSX.Element | null;
6
- export {};