skill-creator 1.5.0 → 1.5.2
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/README.md +173 -103
- package/dist/buildIndex-B_9ABRtx.mjs +2 -0
- package/dist/buildIndex-B_9ABRtx.mjs.map +1 -0
- package/dist/buildIndex-Cea97e0l.mjs +1 -0
- package/dist/cli.d.mts +0 -0
- package/dist/cli.d.mts.map +1 -1
- package/dist/cli.mjs +17 -33
- package/dist/cli.mjs.map +1 -1
- package/dist/contentManager-CoVTiSDT.mjs +13 -0
- package/dist/contentManager-CoVTiSDT.mjs.map +1 -0
- package/dist/contentManager-CwquwC1s.mjs +1 -0
- package/dist/context7-BejCCqkm.mjs +1 -0
- package/dist/context7-BxMpyQiW.mjs +2 -0
- package/dist/context7-BxMpyQiW.mjs.map +1 -0
- package/dist/index.d.mts +317 -123
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -20
- package/dist/index.mjs.map +1 -1
- package/dist/{listContext7-DKXzgWdn.mjs → listContext7-DHj9AL-z.mjs} +2 -2
- package/dist/{listContext7-DKXzgWdn.mjs.map → listContext7-DHj9AL-z.mjs.map} +1 -1
- package/dist/package-CFJazwTO.mjs +2 -0
- package/dist/package-CFJazwTO.mjs.map +1 -0
- package/dist/referenceSearchUtils-DZgupMZp.mjs +2 -0
- package/dist/referenceSearchUtils-DZgupMZp.mjs.map +1 -0
- package/dist/removeContext7-BZtL4_CJ.mjs +3 -0
- package/dist/{removeContext7-DOXrTXeI.mjs.map → removeContext7-BZtL4_CJ.mjs.map} +1 -1
- package/dist/{removeSkill-C-ehFexk.mjs → removeSkill-Bat_plVG.mjs} +4 -4
- package/dist/removeSkill-Bat_plVG.mjs.map +1 -0
- package/dist/removeSkill-DjDZjhJU.mjs +1 -0
- package/dist/runScript-CSKqb831.mjs +13 -0
- package/dist/runScript-CSKqb831.mjs.map +1 -0
- package/dist/scopeSelection-BWteJQSv.mjs +2 -0
- package/dist/scopeSelection-BWteJQSv.mjs.map +1 -0
- package/dist/searchQuality-DVdHmamh.mjs +2 -0
- package/dist/searchQuality-DVdHmamh.mjs.map +1 -0
- package/dist/search_format-RyjXACJa.mjs +5 -0
- package/dist/search_format-RyjXACJa.mjs.map +1 -0
- package/dist/shared-DsVh4gOV.mjs +2 -0
- package/dist/shared-DsVh4gOV.mjs.map +1 -0
- package/dist/skillCreator-BomXoqdw.mjs +2 -0
- package/dist/skillCreator-BomXoqdw.mjs.map +1 -0
- package/dist/skillMdManager-DGBZ6M5J.mjs +7 -0
- package/dist/skillMdManager-DGBZ6M5J.mjs.map +1 -0
- package/dist/sqliteVectorSearchAdapter-56kZjbUT.mjs +28 -0
- package/dist/sqliteVectorSearchAdapter-56kZjbUT.mjs.map +1 -0
- package/dist/sqliteVectorSearchAdapter-DNkyKuZs.mjs +1 -0
- package/dist/unifiedSearch-CLdazMYU.mjs +4 -0
- package/dist/unifiedSearch-CLdazMYU.mjs.map +1 -0
- package/dist/unifiedSearch-DCFPrtzZ.mjs +1 -0
- package/package.json +32 -28
- package/templates/SKILL.md +19 -4
- package/templates/SKILL.zh-CN.md +54 -12
- package/templates/skill-creator.md +52 -19
- package/templates/skill-creator.zh-CN.md +55 -22
- package/dist/chunk-Da8dvM5T.mjs +0 -1
- package/dist/contentManager-8rmWJMb6.mjs +0 -22
- package/dist/contentManager-8rmWJMb6.mjs.map +0 -1
- package/dist/contentManager-Xt8N5psY.mjs +0 -1
- package/dist/dist-DZL34HNo.mjs +0 -8
- package/dist/dist-DZL34HNo.mjs.map +0 -1
- package/dist/dist-X_kVEzbK.mjs +0 -1
- package/dist/esm-8qfZdcpd.mjs +0 -33
- package/dist/esm-8qfZdcpd.mjs.map +0 -1
- package/dist/esm-BF5pvSbc.mjs +0 -1
- package/dist/esm-BbhxxeGF.mjs +0 -4
- package/dist/esm-BbhxxeGF.mjs.map +0 -1
- package/dist/package-B4FNst2t.mjs +0 -2
- package/dist/package-B4FNst2t.mjs.map +0 -1
- package/dist/path-CuoiIaIe.mjs +0 -2
- package/dist/path-CuoiIaIe.mjs.map +0 -1
- package/dist/removeContext7-DOXrTXeI.mjs +0 -3
- package/dist/removeSkill-C-ehFexk.mjs.map +0 -1
- package/dist/removeSkill-DWwhvzej.mjs +0 -1
- package/dist/runScript-Cr9RRN9y.mjs +0 -14
- package/dist/runScript-Cr9RRN9y.mjs.map +0 -1
- package/dist/search_format-DIs-1lKk.mjs +0 -5
- package/dist/search_format-DIs-1lKk.mjs.map +0 -1
- package/dist/shared-CFoY2Xhg.mjs +0 -2
- package/dist/shared-CFoY2Xhg.mjs.map +0 -1
- package/dist/skillMdManager-DP8fGZb7.mjs +0 -7
- package/dist/skillMdManager-DP8fGZb7.mjs.map +0 -1
- package/dist/unifiedSearch-CGZXw0NB.mjs +0 -1
- package/dist/unifiedSearch-l-lrSc9C.mjs +0 -4
- package/dist/unifiedSearch-l-lrSc9C.mjs.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./path-CuoiIaIe.mjs";import{join as t}from"node:path";import{existsSync as n,mkdirSync as r,readFileSync as i,readdirSync as a,writeFileSync as o}from"node:fs";const s=Symbol.for(`@ts-pattern/matcher`),c=Symbol.for(`@ts-pattern/isVariadic`),l=`@ts-pattern/anonymous-select-key`,u=e=>!!(e&&typeof e==`object`),d=e=>e&&!!e[s],f=(e,t,n)=>{if(d(e)){let{matched:r,selections:i}=e[s]().match(t);return r&&i&&Object.keys(i).forEach(e=>n(e,i[e])),r}if(u(e)){if(!u(t))return!1;if(Array.isArray(e)){if(!Array.isArray(t))return!1;let r=[],i=[],a=[];for(let t of e.keys()){let n=e[t];d(n)&&n[c]?a.push(n):a.length?i.push(n):r.push(n)}if(a.length){if(a.length>1)throw Error("Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.");if(t.length<r.length+i.length)return!1;let e=t.slice(0,r.length),o=i.length===0?[]:t.slice(-i.length),s=t.slice(r.length,i.length===0?1/0:-i.length);return r.every((t,r)=>f(t,e[r],n))&&i.every((e,t)=>f(e,o[t],n))&&(a.length===0||f(a[0],s,n))}return e.length===t.length&&e.every((e,r)=>f(e,t[r],n))}return Reflect.ownKeys(e).every(r=>{let i=e[r];return(r in t||d(a=i)&&a[s]().matcherType===`optional`)&&f(i,t[r],n);var a})}return Object.is(t,e)},p=e=>{var t;return u(e)?d(e)?(t=e[s]()).getSelectionKeys?.call(t)??[]:m(Array.isArray(e)?e:Object.values(e),p):[]},m=(e,t)=>e.reduce((e,n)=>e.concat(t(n)),[]);function h(e){return Object.assign(e,{optional:()=>_(e),and:t=>v(e,t),or:t=>y(e,t),select:t=>t===void 0?x(e):x(t,e)})}function g(e){return Object.assign((e=>Object.assign(e,{[Symbol.iterator](){let t=0,n=[{value:Object.assign(e,{[c]:!0}),done:!1},{done:!0,value:void 0}];return{next:()=>n[t++]??n.at(-1)}}}))(e),{optional:()=>g(_(e)),select:t=>g(t===void 0?x(e):x(t,e))})}function _(e){return h({[s]:()=>({match:t=>{let n={},r=(e,t)=>{n[e]=t};return t===void 0?(p(e).forEach(e=>r(e,void 0)),{matched:!0,selections:n}):{matched:f(e,t,r),selections:n}},getSelectionKeys:()=>p(e),matcherType:`optional`})})}function v(...e){return h({[s]:()=>({match:t=>{let n={},r=(e,t)=>{n[e]=t};return{matched:e.every(e=>f(e,t,r)),selections:n}},getSelectionKeys:()=>m(e,p),matcherType:`and`})})}function y(...e){return h({[s]:()=>({match:t=>{let n={},r=(e,t)=>{n[e]=t};return m(e,p).forEach(e=>r(e,void 0)),{matched:e.some(e=>f(e,t,r)),selections:n}},getSelectionKeys:()=>m(e,p),matcherType:`or`})})}function b(e){return{[s]:()=>({match:t=>({matched:!!e(t)})})}}function x(...e){let t=typeof e[0]==`string`?e[0]:void 0,n=e.length===2?e[1]:typeof e[0]==`string`?void 0:e[0];return h({[s]:()=>({match:e=>{let r={[t??l]:e};return{matched:n===void 0||f(n,e,(e,t)=>{r[e]=t}),selections:r}},getSelectionKeys:()=>[t??l].concat(n===void 0?[]:p(n))})})}function S(e){return!0}function C(e){return typeof e==`number`}function w(e){return typeof e==`string`}function T(e){return typeof e==`bigint`}h(b(S)),h(b(S));const E=e=>Object.assign(h(e),{startsWith:t=>{return E(v(e,(n=t,b(e=>w(e)&&e.startsWith(n)))));var n},endsWith:t=>{return E(v(e,(n=t,b(e=>w(e)&&e.endsWith(n)))));var n},minLength:t=>E(v(e,(e=>b(t=>w(t)&&t.length>=e))(t))),length:t=>E(v(e,(e=>b(t=>w(t)&&t.length===e))(t))),maxLength:t=>E(v(e,(e=>b(t=>w(t)&&t.length<=e))(t))),includes:t=>{return E(v(e,(n=t,b(e=>w(e)&&e.includes(n)))));var n},regex:t=>{return E(v(e,(n=t,b(e=>w(e)&&!!e.match(n)))));var n}});E(b(w));const D=e=>Object.assign(h(e),{between:(t,n)=>D(v(e,((e,t)=>b(n=>C(n)&&e<=n&&t>=n))(t,n))),lt:t=>D(v(e,(e=>b(t=>C(t)&&t<e))(t))),gt:t=>D(v(e,(e=>b(t=>C(t)&&t>e))(t))),lte:t=>D(v(e,(e=>b(t=>C(t)&&t<=e))(t))),gte:t=>D(v(e,(e=>b(t=>C(t)&&t>=e))(t))),int:()=>D(v(e,b(e=>C(e)&&Number.isInteger(e)))),finite:()=>D(v(e,b(e=>C(e)&&Number.isFinite(e)))),positive:()=>D(v(e,b(e=>C(e)&&e>0))),negative:()=>D(v(e,b(e=>C(e)&&e<0)))});D(b(C));const O=e=>Object.assign(h(e),{between:(t,n)=>O(v(e,((e,t)=>b(n=>T(n)&&e<=n&&t>=n))(t,n))),lt:t=>O(v(e,(e=>b(t=>T(t)&&t<e))(t))),gt:t=>O(v(e,(e=>b(t=>T(t)&&t>e))(t))),lte:t=>O(v(e,(e=>b(t=>T(t)&&t<=e))(t))),gte:t=>O(v(e,(e=>b(t=>T(t)&&t>=e))(t))),positive:()=>O(v(e,b(e=>T(e)&&e>0))),negative:()=>O(v(e,b(e=>T(e)&&e<0)))});O(b(T)),h(b(function(e){return typeof e==`boolean`})),h(b(function(e){return typeof e==`symbol`})),h(b(function(e){return e==null})),h(b(function(e){return e!=null}));var k=class extends Error{constructor(e){let t;try{t=JSON.stringify(e)}catch{t=e}super(`Pattern matching error: no pattern matches value ${t}`),this.input=void 0,this.input=e}};const A={matched:!1,value:void 0};function j(e){return new M(e,A)}var M=class e{constructor(e,t){this.input=void 0,this.state=void 0,this.input=e,this.state=t}with(...t){if(this.state.matched)return this;let n=t[t.length-1],r=[t[0]],i;t.length===3&&typeof t[1]==`function`?i=t[1]:t.length>2&&r.push(...t.slice(1,t.length-1));let a=!1,o={},s=(e,t)=>{a=!0,o[e]=t},c=!r.some(e=>f(e,this.input,s))||i&&!i(this.input)?A:{matched:!0,value:n(a?l in o?o[l]:o:this.input,this.input)};return new e(this.input,c)}when(t,n){if(this.state.matched)return this;let r=!!t(this.input);return new e(this.input,r?{matched:!0,value:n(this.input,this.input)}:A)}otherwise(e){return this.state.matched?this.state.value:e(this.input)}exhaustive(e=N){return this.state.matched?this.state.value:e(this.input)}run(){return this.exhaustive()}returnType(){return this}narrow(){return this}};function N(e){throw new k(e)}var P=class{templateDir;constructor(){this.templateDir=e(`templates`)}async createSkill(e){let i={created:!1,message:``};try{let o=t(e.baseDir,e.skillDirname);if(n(o)){let t=a(o).filter(e=>e!==`.gitkeep`);if(t.length>0&&!e.force)return i.message=`Skill directory already exists and is not empty: ${o}`,i;t.length>0&&e.force&&console.log(`⚠️ Skill directory exists, forcing overwrite of existing files: ${o}`)}return r(o,{recursive:!0}),this.createDirectoryStructure(o),await this.createSkillMdFromTemplate(o,e),i.created=!0,i.skillPath=o,i.message=`Skill created successfully: ${o}`,i}catch(e){return i.message=`Failed to create skill: ${e instanceof Error?e.stack??e.message:String(e)}`,i}}createDirectoryStructure(e){for(let n of[`assets/references/context7`,`assets/references/user`,`assets/chroma_db`,`assets/logs`]){let i=t(e,n);r(i,{recursive:!0}),o(t(i,`.gitkeep`),``)}}async createSkillMdFromTemplate(e,r){let a=t(this.templateDir,`SKILL.md`);if(!n(a))throw Error(`SKILL.md template not found at ${a}`);let s=i(a,`utf-8`);s=s.replace(/\{\{(.+?)\}\}/g,(t,n)=>(n=n.trim().toLowerCase(),j(n).with(`name`,()=>r.skillName).with(`description`,()=>r.skillDescription??``).with(`skill_path`,()=>e).otherwise(()=>t))),o(t(e,`SKILL.md`),s)}},F=class t{static async getPackageVersion(e){try{let t=await fetch(`https://registry.npmjs.org/${e}/latest`);return t.ok?(await t.json()).version:null}catch{return null}}static async getPackageInfo(e){try{let t=await fetch(`https://registry.npmjs.org/${e}`);if(!t.ok)return null;let n=await t.json(),r=n[`dist-tags`]?.latest;return r&&n.versions?.[r]||null}catch{return null}}static getCurrentPackageInfo(){try{return JSON.parse(i(e(`package.json`),`utf-8`))}catch{return null}}static formatVersion(e){if(!e)return``;e.startsWith(`v`)&&(e=e.slice(1));let t=e.split(`.`);if(t.length>=2){let e=parseInt(t[0],10);return e>=1?String(e):`${e}.${t[1]}`}return e}static createSkillFolderName(e,t){let n=e.replace(/\//g,`__`),r=this.formatVersion(t);return r?`${n}@${r}`:n}static normalizePackageName(e){return e.startsWith(`@`)?e.slice(1):e}static validatePackageName(e){return!e||e.length===0?!1:/^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(e)}static async searchPackages(e,t={}){let{limit:n=10,minScore:r=.3}=t;try{let t=e.join(` `),i=await fetch(`https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(t)}&size=${n*2}`);if(!i.ok)return[];let a=await i.json(),o=[];for(let e of a.objects||[]){let t=e.score?.detail?.popularity||0;if(t>=r){let n=await this.getPackageInfo(e.package.name);o.push({name:e.package.name,description:e.package.description||``,version:e.package.version,date:e.package.date,publisher:e.package.publisher?.username||`unknown`,score:t,homepage:n?.homepage,repository:n?.repository?.url,skill_dir_name:n?this.createSkillFolderName(n.name,n.version):void 0})}}return o.slice(0,n)}catch{return[]}}static async findExactPackage(e){try{let t=await this.getPackageInfo(e);return t?{name:t.name,description:t.description||``,version:t.version,date:t.time?.modified||new Date().toISOString(),publisher:t.publisher?.username||`unknown`,score:1,homepage:t.homepage,repository:t.repository?.url,skill_dir_name:this.createSkillFolderName(t.name,t.version)}:null}catch{return null}}static async suggestPackages(e,n={}){let r=[];if(t.validatePackageName(e)){let n=await t.findExactPackage(e);n&&r.push(n)}let i=e.split(/[\s-]+/).filter(e=>e.length>2).slice(0,3);i.length===0&&i.push(e);let a=await t.searchPackages(i,n),o=new Set(r.map(e=>e.name)),s=a.filter(e=>!o.has(e.name));return[...r,...s].slice(0,n.limit||10)}static async selectPackage(e){let n=await t.suggestPackages(e,{limit:5});if(n.length===0)return null;if(n.length===1){let e=n[0],r=await t.getPackageVersion(e.name);return{name:e.name,version:r||e.version}}let r=n.reduce((e,t)=>t.score>e.score?t:e),i=await t.getPackageVersion(r.name);return{name:r.name,version:i||r.version}}};export{P as n,F as t};
|
|
2
|
-
//# sourceMappingURL=package-B4FNst2t.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-B4FNst2t.mjs","names":["t","e","n","r","i","s","c","u","o","a","result: CreateSkillResult","f","match","results: SearchResult[]","r","version"],"sources":["../node_modules/.pnpm/ts-pattern@5.9.0/node_modules/ts-pattern/dist/index.js","../src/core/skillCreator.ts","../src/utils/package.ts"],"sourcesContent":["const t=Symbol.for(\"@ts-pattern/matcher\"),e=Symbol.for(\"@ts-pattern/isVariadic\"),n=\"@ts-pattern/anonymous-select-key\",r=t=>Boolean(t&&\"object\"==typeof t),i=e=>e&&!!e[t],o=(n,s,c)=>{if(i(n)){const e=n[t](),{matched:r,selections:i}=e.match(s);return r&&i&&Object.keys(i).forEach(t=>c(t,i[t])),r}if(r(n)){if(!r(s))return!1;if(Array.isArray(n)){if(!Array.isArray(s))return!1;let t=[],r=[],u=[];for(const o of n.keys()){const s=n[o];i(s)&&s[e]?u.push(s):u.length?r.push(s):t.push(s)}if(u.length){if(u.length>1)throw new Error(\"Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.\");if(s.length<t.length+r.length)return!1;const e=s.slice(0,t.length),n=0===r.length?[]:s.slice(-r.length),i=s.slice(t.length,0===r.length?Infinity:-r.length);return t.every((t,n)=>o(t,e[n],c))&&r.every((t,e)=>o(t,n[e],c))&&(0===u.length||o(u[0],i,c))}return n.length===s.length&&n.every((t,e)=>o(t,s[e],c))}return Reflect.ownKeys(n).every(e=>{const r=n[e];return(e in s||i(u=r)&&\"optional\"===u[t]().matcherType)&&o(r,s[e],c);var u})}return Object.is(s,n)},s=e=>{var n,o,u;return r(e)?i(e)?null!=(n=null==(o=(u=e[t]()).getSelectionKeys)?void 0:o.call(u))?n:[]:Array.isArray(e)?c(e,s):c(Object.values(e),s):[]},c=(t,e)=>t.reduce((t,n)=>t.concat(e(n)),[]);function u(...t){if(1===t.length){const[e]=t;return t=>o(e,t,()=>{})}if(2===t.length){const[e,n]=t;return o(e,n,()=>{})}throw new Error(`isMatching wasn't given the right number of arguments: expected 1 or 2, received ${t.length}.`)}function a(t){return Object.assign(t,{optional:()=>h(t),and:e=>d(t,e),or:e=>y(t,e),select:e=>void 0===e?v(t):v(e,t)})}function l(t){return Object.assign((t=>Object.assign(t,{[Symbol.iterator](){let n=0;const r=[{value:Object.assign(t,{[e]:!0}),done:!1},{done:!0,value:void 0}];return{next:()=>{var t;return null!=(t=r[n++])?t:r.at(-1)}}}}))(t),{optional:()=>l(h(t)),select:e=>l(void 0===e?v(t):v(e,t))})}function h(e){return a({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return void 0===t?(s(e).forEach(t=>r(t,void 0)),{matched:!0,selections:n}):{matched:o(e,t,r),selections:n}},getSelectionKeys:()=>s(e),matcherType:\"optional\"})})}const f=(t,e)=>{for(const n of t)if(!e(n))return!1;return!0},g=(t,e)=>{for(const[n,r]of t.entries())if(!e(r,n))return!1;return!0},m=(t,e)=>{const n=Reflect.ownKeys(t);for(const r of n)if(!e(r,t[r]))return!1;return!0};function d(...e){return a({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return{matched:e.every(e=>o(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,s),matcherType:\"and\"})})}function y(...e){return a({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return c(e,s).forEach(t=>r(t,void 0)),{matched:e.some(e=>o(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,s),matcherType:\"or\"})})}function p(e){return{[t]:()=>({match:t=>({matched:Boolean(e(t))})})}}function v(...e){const r=\"string\"==typeof e[0]?e[0]:void 0,i=2===e.length?e[1]:\"string\"==typeof e[0]?void 0:e[0];return a({[t]:()=>({match:t=>{let e={[null!=r?r:n]:t};return{matched:void 0===i||o(i,t,(t,n)=>{e[t]=n}),selections:e}},getSelectionKeys:()=>[null!=r?r:n].concat(void 0===i?[]:s(i))})})}function b(t){return!0}function w(t){return\"number\"==typeof t}function S(t){return\"string\"==typeof t}function j(t){return\"bigint\"==typeof t}const K=a(p(b)),O=a(p(b)),E=K,x=t=>Object.assign(a(t),{startsWith:e=>{return x(d(t,(n=e,p(t=>S(t)&&t.startsWith(n)))));var n},endsWith:e=>{return x(d(t,(n=e,p(t=>S(t)&&t.endsWith(n)))));var n},minLength:e=>x(d(t,(t=>p(e=>S(e)&&e.length>=t))(e))),length:e=>x(d(t,(t=>p(e=>S(e)&&e.length===t))(e))),maxLength:e=>x(d(t,(t=>p(e=>S(e)&&e.length<=t))(e))),includes:e=>{return x(d(t,(n=e,p(t=>S(t)&&t.includes(n)))));var n},regex:e=>{return x(d(t,(n=e,p(t=>S(t)&&Boolean(t.match(n))))));var n}}),A=x(p(S)),N=t=>Object.assign(a(t),{between:(e,n)=>N(d(t,((t,e)=>p(n=>w(n)&&t<=n&&e>=n))(e,n))),lt:e=>N(d(t,(t=>p(e=>w(e)&&e<t))(e))),gt:e=>N(d(t,(t=>p(e=>w(e)&&e>t))(e))),lte:e=>N(d(t,(t=>p(e=>w(e)&&e<=t))(e))),gte:e=>N(d(t,(t=>p(e=>w(e)&&e>=t))(e))),int:()=>N(d(t,p(t=>w(t)&&Number.isInteger(t)))),finite:()=>N(d(t,p(t=>w(t)&&Number.isFinite(t)))),positive:()=>N(d(t,p(t=>w(t)&&t>0))),negative:()=>N(d(t,p(t=>w(t)&&t<0)))}),P=N(p(w)),k=t=>Object.assign(a(t),{between:(e,n)=>k(d(t,((t,e)=>p(n=>j(n)&&t<=n&&e>=n))(e,n))),lt:e=>k(d(t,(t=>p(e=>j(e)&&e<t))(e))),gt:e=>k(d(t,(t=>p(e=>j(e)&&e>t))(e))),lte:e=>k(d(t,(t=>p(e=>j(e)&&e<=t))(e))),gte:e=>k(d(t,(t=>p(e=>j(e)&&e>=t))(e))),positive:()=>k(d(t,p(t=>j(t)&&t>0))),negative:()=>k(d(t,p(t=>j(t)&&t<0)))}),T=k(p(j)),B=a(p(function(t){return\"boolean\"==typeof t})),_=a(p(function(t){return\"symbol\"==typeof t})),W=a(p(function(t){return null==t})),$=a(p(function(t){return null!=t}));var z={__proto__:null,matcher:t,optional:h,array:function(...e){return l({[t]:()=>({match:t=>{if(!Array.isArray(t))return{matched:!1};if(0===e.length)return{matched:!0};const n=e[0];let r={};if(0===t.length)return s(n).forEach(t=>{r[t]=[]}),{matched:!0,selections:r};const i=(t,e)=>{r[t]=(r[t]||[]).concat([e])};return{matched:t.every(t=>o(n,t,i)),selections:r}},getSelectionKeys:()=>0===e.length?[]:s(e[0])})})},set:function(...e){return a({[t]:()=>({match:t=>{if(!(t instanceof Set))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};if(0===e.length)return{matched:!0};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])},i=e[0];return{matched:f(t,t=>o(i,t,r)),selections:n}},getSelectionKeys:()=>0===e.length?[]:s(e[0])})})},map:function(...e){return a({[t]:()=>({match:t=>{if(!(t instanceof Map))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])};if(0===e.length)return{matched:!0};var i;if(1===e.length)throw new Error(`\\`P.map\\` wasn't given enough arguments. Expected (key, value), received ${null==(i=e[0])?void 0:i.toString()}`);const[s,c]=e;return{matched:g(t,(t,e)=>{const n=o(s,e,r),i=o(c,t,r);return n&&i}),selections:n}},getSelectionKeys:()=>0===e.length?[]:[...s(e[0]),...s(e[1])]})})},record:function(...e){return a({[t]:()=>({match:t=>{if(null===t||\"object\"!=typeof t||Array.isArray(t))return{matched:!1};var n;if(0===e.length)throw new Error(`\\`P.record\\` wasn't given enough arguments. Expected (value) or (key, value), received ${null==(n=e[0])?void 0:n.toString()}`);let r={};const i=(t,e)=>{r[t]=(r[t]||[]).concat([e])},[s,c]=1===e.length?[A,e[0]]:e;return{matched:m(t,(t,e)=>{const n=\"string\"!=typeof t||Number.isNaN(Number(t))?null:Number(t),r=null!==n&&o(s,n,i),u=o(s,t,i),a=o(c,e,i);return(u||r)&&a}),selections:r}},getSelectionKeys:()=>0===e.length?[]:[...s(e[0]),...s(e[1])]})})},intersection:d,union:y,not:function(e){return a({[t]:()=>({match:t=>({matched:!o(e,t,()=>{})}),getSelectionKeys:()=>[],matcherType:\"not\"})})},when:p,select:v,any:K,unknown:O,_:E,string:A,number:P,bigint:T,boolean:B,symbol:_,nullish:W,nonNullable:$,instanceOf:function(t){return a(p(function(t){return e=>e instanceof t}(t)))},shape:function(t){return a(p(u(t)))}};class I extends Error{constructor(t){let e;try{e=JSON.stringify(t)}catch(n){e=t}super(`Pattern matching error: no pattern matches value ${e}`),this.input=void 0,this.input=t}}const L={matched:!1,value:void 0};function M(t){return new R(t,L)}class R{constructor(t,e){this.input=void 0,this.state=void 0,this.input=t,this.state=e}with(...t){if(this.state.matched)return this;const e=t[t.length-1],r=[t[0]];let i;3===t.length&&\"function\"==typeof t[1]?i=t[1]:t.length>2&&r.push(...t.slice(1,t.length-1));let s=!1,c={};const u=(t,e)=>{s=!0,c[t]=e},a=!r.some(t=>o(t,this.input,u))||i&&!Boolean(i(this.input))?L:{matched:!0,value:e(s?n in c?c[n]:c:this.input,this.input)};return new R(this.input,a)}when(t,e){if(this.state.matched)return this;const n=Boolean(t(this.input));return new R(this.input,n?{matched:!0,value:e(this.input,this.input)}:L)}otherwise(t){return this.state.matched?this.state.value:t(this.input)}exhaustive(t=F){return this.state.matched?this.state.value:t(this.input)}run(){return this.exhaustive()}returnType(){return this}narrow(){return this}}function F(t){throw new I(t)}export{I as NonExhaustiveError,z as P,z as Pattern,u as isMatching,M as match};\n//# sourceMappingURL=index.js.map\n","/**\n * Main skill creator class\n */\n\nimport { join, resolve } from 'node:path'\nimport { existsSync, mkdirSync, writeFileSync, chmodSync, readdirSync, readFileSync } from 'node:fs'\nimport { createHash } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport type { CreateSkillOptions, CreateSkillResult } from '../types/index.js'\nimport { Config } from '../utils/config.js'\nimport { match } from 'ts-pattern'\nimport { rootResolver } from '../utils/path.js'\n\n// Internal config interface used during skill creation\ninterface SkillCreateConfig {\n context7LibraryId?: string\n}\n\nexport class SkillCreator {\n private templateDir: string\n\n constructor() {\n this.templateDir = rootResolver('templates')\n }\n\n async createSkill(options: CreateSkillOptions): Promise<CreateSkillResult> {\n const result: CreateSkillResult = {\n created: false,\n message: '',\n }\n\n try {\n // Create skill directory\n const skillDir = join(options.baseDir, options.skillDirname)\n\n if (existsSync(skillDir)) {\n const files = readdirSync(skillDir)\n // Filter out .gitkeep files\n const realFiles = files.filter((f) => f !== '.gitkeep')\n if (realFiles.length > 0 && !options.force) {\n result.message = `Skill directory already exists and is not empty: ${skillDir}`\n return result\n } else if (realFiles.length > 0 && options.force) {\n console.log(\n `⚠️ Skill directory exists, forcing overwrite of existing files: ${skillDir}`\n )\n }\n }\n\n mkdirSync(skillDir, { recursive: true })\n\n // Create directory structure\n this.createDirectoryStructure(skillDir)\n\n // Create SKILL.md from template\n await this.createSkillMdFromTemplate(skillDir, options)\n\n result.created = true\n result.skillPath = skillDir\n result.message = `Skill created successfully: ${skillDir}`\n\n return result\n } catch (error) {\n result.message = `Failed to create skill: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`\n return result\n }\n }\n\n private createDirectoryStructure(skillDir: string): void {\n const dirs = [\n 'assets/references/context7', // Base directory for all context7 projects\n 'assets/references/user', // User-created content\n 'assets/chroma_db', // ChromaDB data\n 'assets/logs', // Logs\n ]\n\n for (const dir of dirs) {\n const dirPath = join(skillDir, dir)\n mkdirSync(dirPath, { recursive: true })\n // Only add .gitkeep to empty directories that should exist\n writeFileSync(join(dirPath, '.gitkeep'), '')\n }\n }\n\n private async createSkillMdFromTemplate(\n skillDir: string,\n options: CreateSkillOptions\n ): Promise<void> {\n const templatePath = join(this.templateDir, 'SKILL.md')\n\n if (!existsSync(templatePath)) {\n throw new Error(`SKILL.md template not found at ${templatePath}`)\n }\n\n let templateContent = readFileSync(templatePath, 'utf-8')\n\n // Replace template variables with options data\n templateContent = templateContent.replace(/\\{\\{(.+?)\\}\\}/g, (_, key) => {\n key = key.trim().toLowerCase()\n return match(key)\n .with('name', () => options.skillName)\n .with('description', () => options.skillDescription ?? '')\n .with('skill_path', () => skillDir)\n .otherwise(() => _)\n })\n\n writeFileSync(join(skillDir, 'SKILL.md'), templateContent)\n }\n}\n","/**\n * Package utilities\n */\n\nimport { readFileSync } from 'node:fs'\nimport type { PackageVersion } from '../types/index.js'\nimport { resolve } from 'node:path'\nimport { rootResolver } from './path.js'\n\nexport interface SearchResult {\n name: string\n description: string\n version: string\n date: string\n publisher: string\n score: number\n homepage?: string\n repository?: string\n skill_dir_name?: string\n}\n\nexport interface SearchOptions {\n limit?: number\n minScore?: number\n}\n\nexport class PackageUtils {\n /**\n * Get package version from npm registry\n */\n static async getPackageVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`)\n if (!response.ok) return null\n\n const data = await response.json()\n return data.version as string\n } catch {\n return null\n }\n }\n\n /**\n * Get full package info from npm registry for the latest version\n */\n static async getPackageInfo(packageName: string): Promise<{\n name: string\n version: string\n description: string\n homepage?: string\n repository?: { type: string; url: string }\n [key: string]: any\n } | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}`)\n if (!response.ok) return null\n\n const data = await response.json()\n const latestVersionTag = data['dist-tags']?.latest\n if (!latestVersionTag) return null\n\n const latestVersionInfo = data.versions?.[latestVersionTag]\n if (!latestVersionInfo) return null\n\n return latestVersionInfo\n } catch {\n return null\n }\n }\n\n /**\n * Get full package info from npm registry for the latest version\n */\n static getCurrentPackageInfo(): {\n name: string\n version: string\n description: string\n homepage?: string\n repository?: { type: string; url: string }\n [key: string]: any\n } | null {\n try {\n const packageInfo = JSON.parse(readFileSync(rootResolver('package.json'), 'utf-8'))\n return packageInfo\n } catch {\n return null\n }\n }\n\n /**\n * Format version according to doc-downloader rules\n */\n static formatVersion(version: string): string {\n if (!version) return ''\n\n // Remove 'v' prefix if present\n if (version.startsWith('v')) {\n version = version.slice(1)\n }\n\n const parts = version.split('.')\n if (parts.length >= 2) {\n const major = parseInt(parts[0], 10)\n if (major >= 1) {\n return String(major)\n } else {\n return `${major}.${parts[1]}`\n }\n }\n\n return version\n }\n\n /**\n * Create skill folder name according to spec\n */\n static createSkillFolderName(packageName: string, version: string): string {\n // Replace / with __ as specified in doc-downloader.md\n const safePackage = packageName.replace(/\\//g, '__')\n const formattedVersion = this.formatVersion(version)\n\n if (formattedVersion) {\n return `${safePackage}@${formattedVersion}`\n } else {\n return safePackage\n }\n }\n\n /**\n * Normalize package name (remove @ prefix)\n */\n static normalizePackageName(packageName: string): string {\n if (packageName.startsWith('@')) {\n return packageName.slice(1)\n }\n return packageName\n }\n\n /**\n * Validate package name format\n */\n static validatePackageName(packageName: string): boolean {\n if (!packageName || packageName.length === 0) {\n return false\n }\n\n // Basic validation for npm package names\n const validNamePattern = /^(@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/\n return validNamePattern.test(packageName)\n }\n\n /**\n * Search for packages on npm registry\n */\n static async searchPackages(\n keywords: string[],\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const { limit = 10, minScore = 0.3 } = options\n\n try {\n const query = keywords.join(' ')\n const response = await fetch(\n `https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(query)}&size=${limit * 2}`\n )\n\n if (!response.ok) return []\n\n const data = await response.json()\n const results: SearchResult[] = []\n\n for (const pkg of data.objects || []) {\n const score = pkg.score?.detail?.popularity || 0\n if (score >= minScore) {\n // Get detailed package information including homepage\n const packageInfo = await this.getPackageInfo(pkg.package.name)\n\n results.push({\n name: pkg.package.name,\n description: pkg.package.description || '',\n version: pkg.package.version,\n date: pkg.package.date,\n publisher: pkg.package.publisher?.username || 'unknown',\n score,\n homepage: packageInfo?.homepage,\n repository: packageInfo?.repository?.url,\n skill_dir_name: packageInfo\n ? this.createSkillFolderName(packageInfo.name, packageInfo.version)\n : undefined,\n })\n }\n }\n\n return results.slice(0, limit)\n } catch {\n return []\n }\n }\n\n /**\n * Find exact package match\n */\n static async findExactPackage(packageName: string): Promise<SearchResult | null> {\n try {\n const packageInfo = await this.getPackageInfo(packageName)\n if (!packageInfo) return null\n\n return {\n name: packageInfo.name,\n description: packageInfo.description || '',\n version: packageInfo.version,\n date: packageInfo.time?.modified || new Date().toISOString(),\n publisher: packageInfo.publisher?.username || 'unknown',\n score: 1.0,\n homepage: packageInfo.homepage,\n repository: packageInfo.repository?.url,\n skill_dir_name: this.createSkillFolderName(packageInfo.name, packageInfo.version),\n }\n } catch {\n return null\n }\n }\n\n /**\n * Suggest packages based on keywords\n */\n static async suggestPackages(\n input: string,\n options: SearchOptions = {}\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = []\n\n // Check if input looks like an exact package name and include it as first result\n if (PackageUtils.validatePackageName(input)) {\n const exact = await PackageUtils.findExactPackage(input)\n if (exact) {\n results.push(exact)\n }\n }\n\n // Always perform broader search to find related packages\n // Extract keywords from input\n const keywords = input\n .split(/[\\s-]+/)\n .filter((word) => word.length > 2)\n .slice(0, 3)\n\n if (keywords.length === 0) {\n // Fallback: search with the whole input\n keywords.push(input)\n }\n\n const searchResults = await PackageUtils.searchPackages(keywords, options)\n\n // Merge exact match with search results, avoiding duplicates\n const exactMatchNames = new Set(results.map((r) => r.name))\n const additionalResults = searchResults.filter((r) => !exactMatchNames.has(r.name))\n\n return [...results, ...additionalResults].slice(0, options.limit || 10)\n }\n\n /**\n * Select package from multiple options\n */\n static async selectPackage(input: string): Promise<{ name: string; version: string } | null> {\n const suggestions = await PackageUtils.suggestPackages(input, { limit: 5 })\n\n if (suggestions.length === 0) {\n return null\n }\n\n if (suggestions.length === 1) {\n const pkg = suggestions[0]\n const version = await PackageUtils.getPackageVersion(pkg.name)\n return { name: pkg.name, version: version || pkg.version }\n }\n\n // Multiple options found - would need interactive selection in CLI\n // For now, return the highest scored package\n const best = suggestions.reduce((prev, curr) => (curr.score > prev.score ? curr : prev))\n\n const version = await PackageUtils.getPackageVersion(best.name)\n return { name: best.name, version: version || best.version }\n }\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
package/dist/path-CuoiIaIe.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import t from"node:fs";import n from"node:process";import{fileURLToPath as r}from"node:url";const i=e=>(typeof e!=`string`&&(e=String(e)),e.startsWith(`file://`)&&(e=r(e)),e.includes(`\\`)&&(e=e.replaceAll(`\\`,`/`)),e),a=t=>Object.assign((...n)=>i(e.resolve(t,...n)),{dirname:t});n.cwd();const o=((r=n.cwd(),o=`package.json`,s)=>{let c=i(r);for(;!1===t.existsSync(e.resolve(c,o));){let t=e.dirname(c);if(t===c){let e=s?.();if(e==null)throw Error(`Cannot find ${o} from ${r}`);c=e;break}c=t}return a(c)})(import.meta.url,`package.json`);export{o as t};
|
|
2
|
-
//# sourceMappingURL=path-CuoiIaIe.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"path-CuoiIaIe.mjs","names":["path","node_path"],"sources":["../node_modules/.pnpm/@gaubee+node@0.4.0_@gaubee+util@0.35.2/node_modules/@gaubee/node/esm/path.js","../src/utils/path.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport node_path from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n/**\n * 将一个路径格式化成标准的 posix 格式\n */\nexport const normalizeFilePath = (path) => {\n if (typeof path !== \"string\") {\n path = String(path);\n }\n if (path.startsWith(\"file://\")) {\n path = fileURLToPath(path);\n }\n if (path.includes(\"\\\\\")) {\n path = path.replaceAll(\"\\\\\", \"/\");\n }\n return path;\n};\n/**\n * 创建一个 path.resolve 柯里化函数\n */\nexport const createResolver = (cwd) => {\n return Object.assign((...paths) => {\n return normalizeFilePath(node_path.resolve(cwd, ...paths));\n }, { dirname: cwd });\n};\n/**\n * 等同于 path.resolve(process.cwd(), ...paths)\n */\nexport const cwdResolver = /*@__PURE__*/ createResolver(process.cwd());\n/**\n * 向上寻找某一个文件名,以它所在的目录创建 resolver\n */\nexport const createResolverByRootFile = (fromPath = process.cwd(), rootFilename = \"package.json\", else_fn) => {\n let rootDirname = normalizeFilePath(fromPath);\n while (false === fs.existsSync(node_path.resolve(rootDirname, rootFilename))) {\n const parentDirname = node_path.dirname(rootDirname);\n if (parentDirname === rootDirname) {\n const customDirname = else_fn?.();\n if (null == customDirname) {\n throw new Error(`Cannot find ${rootFilename} from ${fromPath}`);\n }\n rootDirname = customDirname;\n break;\n }\n rootDirname = parentDirname;\n }\n return createResolver(rootDirname);\n};\n","import { createResolverByRootFile } from '@gaubee/nodekit'\n\n/**\n * rootResolver.dirname\n * rootResolver('templates/SKILL.md')\n */\nexport const rootResolver = createResolverByRootFile(import.meta.url, 'package.json')\n"],"x_google_ignoreList":[0],"mappings":"qHAOA,MAAa,EAAqB,IAC1B,OAAOA,GAAS,WAChB,EAAO,OAAOA,EAAK,EAEnBA,EAAK,WAAW,UAAU,GAC1B,EAAO,EAAcA,EAAK,EAE1BA,EAAK,SAAS,KAAK,GACnB,EAAOA,EAAK,WAAW,KAAM,IAAI,EAE9BA,GAKE,EAAkB,GACpB,OAAO,QAAQ,GAAG,IACd,EAAkBC,EAAU,QAAQ,EAAK,GAAG,EAAM,CAAC,CAC3D,CAAE,QAAS,EAAK,CAAC,CAKgC,EAAQ,KAAK,CCxBrE,MAAa,ID4B4B,EAAW,EAAQ,KAAK,CAAE,EAAe,eAAgB,IAAY,CAC1G,IAAI,EAAc,EAAkB,EAAS,CAC7C,KAAO,KAAU,EAAG,WAAWA,EAAU,QAAQ,EAAa,EAAa,CAAC,EAAE,CAC1E,IAAM,EAAgBA,EAAU,QAAQ,EAAY,CACpD,GAAI,IAAkB,EAAa,CAC/B,IAAM,EAAgB,KAAW,CACjC,GAAY,GAAR,KACA,MAAU,MAAM,eAAe,EAAa,QAAQ,IAAW,CAEnE,EAAc,EACd,MAEJ,EAAc,EAElB,OAAO,EAAe,EAAY,GC1Ce,OAAO,KAAK,IAAK,eAAe"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{n as e,t}from"./shared-CFoY2Xhg.mjs";import{t as n}from"./skillMdManager-DP8fGZb7.mjs";import{join as r}from"node:path";import{existsSync as i}from"node:fs";async function a(a){let o=await t({}),{ContentManager:s}=await import(`./contentManager-Xt8N5psY.mjs`),c=new s({searchEngine:o,referencesDir:r(process.cwd(),`assets`,`references`)}),l=e(a,[{name:`project-id`,type:`string`}])[`project-id`];l||(console.error(`❌ No Context7 project ID provided`),console.error(` Use --project-id <id>`),process.exit(1)),console.log(`🗑️ Removing Context7 project: ${l}`);try{let e=c.removeContext7Project(l);e.success||(console.error(`❌ ${e.message}`),process.exit(1)),console.log(`✅ ${e.message}`);let t=r(process.cwd(),`SKILL.md`);i(t)&&(n(t,l),console.log(`📝 Updated SKILL.md`)),console.log(`
|
|
2
|
-
🔧 Rebuilding ChromaDB index...`);try{await o.initialize(),await o.buildIndex(r(process.cwd(),`assets`,`references`)),console.log(`✅ Index rebuilt successfully`)}catch(e){console.log(`⚠️ Index rebuild failed: ${e instanceof Error?e.message:String(e)}`)}}catch(e){console.error(`❌ Error removing Context7 project:`,e),process.exit(1)}}export{a as removeContext7};
|
|
3
|
-
//# sourceMappingURL=removeContext7-DOXrTXeI.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"removeSkill-C-ehFexk.mjs","names":["source: 'user' | 'context7'","projectId: string | undefined","filePath: string"],"sources":["../src/commands/removeSkill.ts"],"sourcesContent":["/**\n * Remove skill file command\n */\n\nimport { join } from 'node:path'\nimport { existsSync, unlinkSync, readdirSync } from 'node:fs'\nimport { parseArgs } from './shared.js'\nimport { updateSkillMdFile } from '../utils/skillMdManager.js'\n\nexport async function removeSkill(args: string[]): Promise<void> {\n // Parse arguments\n const options = parseArgs(args, [\n { name: 'type', type: 'string', required: true },\n { name: 'file', type: 'string', required: true },\n ])\n\n const type = options.type\n const fileName = options.file\n\n // Parse type: user or context7:<project_id>\n let source: 'user' | 'context7' = 'user'\n let projectId: string | undefined\n\n if (type.startsWith('context7:')) {\n source = 'context7'\n projectId = type.slice('context7:'.length)\n if (!projectId) {\n console.error('❌ Invalid type format. Use: user or context7:<project_id>')\n process.exit(1)\n }\n } else if (type === 'user') {\n source = 'user'\n } else {\n console.error('❌ Invalid type. Use: user or context7:<project_id>')\n process.exit(1)\n }\n\n // Construct file path\n const referencesDir = join(process.cwd(), 'assets', 'references')\n let filePath: string\n\n if (source === 'user') {\n filePath = join(referencesDir, 'user', fileName)\n } else if (source === 'context7' && projectId) {\n filePath = join(referencesDir, 'context7', projectId, fileName)\n } else {\n console.error('❌ Invalid configuration')\n process.exit(1)\n }\n\n // Check if file exists\n if (!existsSync(filePath)) {\n console.error(`❌ File not found: ${filePath}`)\n process.exit(1)\n }\n\n try {\n // Remove file\n unlinkSync(filePath)\n console.log(`✅ Removed file: ${fileName}`)\n\n // Update SKILL.md\n const skillMdPath = join(process.cwd(), 'SKILL.md')\n if (existsSync(skillMdPath)) {\n if (source === 'user') {\n // Update user-skills tag\n const userDir = join(referencesDir, 'user')\n const files = readdirSync(userDir).filter((f) => f.endsWith('.md'))\n const fileList = files.map((f) => `- ${f}`).join('\\n')\n\n updateSkillMdFile(skillMdPath, 'user-skills', fileList)\n console.log(`📝 Updated SKILL.md`)\n } else if (source === 'context7' && projectId) {\n // Update context7-skills tag\n const projectDir = join(referencesDir, 'context7', projectId)\n const files = readdirSync(projectDir).filter((f) => f.endsWith('.md'))\n const fileList = files.map((f) => `- ${f}`).join('\\n')\n\n updateSkillMdFile(skillMdPath, 'context7-skills', fileList, projectId)\n console.log(`📝 Updated SKILL.md`)\n }\n }\n\n console.log(`\\n✅ Skill file removed successfully`)\n } catch (error) {\n console.error(`❌ Error removing skill file:`, error)\n process.exit(1)\n }\n}\n"],"mappings":"mMASA,eAAsB,EAAY,EAA+B,CAE/D,IAAM,EAAU,EAAU,EAAM,CAC9B,CAAE,KAAM,OAAQ,KAAM,SAAU,SAAU,GAAM,CAChD,CAAE,KAAM,OAAQ,KAAM,SAAU,SAAU,GAAM,CACjD,CAAC,CAEI,EAAO,EAAQ,KACf,EAAW,EAAQ,KAGrBA,EAA8B,OAC9BC,EAEA,EAAK,WAAW,YAAY,EAC9B,EAAS,WACT,EAAY,EAAK,MAAM,EAAmB,CACrC,IACH,QAAQ,MAAM,4DAA4D,CAC1E,QAAQ,KAAK,EAAE,GAER,IAAS,OAClB,EAAS,QAET,QAAQ,MAAM,qDAAqD,CACnE,QAAQ,KAAK,EAAE,EAIjB,IAAM,EAAgB,EAAK,QAAQ,KAAK,CAAE,SAAU,aAAa,CAC7DC,EAEA,IAAW,OACb,EAAW,EAAK,EAAe,OAAQ,EAAS,CACvC,IAAW,YAAc,EAClC,EAAW,EAAK,EAAe,WAAY,EAAW,EAAS,EAE/D,QAAQ,MAAM,0BAA0B,CACxC,QAAQ,KAAK,EAAE,EAIZ,EAAW,EAAS,GACvB,QAAQ,MAAM,qBAAqB,IAAW,CAC9C,QAAQ,KAAK,EAAE,EAGjB,GAAI,CAEF,EAAW,EAAS,CACpB,QAAQ,IAAI,mBAAmB,IAAW,CAG1C,IAAM,EAAc,EAAK,QAAQ,KAAK,CAAE,WAAW,CAC/C,EAAW,EAAY,GACrB,IAAW,QAMb,EAAkB,EAAa,cAHjB,EADE,EAAK,EAAe,OAAO,CACT,CAAC,OAAQ,GAAM,EAAE,SAAS,MAAM,CAAC,CAC5C,IAAK,GAAM,KAAK,IAAI,CAAC,KAAK;EAAK,CAEC,CACvD,QAAQ,IAAI,sBAAsB,EACzB,IAAW,YAAc,IAMlC,EAAkB,EAAa,kBAHjB,EADK,EAAK,EAAe,WAAY,EAAU,CACxB,CAAC,OAAQ,GAAM,EAAE,SAAS,MAAM,CAAC,CAC/C,IAAK,GAAM,KAAK,IAAI,CAAC,KAAK;EAAK,CAEM,EAAU,CACtE,QAAQ,IAAI,sBAAsB,GAItC,QAAQ,IAAI;mCAAsC,OAC3C,EAAO,CACd,QAAQ,MAAM,+BAAgC,EAAM,CACpD,QAAQ,KAAK,EAAE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./shared-CFoY2Xhg.mjs";import"./skillMdManager-DP8fGZb7.mjs";import{t as e}from"./removeSkill-C-ehFexk.mjs";export{e as removeSkill};
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./path-CuoiIaIe.mjs";import{t}from"./search_format-DIs-1lKk.mjs";import{n,t as r}from"./shared-CFoY2Xhg.mjs";import{n as i}from"./skillMdManager-DP8fGZb7.mjs";import{t as a}from"./removeSkill-C-ehFexk.mjs";import{join as o}from"node:path";import{existsSync as s,mkdirSync as c,readFileSync as l,readdirSync as u,writeFileSync as d}from"node:fs";import{homedir as f}from"node:os";async function p(e){let i=n(e,[{name:`query`,alias:`q`,type:`string`,required:!0},{name:`top-k`,type:`number`,default:5},{name:`source`,type:`string`,default:`all`},{name:`mode`,type:`string`,default:`auto`},{name:`list`,type:`boolean`,default:!1}]);[`auto`,`fuzzy`,`chroma`].includes(i.mode)||(console.error(`❌ Invalid search mode. Use: auto, fuzzy, or chroma`),process.exit(1));let a=await r({searchMode:i.mode,useFormatting:!1});await a.initialize();let s=o(process.cwd(),`assets`,`references`);await a.buildIndex(s);let c=i[`top-k`],l=i.source===`all`?void 0:{source:i.source},u=await a.search(i.query,c||5,l);if(console.log(`
|
|
2
|
-
🔍 Searching in skill...`),console.log(`Skill Path: ${process.cwd()}`),console.log(`Query: ${i.query}`),console.log(`\nSearch Results for: '${i.query}'`),console.log(`=`.repeat(50)),u.length===0){console.log(`No results found.`);return}let d=t(i.list?`list`:`enhanced`),f={skillPath:process.cwd(),showFullContentThreshold:.8,minScoreForPreview:.3,maxPreviewLength:200,showLineNumbers:!0},p=d.format(u,f);for(let e=0;e<p.length;e++){let t=p[e],n=t.result;switch(console.log(`\n${e+1}. [Score: ${n.score.toFixed(2)}] ${n.title}`),console.log(` Source: ${n.source} (${n.metadata.priority||`unknown`})`),console.log(` File: ${n.relativePath||n.file_path}`),t.contentType){case`full-content`:console.log(` FileContent:`),console.log(` ${t.content}`);break;case`preview`:if(i.list)console.log(` Preview: ${t.content}`);else{console.log(` Preview:`);let e=t.content.match(/^<limit-content lines-indexs="([^"]+)">\n(.*)\n<\/limit-content>$/s);if(e){let[,t,n]=e;console.log(` ${n}`)}else console.log(` ${t.content}`)}break;case`metadata-only`:console.log(` Content: (No preview - metadata only)`);break;default:console.log(` Preview: ${t.content}`)}}}async function m(e){let t=await r({}),{ContentManager:a}=await import(`./contentManager-Xt8N5psY.mjs`),c=new a({searchEngine:t,referencesDir:o(process.cwd(),`assets`,`references`)}),l=n(e,[{name:`title`,alias:`t`,type:`string`,required:!1},{name:`content`,alias:`c`,type:`string`,required:!1},{name:`file`,alias:`f`,type:`string`,required:!1},{name:`force`,type:`boolean`},{name:`force-append`,type:`boolean`},{name:`no-update`,type:`boolean`}]);!l.title&&!l.file&&(console.error(`❌ Please provide either --title or --file`),process.exit(1));let d=l.content||``,f=l.title||``;if(l.file){let{readFileSync:e}=await import(`node:fs`);try{if(d=e(l.file,`utf-8`),!f){let e=l.file.split(`/`).pop()?.replace(/\.[^/.]+$/,``)||``;f=d.split(`
|
|
3
|
-
`)[0]?.replace(/^#+\s*/,``)||e||e}}catch{console.error(`❌ Failed to read file: ${l.file}`),process.exit(1)}}let p=await c.addUserContent({title:f,content:d,force:l.force,forceAppend:l[`force-append`],autoUpdate:!l[`no-update`]});if(console.log(p.message),p.existingFile&&(console.log(`
|
|
4
|
-
📄 Existing file content:`),console.log(`─`.repeat(50)),console.log(p.existingFile.content),console.log(`─`.repeat(50)),process.exit(1)),p.similarContent&&p.similarContent.length>0&&(console.log(`
|
|
5
|
-
Similar content found:`),p.similarContent.forEach((e,t)=>{console.log(`\n${t+1}. [${e.score.toFixed(2)}] ${e.title}`),console.log(` Source: ${e.source}`),console.log(` Preview: ${e.preview}`)})),p.added||p.updated){let e=o(process.cwd(),`SKILL.md`);if(s(e)){let t=o(process.cwd(),`assets`,`references`,`user`);s(t)&&(i(e,`user-skills`,u(t).filter(e=>e.endsWith(`.md`)).map(e=>`- ${e}`).join(`
|
|
6
|
-
`)),console.log(`📝 Updated SKILL.md with user skills`))}}}async function h(e){let t=await r({}),{ContentManager:a}=await import(`./contentManager-Xt8N5psY.mjs`),c=new a({searchEngine:t,referencesDir:o(process.cwd(),`assets`,`references`)}),l=n(e,[{name:`force`,type:`boolean`},{name:`project-id`,type:`string`},{name:`skip-chroma-indexing`,type:`boolean`}]),u=l[`project-id`];u||(console.error(`❌ No Context7 project ID provided`),console.error(` Use --project-id <id>`),process.exit(1)),console.log(`📥 Downloading Context7 documentation...`),console.log(`Project ID: ${u}`);try{let e=await c.updateFromContext7(u,l.force);console.log(`✅ ${e.message}`);let n=o(process.cwd(),`SKILL.md`);if(s(n)){let e=c.getContext7ProjectFiles(u);i(n,`context7-skills`,e.map(e=>`- ${e}`).join(`
|
|
7
|
-
`),u),console.log(`📝 Updated SKILL.md with ${e.length} files`)}if(l[`skip-chroma-indexing`])console.log(`
|
|
8
|
-
⏭️ Skipping ChromaDB indexing (as requested)`),console.log(`💡 To build index later, run: skill-creator build-index`);else{console.log(`
|
|
9
|
-
🔧 Building ChromaDB index...`);try{await t.initialize(),await t.buildIndex(o(process.cwd(),`assets`,`references`));let e=await t.getStats();console.log(`✅ ChromaDB index built successfully!`),console.log(`📊 Indexed ${e.totalDocuments||0} documents`);let n=t.searchEngine?.constructor?.name;(n?.includes(`Chroma`)||n?.includes(`chroma`))&&console.log(`🎯 ChromaDB search is now ready for enhanced queries`)}catch(e){console.log(`⚠️ ChromaDB indexing failed: ${e instanceof Error?e.message:String(e)}`),console.log(`💡 You can still use fuzzy search, or retry with --skip-chroma-indexing to skip this step`)}}}catch(e){console.error(`❌ Error downloading Context7 documentation:`,e),process.exit(1)}}async function g(t){let n;n=o(t===`user`?f():process.cwd(),`.claude`,`agents`),c(n,{recursive:!0});let r=l(e(`templates/skill-creator.md`),`utf-8`),i=r;r.includes(`{{DEFAULT_SCOPE}}`)&&(i=r.replace(/{{DEFAULT_SCOPE}}/g,t));let a=o(n,`skill-creator.md`);d(a,i);let{default:s}=await import(`./dist-X_kVEzbK.mjs`);console.log(s(`green`,`cyan`)(`
|
|
10
|
-
✅ Skill-creator subagent installed successfully!`)),console.log(`📍 Location: ${a}`),console.log(`📁 Default scope: ${t}`),t===`user`?console.log(`💡 This makes skill-creator available in all Claude Code sessions`):console.log(`💡 This makes skill-creator available in this project only`)}async function _(e){let{default:t}=await import(`./dist-X_kVEzbK.mjs`),r=n(e,[{name:`scope`,type:`string`}]),i;if(r.scope)r.scope===`user`?i=`user`:r.scope===`current`?i=`current`:(console.error(`❌ Invalid scope value. Use: user or current`),process.exit(1));else{console.log(t(`blue`,`cyan`)(`
|
|
11
|
-
🚀 Installing skill-creator as subagent...
|
|
12
|
-
`));let{default:e}=await import(`./esm-8qfZdcpd.mjs`);i=(await e.prompt([{type:`list`,name:`location`,message:`Where would you like to install skill-creator?`,choices:[{name:`User directory (recommended) - Available in all Claude Code sessions`,value:`user`},{name:`Current directory only - Available in this project only`,value:`current`}],default:`user`}])).location}console.log(`\n📦 Installing in ${i===`user`?`user directory`:`current directory`}...\n`);try{await g(i)}catch(e){console.error(`❌ Installation failed:`,e instanceof Error?e.message:String(e)),process.exit(1)}}async function v(e){let t=await r({});console.log(`Building simple search index...`);let n=o(process.cwd(),`assets`,`references`);await t.buildIndex(n);let i=await t.getStats();console.log(`✅ Index built: ${i.totalDocuments||0} documents`)}async function y(e){let t=await r({}),{ContentManager:i}=await import(`./contentManager-Xt8N5psY.mjs`),a=new i({searchEngine:t,referencesDir:o(process.cwd(),`assets`,`references`)}),s=n(e,[{name:`source`,type:`string`,default:`all`}]),c=a.getContentStats();console.log(`
|
|
13
|
-
Content Statistics:`),console.log(` User files: ${c.userFiles}`),console.log(` Context7 files: ${c.context7Files}`),console.log(` Total: ${c.totalFiles}\n`);let l=s.source===`all`?void 0:s.source,u=a.listContent(l);if(u.length===0){console.log(`No content found.`);return}console.log(`${`Title`.padEnd(40)} ${`Source`.padEnd(10)} ${`Size`.padEnd(10)} ${`Modified`.padEnd(20)}`),console.log(`-`.repeat(80)),u.forEach(e=>{console.log(`${e.title.padEnd(40)} ${e.source.padEnd(10)} ${String(e.size).padEnd(10)} ${e.modified.toLocaleString().padEnd(20)}`)})}const b={"search-skill":p,add:m,"add-skill":m,"download-context7":h,init:_,"build-index":v,"list-skills":y,"list-content":y,"remove-skill":a};async function x(e,t){let n=b[e.toLowerCase()]||b[e];n||(console.error(`❌ Unknown script: ${e}`),console.error(`Available scripts: ${Object.keys(b).join(`, `)}`),process.exit(1));try{await n(t)}catch(t){console.error(`❌ Error executing ${e}:`,t),process.exit(1)}}export{x as runScript};
|
|
14
|
-
//# sourceMappingURL=runScript-Cr9RRN9y.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runScript-Cr9RRN9y.mjs","names":["formattingOptions: FormattingOptions","readFileSync","targetDir: string","location: 'current' | 'user'","commands: Record<string, CommandFunction>"],"sources":["../src/commands/searchContent.ts","../src/commands/addContent.ts","../src/commands/downloadContext7.ts","../src/commands/init.ts","../src/commands/buildIndex.ts","../src/commands/listSkills.ts","../src/core/runScript.ts"],"sourcesContent":["/**\n * Search skill content command\n */\n\nimport { join } from 'node:path'\nimport { parseArgs, createSearchEngine } from './shared.js'\nimport { createFormatter } from '../search_format/index.js'\nimport type { FormattingOptions } from '../search_format/types.js'\n\nexport async function searchContent(args: string[]): Promise<void> {\n // Parse arguments\n const options = parseArgs(args, [\n { name: 'query', alias: 'q', type: 'string', required: true },\n { name: 'top-k', type: 'number', default: 5 },\n { name: 'source', type: 'string', default: 'all' },\n { name: 'mode', type: 'string', default: 'auto' },\n { name: 'list', type: 'boolean', default: false },\n ])\n\n // Validate search mode\n if (!['auto', 'fuzzy', 'chroma'].includes(options.mode)) {\n console.error('❌ Invalid search mode. Use: auto, fuzzy, or chroma')\n process.exit(1)\n }\n\n // Create search engine\n const searchEngine = await createSearchEngine({\n searchMode: options.mode as 'auto' | 'fuzzy' | 'chroma',\n useFormatting: false, // We'll handle formatting manually for now\n })\n\n // Initialize search engine\n await searchEngine.initialize()\n\n // Build index if needed\n const referencesDir = join(process.cwd(), 'assets', 'references')\n await searchEngine.buildIndex(referencesDir)\n\n // Prepare search options\n const topK = options['top-k']\n const whereFilter = options.source !== 'all' ? { source: options.source } : undefined\n\n // Perform search\n const results = await searchEngine.search(options.query, topK || 5, whereFilter)\n\n // Display results\n console.log(`\\n🔍 Searching in skill...`)\n console.log(`Skill Path: ${process.cwd()}`)\n console.log(`Query: ${options.query}`)\n\n console.log(`\\nSearch Results for: '${options.query}'`)\n console.log('='.repeat(50))\n\n if (results.length === 0) {\n console.log('No results found.')\n return\n }\n\n // Create formatter based on options\n const formatterType = options.list ? 'list' : 'enhanced'\n const formatter = createFormatter(formatterType)\n\n // Prepare formatting options\n const formattingOptions: FormattingOptions = {\n skillPath: process.cwd(),\n showFullContentThreshold: 0.8,\n minScoreForPreview: 0.3,\n maxPreviewLength: 200,\n showLineNumbers: true,\n }\n\n // Format and display results\n const formattedResults = formatter.format(results, formattingOptions)\n\n for (let i = 0; i < formattedResults.length; i++) {\n const formattedResult = formattedResults[i]\n const result = formattedResult.result\n\n console.log(`\\n${i + 1}. [Score: ${result.score.toFixed(2)}] ${result.title}`)\n console.log(` Source: ${result.source} (${result.metadata.priority || 'unknown'})`)\n console.log(` File: ${result.relativePath || result.file_path}`)\n\n // Display formatted content based on content type\n switch (formattedResult.contentType) {\n case 'full-content':\n console.log(` FileContent:`)\n console.log(` ${formattedResult.content}`)\n break\n\n case 'preview':\n if (options.list) {\n // --list mode: simple preview\n console.log(` Preview: ${formattedResult.content}`)\n } else {\n // --enhanced mode (default): enhanced preview with line numbers\n console.log(` Preview:`)\n // Extract content from <limit-content lines-indexs=\"1,3,45\">...</limit-content> format\n const limitContentMatch = formattedResult.content.match(\n /^<limit-content lines-indexs=\"([^\"]+)\">\\n(.*)\\n<\\/limit-content>$/s\n )\n if (limitContentMatch) {\n const [, lineIndexes, content] = limitContentMatch\n console.log(` ${content}`)\n } else {\n console.log(` ${formattedResult.content}`)\n }\n }\n break\n\n case 'metadata-only':\n console.log(` Content: (No preview - metadata only)`)\n break\n\n default:\n // Fallback to simple preview\n console.log(` Preview: ${formattedResult.content}`)\n }\n }\n}\n","/**\n * Add content command\n */\n\nimport { join } from 'node:path'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { parseArgs, createSearchEngine } from './shared.js'\nimport { updateSkillMdFile } from '../utils/skillMdManager.js'\n\nexport async function addContent(args: string[]): Promise<void> {\n const searchEngine = await createSearchEngine({})\n\n const { ContentManager } = await import('../core/contentManager.js')\n\n const contentManager = new ContentManager({\n searchEngine,\n referencesDir: join(process.cwd(), 'assets', 'references'),\n })\n\n // Parse arguments\n const options = parseArgs(args, [\n { name: 'title', alias: 't', type: 'string', required: false },\n { name: 'content', alias: 'c', type: 'string', required: false },\n { name: 'file', alias: 'f', type: 'string', required: false },\n { name: 'force', type: 'boolean' },\n { name: 'force-append', type: 'boolean' },\n { name: 'no-update', type: 'boolean' },\n ])\n\n if (!options.title && !options.file) {\n console.error('❌ Please provide either --title or --file')\n process.exit(1)\n }\n\n let content = options.content || ''\n let title = options.title || ''\n\n // Read content from file if provided\n if (options.file) {\n const { readFileSync } = await import('node:fs')\n try {\n content = readFileSync(options.file, 'utf-8')\n if (!title) {\n // Extract title from filename or first line\n const fileName =\n options.file\n .split('/')\n .pop()\n ?.replace(/\\.[^/.]+$/, '') || ''\n const firstLine = content.split('\\n')[0]?.replace(/^#+\\s*/, '') || fileName\n title = firstLine || fileName\n }\n } catch (error) {\n console.error(`❌ Failed to read file: ${options.file}`)\n process.exit(1)\n }\n }\n\n const result = await contentManager.addUserContent({\n title,\n content,\n force: options.force,\n forceAppend: options['force-append'],\n autoUpdate: !options['no-update'],\n })\n\n console.log(result.message)\n\n // Handle existing file case\n if (result.existingFile) {\n console.log('\\n📄 Existing file content:')\n console.log('─'.repeat(50))\n console.log(result.existingFile.content)\n console.log('─'.repeat(50))\n process.exit(1)\n }\n\n if (result.similarContent && result.similarContent.length > 0) {\n console.log('\\nSimilar content found:')\n result.similarContent.forEach((similar, i) => {\n console.log(`\\n${i + 1}. [${similar.score.toFixed(2)}] ${similar.title}`)\n console.log(` Source: ${similar.source}`)\n console.log(` Preview: ${similar.preview}`)\n })\n }\n\n // Update SKILL.md with user files list\n if (result.added || result.updated) {\n const skillMdPath = join(process.cwd(), 'SKILL.md')\n if (existsSync(skillMdPath)) {\n const userDir = join(process.cwd(), 'assets', 'references', 'user')\n if (existsSync(userDir)) {\n const files = readdirSync(userDir).filter((f) => f.endsWith('.md'))\n const fileList = files.map((f) => `- ${f}`).join('\\n')\n\n updateSkillMdFile(skillMdPath, 'user-skills', fileList)\n console.log(`📝 Updated SKILL.md with user skills`)\n }\n }\n }\n}\n","/**\n * Download Context7 documentation command with automatic ChromaDB indexing\n */\n\nimport { join } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { parseArgs, createSearchEngine } from './shared.js'\nimport { updateSkillMdFile } from '../utils/skillMdManager.js'\n\nexport async function downloadContext7(args: string[]): Promise<void> {\n const searchEngine = await createSearchEngine({})\n\n const { ContentManager } = await import('../core/contentManager.js')\n\n const contentManager = new ContentManager({\n searchEngine,\n referencesDir: join(process.cwd(), 'assets', 'references'),\n })\n\n // Parse arguments\n const options = parseArgs(args, [\n { name: 'force', type: 'boolean' },\n { name: 'project-id', type: 'string' },\n { name: 'skip-chroma-indexing', type: 'boolean' },\n ])\n\n const projectId = options['project-id']\n if (!projectId) {\n console.error('❌ No Context7 project ID provided')\n console.error(' Use --project-id <id>')\n process.exit(1)\n }\n\n console.log(`📥 Downloading Context7 documentation...`)\n console.log(`Project ID: ${projectId}`)\n\n try {\n // Download documentation\n const result = await contentManager.updateFromContext7(projectId, options.force)\n console.log(`✅ ${result.message}`)\n\n // Update SKILL.md with the file list\n const skillMdPath = join(process.cwd(), 'SKILL.md')\n if (existsSync(skillMdPath)) {\n const files = contentManager.getContext7ProjectFiles(projectId)\n const fileList = files.map((f) => `- ${f}`).join('\\n')\n\n updateSkillMdFile(skillMdPath, 'context7-skills', fileList, projectId)\n console.log(`📝 Updated SKILL.md with ${files.length} files`)\n }\n\n // Auto-build ChromaDB index unless skipped\n if (!options['skip-chroma-indexing']) {\n console.log(`\\n🔧 Building ChromaDB index...`)\n\n try {\n await searchEngine.initialize()\n await searchEngine.buildIndex(join(process.cwd(), 'assets', 'references'))\n\n const stats = await searchEngine.getStats()\n console.log(`✅ ChromaDB index built successfully!`)\n console.log(`📊 Indexed ${stats.totalDocuments || 0} documents`)\n\n // Check if ChromaDB was used by checking the search engine type\n const engineType = (searchEngine as any).searchEngine?.constructor?.name\n if (engineType?.includes('Chroma') || engineType?.includes('chroma')) {\n console.log(`🎯 ChromaDB search is now ready for enhanced queries`)\n }\n } catch (error) {\n console.log(\n `⚠️ ChromaDB indexing failed: ${error instanceof Error ? error.message : String(error)}`\n )\n console.log(\n `💡 You can still use fuzzy search, or retry with --skip-chroma-indexing to skip this step`\n )\n }\n } else {\n console.log(`\\n⏭️ Skipping ChromaDB indexing (as requested)`)\n console.log(`💡 To build index later, run: skill-creator build-index`)\n }\n } catch (error) {\n console.error(`❌ Error downloading Context7 documentation:`, error)\n process.exit(1)\n }\n}\n","/**\n * Interactive init command to install skill-creator as subagent\n */\n\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\nimport { mkdirSync, writeFileSync, existsSync, readFileSync } from 'node:fs'\nimport { createInterface } from 'node:readline'\nimport { parseArgs } from './shared.js'\nimport { rootResolver } from '../utils/path.js'\n\n/**\n * Install skill-creator as subagent in specified directory\n */\nasync function installSubagent(location: 'current' | 'user'): Promise<void> {\n let targetDir: string\n\n if (location === 'user') {\n targetDir = join(homedir(), '.claude', 'agents')\n } else {\n // current directory\n targetDir = join(process.cwd(), '.claude', 'agents')\n }\n\n // Create directories\n mkdirSync(targetDir, { recursive: true })\n\n // Read the skill-creator template\n const templatePath = rootResolver('templates/skill-creator.md')\n const templateContent = readFileSync(templatePath, 'utf-8')\n\n // Inject DEFAULT_SCOPE if the template has the placeholder\n let finalTemplateContent = templateContent\n if (templateContent.includes('{{DEFAULT_SCOPE}}')) {\n finalTemplateContent = templateContent.replace(/{{DEFAULT_SCOPE}}/g, location)\n }\n\n // Write skill-creator.md file\n const targetFile = join(targetDir, 'skill-creator.md')\n writeFileSync(targetFile, finalTemplateContent)\n\n const { default: gradient } = await import('gradient-string')\n console.log(gradient('green', 'cyan')('\\n✅ Skill-creator subagent installed successfully!'))\n console.log(`📍 Location: ${targetFile}`)\n console.log(`📁 Default scope: ${location}`)\n\n if (location === 'user') {\n console.log('💡 This makes skill-creator available in all Claude Code sessions')\n } else {\n console.log('💡 This makes skill-creator available in this project only')\n }\n}\n\nexport async function init(args: string[]): Promise<void> {\n const { default: gradient } = await import('gradient-string')\n\n // Parse arguments\n const options = parseArgs(args, [{ name: 'scope', type: 'string' }])\n\n let location: 'current' | 'user'\n\n // Non-interactive mode if scope is provided\n if (options.scope) {\n if (options.scope === 'user') {\n location = 'user'\n } else if (options.scope === 'current') {\n location = 'current'\n } else {\n console.error('❌ Invalid scope value. Use: user or current')\n process.exit(1)\n }\n } else {\n // Interactive mode\n console.log(gradient('blue', 'cyan')('\\n🚀 Installing skill-creator as subagent...\\n'))\n\n const { default: inquirer } = await import('inquirer')\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'location',\n message: 'Where would you like to install skill-creator?',\n choices: [\n {\n name: 'User directory (recommended) - Available in all Claude Code sessions',\n value: 'user',\n },\n {\n name: 'Current directory only - Available in this project only',\n value: 'current',\n },\n ],\n default: 'user',\n },\n ])\n\n location = answers.location\n }\n\n console.log(\n `\\n📦 Installing in ${location === 'user' ? 'user directory' : 'current directory'}...\\n`\n )\n\n try {\n await installSubagent(location)\n } catch (error) {\n console.error('❌ Installation failed:', error instanceof Error ? error.message : String(error))\n process.exit(1)\n }\n}\n","/**\n * Build search index command\n */\n\nimport { join } from 'node:path'\nimport { createSearchEngine } from './shared.js'\n\nexport async function buildIndex(args: string[]): Promise<void> {\n const searchEngine = await createSearchEngine({})\n\n console.log('Building simple search index...')\n\n // Build index\n const referencesDir = join(process.cwd(), 'assets', 'references')\n await searchEngine.buildIndex(referencesDir)\n\n // Show stats\n const stats = await searchEngine.getStats()\n console.log(`✅ Index built: ${stats.totalDocuments || 0} documents`)\n}\n","/**\n * List skills command\n */\n\nimport { join } from 'node:path'\nimport { parseArgs, createSearchEngine } from './shared.js'\n\nexport async function listSkills(args: string[]): Promise<void> {\n const searchEngine = await createSearchEngine({})\n\n const { ContentManager } = await import('../core/contentManager.js')\n\n const contentManager = new ContentManager({\n searchEngine,\n referencesDir: join(process.cwd(), 'assets', 'references'),\n })\n\n // Parse arguments\n const options = parseArgs(args, [{ name: 'source', type: 'string', default: 'all' }])\n\n // Get stats\n const stats = contentManager.getContentStats()\n console.log(`\\nContent Statistics:`)\n console.log(` User files: ${stats.userFiles}`)\n console.log(` Context7 files: ${stats.context7Files}`)\n console.log(` Total: ${stats.totalFiles}\\n`)\n\n // List content\n const sourceFilter = options.source === 'all' ? undefined : options.source\n const contentList = contentManager.listContent(sourceFilter)\n\n if (contentList.length === 0) {\n console.log('No content found.')\n return\n }\n\n console.log(\n `${'Title'.padEnd(40)} ${'Source'.padEnd(10)} ${'Size'.padEnd(10)} ${'Modified'.padEnd(20)}`\n )\n console.log('-'.repeat(80))\n\n contentList.forEach((item) => {\n console.log(\n `${item.title.padEnd(40)} ${item.source.padEnd(10)} ${String(item.size).padEnd(10)} ${item.modified.toLocaleString().padEnd(20)}`\n )\n })\n}\n","/**\n * Execute skill scripts - simplified version using individual command files\n */\n\nimport { searchContent } from '../commands/searchContent.js'\nimport { addContent } from '../commands/addContent.js'\nimport { downloadContext7 } from '../commands/downloadContext7.js'\nimport { init } from '../commands/init.js'\nimport { buildIndex } from '../commands/buildIndex.js'\nimport { listSkills } from '../commands/listSkills.js'\nimport { removeSkill } from '../commands/removeSkill.js'\n\ntype CommandFunction = (args: string[]) => Promise<void>\n\nconst commands: Record<string, CommandFunction> = {\n 'search-skill': searchContent,\n add: addContent,\n 'add-skill': addContent,\n 'download-context7': downloadContext7,\n init: init,\n 'build-index': buildIndex,\n 'list-skills': listSkills,\n 'list-content': listSkills, // Backward compatibility\n 'remove-skill': removeSkill,\n}\n\nexport async function runScript(script: string, args: string[]): Promise<void> {\n // Normalize script name\n const normalizedScript = script.toLowerCase()\n\n // Find the command\n const command = commands[normalizedScript] || commands[script]\n\n if (!command) {\n console.error(`❌ Unknown script: ${script}`)\n console.error(`Available scripts: ${Object.keys(commands).join(', ')}`)\n process.exit(1)\n }\n\n try {\n await command(args)\n } catch (error) {\n console.error(`❌ Error executing ${script}:`, error)\n process.exit(1)\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{relative as e}from"node:path";var t=class{getName(){return`list`}getDescription(){return`Simple list format with basic preview`}format(e,t){let n=t.maxPreviewLength||200;return e.map((e,r)=>{let i=e;this.getRelativePath(i,t.skillPath);let a=e.content;if(i.fullContent){let e=i.fullContent.match(/^<content lines="\d+">\n(.*)\n<\/content>$/s);e&&(a=e[1])}return{result:i,content:this.createPreview(a,n),contentType:`preview`,priority:r}})}getRelativePath(t,n){return t.relativePath||e(n,t.file_path)}createPreview(e,t){return e.length<=t?e.replace(/\n/g,` `):e.substring(0,t).replace(/\n/g,` `)+`...`}},n=class{getName(){return`enhanced`}getDescription(){return`Three-tier enhanced format with intelligent content display`}format(e,t){if(e.length===0)return[];let n=this.calculateQualityMetrics(e);return this.enhanceResults(e,n,t).map((e,n)=>({result:e,content:this.formatByTier(e,t),contentType:this.getContentType(e),priority:n}))}calculateQualityMetrics(e){if(e.length===0)return{maxScore:0,averageScore:0,modifiedAverageScore:0};let t=e.map(e=>e.score),n=Math.max(...t),r;if(t.length<=2)r=Math.min(...t);else{let e=[...t].sort((e,t)=>e-t).slice(1,-1);r=e.reduce((e,t)=>e+t,0)/e.length}let i=t.reduce((e,t)=>e+t,0)/t.length;return console.log(`📊 质量指标计算: maxScore=${n.toFixed(3)}, modifiedAverageScore=${r.toFixed(3)}, averageScore=${i.toFixed(3)}`),{maxScore:n,averageScore:i,modifiedAverageScore:r}}enhanceResults(t,n,r){let{maxScore:i,modifiedAverageScore:a}=n,{skillPath:o}=r;return t.map(t=>{let r=t,s=t.score,c,l,u;return console.log(`🔍 Enhanced分层判断: Score=${s.toFixed(3)}, maxScore=${i.toFixed(3)}, modifiedAverageScore=${a.toFixed(3)}`),s===i?(c=`full`,l=this.wrapContent(t.content,`content`),console.log(`✅ score == maxScore,分配到完整内容模式`)):s>=a?(c=`preview`,u=this.createEnhancedPreview(t.content),console.log(`✅ score >= modifiedAverageScore,分配到预览模式`)):(c=`metadata-only`,console.log(`⚠️ score < modifiedAverageScore,分配到元数据模式`)),r.relativePath=e(o,t.file_path),r.metadata={...t.metadata,displayTier:c,maxScore:i,averageScore:n.averageScore},l&&(r.fullContent=l),u&&(r.preview=u),r})}formatByTier(e,t){let n=e.score,r=e.metadata.displayTier,i=e.content?.length||0,a=`<!-- Score: ${n.toFixed(3)}, Tier: ${r}, ContentLength: ${i} -->`;switch(console.log(`🔍 Enhanced格式化: Score=${n.toFixed(3)}, Tier=${r}, ContentLength=${i}`),r){case`full`:return console.log(`📝 使用完整内容模式,内容长度: ${e.fullContent?.length||0}`),`${a}\n${e.fullContent||``}`;case`preview`:return console.log(`👁️ 使用预览模式,预览长度: ${e.preview?.length||0}`),`${a}\n${e.preview||``}`;case`metadata-only`:return console.log(`📋 使用元数据模式`),`${a}\nContent: (No preview - metadata only)`;default:return console.log(`⚠️ 未知层级,使用默认模式`),`${a}\n${e.content.substring(0,200).replace(/\n/g,` `)}...`}}getContentType(e){switch(e.metadata.displayTier){case`full`:return`full-content`;case`preview`:return`preview`;default:return`metadata-only`}}createEnhancedPreview(e){let t=e.split(`
|
|
2
|
-
`),n=[],r=[];if(t.length>0&&(r.push(t[0]),n.push(1)),t.length>2){let e=Math.floor(t.length/2);r.push(t[e]),n.push(e+1)}t.length>1&&(r.push(t[t.length-1]),n.push(t.length));let i=r.join(`
|
|
3
|
-
`),a=n.join(`,`);return this.wrapContent(i,`limit-content`,a)}wrapContent(e,t,n){return t===`limit-content`&&n?`<${t} lines-indexs="${n}">\n${e}\n</${t}>`:t===`content`?`<${t} lines="${e.split(`
|
|
4
|
-
`).length}">\n${e}\n</${t}>`:e}};function r(e){switch(e){case`list`:return new t;case`enhanced`:return new n;default:throw Error(`Unknown formatter type: ${e}`)}}export{r as t};
|
|
5
|
-
//# sourceMappingURL=search_format-DIs-1lKk.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search_format-DIs-1lKk.mjs","names":["modifiedAverageScore: number","displayTier: FormattableSearchResult['metadata']['displayTier']","fullContent: string | undefined","preview: string | undefined","lineNumbers: number[]","selectedLines: string[]"],"sources":["../src/search_format/listFormatter.ts","../src/search_format/enhancedFormatter.ts","../src/search_format/index.ts"],"sourcesContent":["/**\n * Simple list formatter for search results\n * Shows basic information with minimal preview\n */\n\nimport type {\n SearchResult,\n FormattableSearchResult,\n FormattingOptions,\n FormattedResult,\n SearchFormatter,\n} from './types.js'\nimport { relative } from 'node:path'\n\n/**\n * List formatter - simple, clean display with basic preview\n */\nexport class ListFormatter implements SearchFormatter {\n getName(): string {\n return 'list'\n }\n\n getDescription(): string {\n return 'Simple list format with basic preview'\n }\n\n format(results: SearchResult[], options: FormattingOptions): FormattedResult[] {\n const maxPreviewLength = options.maxPreviewLength || 200\n\n return results.map((result, index) => {\n const formattableResult = result as FormattableSearchResult\n const relativePath = this.getRelativePath(formattableResult, options.skillPath)\n\n // Extract content for preview\n let previewContent = result.content\n if (formattableResult.fullContent) {\n // Extract original content from <content lines=\"N\">...</content> format\n const match = formattableResult.fullContent.match(\n /^<content lines=\"\\d+\">\\n(.*)\\n<\\/content>$/s\n )\n if (match) {\n previewContent = match[1]\n }\n }\n\n // Create preview\n const preview = this.createPreview(previewContent, maxPreviewLength)\n\n return {\n result: formattableResult,\n content: preview,\n contentType: 'preview',\n priority: index,\n }\n })\n }\n\n private getRelativePath(result: FormattableSearchResult, skillPath: string): string {\n return result.relativePath || relative(skillPath, result.file_path)\n }\n\n private createPreview(content: string, maxLength: number): string {\n if (content.length <= maxLength) {\n return content.replace(/\\n/g, ' ')\n }\n\n const preview = content.substring(0, maxLength)\n return preview.replace(/\\n/g, ' ') + '...'\n }\n}\n","/**\n * Enhanced formatter for search results\n * Implements three-tier display strategy based on search quality scores\n *\n * ===================== ENHANCED MODE 客观需求标准 =====================\n *\n * 用户明确要求的三层显示策略:\n *\n * 🔴 Tier 1 (高分结果): 显示 FileContent (完整内容)\n * - 标准: 匹配度最高的结果\n * - 显示: 完整的文档内容,不做截断\n * - 格式: <content lines=\"N\">完整内容</content>\n *\n * 🟡 Tier 2 (中等分数): 显示 Preview with line numbers (带行号的部分内容)\n * - 标准: 部分匹配的结果\n * - 显示: 文档的关键片段,带行号指示\n * - 格式: <limit-content lines-indexs=\"1,5,10\">片段内容</limit-content>\n *\n * 🟢 Tier 3 (低分数): 显示 Metadata only (只显示元数据)\n * - 标准: 匹配度较低的结果\n * - 显示: 仅标题、文件路径等元数据信息\n * - 格式: Content: (No preview - metadata only)\n *\n * ===================== 关键要求 =====================\n * 1. 必须基于实际的搜索质量分数进行分层\n * 2. 不能所有结果都显示为 \"metadata-only\"\n * 3. 高质量结果必须显示完整内容,不能截断\n * 4. 中等质量结果必须显示带行号的预览\n * 5. 阈值设置要合理,确保三层都有分布\n *\n * ===================== 实现要点 =====================\n * - 基于用户的中位数思路:去掉一个最高分和最低分,再取平均值\n * - 边缘情况处理:当结果<=2个时,直接使用最低分作为平均值\n * - maxScore必然显示完整内容:score == maxScore 时显示 FileContent\n * - 动态阈值:不使用固定阈值,基于实际分数分布计算\n *\n * ===================== 具体算法 =====================\n * 1. modifiedAverageScore = 去掉最高分和最低分后,剩余分数的平均值\n * 2. 只有1-2个结果时:modifiedAverageScore = 最低分\n * 3. 3个以上结果时:sortedScores.slice(1, -1) 去掉首尾后平均\n *\n * ===================== 分层标准 =====================\n * - Tier 1 (score == maxScore): FileContent (完整内容)\n * - Tier 2 (score >= modifiedAverageScore): Preview with line numbers (带行号预览)\n * - Tier 3 (score < modifiedAverageScore): Metadata only (只显示元数据)\n *\n * ===================== 关键要求 =====================\n * 1. maxScore 必然显示完整内容,这是最高优先级策略\n * 2. 不使用固定阈值,避免全部落入某一层\n * 3. 基于实际分数分布动态调整分层\n * 4. 确保三层都有合理分布\n *\n * ===================== 当前修复重点 =====================\n * - 修复 Score 计算问题(从 0.00 到合理的 0.1-1.0 范围)\n * - 实现中位数算法的阈值计算\n * - 确保 maxScore 的结果显示完整内容\n * - 移除固定阈值依赖,使用动态算法\n *\n * ===================== 用户反馈问题 =====================\n * - \"默认enhanced模式,没有如期工作\"\n * - \"Score居然是负数/0.00,太不合理\"\n * - 所有结果都显示 \"(No preview - metadata only)\"\n *\n * ===================== 验收标准 =====================\n * - 高分结果显示完整文档内容\n * - 中等分数结果显示带行号的预览\n * - 低分结果显示元数据\n * - 三层都有合理分布,不是全部落在某一层\n *\n * ======================================================================\n */\n\nimport type {\n SearchResult,\n FormattableSearchResult,\n FormattingOptions,\n FormattedResult,\n SearchFormatter,\n} from './types.js'\nimport { relative } from 'node:path'\n\n/**\n * Enhanced formatter - three-tier display based on search quality\n *\n * Tier 1 (score >= maxScore): Show full content\n * Tier 2 (score >= modifiedAverageScore): Show preview with line numbers\n * Tier 3 (score < modifiedAverageScore): Show metadata only\n */\nexport class EnhancedFormatter implements SearchFormatter {\n getName(): string {\n return 'enhanced'\n }\n\n getDescription(): string {\n return 'Three-tier enhanced format with intelligent content display'\n }\n\n format(results: SearchResult[], options: FormattingOptions): FormattedResult[] {\n if (results.length === 0) {\n return []\n }\n\n // Calculate search quality metrics\n const qualityMetrics = this.calculateQualityMetrics(results)\n\n // Enhance results with quality information\n const enhancedResults = this.enhanceResults(results, qualityMetrics, options)\n\n // Format based on display tiers\n return enhancedResults.map((result, index) => {\n const formattedContent = this.formatByTier(result, options)\n const contentType = this.getContentType(result)\n\n return {\n result,\n content: formattedContent,\n contentType,\n priority: index,\n }\n })\n }\n\n /**\n * Calculate quality metrics for search results\n */\n private calculateQualityMetrics(results: SearchResult[]) {\n if (results.length === 0) {\n return { maxScore: 0, averageScore: 0, modifiedAverageScore: 0 }\n }\n\n const scores = results.map((r) => r.score)\n const maxScore = Math.max(...scores)\n\n // 用户要求:使用中位数思路,去掉一个最高分和最低分\n let modifiedAverageScore: number\n\n if (scores.length <= 2) {\n // 如果只有2个或更少的结果,直接使用较低的分数作为平均分\n modifiedAverageScore = Math.min(...scores)\n } else {\n // 去掉最高分和最低分,然后计算平均分\n const sortedScores = [...scores].sort((a, b) => a - b)\n const middleScores = sortedScores.slice(1, -1) // 去掉第一个(最低)和最后一个(最高)\n modifiedAverageScore =\n middleScores.reduce((sum, score) => sum + score, 0) / middleScores.length\n }\n\n const averageScore = scores.reduce((sum, score) => sum + score, 0) / scores.length\n\n console.log(\n `📊 质量指标计算: maxScore=${maxScore.toFixed(3)}, modifiedAverageScore=${modifiedAverageScore.toFixed(3)}, averageScore=${averageScore.toFixed(3)}`\n )\n\n return {\n maxScore,\n averageScore,\n modifiedAverageScore,\n }\n }\n\n /**\n * Enhance search results with quality information\n */\n private enhanceResults(\n results: SearchResult[],\n qualityMetrics: ReturnType<typeof this.calculateQualityMetrics>,\n options: FormattingOptions\n ): FormattableSearchResult[] {\n const { maxScore, modifiedAverageScore } = qualityMetrics\n const { skillPath } = options\n\n return results.map((result) => {\n const enhancedResult = result as FormattableSearchResult\n const score = result.score\n\n // 用户要求的三层显示策略\n let displayTier: FormattableSearchResult['metadata']['displayTier']\n let fullContent: string | undefined\n let preview: string | undefined\n\n console.log(\n `🔍 Enhanced分层判断: Score=${score.toFixed(3)}, maxScore=${maxScore.toFixed(3)}, modifiedAverageScore=${modifiedAverageScore.toFixed(3)}`\n )\n\n // 最高优先级:maxScore 必然显示完整内容\n if (score === maxScore) {\n // Tier 1: 最高分 - 显示完整内容\n displayTier = 'full'\n fullContent = this.wrapContent(result.content, 'content')\n console.log(`✅ score == maxScore,分配到完整内容模式`)\n } else if (score >= modifiedAverageScore) {\n // Tier 2: 中等分数 - 显示带行号的预览\n displayTier = 'preview'\n preview = this.createEnhancedPreview(result.content)\n console.log(`✅ score >= modifiedAverageScore,分配到预览模式`)\n } else {\n // Tier 3: 低分数 - 仅显示元数据\n displayTier = 'metadata-only'\n console.log(`⚠️ score < modifiedAverageScore,分配到元数据模式`)\n }\n\n // 设置相对路径\n enhancedResult.relativePath = relative(skillPath, result.file_path)\n\n // 添加质量元数据\n enhancedResult.metadata = {\n ...result.metadata,\n displayTier,\n maxScore,\n averageScore: qualityMetrics.averageScore,\n }\n\n if (fullContent) enhancedResult.fullContent = fullContent\n if (preview) enhancedResult.preview = preview\n\n return enhancedResult\n })\n }\n\n /**\n * Format content based on display tier\n */\n private formatByTier(result: FormattableSearchResult, options: FormattingOptions): string {\n const score = result.score\n const tier = result.metadata.displayTier\n const contentLength = result.content?.length || 0\n\n // 添加调试信息显示分数和层级\n const debugInfo = `<!-- Score: ${score.toFixed(3)}, Tier: ${tier}, ContentLength: ${contentLength} -->`\n\n console.log(\n `🔍 Enhanced格式化: Score=${score.toFixed(3)}, Tier=${tier}, ContentLength=${contentLength}`\n )\n\n switch (tier) {\n case 'full':\n console.log(`📝 使用完整内容模式,内容长度: ${result.fullContent?.length || 0}`)\n return `${debugInfo}\\n${result.fullContent || ''}`\n\n case 'preview':\n console.log(`👁️ 使用预览模式,预览长度: ${result.preview?.length || 0}`)\n return `${debugInfo}\\n${result.preview || ''}`\n\n case 'metadata-only':\n console.log(`📋 使用元数据模式`)\n return `${debugInfo}\\nContent: (No preview - metadata only)`\n\n default:\n console.log(`⚠️ 未知层级,使用默认模式`)\n return `${debugInfo}\\n${result.content.substring(0, 200).replace(/\\n/g, ' ')}...`\n }\n }\n\n /**\n * Get content type for styling\n */\n private getContentType(result: FormattableSearchResult): FormattedResult['contentType'] {\n switch (result.metadata.displayTier) {\n case 'full':\n return 'full-content'\n case 'preview':\n return 'preview'\n default:\n return 'metadata-only'\n }\n }\n\n /**\n * Create enhanced preview with line numbers\n */\n private createEnhancedPreview(content: string): string {\n const lines = content.split('\\n')\n const lineNumbers: number[] = []\n\n // Select representative lines (first, middle, last)\n const selectedLines: string[] = []\n if (lines.length > 0) {\n selectedLines.push(lines[0])\n lineNumbers.push(1)\n }\n\n if (lines.length > 2) {\n const middleLine = Math.floor(lines.length / 2)\n selectedLines.push(lines[middleLine])\n lineNumbers.push(middleLine + 1)\n }\n\n if (lines.length > 1) {\n selectedLines.push(lines[lines.length - 1])\n lineNumbers.push(lines.length)\n }\n\n const previewContent = selectedLines.join('\\n')\n const lineIndexes = lineNumbers.join(',')\n\n return this.wrapContent(previewContent, 'limit-content', lineIndexes)\n }\n\n /**\n * Wrap content in appropriate tags\n */\n private wrapContent(content: string, tag: string, lineIndexes?: string): string {\n if (tag === 'limit-content' && lineIndexes) {\n return `<${tag} lines-indexs=\"${lineIndexes}\">\\n${content}\\n</${tag}>`\n } else if (tag === 'content') {\n const lines = content.split('\\n').length\n return `<${tag} lines=\"${lines}\">\\n${content}\\n</${tag}>`\n }\n return content\n }\n}\n","/**\n * Search result formatting module\n * Provides various formatting options for search results\n */\n\nexport type {\n FormattableSearchResult,\n FormattingOptions,\n FormattedResult,\n SearchFormatter,\n} from './types.js'\n\nexport { ListFormatter } from './listFormatter.js'\nexport { EnhancedFormatter } from './enhancedFormatter.js'\n\n/**\n * Factory function to create appropriate formatter\n */\nimport { ListFormatter } from './listFormatter.js'\nimport { EnhancedFormatter } from './enhancedFormatter.js'\nimport type { SearchFormatter } from './types.js'\n\nexport function createFormatter(type: 'list' | 'enhanced'): SearchFormatter {\n switch (type) {\n case 'list':\n return new ListFormatter()\n case 'enhanced':\n return new EnhancedFormatter()\n default:\n throw new Error(`Unknown formatter type: ${type}`)\n }\n}\n"],"mappings":"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"}
|
package/dist/shared-CFoY2Xhg.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{join as e}from"node:path";function t(e,t){let n={};for(let r=0;r<e.length;r++){let i=e[r];if(i.startsWith(`--`)){let a=i.slice(2),o=t.find(e=>e.name===a||e.alias===a);if(o){if(o.type===`boolean`)n[a]=!0;else if(r+1<e.length){let t=e[++r];n[a]=o.type===`number`?Number(t):t}}}else if(i.startsWith(`-`)){let a=i.slice(1),o=t.find(e=>e.alias===a);if(o){if(o.type===`boolean`)n[o.name]=!0;else if(r+1<e.length){let t=e[++r];n[o.name]=o.type===`number`?Number(t):t}}}}for(let e of t)e.required&&!(e.name in n)&&(console.error(`❌ Required argument --${e.name} is missing`),process.exit(1));for(let e of t)!(e.name in n)&&e.default!==void 0&&(n[e.name]=e.default);return n}async function n(t={}){let{searchMode:n=`auto`,useFormatting:r=!0}=t,{UnifiedSearchEngine:i}=await import(`./unifiedSearch-CGZXw0NB.mjs`);return new i({mode:n,skillDir:e(process.cwd(),`assets`),referencesDir:e(process.cwd(),`assets`,`references`),config:{},skillPath:process.cwd(),format:r?`enhanced`:void 0,adapterOptions:{enableChromaFallback:!0,chromaStartupTimeout:15e3,qualityThreshold:.3},formatting:{maxPreviewLength:200,showFullContentThreshold:.8,minScoreForPreview:.3,showLineNumbers:!0}})}export{t as n,n as t};
|
|
2
|
-
//# sourceMappingURL=shared-CFoY2Xhg.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared-CFoY2Xhg.mjs","names":["result: Record<string, any>"],"sources":["../src/commands/shared.ts"],"sourcesContent":["/**\n * Shared utilities for commands\n */\n\nimport { join } from 'node:path'\n\n/**\n * Parse command line arguments\n */\nexport function parseArgs(\n args: string[],\n definitions: Array<{\n name: string\n alias?: string\n type: 'string' | 'number' | 'boolean'\n required?: boolean\n default?: any\n }>\n): Record<string, any> {\n const result: Record<string, any> = {}\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n const def = definitions.find((d) => d.name === key || d.alias === key)\n\n if (def) {\n if (def.type === 'boolean') {\n result[key] = true\n } else if (i + 1 < args.length) {\n const value = args[++i]\n result[key] = def.type === 'number' ? Number(value) : value\n }\n }\n } else if (arg.startsWith('-')) {\n const key = arg.slice(1)\n const def = definitions.find((d) => d.alias === key)\n\n if (def) {\n if (def.type === 'boolean') {\n result[def.name] = true\n } else if (i + 1 < args.length) {\n const value = args[++i]\n result[def.name] = def.type === 'number' ? Number(value) : value\n }\n }\n }\n }\n\n // Check for required arguments\n for (const def of definitions) {\n if (def.required && !(def.name in result)) {\n console.error(`❌ Required argument --${def.name} is missing`)\n process.exit(1)\n }\n }\n\n // Apply defaults\n for (const def of definitions) {\n if (!(def.name in result) && def.default !== undefined) {\n result[def.name] = def.default\n }\n }\n\n return result\n}\n\n/**\n * Create search engine instance\n */\nexport async function createSearchEngine(\n options: {\n searchMode?: 'chroma' | 'fuzzy' | 'auto'\n useFormatting?: boolean\n } = {}\n) {\n const { searchMode = 'auto', useFormatting = true } = options\n const { UnifiedSearchEngine } = await import('../core/unifiedSearch.js')\n\n return new UnifiedSearchEngine({\n mode: searchMode,\n skillDir: join(process.cwd(), 'assets'),\n referencesDir: join(process.cwd(), 'assets', 'references'),\n config: {}, // No longer needed\n skillPath: process.cwd(),\n format: useFormatting ? 'enhanced' : undefined,\n adapterOptions: {\n enableChromaFallback: true,\n chromaStartupTimeout: 15000,\n qualityThreshold: 0.3,\n },\n formatting: {\n maxPreviewLength: 200,\n showFullContentThreshold: 0.8,\n minScoreForPreview: 0.3,\n showLineNumbers: true,\n },\n })\n}\n"],"mappings":"iCASA,SAAgB,EACd,EACA,EAOqB,CACrB,IAAMA,EAA8B,EAAE,CAEtC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CACpC,IAAM,EAAM,EAAK,GAEjB,GAAI,EAAI,WAAW,KAAK,CAAE,CACxB,IAAM,EAAM,EAAI,MAAM,EAAE,CAClB,EAAM,EAAY,KAAM,GAAM,EAAE,OAAS,GAAO,EAAE,QAAU,EAAI,CAEtE,GAAI,MACE,EAAI,OAAS,UACf,EAAO,GAAO,WACL,EAAI,EAAI,EAAK,OAAQ,CAC9B,IAAM,EAAQ,EAAK,EAAE,GACrB,EAAO,GAAO,EAAI,OAAS,SAAW,OAAO,EAAM,CAAG,YAGjD,EAAI,WAAW,IAAI,CAAE,CAC9B,IAAM,EAAM,EAAI,MAAM,EAAE,CAClB,EAAM,EAAY,KAAM,GAAM,EAAE,QAAU,EAAI,CAEpD,GAAI,MACE,EAAI,OAAS,UACf,EAAO,EAAI,MAAQ,WACV,EAAI,EAAI,EAAK,OAAQ,CAC9B,IAAM,EAAQ,EAAK,EAAE,GACrB,EAAO,EAAI,MAAQ,EAAI,OAAS,SAAW,OAAO,EAAM,CAAG,KAOnE,IAAK,IAAM,KAAO,EACZ,EAAI,UAAY,EAAE,EAAI,QAAQ,KAChC,QAAQ,MAAM,yBAAyB,EAAI,KAAK,aAAa,CAC7D,QAAQ,KAAK,EAAE,EAKnB,IAAK,IAAM,KAAO,EACZ,EAAE,EAAI,QAAQ,IAAW,EAAI,UAAY,IAAA,KAC3C,EAAO,EAAI,MAAQ,EAAI,SAI3B,OAAO,EAMT,eAAsB,EACpB,EAGI,EAAE,CACN,CACA,GAAM,CAAE,aAAa,OAAQ,gBAAgB,IAAS,EAChD,CAAE,uBAAwB,MAAM,OAAO,gCAE7C,OAAO,IAAI,EAAoB,CAC7B,KAAM,EACN,SAAU,EAAK,QAAQ,KAAK,CAAE,SAAS,CACvC,cAAe,EAAK,QAAQ,KAAK,CAAE,SAAU,aAAa,CAC1D,OAAQ,EAAE,CACV,UAAW,QAAQ,KAAK,CACxB,OAAQ,EAAgB,WAAa,IAAA,GACrC,eAAgB,CACd,qBAAsB,GACtB,qBAAsB,KACtB,iBAAkB,GACnB,CACD,WAAY,CACV,iBAAkB,IAClB,yBAA0B,GAC1B,mBAAoB,GACpB,gBAAiB,GAClB,CACF,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{readFileSync as e,writeFileSync as t}from"node:fs";function n(e){let t=[],n=/<user-skills(?:\s+baseDir="([^"]+)")?>(\s[\s\S]*?)<\/user-skills>/g,r;for(;(r=n.exec(e))!==null;)t.push({tagName:`user-skills`,baseDir:r[1]||`assets/references/user`,content:r[2].trim(),startIndex:r.index,endIndex:r.index+r[0].length});let i=/<context7-skills\s+id="([^"]+)"(?:\s+baseDir="([^"]+)")?>(\s[\s\S]*?)<\/context7-skills>/g;for(;(r=i.exec(e))!==null;){let e=r[1];t.push({tagName:`context7-skills`,id:e,baseDir:r[2]||`assets/references/context7/${e}`,content:r[3].trim(),startIndex:r.index,endIndex:r.index+r[0].length})}return t.sort((e,t)=>e.startIndex-t.startIndex)}function r(e,t,r,i,a){let o=n(e),s=o.find(e=>e.tagName===t&&(t===`user-skills`||e.id===i));if(s){let n=a||s.baseDir,o;o=t===`user-skills`?n?`<user-skills baseDir="${n}">`:`<user-skills>`:n?`<context7-skills id="${i}" baseDir="${n}">`:`<context7-skills id="${i}">`;let c=`</${t}>`,l=`${o}\n${r}\n${c}`;return e.slice(0,s.startIndex)+l+e.slice(s.endIndex)}else if(t===`context7-skills`&&i){let t=e.match(/## Context7 Documentation[\s\S]*?(?=\n##|$)/);if(t){let n=e.indexOf(t[0]),s=n+t[0].length,c=o.filter(e=>e.tagName===`context7-skills`),l=s;if(c.length>0)l=c[c.length-1].endIndex;else{let r=e.indexOf(`
|
|
2
|
-
`,n+t[0].indexOf(`
|
|
3
|
-
`)),i=e.indexOf(`-->`,r);l=i>r?i+3:r}let u=a||`assets/references/context7/${i}`,d=`\n\n${u?`<context7-skills id="${i}" baseDir="${u}">`:`<context7-skills id="${i}">`}\n${r}\n</context7-skills>`;return e.slice(0,l)+d+e.slice(l)}}return e}function i(e,t){let r=n(e).find(e=>e.tagName===`context7-skills`&&e.id===t);if(!r)return e;let i=r.startIndex,a=r.endIndex;for(;i>0&&e[i-1]===`
|
|
4
|
-
`&&(i--,!(i>0&&e[i-1]===`
|
|
5
|
-
`)););for(;a<e.length&&e[a]===`
|
|
6
|
-
`;)a++;return e.slice(0,i)+e.slice(a)}function a(n,i,a,o,s){t(n,r(e(n,`utf-8`),i,a,o,s),`utf-8`)}function o(n,r){t(n,i(e(n,`utf-8`),r),`utf-8`)}export{a as n,o as t};
|
|
7
|
-
//# sourceMappingURL=skillMdManager-DP8fGZb7.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillMdManager-DP8fGZb7.mjs","names":["tags: TagContent[]","tagStart: string"],"sources":["../src/utils/skillMdManager.ts"],"sourcesContent":["/**\n * SKILL.md tag management utilities\n * Manages <user-skills> and <context7-skills> tags in SKILL.md file\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs'\n\nexport interface TagContent {\n tagName: string\n id?: string\n baseDir?: string\n content: string\n startIndex: number\n endIndex: number\n}\n\n/**\n * Parse all tags from SKILL.md content\n */\nexport function parseSkillMdTags(content: string): TagContent[] {\n const tags: TagContent[] = []\n\n // Match <user-skills baseDir=\"...\">...</user-skills>\n const userSkillsRegex = /<user-skills(?:\\s+baseDir=\"([^\"]+)\")?>(\\s[\\s\\S]*?)<\\/user-skills>/g\n let match\n\n while ((match = userSkillsRegex.exec(content)) !== null) {\n tags.push({\n tagName: 'user-skills',\n baseDir: match[1] || 'assets/references/user', // Default baseDir\n content: match[2].trim(),\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n })\n }\n\n // Match <context7-skills id=\"xxx\" baseDir=\"...\">...</context7-skills>\n const context7Regex =\n /<context7-skills\\s+id=\"([^\"]+)\"(?:\\s+baseDir=\"([^\"]+)\")?>(\\s[\\s\\S]*?)<\\/context7-skills>/g\n\n while ((match = context7Regex.exec(content)) !== null) {\n const projectId = match[1]\n tags.push({\n tagName: 'context7-skills',\n id: projectId,\n baseDir: match[2] || `assets/references/context7/${projectId}`, // Default baseDir with project ID\n content: match[3].trim(),\n startIndex: match.index,\n endIndex: match.index + match[0].length,\n })\n }\n\n return tags.sort((a, b) => a.startIndex - b.startIndex)\n}\n\n/**\n * Update or create a tag in SKILL.md content\n */\nexport function updateSkillMdTag(\n content: string,\n tagName: 'user-skills' | 'context7-skills',\n newContent: string,\n id?: string,\n baseDir?: string\n): string {\n const tags = parseSkillMdTags(content)\n\n // Find existing tag\n const existingTag = tags.find(\n (t) => t.tagName === tagName && (tagName === 'user-skills' || t.id === id)\n )\n\n if (existingTag) {\n // Replace existing tag content, preserving or updating baseDir\n const finalBaseDir = baseDir || existingTag.baseDir\n let tagStart: string\n if (tagName === 'user-skills') {\n tagStart = finalBaseDir ? `<user-skills baseDir=\"${finalBaseDir}\">` : `<user-skills>`\n } else {\n tagStart = finalBaseDir\n ? `<context7-skills id=\"${id}\" baseDir=\"${finalBaseDir}\">`\n : `<context7-skills id=\"${id}\">`\n }\n const tagEnd = `</${tagName}>`\n const newTag = `${tagStart}\\n${newContent}\\n${tagEnd}`\n\n return content.slice(0, existingTag.startIndex) + newTag + content.slice(existingTag.endIndex)\n } else if (tagName === 'context7-skills' && id) {\n // Add new context7-skills tag\n // Find the Context7 Documentation section\n const context7SectionRegex = /## Context7 Documentation[\\s\\S]*?(?=\\n##|$)/\n const sectionMatch = content.match(context7SectionRegex)\n\n if (sectionMatch) {\n const sectionStart = content.indexOf(sectionMatch[0])\n const sectionEnd = sectionStart + sectionMatch[0].length\n\n // Find the end of existing context7-skills tags\n const existingContext7Tags = tags.filter((t) => t.tagName === 'context7-skills')\n let insertPosition = sectionEnd\n\n if (existingContext7Tags.length > 0) {\n const lastTag = existingContext7Tags[existingContext7Tags.length - 1]\n insertPosition = lastTag.endIndex\n } else {\n // Insert after the section header and comment\n const headerEnd = content.indexOf('\\n', sectionStart + sectionMatch[0].indexOf('\\n'))\n const commentEnd = content.indexOf('-->', headerEnd)\n insertPosition = commentEnd > headerEnd ? commentEnd + 3 : headerEnd\n }\n\n const finalBaseDir = baseDir || `assets/references/context7/${id}`\n const tagStart = finalBaseDir\n ? `<context7-skills id=\"${id}\" baseDir=\"${finalBaseDir}\">`\n : `<context7-skills id=\"${id}\">`\n const newTag = `\\n\\n${tagStart}\\n${newContent}\\n</context7-skills>`\n\n return content.slice(0, insertPosition) + newTag + content.slice(insertPosition)\n }\n }\n\n return content\n}\n\n/**\n * Remove a context7-skills tag from SKILL.md\n */\nexport function removeContext7Tag(content: string, projectId: string): string {\n const tags = parseSkillMdTags(content)\n const tagToRemove = tags.find((t) => t.tagName === 'context7-skills' && t.id === projectId)\n\n if (!tagToRemove) {\n return content\n }\n\n // Remove the tag and any surrounding whitespace\n let startIndex = tagToRemove.startIndex\n let endIndex = tagToRemove.endIndex\n\n // Remove leading newlines\n while (startIndex > 0 && content[startIndex - 1] === '\\n') {\n startIndex--\n if (startIndex > 0 && content[startIndex - 1] === '\\n') break // Keep one newline\n }\n\n // Remove trailing newlines\n while (endIndex < content.length && content[endIndex] === '\\n') {\n endIndex++\n }\n\n return content.slice(0, startIndex) + content.slice(endIndex)\n}\n\n/**\n * Get all context7 project IDs from SKILL.md\n */\nexport function getContext7ProjectIds(content: string): string[] {\n const tags = parseSkillMdTags(content)\n return tags.filter((t) => t.tagName === 'context7-skills' && t.id).map((t) => t.id as string)\n}\n\n/**\n * Get user skills files from SKILL.md\n */\nexport function getUserSkillsFiles(content: string): string[] {\n const tags = parseSkillMdTags(content)\n const userSkillsTag = tags.find((t) => t.tagName === 'user-skills')\n\n if (!userSkillsTag || !userSkillsTag.content) {\n return []\n }\n\n // Parse markdown list items\n return userSkillsTag.content\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.startsWith('-'))\n .map((line) => line.slice(1).trim())\n .filter(Boolean)\n}\n\n/**\n * Get context7 files for a specific project from SKILL.md\n */\nexport function getContext7Files(content: string, projectId: string): string[] {\n const tags = parseSkillMdTags(content)\n const projectTag = tags.find((t) => t.tagName === 'context7-skills' && t.id === projectId)\n\n if (!projectTag || !projectTag.content) {\n return []\n }\n\n // Parse markdown list items\n return projectTag.content\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.startsWith('-'))\n .map((line) => line.slice(1).trim())\n .filter(Boolean)\n}\n\n/**\n * Update SKILL.md file with new tag content\n */\nexport function updateSkillMdFile(\n filePath: string,\n tagName: 'user-skills' | 'context7-skills',\n newContent: string,\n id?: string,\n baseDir?: string\n): void {\n const content = readFileSync(filePath, 'utf-8')\n const updated = updateSkillMdTag(content, tagName, newContent, id, baseDir)\n writeFileSync(filePath, updated, 'utf-8')\n}\n\n/**\n * Remove context7 tag from SKILL.md file\n */\nexport function removeContext7TagFromFile(filePath: string, projectId: string): void {\n const content = readFileSync(filePath, 'utf-8')\n const updated = removeContext7Tag(content, projectId)\n writeFileSync(filePath, updated, 'utf-8')\n}\n"],"mappings":"0DAmBA,SAAgB,EAAiB,EAA+B,CAC9D,IAAMA,EAAqB,EAAE,CAGvB,EAAkB,qEACpB,EAEJ,MAAQ,EAAQ,EAAgB,KAAK,EAAQ,IAAM,MACjD,EAAK,KAAK,CACR,QAAS,cACT,QAAS,EAAM,IAAM,yBACrB,QAAS,EAAM,GAAG,MAAM,CACxB,WAAY,EAAM,MAClB,SAAU,EAAM,MAAQ,EAAM,GAAG,OAClC,CAAC,CAIJ,IAAM,EACJ,4FAEF,MAAQ,EAAQ,EAAc,KAAK,EAAQ,IAAM,MAAM,CACrD,IAAM,EAAY,EAAM,GACxB,EAAK,KAAK,CACR,QAAS,kBACT,GAAI,EACJ,QAAS,EAAM,IAAM,8BAA8B,IACnD,QAAS,EAAM,GAAG,MAAM,CACxB,WAAY,EAAM,MAClB,SAAU,EAAM,MAAQ,EAAM,GAAG,OAClC,CAAC,CAGJ,OAAO,EAAK,MAAM,EAAG,IAAM,EAAE,WAAa,EAAE,WAAW,CAMzD,SAAgB,EACd,EACA,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAO,EAAiB,EAAQ,CAGhC,EAAc,EAAK,KACtB,GAAM,EAAE,UAAY,IAAY,IAAY,eAAiB,EAAE,KAAO,GACxE,CAED,GAAI,EAAa,CAEf,IAAM,EAAe,GAAW,EAAY,QACxCC,EACJ,AAGE,EAHE,IAAY,cACH,EAAe,yBAAyB,EAAa,IAAM,gBAE3D,EACP,wBAAwB,EAAG,aAAa,EAAa,IACrD,wBAAwB,EAAG,IAEjC,IAAM,EAAS,KAAK,EAAQ,GACtB,EAAS,GAAG,EAAS,IAAI,EAAW,IAAI,IAE9C,OAAO,EAAQ,MAAM,EAAG,EAAY,WAAW,CAAG,EAAS,EAAQ,MAAM,EAAY,SAAS,SACrF,IAAY,mBAAqB,EAAI,CAI9C,IAAM,EAAe,EAAQ,MADA,8CAC2B,CAExD,GAAI,EAAc,CAChB,IAAM,EAAe,EAAQ,QAAQ,EAAa,GAAG,CAC/C,EAAa,EAAe,EAAa,GAAG,OAG5C,EAAuB,EAAK,OAAQ,GAAM,EAAE,UAAY,kBAAkB,CAC5E,EAAiB,EAErB,GAAI,EAAqB,OAAS,EAEhC,EADgB,EAAqB,EAAqB,OAAS,GAC1C,aACpB,CAEL,IAAM,EAAY,EAAQ,QAAQ;EAAM,EAAe,EAAa,GAAG,QAAQ;EAAK,CAAC,CAC/E,EAAa,EAAQ,QAAQ,MAAO,EAAU,CACpD,EAAiB,EAAa,EAAY,EAAa,EAAI,EAG7D,IAAM,EAAe,GAAW,8BAA8B,IAIxD,EAAS,OAHE,EACb,wBAAwB,EAAG,aAAa,EAAa,IACrD,wBAAwB,EAAG,IACA,IAAI,EAAW,sBAE9C,OAAO,EAAQ,MAAM,EAAG,EAAe,CAAG,EAAS,EAAQ,MAAM,EAAe,EAIpF,OAAO,EAMT,SAAgB,EAAkB,EAAiB,EAA2B,CAE5E,IAAM,EADO,EAAiB,EAAQ,CACb,KAAM,GAAM,EAAE,UAAY,mBAAqB,EAAE,KAAO,EAAU,CAE3F,GAAI,CAAC,EACH,OAAO,EAIT,IAAI,EAAa,EAAY,WACzB,EAAW,EAAY,SAG3B,KAAO,EAAa,GAAK,EAAQ,EAAa,KAAO;IACnD,IACI,IAAa,GAAK,EAAQ,EAAa,KAAO;MAIpD,KAAO,EAAW,EAAQ,QAAU,EAAQ,KAAc;GACxD,IAGF,OAAO,EAAQ,MAAM,EAAG,EAAW,CAAG,EAAQ,MAAM,EAAS,CAsD/D,SAAgB,EACd,EACA,EACA,EACA,EACA,EACM,CAGN,EAAc,EADE,EADA,EAAa,EAAU,QAAQ,CACL,EAAS,EAAY,EAAI,EAAQ,CAC1C,QAAQ,CAM3C,SAAgB,EAA0B,EAAkB,EAAyB,CAGnF,EAAc,EADE,EADA,EAAa,EAAU,QAAQ,CACJ,EAAU,CACpB,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./esm-BbhxxeGF.mjs";import{t as e}from"./unifiedSearch-l-lrSc9C.mjs";import"./search_format-DIs-1lKk.mjs";export{e as UnifiedSearchEngine};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{i as e,t}from"./chunk-Da8dvM5T.mjs";import{t as n}from"./esm-BbhxxeGF.mjs";import{t as r}from"./search_format-DIs-1lKk.mjs";import{createRequire as i}from"node:module";import{basename as a,dirname as o,join as s}from"node:path";import{existsSync as c,mkdirSync as l,readFileSync as u}from"node:fs";import{spawn as d}from"node:child_process";import{createHash as f}from"node:crypto";import{ChromaClient as p}from"chromadb";import{DefaultEmbeddingFunction as m}from"@chroma-core/default-embed";import{createServer as h}from"node:net";var g=e(t(((e,t)=>{let n=(e,t)=>e>t?1:e<t?-1:0,r=1/0,i=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=`eexxaacctt`,o=/\p{P}/gu,s=[`en`,{numeric:!0,sensitivity:`base`}],c=(e,t,n)=>e.replace(`A-Z`,t).replace(`a-z`,n),l={unicode:!1,alpha:null,interSplit:`[^A-Za-z\\d']+`,intraSplit:`[a-z][A-Z]`,interBound:`[^A-Za-z\\d]`,intraBound:`[A-Za-z]\\d|\\d[A-Za-z]|[a-z][A-Z]`,interLft:0,interRgt:0,interChars:`.`,interIns:r,intraChars:`[a-z\\d']`,intraIns:null,intraContr:`'[a-z]{1,2}\\b`,intraMode:0,intraSlice:[1,r],intraSub:null,intraTrn:null,intraDel:null,intraFilt:(e,t,n)=>!0,toUpper:e=>e.toLocaleUpperCase(),toLower:e=>e.toLocaleLowerCase(),compare:null,sort:(e,t,r,i=n)=>{let{idx:a,chars:o,terms:s,interLft2:c,interLft1:l,start:u,intraIns:d,interIns:f,cases:p}=e;return a.map((e,t)=>t).sort((e,n)=>o[n]-o[e]||d[e]-d[n]||s[n]+c[n]+.5*l[n]-(s[e]+c[e]+.5*l[e])||f[e]-f[n]||u[e]-u[n]||p[n]-p[e]||i(t[a[e]],t[a[n]]))}},u=(e,t)=>t==0?``:t==1?e+`??`:t==r?e+`*?`:e+`{0,${t}}?`,d=`(?:\\b|_)`;function f(e){e=Object.assign({},l,e);let{unicode:t,interLft:r,interRgt:f,intraMode:p,intraSlice:h,intraIns:g,intraSub:_,intraTrn:v,intraDel:y,intraContr:b,intraSplit:x,interSplit:S,intraBound:C,interBound:w,intraChars:T,toUpper:E,toLower:D,compare:O}=e;g??=p,_??=p,v??=p,y??=p,O??=typeof Intl>`u`?n:new Intl.Collator(...s).compare;let k=e.letters??e.alpha;if(k!=null){let e=E(k),t=D(k);S=c(S,e,t),x=c(x,e,t),w=c(w,e,t),C=c(C,e,t),T=c(T,e,t),b=c(b,e,t)}let A=t?`u`:``,j=`".+?"`,M=new RegExp(j,`gi`+A),N=RegExp(`(?:\\s+|^)-(?:${T}+|${j})`,`gi`+A),{intraRules:P}=e;P??=e=>{let t=l.intraSlice,n=0,r=0,i=0,a=0;if(/[^\d]/.test(e)){let o=e.length;o<=4?o>=3&&(i=Math.min(v,1),o==4&&(n=Math.min(g,1))):(t=h,n=g,r=_,i=v,a=y)}return{intraSlice:t,intraIns:n,intraSub:r,intraTrn:i,intraDel:a}};let F=!!x,I=new RegExp(x,`g`+A),L=new RegExp(S,`g`+A),R=RegExp(`^`+S+`|`+S+`$`,`g`+A),z=new RegExp(b,`gi`+A),B=(e,t=!1)=>{let n=[];e=e.replace(M,e=>(n.push(e),a)),e=e.replace(R,``),t||(e=D(e)),F&&(e=e.replace(I,e=>e[0]+` `+e[1]));let r=0;return e.split(L).filter(e=>e!=``).map(e=>e===a?n[r++]:e)},V=/[^\d]+|\d+/g,H=(t,n=0,a=!1)=>{let o=B(t);if(o.length==0)return[];let s=Array(o.length).fill(``);o=o.map((e,t)=>e.replace(z,e=>(s[t]=e,``)));let c;if(p==1)c=o.map((e,t)=>{if(e[0]===`"`)return i(e.slice(1,-1));let n=``;for(let r of e.matchAll(V)){let e=r[0],{intraSlice:i,intraIns:a,intraSub:o,intraTrn:c,intraDel:l}=P(e);if(a+o+c+l==0)n+=e+s[t];else{let[r,d]=i,f=e.slice(0,r),p=e.slice(d),m=e.slice(r,d);a==1&&f.length==1&&f!=m[0]&&(f+=`(?!`+f+`)`);let h=m.length,g=[e];if(o)for(let e=0;e<h;e++)g.push(f+m.slice(0,e)+T+m.slice(e+1)+p);if(c)for(let e=0;e<h-1;e++)m[e]!=m[e+1]&&g.push(f+m.slice(0,e)+m[e+1]+m[e]+m.slice(e+2)+p);if(l)for(let e=0;e<h;e++)g.push(f+m.slice(0,e+1)+`?`+m.slice(e+1)+p);if(a){let e=u(T,1);for(let t=0;t<h;t++)g.push(f+m.slice(0,t)+e+m.slice(t)+p)}n+=`(?:`+g.join(`|`)+`)`+s[t]}}return n});else{let e=u(T,g);n==2&&g>0&&(e=`)(`+e+`)(`),c=o.map((t,n)=>t[0]===`"`?i(t.slice(1,-1)):t.split(``).map((e,t,n)=>(g==1&&t==0&&n.length>1&&e!=n[t+1]&&(e+=`(?!`+e+`)`),e)).join(e)+s[n])}let l=r==2?d:``,m=f==2?d:``,h=m+u(e.interChars,e.interIns)+l;return n>0?a?c=l+`(`+c.join(`)`+m+`|`+l+`(`)+`)`+m:(c=`(`+c.join(`)(`+h+`)(`)+`)`,c=`(.??`+l+`)`+c+`(`+m+`.*)`):(c=c.join(h),c=l+c+m),[new RegExp(c,`i`+A),o,s]},U=(e,t,n)=>{let[r]=H(t);if(r==null)return null;let i=[];if(n!=null)for(let t=0;t<n.length;t++){let a=n[t];r.test(e[a])&&i.push(a)}else for(let t=0;t<e.length;t++)r.test(e[t])&&i.push(t);return i},W=!!C,G=new RegExp(w,A),K=new RegExp(C,A),q=(t,n,i)=>{let[a,o,s]=H(i,1),c=B(i,!0),[l]=H(i,2),u=o.length,d=Array(u),p=Array(u);for(let e=0;e<u;e++){let t=o[e],n=c[e],r=t[0]==`"`?t.slice(1,-1):t+s[e],i=n[0]==`"`?n.slice(1,-1):n+s[e];d[e]=r,p[e]=i}let m=t.length,h=Array(m).fill(0),g={idx:Array(m),start:h.slice(),chars:h.slice(),cases:h.slice(),terms:h.slice(),interIns:h.slice(),intraIns:h.slice(),interLft2:h.slice(),interRgt2:h.slice(),interLft1:h.slice(),interRgt1:h.slice(),ranges:Array(m)},_=r==1||f==1,v=0;for(let i=0;i<t.length;i++){let o=n[t[i]],s=o.match(a),c=s.index+s[1].length,m=c,h=!1,y=0,b=0,x=0,S=0,C=0,w=0,T=0,E=0,O=0,k=[];for(let t=0,n=2;t<u;t++,n+=2){let i=D(s[n]),a=d[t],l=p[t],g=a.length,v=i.length,j=i==a;if(s[n]==l&&T++,!j&&s[n+1].length>=g){let e=D(s[n+1]).indexOf(a);e>-1&&(k.push(m,v,e,g),m+=J(s,n,e,g),i=a,v=g,j=!0,t==0&&(c=m))}if(_||j){let e=m-1,l=m+v,u=!1,d=!1;if(e==-1||G.test(o[e]))j&&y++,u=!0;else{if(r==2){h=!0;break}if(W&&K.test(o[e]+o[e+1]))j&&b++,u=!0;else if(r==1){let e=s[n+1],r=m+v;if(e.length>=g){let l=0,d=!1,f=new RegExp(a,`ig`+A),p;for(;p=f.exec(e);){l=p.index;let e=r+l,t=e-1;if(t==-1||G.test(o[t])){y++,d=!0;break}else if(K.test(o[t]+o[e])){b++,d=!0;break}}d&&(u=!0,k.push(m,v,l,g),m+=J(s,n,l,g),i=a,v=g,j=!0,t==0&&(c=m))}if(!u){h=!0;break}}}if(l==o.length||G.test(o[l]))j&&x++,d=!0;else{if(f==2){h=!0;break}if(W&&K.test(o[l-1]+o[l]))j&&S++,d=!0;else if(f==1){h=!0;break}}j&&(C+=g,u&&d&&w++)}if(v>g&&(O+=v-g),t>0&&(E+=s[n-1].length),!e.intraFilt(a,i,m)){h=!0;break}t<u-1&&(m+=v+s[n+1].length)}if(!h){g.idx[v]=t[i],g.interLft2[v]=y,g.interLft1[v]=b,g.interRgt2[v]=x,g.interRgt1[v]=S,g.chars[v]=C,g.terms[v]=w,g.cases[v]=T,g.interIns[v]=E,g.intraIns[v]=O,g.start[v]=c;let e=o.match(l),n=e.index+e[1].length,r=k.length,a=r>0?0:1/0,s=r-4;for(let t=2;t<e.length;){let r=e[t].length;if(a<=s&&k[a]==n){let r=k[a+1],i=k[a+2],o=k[a+3],s=t,c=``;for(let t=0;t<r;s++)c+=e[s],t+=e[s].length;e.splice(t,s-t,c),n+=J(e,t,i,o),a+=4}else n+=r,t++}n=e.index+e[1].length;let u=g.ranges[v]=[],d=n,f=n;for(let t=2;t<e.length;t++){let r=e[t].length;n+=r,t%2==0?f=n:r>0&&(u.push(d,f),d=f=n)}f>d&&u.push(d,f),v++}}if(v<t.length)for(let e in g)g[e]=g[e].slice(0,v);return g},J=(e,t,n,r)=>{let i=e[t]+e[t+1].slice(0,n);return e[t-1]+=i,e[t]=e[t+1].slice(n,n+r),e[t+1]=e[t+1].slice(n+r),i.length},Y=(t,n,r,a=1e3,s)=>{r=r?r===!0?5:r:0;let c=null,l=null,u=[];n=n.replace(N,e=>{let t=e.trim().slice(1);return t=t[0]===`"`?i(t.slice(1,-1)):t.replace(o,``),t!=``&&u.push(t),``});let d=B(n),f;if(u.length>0){if(f=new RegExp(u.join(`|`),`i`+A),d.length==0){let e=[];for(let n=0;n<t.length;n++)f.test(t[n])||e.push(n);return[e,null,null]}}else if(d.length==0)return[null,null,null];if(r>0){let e=B(n);if(e.length>1){let n=e.slice().sort((e,t)=>t.length-e.length);for(let e=0;e<n.length;e++){if(s?.length==0)return[[],null,null];s=U(t,n[e],s)}if(e.length>r)return[s,null,null];c=m(e).map(e=>e.join(` `)),l=[];let i=new Set;for(let e=0;e<c.length;e++)if(i.size<s.length){let n=s.filter(e=>!i.has(e)),r=U(t,c[e],n);for(let e=0;e<r.length;e++)i.add(r[e]);l.push(r)}else l.push([])}}c??(c=[n],l=[s?.length>0?s:U(t,n)]);let p=null,h=null;if(u.length>0&&(l=l.map(e=>e.filter(e=>!f.test(t[e])))),l.reduce((e,t)=>e+t.length,0)<=a){p={},h=[];for(let n=0;n<l.length;n++){let r=l[n];if(r==null||r.length==0)continue;let i=c[n],a=q(r,t,i),o=e.sort(a,t,i,O);if(n>0)for(let e=0;e<o.length;e++)o[e]+=h.length;for(let e in a)p[e]=(p[e]??[]).concat(a[e]);h=h.concat(o)}}return[[].concat(...l),p,h]};return{search:(...e)=>Y(...e),split:B,filter:U,info:q,sort:e.sort}}let p=(()=>{let e={A:`ÁÀÃÂÄĄĂÅ`,a:`áàãâäąăå`,E:`ÉÈÊËĖĚ`,e:`éèêëęě`,I:`ÍÌÎÏĮİ`,i:`íìîïįı`,O:`ÓÒÔÕÖ`,o:`óòôõö`,U:`ÚÙÛÜŪŲŮŰ`,u:`úùûüūųůű`,C:`ÇČĆ`,c:`çčć`,D:`Ď`,d:`ď`,G:`Ğ`,g:`ğ`,L:`Ł`,l:`ł`,N:`ÑŃŇ`,n:`ñńň`,S:`ŠŚȘŞ`,s:`šśșş`,T:`ŢȚŤ`,t:`ţțť`,Y:`Ý`,y:`ý`,Z:`ŻŹŽ`,z:`żźž`},t={},n=``;for(let r in e)e[r].split(``).forEach(e=>{n+=e,t[e]=r});let r=RegExp(`[${n}]`,`g`),i=e=>t[e];return e=>{if(typeof e==`string`)return e.replace(r,i);let t=Array(e.length);for(let n=0;n<e.length;n++)t[n]=e[n].replace(r,i);return t}})();function m(e){e=e.slice();let t=e.length,n=[e.slice()],r=Array(t).fill(0),i=1,a,o;for(;i<t;)r[i]<i?(a=i%2&&r[i],o=e[i],e[i]=e[a],e[a]=o,++r[i],i=1,n.push(e.slice())):(r[i]=0,++i);return n}let h=(e,t)=>t?`<mark>${e}</mark>`:e,g=(e,t)=>e+t;function _(e,t,n=h,r=``,i=g){r=i(r,n(e.substring(0,t[0]),!1))??r;for(let a=0;a<t.length;a+=2){let o=t[a],s=t[a+1];r=i(r,n(e.substring(o,s),!0))??r,a<t.length-3&&(r=i(r,n(e.substring(t[a+1],t[a+2]),!1))??r)}return r=i(r,n(e.substring(t[t.length-1]),!1))??r,r}f.latinize=p,f.permute=e=>m([...Array(e.length).keys()]).sort((e,t)=>{for(let n=0;n<e.length;n++)if(e[n]!=t[n])return e[n]-t[n];return 0}).map(t=>t.map(t=>e[t])),f.highlight=_,t.exports=f}))(),1),_=class{documents=[];fuzzy;lastSearchInfo=new Map;constructor(){this.fuzzy=new g.default({unicode:!0})}async buildIndex(e){console.log(`🔨 Building fuzzy search index with uFuzzy...`);let t=await n(`**/*.md`,{cwd:e});if(t.length===0){console.log(`No documentation files found to index`);return}this.documents=[];for(let n of t)try{let t=s(e,n),r=u(t,`utf-8`),i=r.split(`
|
|
2
|
-
`)[0]?.replace(/^#+\s*/,``).trim()||a(n,`.md`).replace(/[-_]/g,` `),o=n.includes(`context7/`)?`context7`:`user`;this.documents.push({id:n,title:i,content:r,source:o,file_path:t,metadata:{file_name:a(n),file_path:n}})}catch(e){console.warn(`Warning: Failed to index file ${n}:`,e)}console.log(`✅ Fuzzy search index built with ${this.documents.length} documents`)}async search(e,t={}){let{topK:n=5,where:r}=t;if(this.documents.length===0)return console.warn(`Search index not built. Call buildIndex() first.`),[];let i=this.documents;if(r?.source&&(i=this.documents.filter(e=>e.source===r.source)),i.length===0)return[];let a=[],o=new Set,s=i.map(e=>e.title),c=i.map(e=>e.content),l=i.map(e=>e.metadata.file_name);return this.fuzzySearch(s,e).forEach(e=>{let t=i[e];t&&!o.has(t.id)&&(o.add(t.id),a.push({id:t.id,title:t.title,content:t.content,source:t.source,file_path:t.file_path,score:1,metadata:{...t.metadata,matchType:`title`}}))}),this.fuzzySearch(c,e).forEach(e=>{let t=i[e];t&&!o.has(t.id)&&(o.add(t.id),a.push({id:t.id,title:t.title,content:t.content,source:t.source,file_path:t.file_path,score:.7,metadata:{...t.metadata,matchType:`content`}}))}),this.fuzzySearch(l,e).forEach(e=>{let t=i[e];t&&!o.has(t.id)&&(o.add(t.id),a.push({id:t.id,title:t.title,content:t.content,source:t.source,file_path:t.file_path,score:.5,metadata:{...t.metadata,matchType:`filename`}}))}),a.sort((e,t)=>t.score-e.score).slice(0,n)}fuzzySearch(e,t){return this.fuzzySearchWithInfo(e,t).indices}fuzzySearchWithInfo(e,t){if(!t||t.length<1||!e||e.length===0)return{indices:[],info:null};let n=this.fuzzy.filter(e,t);if(!n||n.length===0)return{indices:[],info:null};let r=this.fuzzy.info(n,e,t),i=this.fuzzy.sort(r,e,t),a=`${t}-${JSON.stringify(e.slice(0,3))}`;return this.lastSearchInfo.set(a,r),{indices:i.map(e=>r.idx[e]),info:r}}isBuilt(){return this.documents.length>0}async getStats(){return{totalDocuments:this.documents.length}}async searchByPriority(e,t=5){return this.search(e,{topK:t})}clearIndex(){this.documents=[],this.lastSearchInfo.clear()}};async function v(){return new Promise((e,t)=>{(()=>{let t=h();t.listen(0,()=>{let n=t.address()?.port;t.close(()=>{e(n)})})})()})}async function y(e,t=1e4){return new Promise(n=>{let r=Date.now(),a=()=>{if(Date.now()-r>t){n(!1);return}let o=new(i(import.meta.url)(`net`)).Socket;o.setTimeout(1e3),o.connect(e,`localhost`,()=>{o.destroy(),n(!0)}),o.on(`error`,()=>{setTimeout(a,500)}),o.on(`timeout`,()=>{o.destroy(),setTimeout(a,500)})};a()})}var b=class e{static instance=null;servers=new Map;chromaCliPath=null;constructor(){}static getInstance(){return e.instance||=new e,e.instance}async initChromaCliPath(){if(this.chromaCliPath)return this.chromaCliPath;try{let e=process.cwd();for(;!c(s(e,`node_modules`,`chromadb`))&&e!==`/`;)e=o(e);let t=s(s(s(e,`node_modules`),`chromadb`),`dist`,`cli.mjs`);if(c(t))return console.log(`✅ Found ChromaDB CLI: ${t}`),this.chromaCliPath=t;throw Error(`ChromaDB CLI not found at ${t}`)}catch(e){throw Error(`Failed to locate ChromaDB CLI: ${e instanceof Error?e.message:String(e)}`)}}generateServerId(e){let t=f(`md5`);return t.update(e.skillDir),t.digest(`hex`).substring(0,12)}async startServer(e){let t=await this.initChromaCliPath(),n=this.generateServerId(e);if(this.servers.has(n)){let e=this.servers.get(n);if(e.process&&!e.process.killed)return console.log(`📡 ChromaDB 服务器已在运行 (端口: ${e.port})`),e;this.servers.delete(n)}console.log(`🚀 启动 ChromaDB 服务器...`);let r=e.port||await v(),i=s(e.skillDir,`chromadb`);c(i)||l(i,{recursive:!0}),console.log(`🔧 启动命令: chroma run --path ./chromadb --port ${r} --host localhost`),console.log(`📁 数据目录: ${i}`),console.log(`🌐 服务端口: ${r}`),console.log(`🔄 工作目录: ${e.skillDir}`);let a=d(process.argv[0],[t,`run`,`--port`,r.toString()],{stdio:`ignore`,detached:!0,cwd:i});a.unref(),a.on(`error`,e=>{console.log(`❌ ChromaDB 进程错误:`,e.message)}),a.on(`exit`,(e,t)=>{console.log(`🔚 ChromaDB 进程退出 (code: ${e}, signal: ${t})`),this.servers.delete(n)});let o=e.startupTimeout||15e3;if(console.log(`⏳ 等待 ChromaDB 服务器启动 (超时: ${o}ms)...`),!await y(r,o))throw a.kill(`SIGTERM`),Error(`ChromaDB 服务器启动超时 (端口: ${r})`);console.log(`✅ ChromaDB 服务器启动成功 (端口: ${r})`);let u={port:r,dataPath:i,process:a,config:e};return this.servers.set(n,u),u}async stopServer(e){let t=this.generateServerId(e),n=this.servers.get(t);if(!n){console.log(`⚠️ ChromaDB 服务器未运行`);return}console.log(`🛑 停止 ChromaDB 服务器 (端口: ${n.port})...`);try{n.process.kill(`SIGTERM`);let e=setTimeout(()=>{n.process.killed||(console.log(`⚡ 强制终止 ChromaDB 进程...`),n.process.kill(`SIGKILL`))},5e3);n.process.on(`exit`,()=>{clearTimeout(e)}),this.servers.delete(t),console.log(`✅ ChromaDB 服务器已停止`)}catch(e){console.error(`❌ 停止 ChromaDB 服务器时出错:`,e)}}async stopAllServers(){let e=Array.from(this.servers.values()).map(async e=>{try{e.process.kill(`SIGTERM`)}catch(t){console.error(`停止服务器时出错 (端口: ${e.port}):`,t)}});await Promise.all(e),this.servers.clear(),console.log(`✅ 所有 ChromaDB 服务器已停止`)}getServerInfo(e){let t=this.generateServerId(e);return this.servers.get(t)||null}isServerRunning(e){let t=this.getServerInfo(e);return t!==null&&t.process&&!t.process.killed}},x=class{fuzzyAdapter;serverManager;options;isIndexBuilt=!1;embeddingFunction;constructor(e){this.options=e,this.fuzzyAdapter=new _,this.serverManager=b.getInstance(),this.embeddingFunction=new m}async prepareChromadb(e=`search`,t=!0){let n=this.serverManager.isServerRunning({skillDir:this.options.skillDir}),r,i=t;n?(r=this.serverManager.getServerInfo({skillDir:this.options.skillDir}),console.log(`🔄 使用现有的 ChromaDB 服务器 (端口: ${r.port})`),i=!1):r=await this.serverManager.startServer({skillDir:this.options.skillDir,startupTimeout:this.options.startupTimeout}),console.log(`🔗 连接到 ChromaDB: http://localhost:${r.port}`);let a=new p({host:`localhost`,port:r.port});try{await a.heartbeat(),console.log(`✅ ChromaDB 连接成功`)}catch(e){throw Error(`ChromaDB 连接失败: ${e instanceof Error?e.message:String(e)}`)}return{client:a,serverInfo:{port:r.port,dataPath:r.dataPath},shouldAutoShutdown:i}}async safeShutdownServer(e,t){if(!t){console.log(`🔄 保持 ChromaDB 服务器运行 (端口: ${e.port})`);return}try{await this.serverManager.stopServer({skillDir:this.options.skillDir}),console.log(`✅ ChromaDB 服务器已关闭 (端口: ${e.port})`)}catch(e){console.warn(`⚠️ 关闭 ChromaDB 服务器时出现警告:`,e)}}async search(e,t={}){let{topK:n=5,where:r}=t;try{console.log(`🔍 启动 ChromaDB 搜索...`);let{client:t,serverInfo:r,shouldAutoShutdown:i}=await this.prepareChromadb(`search`);try{let i;try{i=await t.getCollection({name:this.options.collectionName,embeddingFunction:this.embeddingFunction}),console.log(`📚 获取现有集合: ${this.options.collectionName}`)}catch(e){throw this.isIndexBuilt?e:(console.log(`⚠️ 集合不存在且索引未构建,跳过 ChromaDB 搜索`),Error(`ChromaDB 索引未构建`))}try{if(await i.count()===0)throw console.log(`📭 集合为空,跳过 ChromaDB 搜索`),Error(`ChromaDB 集合为空`)}catch{throw console.log(`⚠️ 无法获取集合计数,可能集合为空`),Error(`ChromaDB 集合不可访问`)}console.log(`🔎 查询 ChromaDB: "${e}"`);let a=await i.query({queryTexts:[e],nResults:n}),o=[];if(a.ids[0]&&a.ids[0].length>0)for(let e=0;e<a.ids[0].length;e++){let t=a.ids[0][e],n=a.documents[0]?.[e],i=a.metadatas[0]?.[e],s=a.distances?.[0]?.[e]||1;if(t&&n){let e;e=s<=0?1:s<=1?1-s:Math.max(.1,.3/s),o.push({id:t,title:typeof i?.title==`string`?i.title:`Document ${t}`,content:n,source:i?.source===`user`||i?.source===`context7`?i.source:`user`,file_path:typeof i?.file_path==`string`?i.file_path:`unknown/${t}`,score:e,metadata:{...i,similarity:s,distance:s,serverPort:r.port,indexedAt:new Date().toISOString()}})}}return console.log(`✅ ChromaDB 搜索完成,找到 ${o.length} 个结果`),o}finally{await this.safeShutdownServer(r,i)}}catch(t){if(console.log(`❌ ChromaDB 搜索失败: ${t instanceof Error?t.message:String(t)}`),this.options.enableFallback)return console.log(`🔄 自动回退到模糊搜索...`),this.fuzzyAdapter.search(e,{topK:n,where:r});throw t}}async calculateFileHashes(e){let t=await import(`node:fs`),{createHash:n}=await import(`node:crypto`),{glob:r}=await import(`./esm-BF5pvSbc.mjs`),i=await r(`**/*.md`,{cwd:e}),a=new Map;for(let r of i.sort())try{let i=`${e}/${r}`,o=t.readFileSync(i,`utf-8`),s=n(`sha256`).update(o).digest(`hex`);a.set(r,s)}catch(e){console.warn(`⚠️ 计算文件hash失败 ${r}:`,e)}return a}async loadFileHashCache(e){let t=await import(`node:fs`),n=(await import(`node:path`)).dirname(e);t.existsSync(n)||t.mkdirSync(n,{recursive:!0});let r=new Map;try{if(t.existsSync(e)){let n=t.readFileSync(e,`utf-8`),i=JSON.parse(n);Object.entries(i).forEach(([e,t])=>{r.set(e,t)})}}catch(e){console.warn(`⚠️ 读取文件hash缓存失败:`,e)}return r}async saveFileHashCache(e,t){let n=await import(`node:fs`);try{let r=Object.fromEntries(t);n.writeFileSync(e,JSON.stringify(r,null,2)),console.log(`💾 已更新文件hash缓存`)}catch(e){console.warn(`⚠️ 保存文件hash缓存失败:`,e)}}analyzeFileChanges(e,t){let n=[],r=[],i=[];for(let[i,a]of e){let e=t.get(i);e?e!==a&&r.push(i):n.push(i)}for(let n of t.keys())e.has(n)||i.push(n);return{added:n,modified:r,deleted:i}}async getOrCreateCollection(e){try{let t=await e.getCollection({name:this.options.collectionName,embeddingFunction:this.embeddingFunction});return console.log(`📝 使用现有集合: ${this.options.collectionName}`),t}catch{return console.log(`📝 创建新集合: ${this.options.collectionName}`),await e.createCollection({name:this.options.collectionName,embeddingFunction:this.embeddingFunction})}}async processFileChanges(e,t,n){let r=await import(`node:fs`),{join:i,relative:a}=await import(`node:path`);if(n.deleted.length>0)try{await e.delete({ids:n.deleted}),console.log(`🗑️ 已删除 ${n.deleted.length} 个文档`)}catch(e){console.warn(`⚠️ 删除文档失败:`,e)}let o=[...n.added,...n.modified];if(o.length>0){console.log(`📝 处理文件变更: 新增 ${n.added.length}, 修改 ${n.modified.length}`);for(let a=0;a<o.length;a+=50){let s=o.slice(a,a+50),c=[],l=[],u=[];for(let e of s)try{let n=i(t,e),a=r.readFileSync(n,`utf-8`),o=a.split(`
|
|
3
|
-
`)[0]?.replace(/^#+\s*/,``).trim()||e.replace(/\.md$/,``);c.push(a),l.push(e),u.push({title:o,file_path:e,source:e.includes(`context7/`)?`context7`:`user`,file_name:e.split(`/`).pop()||e,updated_at:new Date().toISOString()})}catch(t){console.warn(`⚠️ 处理文件失败 ${e}:`,t)}if(c.length>0){let t=l.filter(e=>n.modified.includes(e));if(t.length>0)try{await e.delete({ids:t})}catch{}await e.add({ids:l,documents:c,metadatas:u}),console.log(`📚 已处理 ${Math.min(a+50,o.length)}/${o.length} 个文档`)}}}}async buildIndex(e){console.log(`🔧 构建 ChromaDB 索引...`);let{client:t,serverInfo:n,shouldAutoShutdown:r}=await this.prepareChromadb(`build-index`,!1);try{let n=await this.calculateFileHashes(e),r=`${e}/../.cache/chroma-file-hashes.json`,i=await this.loadFileHashCache(r),a=this.analyzeFileChanges(n,i);if(console.log(`📊 文件变化分析: 新增 ${a.added.length}, 修改 ${a.modified.length}, 删除 ${a.deleted.length}`),a.added.length===0&&a.modified.length===0&&a.deleted.length===0){console.log(`✅ 文件未变化,跳过索引重建`),this.isIndexBuilt=!0;return}let o=await this.getOrCreateCollection(t);await this.processFileChanges(o,e,a),await this.saveFileHashCache(r,n);let s=await o.count();console.log(`✅ ChromaDB 索引更新完成,当前包含 ${s} 个文档`),this.isIndexBuilt=!0}finally{await this.safeShutdownServer(n,r)}}async clearIndex(){console.log(`🗑️ 清除 ChromaDB 索引...`);let{client:e,serverInfo:t,shouldAutoShutdown:n}=await this.prepareChromadb(`clear-index`,!1);try{try{await e.deleteCollection({name:this.options.collectionName}),console.log(`✅ ChromaDB 索引已清除`)}catch{console.log(`⚠️ ChromaDB 集合不存在或已清除`)}this.isIndexBuilt=!1}finally{await this.safeShutdownServer(t,n)}}isBuilt(){return this.isIndexBuilt}async getStats(){try{let{client:e,shouldAutoShutdown:t}=await this.prepareChromadb(`search`);try{return{totalDocuments:await(await e.getCollection({name:this.options.collectionName,embeddingFunction:this.embeddingFunction})).count()}}finally{t&&await this.serverManager.stopServer({skillDir:this.options.skillDir})}}catch(e){return console.log(`⚠️ 无法获取 ChromaDB 统计信息:`,e),{totalDocuments:0}}}getServerStatus(){return{isRunning:this.serverManager.isServerRunning({skillDir:this.options.skillDir})}}},S=class{fuzzyAdapter;chromaAdapter=null;options;constructor(e){this.options=e,this.fuzzyAdapter=new _}async getChromaAdapter(){return this.chromaAdapter||=new x({skillDir:this.options.skillDir,collectionName:this.options.collectionName,startupTimeout:this.options.chromaStartupTimeout||15e3,enableFallback:this.options.enableChromaFallback||!0}),this.chromaAdapter}async buildIndex(e){await this.fuzzyAdapter.buildIndex(e)}async search(e,t={}){let{topK:n=5,where:r}=t,i=this.options.qualityThreshold||.3;console.log(`🤖 Auto Mode: Starting with Fuzzy search...`);let a=await this.fuzzyAdapter.search(e,{topK:n,where:r}),o=this.evaluateSearchQuality(a,e);if(console.log(`📊 Fuzzy search quality: ${o.score.toFixed(2)} (${o.reason})`),o.score>=i)return console.log(`✅ Fuzzy search quality satisfactory, returning results`),a;console.log(`🔄 Fuzzy search quality below threshold, trying ChromaDB...`);try{let t=await(await this.getChromaAdapter()).search(e,{topK:n,where:r});return console.log(`✅ ChromaDB search completed, found ${t.length} results`),t}catch(e){return console.log(`❌ ChromaDB search failed, returning fuzzy results:`,e instanceof Error?e.message:String(e)),a}}evaluateSearchQuality(e,t){if(e.length===0)return{score:0,reason:`No results found`};let n=e[0],r=t.toLowerCase();if(n.title.toLowerCase().includes(r))return{score:1,reason:`Exact title match found`};let i=e.map(e=>e.score),a=Math.max(...i),o=i.reduce((e,t)=>e+t,0)/i.length;return a>=.8?{score:a,reason:`High quality matches found`}:e.length>=3&&o>=.5?{score:o,reason:`Multiple decent quality results`}:a<.3?{score:a,reason:`Low quality matches only`}:e.length<2?{score:a*.8,reason:`Too few results`}:{score:o,reason:`Average quality results`}}isBuilt(){return this.fuzzyAdapter.isBuilt()}async getStats(){return this.fuzzyAdapter.getStats()}async searchByPriority(e,t=5){return this.search(e,{topK:t})}clearIndex(){this.fuzzyAdapter.clearIndex(),this.chromaAdapter&&this.chromaAdapter.clearIndex()}};async function C(e={}){let{mode:t=`auto`,skillDir:n=``,referencesDir:r=``,config:i,adapterOptions:a={}}=e;switch(t){case`auto`:if(!i)throw Error(`Config is required for auto mode`);return new S({skillDir:n,collectionName:`skills`,enableChromaFallback:a.enableChromaFallback??!0,chromaStartupTimeout:a.chromaStartupTimeout??15e3,qualityThreshold:a.qualityThreshold??.3});case`fuzzy`:return new _;case`chroma`:if(!i)throw Error(`Config is required for chroma mode`);return new x({skillDir:n,collectionName:`skills`,startupTimeout:a.chromaStartupTimeout??15e3,enableFallback:a.enableChromaFallback??!0});default:throw Error(`Invalid search mode: ${t}. Use 'auto', 'fuzzy', or 'chroma'.`)}}var w=class{searchEngine=null;formatter=null;options;constructor(e){this.options=e}async initialize(){let{skillDir:e=``,referencesDir:t=``,config:n,mode:i=`auto`,adapterOptions:a={}}=this.options;this.searchEngine=await C({mode:i,skillDir:e,referencesDir:t,config:n,adapterOptions:a}),this.options.format&&(this.formatter=r(this.options.format))}async buildIndex(e){await this.ensureInitialized(),this.searchEngine&&await this.searchEngine.buildIndex(e)}async search(e,t=5,n){return await this.ensureInitialized(),this.searchEngine?this.searchEngine.search(e,{topK:t,where:n}):[]}async searchAndFormat(e,t=5,n){let r=await this.search(e,t,n);if(!this.formatter)throw Error(`No formatter configured. Use format option in constructor.`);let i={skillPath:this.options.skillPath||process.cwd(),maxPreviewLength:this.options.formatting?.maxPreviewLength||200,showFullContentThreshold:this.options.formatting?.showFullContentThreshold||.15,minScoreForPreview:this.options.formatting?.minScoreForPreview||.1,showLineNumbers:this.options.formatting?.showLineNumbers??!0};return this.formatter.format(r,i)}async isBuilt(){return await this.ensureInitialized(),this.searchEngine?.isBuilt()||!1}async getStats(){return await this.ensureInitialized(),this.searchEngine?.getStats()||{totalDocuments:0}}async clearIndex(){await this.ensureInitialized(),this.searchEngine&&`clearIndex`in this.searchEngine&&this.searchEngine.clearIndex()}async ensureInitialized(){this.searchEngine||await this.initialize()}};export{x as n,_ as r,w as t};
|
|
4
|
-
//# sourceMappingURL=unifiedSearch-l-lrSc9C.mjs.map
|