@nolgard/addon-kit
v0.1.40
Published
Autonomous toolkit to create, build, package, sign and distribute Pinecone addons
Readme
@nolgard/addon-kit
Autonomous toolkit to create, build, package, sign, and distribute Pinecone addons.
Commands
pinecone-addon create <app-name> [target-dir](app-typ frågas först)pinecone-addon init [--addon <dir>]pinecone-addon package [--addon <dir>]pinecone-addon distribute [--addon <dir>]create-pc-app <app-id> [target-dir](shortcut for scaffold)
Typical usage in an addon
Install:
npm install --save-dev @nolgard/addon-kitScripts:
{
"scripts": {
"package:addon": "pinecone-addon package",
"distribute:addon": "pinecone-addon distribute"
}
}Initialize config in the addon folder:
npx pinecone-addon initCreate from current directory with the shortcut package name:
npx create-pc-app my-addonVid skapande frågas först om app-typ, sedan används appnamnet för att skapa ett giltigt appId.
Packaging uses manifest.json.version as the source of truth for the versioned zip file name. Keep package.json.version aligned for tooling consistency, but do not rely on it for pack output naming.
Config
File: pinecone-addon.config.json
{
"build": {
"command": "",
"args": []
},
"package": {
"outputDir": "dist"
},
"signing": {
"enabled": true
},
"distribution": {
"targetDir": ""
}
}Signing
Signing uses Ed25519 and reads from:
--private-key <path>ADDON_SIGN_PRIVATE_KEYADDON_SIGN_PRIVATE_KEY_PATH
Key id resolution:
--key-idmanifest.vendor.keyIdADDON_SIGN_KEY_ID
Required manifest vendor fields for signed packages:
manifest.vendor.slugmanifest.vendor.namemanifest.vendor.keyId
Config fields without boilerplate
Use a generic config-object flow so new fields are saved automatically without updating readConfigFromForm for every new input.
In src/config/config.js:
const defaults = {
heading: '',
title: '',
message: 'Hello PineCone!',
tone: 'neutral',
showBadge: true,
}
let formState = { ...defaults }
appInstance = mount(Config, {
target: appRoot,
props: {
config: { ...formState },
onConfigInput: (nextConfig) => {
formState = {
...defaults,
...(nextConfig && typeof nextConfig === 'object' ? nextConfig : {}),
}
const heading = `${formState.heading ?? formState.title ?? ''}`
formState.heading = heading
formState.title = heading
},
},
})
const readConfigFromForm = () => {
const heading = `${formState.heading ?? formState.title ?? ''}`
return {
...formState,
heading,
title: heading,
}
}In src/config/Config.svelte:
<script>
export let config = {}
export let onConfigInput = () => {}
$: if ((config?.title ?? '') !== `${config?.heading || ''}`) {
config = {
...(config && typeof config === 'object' ? config : {}),
title: `${config?.heading || ''}`,
}
}
$: onConfigInput(config)
</script>Then bind UI fields directly to config.<fieldName> (for example bind:value={config.backgroundColor}).
