Giter VIP home page Giter VIP logo

kit's Introduction

Script Kit v2

https://scriptkit.com/

Join the Discussion

https://github.com/johnlindquist/kit/discussions

Docs

https://github.com/johnlindquist/kit-docs

⭐️ Unlock Script Kit Pro by Sponsoring Script Kit ⭐️

❤️ Sponsor me on GitHub ❤️

Sponsor Only Features

Shipped Planned
Built-in Debugger Sync Scripts to GitHub Repo
Script Log Window Run Script Remotely as GitHub Actions
Support through Discord Advanced Widgets
Screenshots
Screen Recording
Desktop Color Picker
Measure Tool
Debug from IDE

Script Kit Dev Setup

Note: This ain't pretty 😅

Requirements: yarn 1

Why both npm and yarn?

The App was created with https://github.com/electron-react-boilerplate/electron-react-boilerplate a long time ago. They require yarn and webpack.

I have been unable to prioritize the time to switch over to another build system or keeping up with the boilerplate, especially with so many moving pieces.

Thus, we use yarn to build the App and npm to build the SDK 🤦‍♂️

Note: A huge focus of v3 will be to clean up this mess and make it much, much easier to contribute.

Using node 18.18.2 from ~/.knode

Installing Kit.app already installed node 18.18.2 to ~/.knode. You'll want to use this node version for all build/run steps:

PATH=~/.knode/bin:$PATH

This will use 18.18.2's node/npm when working with Kit. (Alternatively, you can use nvm/n/whatever, but I don't)

  • Use volta to manage node versions.
    1. Install volta
    2. Volta will automatically switch node version to 18.18.2 when working with kit.

Clone Kit SDK

Clone: git clone https://github.com/johnlindquist/kit.git

Install: npm install

Clone Kit App

Clone: git clone https://github.com/johnlindquist/kitapp.git

Install: yarn

(Skip if you already have a kenv from production) Clone the base kenv

Clone: git clone https://github.com/johnlindquist/kenv.git ~/.kenv

Building Kit SDK

npm run build-kit

The build command builds the SDK to ~/.kit

yarn link (First run only)

  1. cd to ~/.kit
  2. yarn link
  3. cd to ~/wherever you cloned kitapp
  4. yarn link @johnlindquist/kit

This will force the App to use the SDK so you can work on both simultaneously

Building the App

yarn webpack-dev
yarn install-electron-deps
yarn start

Assuming everything went well, the app should start up.

kit's People

Contributors

ambushfall avatar apurvasaraiya avatar bjesuiter avatar dadamssg avatar doctone avatar dodgez avatar joelhooks avatar johnlindquist avatar jsjoeio avatar jwyce avatar maxijonson avatar minatohikari avatar monojack avatar mstine avatar nadeemkhedr avatar nairanvac avatar ngh14 avatar paustint avatar pringshia avatar techvlad avatar vojtaholik avatar wuwe1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kit's Issues

Hard to see against white backgrounds

Due to the app not having any borders or shadows, it is currently hard to spot where it starts and ends when there's a white background. For example:
image
image

arg choices throwing exception for non async functions

Version - 1.3.0-beta7

await arg('hello', () => 'something something')

This is throwing error, because it is expecting the function to be async by invoking then. Even when the return is synchronous.

[2021-04-29 01:29:56.935] [warn] UNCAUGHT EXCEPTION: TypeError: generateChoices(...).then is not a function
[2021-04-29 01:32:34.923] [warn] UNCAUGHT EXCEPTION: TypeError: choices(...).then is not a function
[2021-04-29 01:33:02.576] [warn] UNCAUGHT EXCEPTION: TypeError: choices(...).then is not a function
[2021-04-29 02:01:41.368] [warn] UNCAUGHT EXCEPTION: TypeError: choices(...).then is not a function

Adding async in front works, but not sure if it is intended.

//                   👇 - This will work
await arg('hello', async () => 'something something')

Can't connect to github when installing behind GFW.

I think it does not use system proxy setting.

Cloning into '/Users/like/.kenv'...
fatal: unable to access 'https://github.com/johnlindquist/kenv.git/': Failed to connect to github.com port 443: Operation timed out

Error: Cloning into '/Users/like/.kenv'...
fatal: unable to access 'https://github.com/johnlindquist/kenv.git/': Failed to connect to github.com port 443: Operation timed out

    at t.GitExecutorChain.onFatalException (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1167952)
    at t.GitExecutorChain.<anonymous> (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1167830)
    at Generator.throw (<anonymous>)
    at a (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1166674)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
[2021-03-28 19:45:36.906] [info] /Applications/Kit.app/Contents/MacOS/Kit undefined
[2021-03-28 19:45:37.351] [info] Checking if kit exists
[2021-03-28 19:45:37.361] [info] ~/.kit not found. Installing...
[2021-03-28 19:45:58.207] [info] Adding node to ~/.kit...
[2021-03-28 19:46:57.425] [info] install node   Configuration
> Version:  v15.12.0 (resolved from )
> Prefix:   node
> Platform: darwin
> Arch:     x64

> Tarball URL: https://nodejs.org/dist/v15.12.0/node-v15.12.0-darwin-x64.tar.gz
> Installing Node.js, please wait…
✓ Done

[2021-03-28 19:46:57.427] [info] adding ~/.kit packages...
[2021-03-28 19:47:05.059] [info] npm 
added 116 packages, and audited 117 packages in 6s

14 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

[2021-03-28 19:47:05.060] [info] Comparing versions...
[2021-03-28 19:47:05.469] [info] ~/.kit: 1.1.0-beta.79
 - Kit app: 1.1.0-beta.79
[2021-03-28 19:47:05.887] [info] Currently on branch: main

[2021-03-28 19:47:05.888] [info] Checking out 1.1.0-beta.79
[2021-03-28 19:47:05.889] [info] git fetch all tags
[2021-03-28 19:48:29.241] [warn] fatal: unable to access 'https://github.com/johnlindquist/kit.git/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 
error: Could not fetch origin

[2021-03-28 19:48:29.252] [warn] Error: fatal: unable to access 'https://github.com/johnlindquist/kit.git/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 
error: Could not fetch origin

    at t.GitExecutorChain.onFatalException (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1167952)
    at t.GitExecutorChain.<anonymous> (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1167830)
    at Generator.throw (<anonymous>)
    at a (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1166674)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
[2021-03-28 19:48:29.903] [warn] Object has been destroyed
[2021-03-28 19:48:29.904] [warn] TypeError: Object has been destroyed
    at Bt (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:45431)
    at Gt (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:46246)
    at /Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:47741
    at l (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1052623)
    at Generator._invoke (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1052411)
    at Generator.next (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1053048)
    at Tt (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:41053)
    at s (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:41257)
[2021-03-28 19:48:42.188] [info] /Applications/Kit.app/Contents/MacOS/Kit undefined
[2021-03-28 19:48:42.548] [info] Checking if kit exists
[2021-03-28 19:48:42.549] [info] Comparing versions...
[2021-03-28 19:48:42.862] [info] ~/.kit: 1.1.0-beta.79
 - Kit app: 1.1.0-beta.79
[2021-03-28 19:48:43.157] [info] Currently on branch: main

[2021-03-28 19:48:43.158] [info] Checking out 1.1.0-beta.79
[2021-03-28 19:48:43.158] [info] git fetch all tags
[2021-03-28 19:48:44.296] [info] git checkout tags/1.1.0-beta.79
[2021-03-28 19:48:44.633] [info] Run .kenv setup script...
[2021-03-28 19:50:00.525] [warn] Cloning into '/Users/like/.kenv'...
fatal: unable to access 'https://github.com/johnlindquist/kenv.git/': Failed to connect to github.com port 443: Operation timed out

[2021-03-28 19:50:00.537] [warn] Error: Cloning into '/Users/like/.kenv'...
fatal: unable to access 'https://github.com/johnlindquist/kenv.git/': Failed to connect to github.com port 443: Operation timed out

    at t.GitExecutorChain.onFatalException (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1167952)
    at t.GitExecutorChain.<anonymous> (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1167830)
    at Generator.throw (<anonymous>)
    at a (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:8:1166674)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

autoupdater fails, so kit doesn't get launched

Everytime I launch kit it crashes (I never get to use the actual app). I see it appear in my status bar, then the orange badge comes up and then it crashes.

The log gets copied to clipboard so here is the log:

