archik 0.12.37 → 0.12.38

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.
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "archik",
3
+ "owner": {
4
+ "name": "Bashar",
5
+ "email": "welcomebachar@gmail.com"
6
+ },
7
+ "plugins": [
8
+ {
9
+ "name": "archik",
10
+ "source": ".",
11
+ "description": "Plain-YAML architecture diagrams + Jacobson use cases / actors / sequence diagrams / alphas, all CLI-mediated and validated. The skill enforces CLI-only access; the slash commands wrap the loop.",
12
+ "homepage": "https://github.com/bacharSalleh/archik#readme",
13
+ "license": "MIT",
14
+ "keywords": ["architecture", "diagram", "yaml", "jacobson", "ecb"]
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "archik",
3
+ "description": "The shared vocabulary between you and Claude Code, at the engineering level. Plain-YAML architecture diagrams + Jacobson use cases / actors / sequence diagrams / alphas, all CLI-mediated and validated.",
4
+ "author": {
5
+ "name": "Bashar",
6
+ "email": "welcomebachar@gmail.com"
7
+ },
8
+ "homepage": "https://github.com/bacharSalleh/archik#readme",
9
+ "repository": "https://github.com/bacharSalleh/archik",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "architecture",
13
+ "diagram",
14
+ "yaml",
15
+ "jacobson",
16
+ "use-case",
17
+ "ecb",
18
+ "essence",
19
+ "documentation"
20
+ ]
21
+ }
package/README.md CHANGED
@@ -65,6 +65,17 @@ Done with the canvas? `npx archik stop`.
65
65
  </video>
66
66
  </p>
67
67
 
68
+ ### Install as a Claude Code plugin
69
+
70
+ If you're on Claude Code and prefer the plugin marketplace flow, archik also ships as a plugin (skill + 11 slash commands bundled together):
71
+
72
+ ```
73
+ /plugin marketplace add bacharSalleh/archik
74
+ /plugin install archik@archik
75
+ ```
76
+
77
+ The plugin still shells out to the `archik` CLI for the actual diagram work, so you also need the npm binary on your PATH (`npm i -g archik` or keep using `npx archik`). The skill enforces CLI-only access either way — same contract as the npm install.
78
+
68
79
  ## What you write
69
80
 
70
81
  ```yaml
@@ -177,7 +188,9 @@ Each command stages a sidecar via `npx archik suggest set`. The canvas shows a g
177
188
 
178
189
  ### Manual install (existing projects without `archik init`)
179
190
 
180
- If you already have an archik file and just want to add the Claude integration:
191
+ If you already have an archik file and just want to add the Claude integration, pick the path that suits you:
192
+
193
+ **Via the npm CLI:**
181
194
 
182
195
  ```bash
183
196
  npx archik@latest skill --user # install skill into ~/.claude/skills (all projects)
@@ -186,6 +199,15 @@ npx archik@latest commands --user # install /archik:* into ~/.claude/command
186
199
 
187
200
  Drop the `--user` flag to scope to the current project only.
188
201
 
202
+ **Via Claude Code's plugin marketplace:**
203
+
204
+ ```
205
+ /plugin marketplace add bacharSalleh/archik
206
+ /plugin install archik@archik
207
+ ```
208
+
209
+ Either path leaves the same skill + the same 11 slash commands in the same target directories.
210
+
189
211
  ## Commands
190
212
 
