@starlein/paperclip-plugin-company-wizard 0.6.3 → 0.6.4
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.
- package/CHANGELOG.md +15 -0
- package/README.md +2 -2
- package/dist/manifest.js +2 -2
- package/dist/manifest.js.map +1 -1
- package/dist/ui/index.js +38 -5
- package/dist/ui/index.js.map +3 -3
- package/dist/worker.js +95 -14
- package/dist/worker.js.map +2 -2
- package/docs/PAPERCLIP-COMPATIBILITY.md +3 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,21 @@ All notable changes to the Company Wizard plugin are documented here.
|
|
|
4
4
|
|
|
5
5
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
|
|
7
|
+
## [0.6.4] - 2026-09-16
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Assembled Company Skills now include the YAML `name` and `description` frontmatter required by Codex. Provisioning also normalizes skill markdown before creating or updating `SKILL.md`, and keeps Paperclip's stored skill name equal to the Codex-compatible slug so a later rename cannot reintroduce an invalid name.
|
|
12
|
+
- Existing frontmatter is preserved instead of adding a duplicate block. Role-specific skill variants receive their final, disambiguated slug in the generated frontmatter.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- When `templatesPath` points to an empty directory and a custom GitHub template URL is configured, the wizard offers an explicit sync bound to that directory and saved source. The download is validated before replacing the empty directory; an operator-managed directory with files is left untouched (PR #52).
|
|
17
|
+
|
|
18
|
+
### Upgrade notes
|
|
19
|
+
|
|
20
|
+
- Install or update the plugin package and reload it to activate the worker fix. Installing this release does not rewrite existing companies or skill files; refresh an existing company to regenerate its managed skills with valid frontmatter.
|
|
21
|
+
|
|
7
22
|
## [0.6.3] - 2026-09-08
|
|
8
23
|
|
|
9
24
|
Includes PR #50 and preserves all changes from the previously published v0.6.2 tag, which had not yet been merged into main.
|
package/README.md
CHANGED
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
|
|
18
18
|
> **Fork:** This is a community-maintained fork of [yesterday-AI/paperclip-plugin-company-wizard](https://github.com/yesterday-AI/paperclip-plugin-company-wizard), updated for Paperclip plugin API v1 and the current published SDK with substantial bug fixes. End-to-end company setup is governed through current Paperclip workflows as of v0.5.0.
|
|
19
19
|
|
|
20
|
-
**Version 0.6.
|
|
20
|
+
**Version 0.6.4:** adds an explicit sync option for a configured empty template directory and fixes generated Company Skills so Codex can load their `SKILL.md` files. See the [changelog](CHANGELOG.md) and [compatibility notes](docs/PAPERCLIP-COMPATIBILITY.md).
|
|
21
21
|
|
|
22
|
-
**Upgrading from 0.6.
|
|
22
|
+
**Upgrading from 0.6.3:** update the installed plugin package and reload it; refreshing templates alone does not update the worker. Newly provisioned or refreshed Company Skills gain Codex-compatible YAML frontmatter. Existing skills are not changed merely by installing the release. If `templatesPath` is intentionally empty, the wizard can offer an explicit sync from the configured GitHub template URL; clearing the path still selects bundled templates. `companiesDir` does not need to change.
|
|
23
23
|
|
|
24
24
|
Requires Node **24.11+**, matching the current Paperclip SDK/shared runtime requirement.
|
|
25
25
|
|
package/dist/manifest.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
var manifest = {
|
|
3
3
|
id: "starlein.paperclip-plugin-company-wizard",
|
|
4
4
|
apiVersion: 1,
|
|
5
|
-
version: "0.6.
|
|
5
|
+
version: "0.6.4",
|
|
6
6
|
displayName: "Company Wizard",
|
|
7
7
|
description: "AI-powered wizard to bootstrap agent companies from composable templates",
|
|
8
8
|
author: "Sascha Pietrowski <sp@speednetwork.de>",
|
|
@@ -38,7 +38,7 @@ var manifest = {
|
|
|
38
38
|
},
|
|
39
39
|
templatesPath: {
|
|
40
40
|
type: "string",
|
|
41
|
-
description: "Optional existing template root containing roles/, modules/, and presets/. Overrides the GitHub URL. Leave empty to use bundled release templates or a custom GitHub source. Refresh never
|
|
41
|
+
description: "Optional existing template root containing roles/, modules/, and presets/. Overrides the GitHub URL. Leave empty to use bundled release templates or a custom GitHub source. Refresh never overwrites this directory. For an existing empty directory, the wizard offers an explicit sync from the configured template URL."
|
|
42
42
|
},
|
|
43
43
|
templatesRepoUrl: {
|
|
44
44
|
type: "string",
|
package/dist/manifest.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from '@paperclipai/plugin-sdk';\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: 'starlein.paperclip-plugin-company-wizard',\n apiVersion: 1,\n version: '0.6.
|
|
4
|
+
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from '@paperclipai/plugin-sdk';\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: 'starlein.paperclip-plugin-company-wizard',\n apiVersion: 1,\n version: '0.6.4',\n displayName: 'Company Wizard',\n description: 'AI-powered wizard to bootstrap agent companies from composable templates',\n author: 'Sascha Pietrowski <sp@speednetwork.de>',\n categories: ['workspace', 'ui'],\n // No numeric host floor: the loader compares this against the host version\n // `createApp` resolves (git describe \u2192 stamped build version \u2192 the server\n // package version), so a packaged install reports its package version (0.3.1)\n // and `compareSemver` would reject any CalVer floor on a current host.\n // Keep API v1/capabilities explicit and validate feature availability at runtime.\n capabilities: [\n 'companies.read',\n 'issues.create',\n 'issues.read',\n 'issues.update',\n 'goals.create',\n 'goals.read',\n 'agents.read',\n 'projects.read',\n 'skills.managed',\n 'plugin.state.read',\n 'plugin.state.write',\n 'secrets.read-ref',\n 'events.subscribe',\n 'ui.page.register',\n 'ui.sidebar.register',\n ],\n instanceConfigSchema: {\n type: 'object',\n properties: {\n companiesDir: {\n type: 'string',\n description:\n 'Directory where assembled company workspaces are written. Auto-detected: ~/instances/default/companies in Docker setups, ~/.paperclip/instances/default/companies otherwise. Rarely needs manual override.',\n },\n templatesPath: {\n type: 'string',\n description:\n 'Optional existing template root containing roles/, modules/, and presets/. Overrides the GitHub URL. Leave empty to use bundled release templates or a custom GitHub source. Refresh never overwrites this directory. For an existing empty directory, the wizard offers an explicit sync from the configured template URL.',\n },\n templatesRepoUrl: {\n type: 'string',\n default: 'https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates',\n description:\n 'Optional custom GitHub tree URL. The official default uses bundled release templates; a custom URL opts into a refreshable remote cache.',\n },\n aiProvider: {\n type: 'string',\n enum: ['anthropic', 'openai'],\n default: 'anthropic',\n description:\n 'AI provider used for company generation. Anthropic uses Claude Opus 5 at max effort; OpenAI uses GPT-6-Astra at high reasoning effort.',\n },\n anthropicApiKey: {\n // Paperclip's secret picker submits an EnvSecretRefBinding object,\n // while direct keys and older hosts still submit strings. Keep both\n // representations schema-valid; the host validates governed bindings\n // and the worker resolves them before calling Anthropic.\n type: ['string', 'object'],\n format: 'secret-ref',\n description:\n 'Anthropic API key for the AI wizard. Paste a key or select a saved Paperclip company secret; Paperclip stores pasted values as governed secret references.',\n },\n openaiApiKey: {\n type: ['string', 'object'],\n format: 'secret-ref',\n description:\n 'OpenAI API key for GPT/Codex company generation. Paste a key or select a saved Paperclip company secret; required when AI Provider is openai.',\n },\n paperclipUrl: {\n type: 'string',\n description:\n 'Paperclip instance URL. Defaults to http://localhost:3100 or the PAPERCLIP_PUBLIC_URL env var.',\n },\n paperclipEmail: {\n type: 'string',\n description: 'Board login email (for authenticated instances).',\n },\n paperclipPassword: {\n type: 'string',\n description: 'Board login password (for authenticated instances).',\n },\n },\n },\n entrypoints: {\n worker: './dist/worker.js',\n ui: './dist/ui',\n },\n ui: {\n slots: [\n {\n type: 'page',\n id: 'company-wizard',\n displayName: 'Company Wizard',\n exportName: 'WizardPage',\n routePath: 'company-creator',\n },\n {\n type: 'sidebar',\n id: 'company-wizard-link',\n displayName: 'Create Company',\n exportName: 'SidebarLink',\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
5
|
"mappings": ";AAEA,IAAM,WAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY,CAAC,aAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9B,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,YAAY;AAAA,MACV,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,kBAAkB;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,MAAM,CAAC,aAAa,QAAQ;AAAA,QAC5B,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,MACA,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,QAKf,MAAM,CAAC,UAAU,QAAQ;AAAA,QACzB,QAAQ;AAAA,QACR,aACE;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,QACZ,MAAM,CAAC,UAAU,QAAQ;AAAA,QACzB,QAAQ;AAAA,QACR,aACE;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,mBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/ui/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// src/ui/index.tsx
|
|
2
2
|
import {
|
|
3
|
-
usePluginData
|
|
3
|
+
usePluginData,
|
|
4
|
+
usePluginAction as usePluginAction9
|
|
4
5
|
} from "@paperclipai/plugin-sdk/ui";
|
|
6
|
+
import { useState as useState12 } from "react";
|
|
5
7
|
|
|
6
8
|
// node_modules/.pnpm/lucide-react@0.574.0_react@19.2.4/node_modules/lucide-react/dist/esm/createLucideIcon.js
|
|
7
9
|
import { forwardRef as forwardRef2, createElement as createElement2 } from "react";
|
|
@@ -8060,9 +8062,26 @@ function WizardShell() {
|
|
|
8060
8062
|
}
|
|
8061
8063
|
|
|
8062
8064
|
// src/ui/index.tsx
|
|
8063
|
-
import { jsx as jsx22, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
8065
|
+
import { Fragment as Fragment4, jsx as jsx22, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
8064
8066
|
function WizardPage(_props) {
|
|
8065
|
-
const { data: templates, loading, error } = usePluginData("templates");
|
|
8067
|
+
const { data: templates, loading, error, refresh } = usePluginData("templates");
|
|
8068
|
+
const syncTemplates = usePluginAction9("sync-empty-templates");
|
|
8069
|
+
const [syncing, setSyncing] = useState12(false);
|
|
8070
|
+
const [syncError, setSyncError] = useState12(null);
|
|
8071
|
+
const handleSync = async () => {
|
|
8072
|
+
if (syncing || !templates?.syncOffer?.canSync) return;
|
|
8073
|
+
setSyncing(true);
|
|
8074
|
+
setSyncError(null);
|
|
8075
|
+
try {
|
|
8076
|
+
const result = await syncTemplates({ confirmation: templates.syncOffer.token });
|
|
8077
|
+
if (!result.ok) throw new Error(result.error || "Template sync failed.");
|
|
8078
|
+
await refresh();
|
|
8079
|
+
} catch (err) {
|
|
8080
|
+
setSyncError(err instanceof Error ? err.message : "Template sync failed.");
|
|
8081
|
+
} finally {
|
|
8082
|
+
setSyncing(false);
|
|
8083
|
+
}
|
|
8084
|
+
};
|
|
8066
8085
|
if (error) {
|
|
8067
8086
|
return /* @__PURE__ */ jsxs16("div", { className: "flex items-center justify-center min-h-[400px] text-sm text-destructive", children: [
|
|
8068
8087
|
"Failed to load templates: ",
|
|
@@ -8086,9 +8105,23 @@ function WizardPage(_props) {
|
|
|
8086
8105
|
className: "flex flex-col items-center justify-center min-h-[400px] gap-3 px-6 text-sm text-center",
|
|
8087
8106
|
children: [
|
|
8088
8107
|
/* @__PURE__ */ jsx22(TriangleAlert, { className: "h-6 w-6 text-destructive" }),
|
|
8089
|
-
/* @__PURE__ */ jsx22("p", { className: "font-medium", children: "Templates are unavailable" }),
|
|
8108
|
+
/* @__PURE__ */ jsx22("p", { className: "font-medium", children: templates.syncOffer ? "Template directory is empty" : "Templates are unavailable" }),
|
|
8109
|
+
templates.syncOffer?.canSync && /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
8110
|
+
/* @__PURE__ */ jsx22("p", { className: "text-muted-foreground", children: "Sync downloads and validates the configured template URL into this empty directory. Existing files are never overwritten." }),
|
|
8111
|
+
/* @__PURE__ */ jsx22(
|
|
8112
|
+
"button",
|
|
8113
|
+
{
|
|
8114
|
+
type: "button",
|
|
8115
|
+
disabled: syncing,
|
|
8116
|
+
onClick: handleSync,
|
|
8117
|
+
className: "rounded-md bg-primary px-4 py-2 text-primary-foreground disabled:opacity-50",
|
|
8118
|
+
children: syncing ? "Syncing templates\u2026" : "Confirm sync from configured template URL"
|
|
8119
|
+
}
|
|
8120
|
+
)
|
|
8121
|
+
] }),
|
|
8122
|
+
syncError && /* @__PURE__ */ jsx22("p", { role: "alert", className: "text-destructive", children: syncError }),
|
|
8090
8123
|
/* @__PURE__ */ jsx22("p", { className: "max-w-2xl text-destructive", children: templates.error || "No CEO template was loaded." }),
|
|
8091
|
-
/* @__PURE__ */ jsx22("p", { className: "max-w-2xl text-muted-foreground", children: "Open Company Wizard plugin settings. Clear templatesPath to use bundled templates or your custom GitHub source, or point it to a populated template root. The local path overrides the GitHub URL
|
|
8124
|
+
/* @__PURE__ */ jsx22("p", { className: "max-w-2xl text-muted-foreground", children: "Open Company Wizard plugin settings. Clear templatesPath to use bundled templates or your custom GitHub source, or point it to a populated template root. The local path overrides the GitHub URL. Only the explicit sync offer can populate an empty local directory. Test Configuration, save, then reload this page." })
|
|
8092
8125
|
]
|
|
8093
8126
|
}
|
|
8094
8127
|
);
|