---------------------------------
[2022-06-21 09:15:19.439] [info] Launching Script Kit  1.19.0
[2022-06-21 09:15:19.440] [info] auto updater detected version: 1.19.0
[2022-06-21 09:15:19.441] [info] PATH: /Users/daren/.knode/bin:/Users/daren/.kit/bin:/Users/daren/.kit/bin/code:/Users/daren/.kenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
[2022-06-21 09:15:19.441] [info] Configuring auto-update
[2022-06-21 09:15:19.442] [info] Checking for updates...
[2022-06-21 09:15:19.445] [info] Didn't find /Users/daren/.kit/.kitignore
[2022-06-21 09:15:19.445] [info] Auto-update enabled. Checking for update.
[2022-06-21 09:15:19.445] [info] Checking for update
[2022-06-21 09:15:19.446] [info] Checking for update...
[2022-06-21 09:15:19.446] [info] 🎨 Tray icon: notification-orange
[2022-06-21 09:15:19.447] [info] /Users/daren/.kit
[2022-06-21 09:15:19.447] [info] kit found
[2022-06-21 09:15:19.454] [info] 🔥 Starting Kit First Install
[2022-06-21 09:15:19.454] [info] App version: 1.19.0
[2022-06-21 09:15:19.460] [info] Previous version: 0.0.0
[2022-06-21 09:15:19.460] [info] Requires install: true
[2022-06-21 09:15:19.460] [info] /Users/daren/.kit
[2022-06-21 09:15:19.461] [info] kit found
[2022-06-21 09:15:19.461] [info] Didn't find /Users/daren/.kit/.kitignore
[2022-06-21 09:15:19.461] [info] /Users/daren/.kit
[2022-06-21 09:15:19.462] [info] kit found
[2022-06-21 09:15:19.462] [info] Cleaning previous .kit
[2022-06-21 09:15:19.462] [info] 🎨 Tray icon: notification-orange
[2022-06-21 09:15:19.463] [info] 🧹 Cleaning /Users/daren/.kit
[2022-06-21 09:15:19.463] [info] ↖ OPEN: { x: 576, y: 172, width: 768, height: 480 }
[2022-06-21 09:15:19.476] [info] 🧹 Cleaning /Users/daren/.kit/CODE_OF_CONDUCT.md
[2022-06-21 09:15:19.480] [info] 🧹 Cleaning /Users/daren/.kit/LICENSE
[2022-06-21 09:15:19.481] [info] 🧹 Cleaning /Users/daren/.kit/README.md
[2022-06-21 09:15:19.482] [info] 🧹 Cleaning /Users/daren/.kit/api
[2022-06-21 09:15:19.487] [info] 🧹 Cleaning /Users/daren/.kit/bin
[2022-06-21 09:15:19.489] [info] 🧹 Cleaning /Users/daren/.kit/build
[2022-06-21 09:15:19.491] [info] 🧹 Cleaning /Users/daren/.kit/ci
[2022-06-21 09:15:19.493] [info] 🧹 Cleaning /Users/daren/.kit/cli
[2022-06-21 09:15:19.503] [info] 🧹 Cleaning /Users/daren/.kit/core
[2022-06-21 09:15:19.506] [info] 🧹 Cleaning /Users/daren/.kit/emoji
[2022-06-21 09:15:19.507] [info] 🧹 Cleaning /Users/daren/.kit/handler
[2022-06-21 09:15:19.512] [info] 🧹 Cleaning /Users/daren/.kit/help
[2022-06-21 09:15:19.514] [info] 🧹 Cleaning /Users/daren/.kit/hot
[2022-06-21 09:15:19.516] [info] 🧹 Cleaning /Users/daren/.kit/icons
[2022-06-21 09:15:19.518] [info] 🧹 Cleaning /Users/daren/.kit/images
[2022-06-21 09:15:19.519] [info] 🧹 Cleaning /Users/daren/.kit/index.d.ts
[2022-06-21 09:15:19.520] [info] 🧹 Cleaning /Users/daren/.kit/index.js
[2022-06-21 09:15:19.521] [info] 🧹 Cleaning /Users/daren/.kit/kar
[2022-06-21 09:15:19.522] [info] 🧹 Cleaning /Users/daren/.kit/lib
[2022-06-21 09:15:19.524] [info] 🧹 Cleaning /Users/daren/.kit/logos
[2022-06-21 09:15:19.631] [info] 🧹 Cleaning /Users/daren/.kit/main
[2022-06-21 09:15:19.634] [info] 🧹 Cleaning /Users/daren/.kit/package.json
[2022-06-21 09:15:19.638] [info] 🧹 Cleaning /Users/daren/.kit/permissions
[2022-06-21 09:15:19.640] [info] 🧹 Cleaning /Users/daren/.kit/platform
[2022-06-21 09:15:19.642] [info] 🧹 Cleaning /Users/daren/.kit/run
[2022-06-21 09:15:19.644] [info] 🧹 Cleaning /Users/daren/.kit/script
[2022-06-21 09:15:19.645] [info] 🧹 Cleaning /Users/daren/.kit/scripts
[2022-06-21 09:15:19.647] [info] 🧹 Cleaning /Users/daren/.kit/setup
[2022-06-21 09:15:19.649] [info] 🧹 Cleaning /Users/daren/.kit/share
[2022-06-21 09:15:19.651] [info] 🧹 Cleaning /Users/daren/.kit/sk
[2022-06-21 09:15:19.652] [info] 🧹 Cleaning /Users/daren/.kit/target
[2022-06-21 09:15:19.654] [info] 🧹 Cleaning /Users/daren/.kit/templates
[2022-06-21 09:15:19.659] [info] 🧹 Cleaning /Users/daren/.kit/tmp
[2022-06-21 09:15:19.662] [info] 🧹 Cleaning /Users/daren/.kit/types
[2022-06-21 09:15:19.664] [info] .kit doesn't exist or isn't on a contributor branch
[2022-06-21 09:15:19.665] [info] Extracting kit.tar.gz to ~/.kit
[2022-06-21 09:15:19.794] [info] node not found
[2022-06-21 09:15:19.794] [warn] tildify is not defined
[2022-06-21 09:15:19.807] [warn] ReferenceError: tildify is not defined
    at /Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:234227
    at tryCatch (/Applications/Kit.app/Contents/Resources/app.asar/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:63:40)
    at Generator.invoke [as _invoke] (/Applications/Kit.app/Contents/Resources/app.asar/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:294:22)
    at Generator.next (/Applications/Kit.app/Contents/Resources/app.asar/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:119:21)
    at nc (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:213219)
    at a (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:213423)

If I remove the .kitfolder and do it, it get the same error:

---------------------------------
[2022-06-21 09:19:00.077] [info] Launching Script Kit  1.19.0
[2022-06-21 09:19:00.078] [info] auto updater detected version: 1.19.0
[2022-06-21 09:19:00.078] [info] PATH: /Users/daren/.knode/bin:/Users/daren/.kit/bin:/Users/daren/.kit/bin/code:/Users/daren/.kenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
[2022-06-21 09:19:00.079] [info] Configuring auto-update
[2022-06-21 09:19:00.079] [info] Checking for updates...
[2022-06-21 09:19:00.080] [info] Didn't find /Users/daren/.kit/.kitignore
[2022-06-21 09:19:00.080] [info] Auto-update enabled. Checking for update.
[2022-06-21 09:19:00.080] [info] Checking for update
[2022-06-21 09:19:00.081] [info] Checking for update...
[2022-06-21 09:19:00.081] [info] 🎨 Tray icon: notification-orange
[2022-06-21 09:19:00.082] [info] /Users/daren/.kit
[2022-06-21 09:19:00.082] [info] kit not found
[2022-06-21 09:19:00.084] [info] 🔥 Starting Kit First Install
[2022-06-21 09:19:00.084] [info] App version: 1.19.0
[2022-06-21 09:19:00.086] [info] ↖ OPEN: { x: 576, y: 172, width: 768, height: 480 }
[2022-06-21 09:19:00.092] [info] Previous version: 0.0.0
[2022-06-21 09:19:00.092] [info] Requires install: true
[2022-06-21 09:19:00.093] [info] /Users/daren/.kit
[2022-06-21 09:19:00.093] [info] kit not found
[2022-06-21 09:19:00.093] [info] /Users/daren/.kit
[2022-06-21 09:19:00.094] [info] kit not found
[2022-06-21 09:19:00.094] [info] .kit doesn't exist or isn't on a contributor branch
[2022-06-21 09:19:00.094] [info] Extracting kit.tar.gz to ~/.kit
[2022-06-21 09:19:00.323] [info] node not found
[2022-06-21 09:19:00.323] [warn] tildify is not defined
[2022-06-21 09:19:00.337] [warn] ReferenceError: tildify is not defined
    at /Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:234227
    at tryCatch (/Applications/Kit.app/Contents/Resources/app.asar/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:63:40)
    at Generator.invoke [as _invoke] (/Applications/Kit.app/Contents/Resources/app.asar/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:294:22)
    at Generator.next (/Applications/Kit.app/Contents/Resources/app.asar/node_modules/@babel/runtime/node_modules/regenerator-runtime/runtime.js:119:21)
    at nc (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:213219)
    at a (/Applications/Kit.app/Contents/Resources/app.asar/main.prod.js:2:213423)

Can't open Kit after installing from dmg

What I did:

  • Downloaded the dmg
  • Dragged to Applications
  • Opened application

What I expected:

  • To be able to use Kit

What actually happened:

  • I get a flash of an error screen Kit failed to Install and then it exits. There is a lot of other info but it crashes before I can grab it.

Running MacOS 11.3

Multiple `exec` calls don't run

Expected

When running this script:

import "@johnlindquist/kit";

const open = (app: string) => exec(`open -a ${app}`);

open("Slack");
open("Discord");

I expect Slack to open, then Discord to open.

Actual

Slack opens, but Discord does not.

Memo

Switching the call order results in Discord opening, but not Slack.

Filter choices based on value

Is it possible to set the keys on a Choice that should be used to filter the items when using arg('write something', [])?
My use case for this is that I have a script that shows all my projects and open them in code, and a choice looks like

{
  name: "lorem",
  value: "~/User/something/something/ipsum",
  description: "~/User/something/something",
};

and filtering is currently only done on name, but it would be nice to include value as well so I could type something which could be a client folder perhaps and lorem would show up.

This could perhaps be done by having a filterKeys: string[] value on the PromptConfig?

[Bug] kit rename (mv) does not rename the bin TARGET_PATH file name

Background

When renaming a file with kit rename from the cli or the rename function from the app, .kit/cli/rename.js changes the scripts and bin paths, but does not rename the TARGET_PATH file name in the bin file.

i.e.

{{TARGET_PATH}}/{{type}}/{{name}}.js \

This seems to be minor issue and might make for a good first PR.

If / when contributions are encouraged, I'd be happy to take a first pass on this.

[Idea] $ as shell global

Found this interesting project today that might make a good addition to global API

https://github.com/google/zx

await $`cat package.json | grep name`

let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`

await Promise.all([
  $`sleep 1; echo 1`,
  $`sleep 2; echo 2`,
  $`sleep 3; echo 3`,
])

let name = 'foo bar'
await $`mkdir /tmp/${name}`

Just a thought ❤️

exec(`open ${url}`) fails to pass on all but the first query parameter

I was working with making some scripts for working with https://obsidian.md/ and ran into an issue with the uri structure they use to open and create new notes.

As they do not have a CLI to open new notes, I am working with their uri structure for this objective (https://help.obsidian.md/Advanced+topics/Using+obsidian+URI). I've used this successfully from my terminal and browsers, however, ScriptKit seems to have an issue with multiple query parameters. I'm not sure yet if this is ScriptKit itself or the underlying shelljs exec command it's using.

I was using the exec(open url) strategy discussed in this post #142 to try and create a script that makes a new note in Obsidian via their uri structure using this:

const noteName = arg("Name your new note");
exec(`open obsidian://new?vault=TreTuna-Digital-Garden&file=Thoughts%2F${noteName}`)

However, it seems that exec("open {uri}") has an issue with multiple query params and simply ignores all but the first one. I'm not sure if this is something with ScriptKit or with ShellJS and haven't been able to track it down yet. This isn't something specific to the Obsidian url structure either as I tried uris like this:
exec("open https://www.scriptkit.com/scripts/johnlindquist?first=works&second=ignore")
and the actual uri that ends up in the browser is:
https://www.scriptkit.com/scripts/johnlindquist?name=works

Show stacktrace?

I've got a script that exits early with:

[2021-06-08 11:39:03.344] [warn]  UNCAUGHT EXCEPTION: TypeError: Cannot read property 'replace' of undefined

I have no idea where this is happening. Could we get a full stack trace for errors like this?

Here's my script (though it may not be helpful):

// Menu: Cloudinary upload
// Description: Upload an image to cloudinary
// Shortcut: command option control c
// Author: Kent C. Dodds
// Twitter: @kentcdodds

import path from 'path'

const cloudinaryCloudName = await env('CLOUDINARY_CLOUD_NAME')
const cloudinaryKey = await env('CLOUDINARY_API_KEY')
const cloudinarySecret = await env('CLOUDINARY_API_SECRET')
const cloudiaryConsoleId = await env('CLOUDINARY_CONSOLE_ID')

await npm('cloudinary')
import cloudinary from 'cloudinary'

const cacheDb = await db('cloudinary-cache', {lastChoice: '', folders: {}})
await cacheDb.read()

cloudinary.config({
  cloud_name: cloudinaryCloudName,
  api_key: cloudinaryKey,
  api_secret: cloudinarySecret,
  secure: true,
})

const actions = {
  CREATE_NEW: 'creating new folder',
  REFRESH_CACHE: 'refreshing cache',
}

let chosenDirectory = await cacheDb.data.lastChoice
let lastSelection
while (true) {
  // if the last action was to create a new directory then we know the chosen
  // directory is new and has no folders otherwise we have to wait a few seconds
  // for the API to be prepared for us to make a request for the contents.
  const directories =
    lastSelection === actions.CREATE_NEW
      ? []
      : await getFolders(chosenDirectory)
  lastSelection = await arg(
    `Select folder in ${chosenDirectory}`,
    [
      {name: '.', value: '.', description: 'Choose this folder'},
      !chosenDirectory
        ? null
        : {name: '..', value: '..', description: 'Go up a directory'},
      ...directories.map(folder => ({
        name: folder.name,
        value: folder.path,
      })),
      {
        name: 'Refresh cache',
        value: actions.REFRESH_CACHE,
        description: 'Refresh the cache for this directory',
      },
      {
        name: 'Create new directory',
        value: actions.CREATE_NEW,
        description: 'Create a new directory here',
      },
    ].filter(Boolean),
  )
  if (lastSelection === '..') {
    chosenDirectory = chosenDirectory.split('/').slice(0, -1).join('/')
  } else if (lastSelection === '.') {
    break
  } else if (lastSelection === actions.CREATE_NEW) {
    const newFolderName = await arg(`What's the new folder name?`)
    const newDirectory = `${chosenDirectory}/${newFolderName}`
    const result = await cloudinary.v2.api.create_folder(newDirectory)
    delete cacheDb.data.folders[chosenDirectory]
    chosenDirectory = newDirectory
  } else if (lastSelection === actions.REFRESH_CACHE) {
    delete cacheDb.data.folders[chosenDirectory]
  } else {
    chosenDirectory = lastSelection
  }
}

cacheDb.data.lastChoice = chosenDirectory
await cacheDb.write()

const images = await arg({
  placeholder: 'Drop the image(s) you want to upload',
  drop: true,
  ignoreBlur: true,
})
for (const image of images) {
  const defaultName = path.parse(image.path).name

  const name =
    (await arg({
      placeholder: `Name of this image?`,
      hint: `Default is: "${defaultName}"`,
    })) || defaultName

  const uploadedImage = await cloudinary.v2.uploader.upload(image.path, {
    public_id: name,
    overwrite: false,
    folder: chosenDirectory,
  })

  // If you have multiple files then this isn't really useful unless you have
  // clipbloard history (which I recommend you get!)
  await copy(uploadedImage.secure_url)
}

const encodedChosenDirectory = encodeURIComponent(chosenDirectory)
await exec(
  `open "https://cloudinary.com/console/${cloudiaryConsoleId}/media_library/folders/${encodedChosenDirectory}"`,
)

async function getFolders(directory) {
  const cachedDirectories = cacheDb.data.folders[directory]
  if (cachedDirectories) {
    return cachedDirectories
  }

  const {folders: directories} = !directory
    ? await cloudinary.v2.api.root_folders()
    : await cloudinary.v2.api.sub_folders(directory)

  cacheDb.data.folders[directory] = directories

  await cacheDb.write()

  return directories
}

Subsequent calls of `arg` in a loop with the same choices results in no list being shown

I wanted to recreate a sort of experience like Moom.app where you can enter the window positioning mode and you can choose to position things according to some presets. Presents like left and right might, themselves cycle through some stops like 50%, 33% and 67%.

I tried implementing this in ScriptKit and while it works (❤️ ), the list is not shown after the initial loop through.

// Menu: Window Positioning
// Description: Position the the active app in one of several ways
// Author: Geoff Goodman
// Twitter: @filearts
let { getActiveScreen, setActiveAppBounds } = await kit("desktop");
let { workArea, bounds } = await getActiveScreen();
let { width, height } = workArea;
let { x, y } = bounds;

let done = false;
let lastInstruction;
let lastInstructionCount = 0;

const stops = [0.5, 0.33, 0.66];

while (!done) {
  let top = 0;
  let right = 0;
  let bottom = 0;
  let left = 0;

  const instruction = await arg("Position:", () => [
    "Fullscreen",
    "Left",
    "Right",
    "Done",
  ]);

  if (lastInstruction === instruction) {
    lastInstructionCount++;
  } else {
    lastInstruction = instruction;
  }

  switch (instruction.toLowerCase()) {
    case "left":
      right = Math.floor(width * stops[lastInstructionCount % stops.length]);
      break;
    case "right":
      left = Math.floor(width * stops[lastInstructionCount % stops.length]);
      break;
    case "rullscreen":
      break;
    case "done":
      done = true;
      break;
  }

  if (!done) {
    console.log({
      top: y + top,
      right: x + width - right,
      bottom: y + height - bottom,
      left: x + left,
    });

    setActiveAppBounds({
      top: y + top,
      right: x + width - right,
      bottom: y + height - bottom,
      left: x + left,
    });
  }
}

🍺 Homebrew Cask?

Installing packages and apps with Homebrew is sooo convenient, I'd love to install Script Kit just by launching brew install --cask scriptkit and back it up in my dotfiles.

share-file example script fails when ran out of the box

When using it "out of the box", share-file example script fails, as it seems it requires SIMPLE_TMP_DIR environment variable being set.

Unless intentional, I think this can be defaulted (on the script) to use Node's os.tmpdir().

PS: Loving Simple Scripts so far ❤️ !

Environment

  • OS: macOS Big Sur 11.1

Logs

node:internal/process/esm_loader:74
    internalBinding('errors').triggerUncaughtException(
                              ^

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received undefined
    at new NodeError (node:internal/errors:278:15)
    at validateString (node:internal/validators:123:11)
    at Proxy.join (node:path:1081:7)
    at file:///Users/------/.simple/src/share-file.js:33:24 {
  code: 'ERR_INVALID_ARG_TYPE'

Sharing link via gist is failing

Version: 1.3.0-beta.9

Publishing a Gist is not working for me. I just did a fresh install, I didn't mess with any config as far as I know. I get the same error when I try to publish via discussion

Kapture.2021-04-30.at.13.17.12.mp4

Error deleting non-existent script

Steps to reproduce:

  1. Open Kit
  2. In the "Run script" box, type a string like "foobar" that doesn't match any scripts.
  3. Press Cmd+Delete on Mac.
  4. The error "Cannot find script based on name or command: foobar" displays.

Kit v1.3.0-beta.58 on Mac 11.5.2

Links to "Discuss Post" for Blog Posts Broken

Looks like for every blog post that has "Discuss Post", the anchor tag is empty and reloads the page. I was trying to take a gander and figure out where the code was for the site but couldn't find it. I'd be happy to make the contribution for you since you're already gathering each Discussion post in!

Here's a screen recording of the behavior:

Recording of me clicking "Discuss Post" and it reloading the page

getTabs throw "Unexpected end of JSON input"

I'm trying to access the url of the current tab and faced issues when playing with the getTabs() function:

[2021-12-20 15:24:44.115] [warn]  SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at global.getTabs (file:///Users/valentin/.kit/lib/browser.js:62:17)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async file:///Users/valentin/.kenv/.scripts/example.mjs:3:12

For example with this script taken from this lesson:

import "@johnlindquist/kit"

let tabs = await getTabs()

let tabsMd = tabs
  .map(tab => `* [${tab.title || tab.url}](${tab.url})`)
  .join("\n")

let notes = await editor(tabsMd)

I'm using Brave.

Error running new script

I'm currently having an issue getting scripts to run.

I installed the Center App script from the marketplace, but when I try run the script I'm getting a weird environment issue, see below.

It looks like it might be trying to run the script with an older version of node since endsWith seems to be undefined, however, I have confirmed Kit is running with Node 16 and my local default version is 14 which both have this feature.

What I've tried:

  • Removing ~/.kit and ~/.kenv and reinstalling Kit by re-opening it.

Kit.log:

[2021-06-23 10:08:30.036] [info]  CONSOLE_WARN Prompt process index.js id: 94285
[2021-06-23 10:08:30.038] [info]  CONSOLE_WARN Prompt process index.js id: 94285
[2021-06-23 10:08:30.896] [info]  ipc message: [
  '/Users/danew/.kit/cli/error-action.js',
  'index.js',
  "Cannot read property 'endsWith' of undefined\n" +
    "TypeError: Cannot read property 'endsWith' of undefined\n" +
    '    at resolveToScriptPath (file:///Users/danew/.kit/utils.js:8:17)\n' +
    '    at global.run (file:///Users/danew/.kit/api/kit.js:158:26)\n' +
    '    at file:///Users/danew/.kit/cli/app-run.js?uuid=268b471f-37b8-4cc4-a3a0-5dc7908aa152:12:11\n' +
    '    at processTicksAndRejections (node:internal/process/task_queues:96:5)',
  '/Users/danew/.kit/main/index.js',
  '1',
  '1'
]
[2021-06-23 10:08:30.898] [info]  *** /Users/danew/.kit/cli/error-action.js index.js,Cannot read property 'endsWith' of undefined
TypeError: Cannot read property 'endsWith' of undefined
    at resolveToScriptPath (file:///Users/danew/.kit/utils.js:8:17)
    at global.run (file:///Users/danew/.kit/api/kit.js:158:26)
    at file:///Users/danew/.kit/cli/app-run.js?uuid=268b471f-37b8-4cc4-a3a0-5dc7908aa152:12:11
    at processTicksAndRejections (node:internal/process/task_queues:96:5),/Users/danew/.kit/main/index.js,1,1 ***
[2021-06-23 10:08:30.898] [info]  🛑 kill process: /Users/danew/.kit/main/index.js id: 94285

Cant open kit("chrome")

Im getting this error when I run a script that depends on kit("chrome")

Cannot find module '/Users/ianjones/.kit/lib/chrome.js' imported from /Users/ianjones/.kit/api/kit.js Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/ianjones/.kit/lib/chrome.js' imported from /Users/ianjones/.kit/api/kit.js at new NodeError (node:internal/errors:329:5) at finalizeResolution (node:internal/modules/esm/resolve:323:11) at moduleResolve (node:internal/modules/esm/resolve:758:10) at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:869:11) at Loader.resolve (node:internal/modules/esm/loader:86:40) at Loader.getModuleJob (node:internal/modules/esm/loader:230:28) at Loader.import (node:internal/modules/esm/loader:165:28) at importModuleDynamically (node:internal/modules/esm/translators:116:35) at exports.importModuleDynamicallyCallback (node:internal/process/esm_loader:30:14) at global.attemptImport (file:///Users/ianjones/.kit/api/kit.js:51:45)

Im on Kit version 1.3.0-beta.34.

I have a feeling something is wrong with the .kit i have but I'm not sure how to resolve the issue.

Allow to specify options for a an arg

Raycast has an super useful feature I am not able to replicate in kit.

image

By hitting the cmd+k shortcut, you are able to provide a list of options for the selected item. However, you can also trigger the main action (opening the file) by just using the enter key. Alfred also provide this feature in the file view using the right arrow key.

I propose this syntax to replicate the feature in kit:

const { task, option } = arg(
  "select task",
  ["buy milk", "create issue for kit"],
  // Menu items for each options, shown when using the right arrow key
  [
    { title: "edit", description: "edit task" },
    { title: "delete", desription: "delete task" },
  ]
)


if (option == "edit")
   edit_task(task)
else if (option == "delete")
    delete_task(task)

Add an url scheme for launching scripts from other apps

I would love to be able to trigger any kit script from outside using an URI.

Is there already a built-in way to achieve this?
You mentioned launching your scripts from alfred in #56

A command-line utility launching a specific script's UI would also work for my use case.

Ex: open kit://run?script=my-custom-script

App does not open

Tried opening the app for the first time, but did not work.

macOS Big Sure (11.2.1) MacBookPro 16"

Screen.Recording.2021-04-11.at.22.52.18.mov

Script that hides desktop icons causes CPU spike

Screenshot 2022-02-07 at 12 14 10

To me it takes sometimes a pretty significant amount of CPU 😞 I love this tool, but would even consider stopping using it because of this. I would be happy to contribute fixing this, but need some advises where to look at 🙇‍♂️

atom not launching as editor. osx big sur

launching scripts for editing from the app or the terminal interface doesn't open the file for editing in the Atom editor.

Here's an example when I ask simple to edit the .env file. In my .env, SIMPLE_EDITOR=atom
calling atom from the terminal command line (outside simple) works.

Screenshot of TerminalScreenshot of Terminal (2-14-21, 10-13-01 PM)

White bar in prompt with dark mode on

Version 1.1.0-beta.69

Steps to Reproduce

  1. System Preferences > General > Appearance
  2. Toggle "Dark"
  3. Open Prompt
  4. Observe white bar on side

Expected

Prompt blends in with appearance colors

Actual

Prompt has white bar on the side
image

Demo

Spotify.-.twocolors.-.Bloodstream.mp4

blog feed for https://www.scriptkit.com/blog

Just discovered this project and I'm very excited about it. I'd like to stay on top of developments via your blog, but I found there is no RSS or JSON feed for your blog page. Just created this issue as a way to suggest adding one, please.

Opening anything in the editor fails

It just hangs forever:

Screen.Recording.2021-11-18.at.10.19.34.AM.mov

The video above is when I choose "Open script in editor" but I have the same thing for any of my scripts that use edit.

Where can I learn what this tool does?

I read the following on the website

Run simple in your shell to launch an interactive prompt to train you to write your own scripts.

I installed simplescripts, and ran simple and was prompted with "What do you want to do?".

I see a menu of options, including a "new" option, but there's no "training" or any other information that explains what I might do with simplescripts.

1.7.0 was broken on my Mac

After update to 1.7.0:

image


Process: Kit [98015]
Path: /Applications/Kit.app/Contents/MacOS/Kit
Identifier: Kit
Version: 1.7.0 (1.7.0)
Code Type: X86-64 (Native)
Parent Process: Kit [98008]
Responsible: Kit [98008]
User ID: 502

Date/Time: 2022-02-26 18:12:22.199 +0800
OS Version: Mac OS X 10.15.7 (19H15)
Report Version: 12
Bridge OS Version: 4.6 (17P6610)
Anonymous UUID: BE5A80AC-3BF4-4B73-85BF-35700AA45BE4

Sleep/Wake UUID: EEFEBB68-E488-4F10-918A-2835F4B048A7

Time Awake Since Boot: 660000 seconds
Time Since Wake: 130 seconds

System Integrity Protection: disabled

Crashed Thread: 0 Dispatch queue: com.apple.main-thread

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000020
Exception Note: EXC_CORPSE_NOTIFY

Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [98015]

VM Regions Near 0x20:
-->
__TEXT 000000010b159000-000000010b15b000 [ 8K] r-x/r-x SM=COW /Applications/Kit.app/Contents/MacOS/Kit

Application Specific Information:
crashed on child side of fork pre-exec

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_malloc.dylib 0x00007fff6fb34e41 nanov2_forked_calloc + 7
1 libsystem_malloc.dylib 0x00007fff6fb1ff59 malloc_zone_calloc + 99
2 libsystem_malloc.dylib 0x00007fff6fb1fed9 calloc + 24
3 libobjc.A.dylib 0x00007fff6e7b4603 allocateBuckets(unsigned int) + 29
4 libobjc.A.dylib 0x00007fff6e7b4096 cache_fill + 283
5 libobjc.A.dylib 0x00007fff6e7b3b27 lookUpImpOrForward + 530
6 libobjc.A.dylib 0x00007fff6e7b3399 _objc_msgSend_uncached + 73
7 libxpc.dylib 0x00007fff6fbbe89e xpc_atfork_child + 125
8 libSystem.B.dylib 0x00007fff6c94dab8 libSystem_atfork_child + 59
9 libsystem_c.dylib 0x00007fff6f9c78ad fork + 40
10 com.github.Electron.framework 0x000000010b1751ef uv_spawn + 527
11 com.github.Electron.framework 0x0000000111907301 node::PromiseRejectCallback(v8::PromiseRejectMessage) + 234001
12 com.github.Electron.framework 0x000000010c1b54fb v8::internal::Accessors::MakeAccessor(v8::internal::Isolate*, v8::internal::Handlev8::internal::Name, void ()(v8::Localv8::Name, v8::PropertyCallbackInfov8::Value const&), void ()(v8::Localv8::Name, v8::Localv8::Value, v8::PropertyCallbackInfov8::Boolean const&)) + 12651
13 ??? 0x0000002807f0aa38 0 + 171931904568
14 ??? 0x0000002807e8c862 0 + 171931388002
15 ??? 0x0000002807e8c862 0 + 171931388002
16 ??? 0x0000002807e8c862 0 + 171931388002
17 ??? 0x0000002807e8c862 0 + 171931388002
18 ??? 0x0000002807f5ab62 0 + 171932232546
19 ??? 0x0000002807e89dcf 0 + 171931377103
20 ??? 0x0000002807fab9b6 0 + 171932563894
21 ??? 0x0000002807e8c862 0 + 171931388002
22 ??? 0x0000002807e8c862 0 + 171931388002
23 ??? 0x00000028000a7a34 0 + 171799378484
24 ??? 0x00000028000a8bc8 0 + 171799382984
25 ??? 0x000000280009d8d6 0 + 171799337174
26 ??? 0x00000028000a9f8c 0 + 171799388044
27 ??? 0x000000280009fece 0 + 171799346894
28 ??? 0x0000002807f5c6f8 0 + 171932239608
29 ??? 0x0000002807eb3f1e 0 + 171931549470
30 ??? 0x0000002807e8a7c7 0 + 171931379655
31 com.github.Electron.framework 0x000000010c286984 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handlev8::internal::Object, v8::internal::Handlev8::internal::Object, int, v8::internal::Handlev8::internal::Object) + 6260
32 com.github.Electron.framework 0x000000010c2872c3 v8::internal::Execution::TryCallScript(v8::internal::Isolate
, v8::internal::Handlev8::internal::JSFunction, v8::internal::Handlev8::internal::Object, v8::internal::Handlev8::internal::FixedArray, v8::internal::Execution::MessageHandling, v8::internal::MaybeHandlev8::internal::Object, bool) + 355
33 com.github.Electron.framework 0x000000010c287430 v8::internal::Execution::TryCall(v8::internal::Isolate
, v8::internal::Handlev8::internal::Object, v8::internal::Handlev8::internal::Object, int, v8::internal::Handlev8::internal::Object, v8::internal::Execution::MessageHandling, v8::internal::MaybeHandlev8::internal::Object, bool) + 224
34 com.github.Electron.framework 0x000000010c2b04dc v8::internal::MicrotaskQueue::PerformCheckpointInternal(v8::Isolate*) + 460
35 com.github.Electron.framework 0x00000001117a2f08 node::CallbackScope::~CallbackScope() + 1256
36 com.github.Electron.framework 0x00000001117a2a7e node::CallbackScope::~CallbackScope() + 94

......

0x7fff6fb66000 -     0x7fff6fb70fff  libsystem_pthread.dylib (416.100.3) <62CB1A98-0B8F-31E7-A02B-A1139927F61D> /usr/lib/system/libsystem_pthread.dylib
0x7fff6fb71000 -     0x7fff6fb75ff3  libsystem_sandbox.dylib (1217.141.2) <051C4018-4345-3034-AC98-6DE42FB8273B> /usr/lib/system/libsystem_sandbox.dylib
0x7fff6fb76000 -     0x7fff6fb78fff  libsystem_secinit.dylib (62.100.2) <F80872AA-E1FD-3D7E-8729-467656EC6561> /usr/lib/system/libsystem_secinit.dylib
0x7fff6fb79000 -     0x7fff6fb80ffb  libsystem_symptoms.dylib (1238.120.1) <5820A2AF-CE72-3AB3-ABCC-273A3419FB55> /usr/lib/system/libsystem_symptoms.dylib
0x7fff6fb81000 -     0x7fff6fb97ff2  libsystem_trace.dylib (1147.120) <04B47629-847B-3D74-8ABE-C05EF9DEEFE4> /usr/lib/system/libsystem_trace.dylib
0x7fff6fb99000 -     0x7fff6fb9eff7  libunwind.dylib (35.4) <42B7B509-BAFE-365B-893A-72414C92F5BF> /usr/lib/system/libunwind.dylib
0x7fff6fb9f000 -     0x7fff6fbd4ffe  libxpc.dylib (1738.140.1) <3E243A41-030F-38E3-9FD2-7B38C66C35B1> /usr/lib/system/libxpc.dylib

External Modification Summary:
Calls made by other processes targeting this process:
task_for_pid: 0
thread_create: 0
thread_set_state: 0
Calls made by this process:
task_for_pid: 0
thread_create: 0
thread_set_state: 0
Calls made by all processes on this machine:
task_for_pid: 97622099
thread_create: 0
thread_set_state: 0

VM Region Summary:
ReadOnly portion of Libraries: Total=825.5M resident=0K(0%) swapped_out_or_unallocated=825.5M(100%)
Writable regions: Total=1.1G written=0K(0%) resident=0K(0%) swapped_out=0K(0%) unallocated=1.1G(100%)

                            VIRTUAL   REGION 

REGION TYPE SIZE COUNT (non-coalesced)
=========== ======= =======
Accelerate framework 256K 2
CG image 12.6M 3
CoreAnimation 44K 5
CoreGraphics 8K 1
CoreUI image data 472K 4
Foundation 28K 2
Kernel Alloc Once 8K 1
MALLOC 196.7M 36
MALLOC guard page 48K 10
MALLOC_MEDIUM (reserved) 240.0M 2 reserved VM address space (unallocated)
MALLOC_NANO (reserved) 384.0M 1 reserved VM address space (unallocated)
Mach message 24K 4
Memory Tag 253 32.0G 746
STACK GUARD 56.0M 1
Stack 222.4M 41
Stack Guard 160K 40
VM_ALLOCATE 16.3M 148
__DATA 55.6M 439
__DATA_CONST 20K 1
__FONT_DATA 4K 1
__LINKEDIT 393.1M 10
__OBJC_RO 32.3M 1
__OBJC_RW 1908K 2
__TEXT 432.4M 431
__UNICODE 564K 1
mapped file 64.7M 26
shared memory 104K 14
=========== ======= =======
TOTAL 34.0G 1973
TOTAL, minus reserved VM space 33.4G 1973

Model: MacBookPro16,1, BootROM 1037.147.4.0.0 (iBridge: 17.16.16610.0.0,0), 6 processors, 6-Core Intel Core i7, 2.6 GHz, 32 GB, SMC
Graphics: kHW_IntelUHDGraphics630Item, Intel UHD Graphics 630, spdisplays_builtin
Graphics: kHW_AMDRadeonPro5300MItem, AMD Radeon Pro 5300M, spdisplays_pcie_device, 4 GB
Memory Module: BANK 0/ChannelA-DIMM0, 16 GB, DDR4, 2667 MHz, Micron, -
Memory Module: BANK 2/ChannelB-DIMM0, 16 GB, DDR4, 2667 MHz, Micron, -
AirPort: spairport_wireless_card_type_airport_extreme (0x14E4, 0x7BF), wl0: Apr 7 2020 13:09:12 version 9.30.357.41.32.5.49 FWID 01-617711e7
Bluetooth: Version 7.0.6f7, 3 services, 27 devices, 1 incoming serial ports
Network Service: Wi-Fi, AirPort, en0
USB Device: USB 3.1 Bus
USB Device: Apple T2 Bus
USB Device: Composite Device
USB Device: Touch Bar Backlight
USB Device: Touch Bar Display
USB Device: Apple Internal Keyboard / Trackpad
USB Device: Headset
USB Device: Ambient Light Sensor
USB Device: FaceTime HD Camera (Built-in)
USB Device: Apple T2 Controller
Thunderbolt Bus: MacBook Pro, Apple Inc., 55.3
Thunderbolt Bus: MacBook Pro, Apple Inc., 55.3

Keyboard layout and shortcuts

Hi,

I have a different keyboard layout on my mac (Colemak)
so my ; is in different place and standard shortcut did not work for me cmd + ;

but then I tried cmd + o (o is in place where ; is in qwerty keyboard)

so the issue seems to be that Script Kit does not take keyboard layout into consideration.

Thanks!

Watch setting triggers over a hundred times on intialization

with the following script:

// Watch: ~/Development/app/spec/**/*.rb
import "@johnlindquist/kit"

console.log(`a spec change detected`)

and running tail -f ~/.kenv/logs/rspec.log in a separate terminal window, I can see that the script fires many times when invoked, even though I haven't touched a file at the watched path. What am I doing wrong here? Does it fire for each file it detects at the given path?

Log output:

[2022-04-05 18:18:15.492] [info]  a spec change detected
[2022-04-05 18:18:15.492] [info]  a spec change detected
[2022-04-05 18:18:15.492] [info]  a spec change detected
[2022-04-05 18:18:15.493] [info]  a spec change detected
[2022-04-05 18:18:15.493] [info]  a spec change detected
[2022-04-05 18:18:15.493] [info]  a spec change detected
[2022-04-05 18:18:15.493] [info]  a spec change detected
[2022-04-05 18:18:15.493] [info]  a spec change detected
[2022-04-05 18:18:15.493] [info]  a spec change detected
[2022-04-05 18:18:15.494] [info]  a spec change detected
[2022-04-05 18:18:15.494] [info]  a spec change detected
[2022-04-05 18:18:15.494] [info]  a spec change detected
[2022-04-05 18:18:15.494] [info]  a spec change detected
[2022-04-05 18:18:15.494] [info]  a spec change detected
[2022-04-05 18:18:15.494] [info]  a spec change detected
[2022-04-05 18:18:15.495] [info]  a spec change detected
[2022-04-05 18:18:15.495] [info]  a spec change detected
[2022-04-05 18:18:15.495] [info]  a spec change detected
[2022-04-05 18:18:15.495] [info]  a spec change detected
[2022-04-05 18:18:15.495] [info]  a spec change detected
[2022-04-05 18:18:15.495] [info]  a spec change detected
[2022-04-05 18:18:15.496] [info]  a spec change detected
[2022-04-05 18:18:15.496] [info]  a spec change detected
[2022-04-05 18:18:15.496] [info]  a spec change detected
[2022-04-05 18:18:15.496] [info]  a spec change detected
[2022-04-05 18:18:15.496] [info]  a spec change detected
[2022-04-05 18:18:15.496] [info]  a spec change detected
[2022-04-05 18:18:15.497] [info]  a spec change detected
[2022-04-05 18:18:15.497] [info]  a spec change detected
[2022-04-05 18:18:15.497] [info]  a spec change detected
[2022-04-05 18:18:15.497] [info]  a spec change detected
[2022-04-05 18:18:15.497] [info]  a spec change detected
[2022-04-05 18:18:15.497] [info]  a spec change detected
[2022-04-05 18:18:15.498] [info]  a spec change detected
[2022-04-05 18:18:15.498] [info]  a spec change detected
[2022-04-05 18:18:15.498] [info]  a spec change detected
[2022-04-05 18:18:15.498] [info]  a spec change detected
[2022-04-05 18:18:15.498] [info]  a spec change detected
[2022-04-05 18:18:15.499] [info]  a spec change detected
[2022-04-05 18:18:15.499] [info]  a spec change detected
[2022-04-05 18:18:15.499] [info]  a spec change detected
[2022-04-05 18:18:15.499] [info]  a spec change detected
[2022-04-05 18:18:15.499] [info]  a spec change detected
[2022-04-05 18:18:15.499] [info]  a spec change detected
[2022-04-05 18:18:15.500] [info]  a spec change detected
[2022-04-05 18:18:15.500] [info]  a spec change detected
[2022-04-05 18:18:15.500] [info]  a spec change detected
[2022-04-05 18:18:15.500] [info]  a spec change detected
[2022-04-05 18:18:15.500] [info]  a spec change detected
[2022-04-05 18:18:15.501] [info]  a spec change detected
[2022-04-05 18:18:15.501] [info]  a spec change detected
[2022-04-05 18:18:15.501] [info]  a spec change detected
[2022-04-05 18:18:15.501] [info]  a spec change detected
[2022-04-05 18:18:15.501] [info]  a spec change detected
[2022-04-05 18:18:15.501] [info]  a spec change detected
[2022-04-05 18:18:15.502] [info]  a spec change detected
[2022-04-05 18:18:15.502] [info]  a spec change detected
[2022-04-05 18:18:15.502] [info]  a spec change detected
[2022-04-05 18:18:15.502] [info]  a spec change detected
[2022-04-05 18:18:15.502] [info]  a spec change detected
[2022-04-05 18:18:15.503] [info]  a spec change detected
[2022-04-05 18:18:15.503] [info]  a spec change detected
[2022-04-05 18:18:15.503] [info]  a spec change detected
[2022-04-05 18:18:15.503] [info]  a spec change detected
[2022-04-05 18:18:15.503] [info]  a spec change detected
[2022-04-05 18:18:15.504] [info]  a spec change detected
[2022-04-05 18:18:15.504] [info]  a spec change detected
[2022-04-05 18:18:15.504] [info]  a spec change detected
[2022-04-05 18:18:15.504] [info]  a spec change detected
[2022-04-05 18:18:15.504] [info]  a spec change detected
[2022-04-05 18:18:15.504] [info]  a spec change detected
[2022-04-05 18:18:15.505] [info]  a spec change detected
[2022-04-05 18:18:15.505] [info]  a spec change detected
[2022-04-05 18:18:15.505] [info]  a spec change detected
[2022-04-05 18:18:15.505] [info]  a spec change detected
[2022-04-05 18:18:15.505] [info]  a spec change detected
[2022-04-05 18:18:15.506] [info]  a spec change detected
[2022-04-05 18:18:15.506] [info]  a spec change detected
[2022-04-05 18:18:15.506] [info]  a spec change detected
[2022-04-05 18:18:15.506] [info]  a spec change detected
[2022-04-05 18:18:15.506] [info]  a spec change detected
[2022-04-05 18:18:15.506] [info]  a spec change detected
[2022-04-05 18:18:15.507] [info]  a spec change detected
[2022-04-05 18:18:15.507] [info]  a spec change detected
[2022-04-05 18:18:15.507] [info]  a spec change detected
[2022-04-05 18:18:15.507] [info]  a spec change detected
[2022-04-05 18:18:15.507] [info]  a spec change detected
[2022-04-05 18:18:15.508] [info]  a spec change detected
[2022-04-05 18:18:15.508] [info]  a spec change detected
[2022-04-05 18:18:15.508] [info]  a spec change detected
[2022-04-05 18:18:15.508] [info]  a spec change detected
[2022-04-05 18:18:15.508] [info]  a spec change detected
[2022-04-05 18:18:15.508] [info]  a spec change detected
[2022-04-05 18:18:15.509] [info]  a spec change detected
[2022-04-05 18:18:15.509] [info]  a spec change detected
[2022-04-05 18:18:15.509] [info]  a spec change detected
[2022-04-05 18:18:15.509] [info]  a spec change detected
[2022-04-05 18:18:15.509] [info]  a spec change detected
[2022-04-05 18:18:15.509] [info]  a spec change detected
[2022-04-05 18:18:15.510] [info]  a spec change detected
[2022-04-05 18:18:15.510] [info]  a spec change detected
[2022-04-05 18:18:15.510] [info]  a spec change detected
[2022-04-05 18:18:15.510] [info]  a spec change detected
[2022-04-05 18:18:15.511] [info]  a spec change detected
[2022-04-05 18:18:15.511] [info]  a spec change detected
[2022-04-05 18:18:15.511] [info]  a spec change detected
[2022-04-05 18:18:15.512] [info]  a spec change detected
[2022-04-05 18:18:15.512] [info]  a spec change detected
[2022-04-05 18:18:15.512] [info]  a spec change detected
[2022-04-05 18:18:15.512] [info]  a spec change detected
[2022-04-05 18:18:15.512] [info]  a spec change detected
[2022-04-05 18:18:15.512] [info]  a spec change detected
[2022-04-05 18:18:15.513] [info]  a spec change detected
[2022-04-05 18:18:15.513] [info]  a spec change detected
[2022-04-05 18:18:15.513] [info]  a spec change detected
[2022-04-05 18:18:15.513] [info]  a spec change detected
[2022-04-05 18:18:15.513] [info]  a spec change detected
[2022-04-05 18:18:15.514] [info]  a spec change detected
[2022-04-05 18:18:15.514] [info]  a spec change detected
[2022-04-05 18:18:15.514] [info]  a spec change detected
[2022-04-05 18:18:15.514] [info]  a spec change detected
[2022-04-05 18:18:15.514] [info]  a spec change detected
[2022-04-05 18:18:15.515] [info]  a spec change detected
[2022-04-05 18:18:15.515] [info]  a spec change detected
[2022-04-05 18:18:15.515] [info]  a spec change detected
[2022-04-05 18:18:15.515] [info]  a spec change detected
[2022-04-05 18:18:15.515] [info]  a spec change detected
[2022-04-05 18:18:15.515] [info]  a spec change detected
[2022-04-05 18:18:15.516] [info]  a spec change detected
[2022-04-05 18:18:15.516] [info]  a spec change detected
[2022-04-05 18:18:15.516] [info]  a spec change detected
[2022-04-05 18:18:15.516] [info]  a spec change detected
[2022-04-05 18:18:15.516] [info]  a spec change detected
[2022-04-05 18:18:15.517] [info]  a spec change detected
[2022-04-05 18:18:15.517] [info]  a spec change detected
[2022-04-05 18:18:15.517] [info]  a spec change detected
[2022-04-05 18:18:15.517] [info]  a spec change detected
[2022-04-05 18:18:15.517] [info]  a spec change detected
[2022-04-05 18:18:15.517] [info]  a spec change detected
[2022-04-05 18:18:15.518] [info]  a spec change detected
[2022-04-05 18:18:15.518] [info]  a spec change detected
[2022-04-05 18:18:15.518] [info]  a spec change detected
[2022-04-05 18:18:15.518] [info]  a spec change detected
[2022-04-05 18:18:15.518] [info]  a spec change detected
[2022-04-05 18:18:15.519] [info]  a spec change detected
[2022-04-05 18:18:15.519] [info]  a spec change detected
[2022-04-05 18:18:15.519] [info]  a spec change detected
[2022-04-05 18:18:15.519] [info]  a spec change detected
[2022-04-05 18:18:15.519] [info]  a spec change detected
[2022-04-05 18:18:15.519] [info]  a spec change detected
[2022-04-05 18:18:15.520] [info]  a spec change detected
[2022-04-05 18:18:15.520] [info]  a spec change detected
[2022-04-05 18:18:15.520] [info]  a spec change detected
[2022-04-05 18:18:15.520] [info]  a spec change detected
[2022-04-05 18:18:15.520] [info]  a spec change detected
[2022-04-05 18:18:15.520] [info]  a spec change detected
[2022-04-05 18:18:15.521] [info]  a spec change detected
[2022-04-05 18:18:15.521] [info]  a spec change detected
[2022-04-05 18:18:15.521] [info]  a spec change detected
[2022-04-05 18:18:15.521] [info]  a spec change detected
[2022-04-05 18:18:15.521] [info]  a spec change detected
[2022-04-05 18:18:15.522] [info]  a spec change detected
[2022-04-05 18:18:15.522] [info]  a spec change detected
[2022-04-05 18:18:15.522] [info]  a spec change detected
[2022-04-05 18:18:15.522] [info]  a spec change detected
[2022-04-05 18:18:15.522] [info]  a spec change detected
[2022-04-05 18:18:15.522] [info]  a spec change detected
[2022-04-05 18:18:15.523] [info]  a spec change detected
[2022-04-05 18:18:15.523] [info]  a spec change detected
[2022-04-05 18:18:15.523] [info]  a spec change detected
[2022-04-05 18:18:15.523] [info]  a spec change detected
[2022-04-05 18:18:15.523] [info]  a spec change detected
[2022-04-05 18:18:15.524] [info]  a spec change detected
[2022-04-05 18:18:15.524] [info]  a spec change detected
[2022-04-05 18:18:15.524] [info]  a spec change detected
[2022-04-05 18:18:15.524] [info]  a spec change detected
[2022-04-05 18:18:15.524] [info]  a spec change detected
[2022-04-05 18:18:15.524] [info]  a spec change detected
[2022-04-05 18:18:15.525] [info]  a spec change detected
[2022-04-05 18:18:15.525] [info]  a spec change detected
[2022-04-05 18:18:15.525] [info]  a spec change detected
[2022-04-05 18:18:15.525] [info]  a spec change detected
[2022-04-05 18:18:15.525] [info]  a spec change detected
[2022-04-05 18:18:15.526] [info]  a spec change detected
[2022-04-05 18:18:15.526] [info]  a spec change detected
[2022-04-05 18:18:15.526] [info]  a spec change detected
[2022-04-05 18:18:15.526] [info]  a spec change detected
[2022-04-05 18:18:15.526] [info]  a spec change detected
[2022-04-05 18:18:15.526] [info]  a spec change detected
[2022-04-05 18:18:15.527] [info]  a spec change detected
[2022-04-05 18:18:15.527] [info]  a spec change detected
[2022-04-05 18:18:15.527] [info]  a spec change detected
[2022-04-05 18:18:15.527] [info]  a spec change detected
[2022-04-05 18:18:15.527] [info]  a spec change detected
[2022-04-05 18:18:15.527] [info]  a spec change detected
[2022-04-05 18:18:15.528] [info]  a spec change detected
[2022-04-05 18:18:15.528] [info]  a spec change detected
[2022-04-05 18:18:15.528] [info]  a spec change detected
[2022-04-05 18:18:15.528] [info]  a spec change detected
[2022-04-05 18:18:15.528] [info]  a spec change detected
[2022-04-05 18:18:15.528] [info]  a spec change detected
[2022-04-05 18:18:15.528] [info]  a spec change detected
[2022-04-05 18:18:15.529] [info]  a spec change detected
[2022-04-05 18:18:15.529] [info]  a spec change detected
[2022-04-05 18:18:15.529] [info]  a spec change detected
[2022-04-05 18:18:15.529] [info]  a spec change detected
[2022-04-05 18:18:15.529] [info]  a spec change detected
[2022-04-05 18:18:15.529] [info]  a spec change detected
[2022-04-05 18:18:21.181] [info]  a spec change detected
[2022-04-05 18:18:21.182] [info]  a spec change detected
[2022-04-05 18:18:21.182] [info]  a spec change detected
[2022-04-05 18:18:21.182] [info]  a spec change detected
[2022-04-05 18:18:21.182] [info]  a spec change detected
[2022-04-05 18:18:21.182] [info]  a spec change detected
[2022-04-05 18:18:21.183] [info]  a spec change detected
[2022-04-05 18:18:21.183] [info]  a spec change detected
[2022-04-05 18:18:21.183] [info]  a spec change detected
[2022-04-05 18:18:21.183] [info]  a spec change detected
[2022-04-05 18:18:21.183] [info]  a spec change detected
[2022-04-05 18:18:21.183] [info]  a spec change detected
[2022-04-05 18:18:21.184] [info]  a spec change detected
[2022-04-05 18:18:21.184] [info]  a spec change detected
[2022-04-05 18:18:21.184] [info]  a spec change detected
[2022-04-05 18:18:21.184] [info]  a spec change detected
[2022-04-05 18:18:21.184] [info]  a spec change detected
[2022-04-05 18:18:21.184] [info]  a spec change detected
[2022-04-05 18:18:21.185] [info]  a spec change detected
[2022-04-05 18:18:21.185] [info]  a spec change detected
[2022-04-05 18:18:21.185] [info]  a spec change detected
[2022-04-05 18:18:21.185] [info]  a spec change detected
[2022-04-05 18:18:21.185] [info]  a spec change detected
[2022-04-05 18:18:21.185] [info]  a spec change detected
[2022-04-05 18:18:21.186] [info]  a spec change detected
[2022-04-05 18:18:21.186] [info]  a spec change detected
[2022-04-05 18:18:21.186] [info]  a spec change detected
[2022-04-05 18:18:21.186] [info]  a spec change detected
[2022-04-05 18:18:21.186] [info]  a spec change detected
[2022-04-05 18:18:21.186] [info]  a spec change detected
[2022-04-05 18:18:21.187] [info]  a spec change detected
[2022-04-05 18:18:21.187] [info]  a spec change detected
[2022-04-05 18:18:21.187] [info]  a spec change detected
[2022-04-05 18:18:21.187] [info]  a spec change detected
[2022-04-05 18:18:21.187] [info]  a spec change detected
[2022-04-05 18:18:21.187] [info]  a spec change detected
[2022-04-05 18:18:21.187] [info]  a spec change detected
[2022-04-05 18:18:21.188] [info]  a spec change detected
[2022-04-05 18:18:21.188] [info]  a spec change detected
[2022-04-05 18:18:21.188] [info]  a spec change detected
[2022-04-05 18:18:21.188] [info]  a spec change detected
[2022-04-05 18:18:21.188] [info]  a spec change detected
[2022-04-05 18:18:21.188] [info]  a spec change detected
[2022-04-05 18:18:21.189] [info]  a spec change detected
[2022-04-05 18:18:21.189] [info]  a spec change detected
[2022-04-05 18:18:21.189] [info]  a spec change detected
[2022-04-05 18:18:21.189] [info]  a spec change detected
[2022-04-05 18:18:21.189] [info]  a spec change detected
[2022-04-05 18:18:21.189] [info]  a spec change detected
[2022-04-05 18:18:21.190] [info]  a spec change detected
[2022-04-05 18:18:21.190] [info]  a spec change detected
[2022-04-05 18:18:21.190] [info]  a spec change detected
[2022-04-05 18:18:21.190] [info]  a spec change detected
[2022-04-05 18:18:21.190] [info]  a spec change detected
[2022-04-05 18:18:21.190] [info]  a spec change detected
[2022-04-05 18:18:21.191] [info]  a spec change detected
[2022-04-05 18:18:21.191] [info]  a spec change detected
[2022-04-05 18:18:21.191] [info]  a spec change detected
[2022-04-05 18:18:21.191] [info]  a spec change detected
[2022-04-05 18:18:21.191] [info]  a spec change detected
[2022-04-05 18:18:21.191] [info]  a spec change detected
[2022-04-05 18:18:21.192] [info]  a spec change detected
[2022-04-05 18:18:21.192] [info]  a spec change detected
[2022-04-05 18:18:21.192] [info]  a spec change detected
[2022-04-05 18:18:21.192] [info]  a spec change detected
[2022-04-05 18:18:21.192] [info]  a spec change detected
[2022-04-05 18:18:21.192] [info]  a spec change detected
[2022-04-05 18:18:21.193] [info]  a spec change detected
[2022-04-05 18:18:21.193] [info]  a spec change detected
[2022-04-05 18:18:21.193] [info]  a spec change detected
[2022-04-05 18:18:21.193] [info]  a spec change detected
[2022-04-05 18:18:21.193] [info]  a spec change detected
[2022-04-05 18:18:21.193] [info]  a spec change detected
[2022-04-05 18:18:21.194] [info]  a spec change detected
[2022-04-05 18:18:21.194] [info]  a spec change detected
[2022-04-05 18:18:21.194] [info]  a spec change detected
[2022-04-05 18:18:21.194] [info]  a spec change detected
[2022-04-05 18:18:21.194] [info]  a spec change detected
[2022-04-05 18:18:21.194] [info]  a spec change detected
[2022-04-05 18:18:21.195] [info]  a spec change detected
[2022-04-05 18:18:21.195] [info]  a spec change detected
[2022-04-05 18:18:21.195] [info]  a spec change detected
[2022-04-05 18:18:21.195] [info]  a spec change detected
[2022-04-05 18:18:21.195] [info]  a spec change detected
[2022-04-05 18:18:21.195] [info]  a spec change detected
[2022-04-05 18:18:21.196] [info]  a spec change detected
[2022-04-05 18:18:21.196] [info]  a spec change detected
[2022-04-05 18:18:21.196] [info]  a spec change detected
[2022-04-05 18:18:21.196] [info]  a spec change detected
[2022-04-05 18:18:21.196] [info]  a spec change detected
[2022-04-05 18:18:21.196] [info]  a spec change detected
[2022-04-05 18:18:21.197] [info]  a spec change detected
[2022-04-05 18:18:21.197] [info]  a spec change detected
[2022-04-05 18:18:21.197] [info]  a spec change detected
[2022-04-05 18:18:21.197] [info]  a spec change detected
[2022-04-05 18:18:21.197] [info]  a spec change detected
[2022-04-05 18:18:21.197] [info]  a spec change detected
[2022-04-05 18:18:21.198] [info]  a spec change detected
[2022-04-05 18:18:21.198] [info]  a spec change detected
[2022-04-05 18:18:21.198] [info]  a spec change detected
[2022-04-05 18:18:21.198] [info]  a spec change detected
[2022-04-05 18:18:21.198] [info]  a spec change detected
[2022-04-05 18:18:21.198] [info]  a spec change detected
[2022-04-05 18:18:25.614] [info]  a spec change detected
[2022-04-05 18:18:25.615] [info]  a spec change detected
[2022-04-05 18:18:25.615] [info]  a spec change detected
[2022-04-05 18:18:25.615] [info]  a spec change detected
[2022-04-05 18:18:25.616] [info]  a spec change detected
[2022-04-05 18:18:25.616] [info]  a spec change detected
[2022-04-05 18:18:25.616] [info]  a spec change detected
[2022-04-05 18:18:25.616] [info]  a spec change detected
[2022-04-05 18:18:25.616] [info]  a spec change detected
[2022-04-05 18:18:25.616] [info]  a spec change detected
[2022-04-05 18:18:25.617] [info]  a spec change detected
[2022-04-05 18:18:25.617] [info]  a spec change detected
[2022-04-05 18:18:25.617] [info]  a spec change detected
[2022-04-05 18:18:25.617] [info]  a spec change detected
[2022-04-05 18:18:25.617] [info]  a spec change detected
[2022-04-05 18:18:25.618] [info]  a spec change detected
[2022-04-05 18:18:25.618] [info]  a spec change detected
[2022-04-05 18:18:25.618] [info]  a spec change detected
[2022-04-05 18:18:25.618] [info]  a spec change detected
[2022-04-05 18:18:25.618] [info]  a spec change detected
[2022-04-05 18:18:25.619] [info]  a spec change detected
[2022-04-05 18:18:25.619] [info]  a spec change detected
[2022-04-05 18:18:25.619] [info]  a spec change detected
[2022-04-05 18:18:25.619] [info]  a spec change detected
[2022-04-05 18:18:25.619] [info]  a spec change detected
[2022-04-05 18:18:25.619] [info]  a spec change detected
[2022-04-05 18:18:25.619] [info]  a spec change detected
[2022-04-05 18:18:25.620] [info]  a spec change detected
[2022-04-05 18:18:25.620] [info]  a spec change detected
[2022-04-05 18:18:25.620] [info]  a spec change detected
[2022-04-05 18:18:25.620] [info]  a spec change detected
[2022-04-05 18:18:25.620] [info]  a spec change detected
[2022-04-05 18:18:25.620] [info]  a spec change detected
[2022-04-05 18:18:25.621] [info]  a spec change detected
[2022-04-05 18:18:25.621] [info]  a spec change detected
[2022-04-05 18:18:25.621] [info]  a spec change detected
[2022-04-05 18:18:25.621] [info]  a spec change detected
[2022-04-05 18:18:25.621] [info]  a spec change detected
[2022-04-05 18:18:25.621] [info]  a spec change detected
[2022-04-05 18:18:25.622] [info]  a spec change detected
[2022-04-05 18:18:25.622] [info]  a spec change detected
[2022-04-05 18:18:25.622] [info]  a spec change detected
[2022-04-05 18:18:25.622] [info]  a spec change detected
[2022-04-05 18:18:25.622] [info]  a spec change detected
[2022-04-05 18:18:25.622] [info]  a spec change detected
[2022-04-05 18:18:25.623] [info]  a spec change detected
[2022-04-05 18:18:25.623] [info]  a spec change detected
[2022-04-05 18:18:25.623] [info]  a spec change detected
[2022-04-05 18:18:25.623] [info]  a spec change detected
[2022-04-05 18:18:25.623] [info]  a spec change detected
[2022-04-05 18:18:25.623] [info]  a spec change detected
[2022-04-05 18:18:25.623] [info]  a spec change detected
[2022-04-05 18:18:25.624] [info]  a spec change detected
[2022-04-05 18:18:25.624] [info]  a spec change detected
[2022-04-05 18:18:25.624] [info]  a spec change detected
[2022-04-05 18:18:25.624] [info]  a spec change detected
[2022-04-05 18:18:25.624] [info]  a spec change detected
[2022-04-05 18:18:25.624] [info]  a spec change detected
[2022-04-05 18:18:25.625] [info]  a spec change detected
[2022-04-05 18:18:25.625] [info]  a spec change detected
[2022-04-05 18:18:25.625] [info]  a spec change detected
[2022-04-05 18:18:25.625] [info]  a spec change detected
[2022-04-05 18:18:25.625] [info]  a spec change detected
[2022-04-05 18:18:25.625] [info]  a spec change detected
[2022-04-05 18:18:25.626] [info]  a spec change detected
[2022-04-05 18:18:25.626] [info]  a spec change detected
[2022-04-05 18:18:25.626] [info]  a spec change detected
[2022-04-05 18:18:25.626] [info]  a spec change detected
[2022-04-05 18:18:25.626] [info]  a spec change detected
[2022-04-05 18:18:25.626] [info]  a spec change detected
[2022-04-05 18:18:25.627] [info]  a spec change detected
[2022-04-05 18:18:25.627] [info]  a spec change detected
[2022-04-05 18:18:25.627] [info]  a spec change detected
[2022-04-05 18:18:25.627] [info]  a spec change detected
[2022-04-05 18:18:25.627] [info]  a spec change detected
[2022-04-05 18:18:25.627] [info]  a spec change detected
[2022-04-05 18:18:25.628] [info]  a spec change detected
[2022-04-05 18:18:25.628] [info]  a spec change detected
[2022-04-05 18:18:25.628] [info]  a spec change detected
[2022-04-05 18:18:25.628] [info]  a spec change detected
[2022-04-05 18:18:25.628] [info]  a spec change detected
[2022-04-05 18:18:25.629] [info]  a spec change detected
[2022-04-05 18:18:26.348] [info]  a spec change detected
[2022-04-05 18:18:26.348] [info]  a spec change detected
[2022-04-05 18:18:26.349] [info]  a spec change detected
[2022-04-05 18:18:26.349] [info]  a spec change detected
[2022-04-05 18:18:26.349] [info]  a spec change detected
[2022-04-05 18:18:26.349] [info]  a spec change detected
[2022-04-05 18:18:26.352] [info]  a spec change detected
[2022-04-05 18:18:26.403] [info]  a spec change detected
[2022-04-05 18:18:26.454] [info]  a spec change detected
[2022-04-05 18:18:26.503] [info]  a spec change detected``` 

Linux Build?

This looks great, but everyone know Linux is the best os :-P.

Seriously though, how can I help you make a Linux build? Is there a lot of platform specific code?

Tutorial: call to `env` does not display `message` in prompt

Going through the tutorial, the call to env (line 39) did not surface a message within or before displaying the prompt. Only a floating input with no clear indication if something was happening, video attached.

scriptkit-tutorial-issue.mp4

Cannot select a choice with ENTER

Steps to reproduce

Using the giphy-search script:

  1. type a query
  2. wait for results to appear
  3. use arrow keys to select a choice
  4. press enter
  5. kit app disappears

expected
kit should show next list of choices

This works well when the choice is selected with the mouse. When choosing an option the next list of arguments appears.

Enter key also works well for top level list of scripts.

Kit crashes after launching on Apple M1 Pro / Monterey 12.4

I was really hoping to start playing with this as I've been a long time follower of your work, but unfortunately after installing and running, it simply crashes. Not sure if this is a problem with it running on Apple Silicon or something else, but thought I'd share.

Note: I'm on vacation for a week after tomorrow, but I'd be happy to provide any logging if you can tell me where to find it.

Steps

  • Install ScriptKit. (Copy to Applications folder)
  • Run ScriptKit

Expected
ScriptKit runs

Actual
Splash screen shows briefly then closes.

Monosnap.screencast.2022-07-08.15-36-35.mp4

App shortcut incorrectly mapping characters to keycodes

When first installing Kit.app with the keymap set to Dvorak it shows that the launch shortcut is cmd+;, but that doesn't work. After remembering that ; is a QWERTY z I tried cmd+z (qwerty /) and it does work. Likewise if I want to change the key I need to figure out which character the key would produce in QWERTY and then select that character to correctly change the shortcut.

Even once past figuring out how to open the app initially the killer part of this bug is that the key combo used to set the shortcut is not the same as the key combo used to activate the app.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.