191
213
  ```
@@ -371,7 +371,7 @@ Consider installing the package or pass your own 'workerFactory' to ELK's constr
371
371
  React keys must be passed directly to JSX without using spread:
372
372
  let props = %s;
373
373
  <%s key={someKey} {...props} />`,Yo,Wr,Oa,Wr),_a[Wr+Yo]=!0)}if(Wr=null,yi!==void 0&&(d(yi),Wr=""+yi),v(Zn)&&(d(Zn.key),Wr=""+Zn.key),"key"in Zn){yi={};for(var Wl in Zn)Wl!=="key"&&(yi[Wl]=Zn[Wl])}else yi=Zn;return Wr&&k(yi,typeof nn=="function"?nn.displayName||nn.name||"Unknown":nn),P(nn,Wr,yi,f(),Hs,Lo)}function B(nn){G(nn)?nn._store&&(nn._store.validated=1):typeof nn=="object"&&nn!==null&&nn.$$typeof===jn&&(nn._payload.status==="fulfilled"?G(nn._payload.value)&&nn._payload.value._store&&(nn._payload.value._store.validated=1):nn._store&&(nn._store.validated=1))}function G(nn){return typeof nn=="object"&&nn!==null&&nn.$$typeof===de}var K=y3(),de=Symbol.for("react.transitional.element"),ce=Symbol.for("react.portal"),we=Symbol.for("react.fragment"),De=Symbol.for("react.strict_mode"),at=Symbol.for("react.profiler"),kt=Symbol.for("react.consumer"),_e=Symbol.for("react.context"),ht=Symbol.for("react.forward_ref"),Te=Symbol.for("react.suspense"),Wt=Symbol.for("react.suspense_list"),tn=Symbol.for("react.memo"),jn=Symbol.for("react.lazy"),rr=Symbol.for("react.activity"),_r=Symbol.for("react.client.reference"),fn=K.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ii=Object.prototype.hasOwnProperty,Si=Array.isArray,No=console.createTask?console.createTask:function(){return null};K={react_stack_bottom_frame:function(nn){return nn()}};var bs,Ki={},se=K.react_stack_bottom_frame.bind(K,b)(),Bs=No(g(b)),_a={};DDe.Fragment=we,DDe.jsx=function(nn,Zn,yi){var Yo=1e4>fn.recentlyCreatedOwnerStacks++;return j(nn,Zn,yi,!1,Yo?Error("react-stack-top-frame"):se,Yo?No(g(nn)):Bs)},DDe.jsxs=function(nn,Zn,yi){var Yo=1e4>fn.recentlyCreatedOwnerStacks++;return j(nn,Zn,yi,!0,Yo?Error("react-stack-top-frame"):se,Yo?No(g(nn)):Bs)}})()});var sc=mr((uri,Dft)=>{"use strict";process.env.NODE_ENV==="production"?Dft.exports=tan():Dft.exports=nan()});import{readFileSync as s8r}from"node:fs";import u8r from"node:path";import{access as RRn,mkdir as DRn,readFile as ORn,writeFile as EKt}from"node:fs/promises";import pct from"node:path";var kRn=process.env.FORCE_COLOR==="0"?!1:process.env.FORCE_COLOR!==void 0?!0:process.env.NO_COLOR!==void 0?!1:!!process.stdout.isTTY,Hx=(o,c)=>d=>kRn?`\x1B[${o}m${d}\x1B[${c}m`:d,Mr=Hx("1","22"),tr=Hx("2","22"),MRn=Hx("31","39"),act=Hx("32","39"),Uf=Hx("33","39"),eKr=Hx("34","39"),mKt=Hx("35","39"),ys=Hx("36","39"),V1=Hx("90","39"),Hl=()=>Mr(act("\u2713")),Yr=()=>Mr(MRn("\u2717")),k9=()=>ys("\u25B8");function vKt(o){let c={_:[]};for(let d=0;d<o.length;d++){let g=o[d];if(g.startsWith("--")){let f=g.indexOf("=");if(f!==-1)c[g.slice(2,f)]=g.slice(f+1);else{let b=o[d+1];b===void 0||b.startsWith("--")?c[g.slice(2)]="true":(c[g.slice(2)]=b,d++)}}else c._.push(g)}return c}function Zr(o,c){let d=o[c];return Array.isArray(d)?d[0]:d}import{existsSync as SRn,mkdirSync as _Rn}from"node:fs";import{readFile as CRn,rename as IRn,unlink as LRn,writeFile as ERn}from"node:fs/promises";import MKt from"node:path";import{access as xRn}from"node:fs/promises";import $x from"node:path";var sct=".archik/main.archik.yaml",uct="architecture.archik.yaml";async function lct(o){try{return await xRn(o),!0}catch{return!1}}async function Lu(o,c=process.cwd()){if(o!==void 0&&o!=="")return $x.resolve(c,o);let d=$x.resolve(c,uct),g=$x.resolve(c,sct),[f,b]=await Promise.all([lct(d),lct(g)]);if(f&&b)throw new Error(`Found both ${uct} and ${sct}. Pick one \u2014 keep the file under .archik/ (preferred) and delete the root copy, or vice versa.`);return f?d:g}async function kKt(o,c=process.cwd()){if(o!==void 0&&o!=="")return $x.resolve(c,o);let d=$x.resolve(c,uct);return await lct(d)?d:$x.resolve(c,sct)}function W1(o){let c=$x.dirname(o);return $x.basename(c)===".archik"?$x.dirname(c):c}var hct="runtime.json";function zU(o){return MKt.join(W1(o),".archik",hct)}async function kfe(o,c){let d=zU(o),g=MKt.dirname(d);SRn(g)||_Rn(g,{recursive:!0});let f=`${d}.tmp`;await ERn(f,JSON.stringify(c,null,2)+`
374
- `,"utf-8"),await IRn(f,d)}async function xKt(o){let c=zU(o);try{let d=await CRn(c,"utf-8"),g=JSON.parse(d);return typeof g.pid!="number"||typeof g.port!="number"||typeof g.host!="string"||typeof g.url!="string"||typeof g.startedAt!="string"?null:g}catch{return null}}function SKt(o){let c=o.urls?.local?.[0];if(c===void 0)return null;let d;try{d=new URL(c)}catch{return null}if(d.port==="")return null;let g=Number.parseInt(d.port,10);return Number.isFinite(g)?{pid:o.pid,port:g,host:d.hostname,url:c,startedAt:o.startedAt}:null}async function GI(o){let c=zU(o);try{await LRn(c)}catch{}}import{copyFile as _Kt,mkdir as CKt,readdir as NRn,stat as dct}from"node:fs/promises";import h3 from"node:path";import IKt from"node:os";import{existsSync as TRn,realpathSync as ARn}from"node:fs";import Mfe from"node:path";import{fileURLToPath as PRn}from"node:url";function U5(){let o=process.env.ARCHIK_PKG_ROOT;if(o)return Mfe.resolve(o);let c=Mfe.dirname(ARn(PRn(import.meta.url))),d=c;for(let g=0;g<10;g++){if(TRn(Mfe.join(d,"package.json")))return d;let f=Mfe.dirname(d);if(f===d)break;d=f}throw new Error(`archik: could not locate package root (start: ${c})`)}async function fct(o){let c=h3.join(U5(),".claude","skills","archik","SKILL.md");try{await dct(c)}catch{return{ok:!1,reason:"missing-source",source:c}}let d=o.scope==="user"?h3.join(IKt.homedir(),".claude","skills"):h3.resolve(".claude","skills"),g=h3.join(d,"archik"),f=h3.join(g,"SKILL.md");if(!o.force)try{return await dct(f),{ok:!1,reason:"exists",target:f}}catch{}return await CKt(g,{recursive:!0}),await _Kt(c,f),{ok:!0,target:f,scope:o.scope}}async function xfe(o){let c=h3.join(U5(),".claude","commands","archik"),d;try{d=(await NRn(c)).filter(v=>v.endsWith(".md"))}catch{return{ok:!1,reason:"missing-source",source:c}}if(d.length===0)return{ok:!1,reason:"missing-source",source:c};let g=o.scope==="user"?h3.join(IKt.homedir(),".claude","commands"):h3.resolve(".claude","commands"),f=h3.join(g,"archik");if(!o.force){let v=[];for(let k of d)try{await dct(h3.join(f,k)),v.push(k)}catch{}if(v.length>0)return{ok:!1,reason:"exists",existing:v,targetDir:f}}await CKt(f,{recursive:!0});let b=[];for(let v of d)await _Kt(h3.join(c,v),h3.join(f,v)),b.push(v);return{ok:!0,targetDir:f,copied:b,scope:o.scope}}async function LKt(o){let c=Zr(o,"user")==="true"?"user":"project",d=Zr(o,"force")==="true",g=await fct({scope:c,force:d});if(!g.ok)return g.reason==="missing-source"?console.error(`\u2717 Source skill not found at ${g.source}`):console.error(`\u2717 ${g.target} already exists. Pass --force to overwrite.`),1;let f=g.scope==="user"?"user-wide":"this project";return console.log(`\u2713 Installed archik skill (${f}) \u2192 ${g.target}`),0}var FRn=`version: "1.0"
374
+ `,"utf-8"),await IRn(f,d)}async function xKt(o){let c=zU(o);try{let d=await CRn(c,"utf-8"),g=JSON.parse(d);return typeof g.pid!="number"||typeof g.port!="number"||typeof g.host!="string"||typeof g.url!="string"||typeof g.startedAt!="string"?null:g}catch{return null}}function SKt(o){let c=o.urls?.local?.[0];if(c===void 0)return null;let d;try{d=new URL(c)}catch{return null}if(d.port==="")return null;let g=Number.parseInt(d.port,10);return Number.isFinite(g)?{pid:o.pid,port:g,host:d.hostname,url:c,startedAt:o.startedAt}:null}async function GI(o){let c=zU(o);try{await LRn(c)}catch{}}import{copyFile as _Kt,mkdir as CKt,readdir as NRn,stat as dct}from"node:fs/promises";import h3 from"node:path";import IKt from"node:os";import{existsSync as TRn,realpathSync as ARn}from"node:fs";import Mfe from"node:path";import{fileURLToPath as PRn}from"node:url";function U5(){let o=process.env.ARCHIK_PKG_ROOT;if(o)return Mfe.resolve(o);let c=Mfe.dirname(ARn(PRn(import.meta.url))),d=c;for(let g=0;g<10;g++){if(TRn(Mfe.join(d,"package.json")))return d;let f=Mfe.dirname(d);if(f===d)break;d=f}throw new Error(`archik: could not locate package root (start: ${c})`)}async function fct(o){let c=h3.join(U5(),"skills","archik","SKILL.md");try{await dct(c)}catch{return{ok:!1,reason:"missing-source",source:c}}let d=o.scope==="user"?h3.join(IKt.homedir(),".claude","skills"):h3.resolve(".claude","skills"),g=h3.join(d,"archik"),f=h3.join(g,"SKILL.md");if(!o.force)try{return await dct(f),{ok:!1,reason:"exists",target:f}}catch{}return await CKt(g,{recursive:!0}),await _Kt(c,f),{ok:!0,target:f,scope:o.scope}}async function xfe(o){let c=h3.join(U5(),"commands"),d;try{d=(await NRn(c)).filter(v=>v.endsWith(".md"))}catch{return{ok:!1,reason:"missing-source",source:c}}if(d.length===0)return{ok:!1,reason:"missing-source",source:c};let g=o.scope==="user"?h3.join(IKt.homedir(),".claude","commands"):h3.resolve(".claude","commands"),f=h3.join(g,"archik");if(!o.force){let v=[];for(let k of d)try{await dct(h3.join(f,k)),v.push(k)}catch{}if(v.length>0)return{ok:!1,reason:"exists",existing:v,targetDir:f}}await CKt(f,{recursive:!0});let b=[];for(let v of d)await _Kt(h3.join(c,v),h3.join(f,v)),b.push(v);return{ok:!0,targetDir:f,copied:b,scope:o.scope}}async function LKt(o){let c=Zr(o,"user")==="true"?"user":"project",d=Zr(o,"force")==="true",g=await fct({scope:c,force:d});if(!g.ok)return g.reason==="missing-source"?console.error(`\u2717 Source skill not found at ${g.source}`):console.error(`\u2717 ${g.target} already exists. Pass --force to overwrite.`),1;let f=g.scope==="user"?"user-wide":"this project";return console.log(`\u2713 Installed archik skill (${f}) \u2192 ${g.target}`),0}var FRn=`version: "1.0"
375
375
  name: My Architecture
376
376
  description: Initial scaffold \u2014 edit this file to grow your diagram.
377
377
  nodes:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "archik",
3
- "version": "0.12.37",
3
+ "version": "0.12.38",
4
4
  "description": "The shared vocabulary between you and Claude Code, at the engineering level. Plain-YAML architecture diagrams with a live browser canvas, headless SVG render in CI, and an installable Claude skill so the model treats the diagram as the spec.",
5
5
  "keywords": [
6
6
  "architecture",
@@ -33,8 +33,9 @@
33
33
  "docs/hero.svg",
34
34
  "docs/logo.svg",
35
35
  "docs/wordmark.svg",
36
- ".claude/skills/archik",
37
- ".claude/commands/archik",
36
+ "skills",
37
+ "commands",
38
+ ".claude-plugin",
38
39
  "README.md",
39
40
  "LICENSE"
40
41
  ],
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes