apiskill 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ :root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#eef1f4;color:#18202a;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh}button,input,select{font:inherit}button{cursor:pointer}.app-shell{min-height:100vh;padding:18px}.topbar{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:16px 20px;border:1px solid #d7dde4;border-radius:8px;background:#fff}.eyebrow{margin:0 0 4px;color:#667282;font-size:12px;font-weight:700;letter-spacing:0;text-transform:uppercase}h1,h2,h3,h4,p{margin-top:0}.topbar h1{margin:0;font-size:24px;line-height:1.2}.topbar-actions{display:flex;align-items:center;gap:14px}.version-switcher{display:inline-flex;align-items:center;gap:8px;color:#647182;font-size:12px;font-weight:800}.version-switcher select{width:min(320px,32vw);min-height:36px;padding:0 10px;border:1px solid #cfd7e1;border-radius:6px;outline:0;color:#15202c;background:#fff}.version-manager{min-width:min(420px,38vw)}.version-manager-trigger{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:9px;width:100%;min-height:44px;padding:7px 10px;border:1px solid #cfd7e1;border-radius:7px;color:#23303e;background:#fff;text-align:left}.version-manager-trigger:disabled{cursor:not-allowed;opacity:.72}.version-manager-trigger span{display:grid;gap:2px;min-width:0}.version-manager-trigger strong,.version-manager-trigger small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.version-manager-trigger strong{font-size:13px}.version-manager-trigger small{color:#657181;font-size:11px;font-weight:800}.version-manager-dialog{width:min(900px,100%);max-height:calc(100vh - 40px);overflow:auto;border-radius:8px;border:1px solid #d7dde4;background:#fff;box-shadow:0 18px 60px #12192338}.version-manager-body{display:grid;gap:12px;padding:16px 20px 20px;background:#f7f9fb}.version-message{padding:9px 11px;border:1px solid #cbe5df;border-radius:7px;color:#176b4f;background:#eef9f5;font-size:13px;font-weight:800}.version-message.error{border-color:#f1c1bd;color:#9a2d27;background:#fff4f3}.version-item{display:grid;gap:12px;padding:13px;border:1px solid #dfe5eb;border-radius:8px;background:#fff}.version-item.active{border-color:#7ab6ad;box-shadow:inset 3px 0 #1b6b65}.version-item-main{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:start}.version-item-title{display:flex;align-items:center;gap:8px;min-width:0}.version-item-title strong{overflow:hidden;color:#202a36;text-overflow:ellipsis;white-space:nowrap}.version-item-title span{padding:3px 7px;border-radius:999px;color:#176b4f;background:#e5f6ef;font-size:11px;font-weight:900}.version-item-main p{margin:4px 0 0;overflow-wrap:anywhere;color:#657181;font-family:SFMono-Regular,Consolas,monospace;font-size:12px}.version-item-stats{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px}.version-item-stats span,.version-env-summary span{padding:5px 7px;border-radius:6px;color:#4d5b6c;background:#eef2f6;font-size:12px;font-weight:800}.version-env-summary{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:8px}.version-env-summary code{overflow:hidden;padding:7px 9px;border:1px solid #dfe5eb;border-radius:6px;color:#2f3d4d;background:#fbfcfd;text-overflow:ellipsis;white-space:nowrap}.version-env-editor{display:grid;grid-template-columns:minmax(160px,.5fr) minmax(0,1fr);gap:10px}.version-env-editor label{display:grid;gap:5px;min-width:0;color:#647182;font-size:12px;font-weight:800}.version-env-editor input{width:100%;min-height:36px;padding:0 10px;border:1px solid #cfd7e1;border-radius:6px;outline:0;color:#15202c;background:#fff}.version-item-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.sync-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;color:#5c6877;font-size:13px}.sync-meta span{padding:5px 8px;border:1px solid #dce2e9;border-radius:6px;background:#f7f9fb}.primary-button,.copy-inline-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:36px;border:0;border-radius:6px;color:#fff;background:#1b6b65;font-weight:700;white-space:nowrap}.primary-button{padding:0 14px}.primary-button:disabled{cursor:wait;opacity:.72}.copy-inline-button{padding:0 12px;background:#202a36}.secondary-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:36px;padding:0 14px;border:1px solid #ccd5df;border-radius:6px;color:#22303d;background:#fff;font-weight:700;white-space:nowrap}.secondary-button:disabled{cursor:wait;opacity:.72}.danger-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:36px;padding:0 14px;border:1px solid #efcbc8;border-radius:6px;color:#b63831;background:#fff7f6;font-weight:700;white-space:nowrap}.icon-secondary-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;border:1px solid #ccd5df;border-radius:6px;color:#22303d;background:#fff}.source-panel{display:grid;gap:10px;margin-top:12px;padding:12px;border:1px solid #d7dde4;border-radius:8px;background:#fff}.source-panel-header{display:flex;align-items:center;justify-content:space-between;gap:10px}.source-panel-actions{display:inline-flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.source-tabs{display:inline-flex;width:fit-content;gap:4px;padding:3px;border:1px solid #d4dce5;border-radius:7px;background:#fff}.source-tabs button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:32px;padding:0 12px;border:0;border-radius:5px;color:#566373;background:transparent;font-size:13px;font-weight:800}.source-tabs button.active{color:#fff;background:#1b6b65}.source-form{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px}.blank-document-dialog-body{display:grid;gap:10px;padding:16px 20px 2px}.source-input,.source-file-picker{display:flex;align-items:center;gap:8px;min-width:0;min-height:38px;padding:0 12px;border:1px solid #cfd7e1;border-radius:7px;background:#f9fafb}.source-file-picker{cursor:pointer}.source-file-picker input{display:none}.source-file-picker span{overflow:hidden;min-width:0;color:#15202c;text-overflow:ellipsis;white-space:nowrap}.source-input input{width:100%;min-width:0;border:0;outline:0;background:transparent;color:#15202c}.source-input textarea{width:100%;min-width:0;min-height:118px;resize:vertical;border:0;outline:0;background:transparent;color:#15202c;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.5}.source-input-multiline{align-items:flex-start;padding-top:10px;padding-bottom:10px}.source-input-multiline svg{margin-top:2px}.source-auth{grid-column:1 / -1;display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px}.source-auth-fields{display:grid;grid-template-columns:repeat(2,minmax(0,220px));gap:8px}.source-auth-fields label{display:flex;align-items:center;gap:8px;min-width:0;min-height:36px;padding:0 10px;border:1px solid #cfd7e1;border-radius:7px;background:#f9fafb}.source-auth-fields input{width:100%;min-width:0;border:0;outline:0;background:transparent;color:#15202c}.source-meta{grid-column:1 / -1;overflow:hidden;color:#657181;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.source-meta span{color:#2f3d4d;font-family:SFMono-Regular,Consolas,monospace}.source-meta small{margin-left:8px;color:#728094;font-weight:800}.workspace{display:grid;grid-template-columns:minmax(320px,380px) minmax(0,1fr);gap:16px;min-height:420px;height:calc(100vh - 270px);margin-top:16px}.sidebar,.detail-pane{min-height:0;border:1px solid #d7dde4;border-radius:8px;background:#fff}.sidebar{display:flex;flex-direction:column;padding:14px}.search-box{display:flex;align-items:center;gap:8px;min-height:42px;padding:0 12px;border:1px solid #cfd7e1;border-radius:7px;background:#f9fafb}.search-box input{width:100%;min-width:0;border:0;outline:0;background:transparent;color:#15202c}.search-clear-button{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:24px;height:24px;padding:0;border:0;border-radius:5px;color:#647182;background:transparent}.search-clear-button:hover{color:#b63831;background:#fff0ef}.filters{display:grid;grid-template-columns:1fr auto;gap:10px;margin-top:12px}.filters label:first-child{display:flex;align-items:center;gap:8px;min-width:0;padding:0 10px;border:1px solid #d5dce5;border-radius:7px;background:#fff}.filters select{width:100%;min-height:38px;border:0;outline:0;background:transparent}.checkbox-line{display:inline-flex;align-items:center;gap:6px;color:#566373;font-size:13px;white-space:nowrap}.method-tabs{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:6px;margin-top:12px}.method-tabs button{min-height:32px;border:1px solid #d5dce5;border-radius:6px;color:#536171;background:#fff;font-size:12px;font-weight:800}.method-tabs button.active{color:#fff;border-color:#1b6b65;background:#1b6b65}.endpoint-count{margin:12px 2px 8px;color:#6b7582;font-size:13px}.endpoint-list{overflow:auto;display:flex;flex-direction:column;gap:6px;padding-right:4px}.endpoint-item{display:grid;grid-template-columns:64px minmax(0,1fr);align-items:start;gap:10px;width:100%;min-height:66px;padding:10px;border:1px solid transparent;border-radius:7px;text-align:left;background:#fff}.endpoint-item:hover{background:#f6f8fa}.endpoint-item.selected{border-color:#1b6b65;background:#edf7f5}.endpoint-main{min-width:0}.endpoint-main strong,.endpoint-main small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.endpoint-main strong{margin-bottom:4px;color:#1d2732;font-size:14px}.endpoint-main small{color:#647182;font-family:SFMono-Regular,Consolas,monospace;font-size:12px}.method{display:inline-flex;align-items:center;justify-content:center;width:58px;height:24px;border-radius:5px;color:#fff;font-size:11px;font-weight:900}.method-get{background:#246bce}.method-post{background:#168456}.method-put{background:#9a6200}.method-delete{background:#c23131}.method-patch{background:#7953b8}.method-options,.method-head{background:#52606f}.detail-pane{overflow:auto}.opened-api-tabs{position:sticky;top:0;z-index:5;display:flex;align-items:flex-end;gap:4px;overflow-x:auto;overflow-y:hidden;min-height:47px;padding:10px 12px 0;border-bottom:1px solid #dfe5eb;background:#f7f9fb}.opened-api-tab{--tab-accent: #52606f;--tab-soft: #eef2f6;display:inline-grid;grid-template-columns:auto minmax(100px,210px) 20px;align-items:center;gap:7px;min-width:180px;max-width:280px;height:36px;padding:7px 8px 8px;border:1px solid color-mix(in srgb,var(--tab-accent) 45%,#d5dce5);border-bottom-color:#dfe5eb;border-radius:7px 7px 0 0;text-align:left;background:var(--tab-soft);cursor:pointer}.opened-api-tab-get{--tab-accent: #246bce;--tab-soft: #eef5ff}.opened-api-tab-post{--tab-accent: #168456;--tab-soft: #edf8f2}.opened-api-tab-put{--tab-accent: #9a6200;--tab-soft: #fff5e4}.opened-api-tab-delete{--tab-accent: #c23131;--tab-soft: #fff0f0}.opened-api-tab-patch{--tab-accent: #7953b8;--tab-soft: #f4efff}.opened-api-tab-options,.opened-api-tab-head{--tab-accent: #52606f;--tab-soft: #f0f3f6}.opened-api-tab.active{position:relative;margin-bottom:-1px;border-color:var(--tab-accent);border-bottom-color:#fff;background:#fff;box-shadow:inset 0 3px 0 var(--tab-accent)}.opened-api-tab-text{min-width:0}.opened-api-tab-text strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opened-api-tab-text strong{color:#1d2732;font-size:12px;font-weight:800}.opened-api-tab-method{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:18px;padding:0 5px;border-radius:4px;color:#fff;font-size:9px;font-weight:900;line-height:1}.opened-api-tab-close{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:0;border-radius:5px;color:var(--tab-accent);background:transparent;cursor:pointer}.opened-api-tab-close:hover{color:#b63831;background:#fff0ef}.endpoint-detail{padding:22px}.detail-header{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding-bottom:18px;border-bottom:1px solid #e1e6ec}.detail-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.endpoint-title-line{display:flex;align-items:center;gap:10px}.endpoint-title-line h2{margin:0;color:#121923;font-size:22px;line-height:1.25}.path-row{display:flex;align-items:center;gap:8px;min-width:0;margin-top:10px}.path-line{display:block;min-width:0;color:#354253;font-size:13px;white-space:normal;word-break:break-all}.path-copy-button{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;gap:4px;min-height:28px;padding:0 8px;border:1px solid #d4dce5;border-radius:6px;color:#415166;background:#fff;font-size:12px;font-weight:800}.path-copy-button:hover{border-color:#9fb0c1;background:#f7f9fb}.tag-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}.tag-row span{padding:4px 8px;border-radius:5px;color:#475364;background:#edf1f5;font-size:12px;font-weight:700}.description{margin:16px 0 0;color:#4f5c6a;line-height:1.7}.copy-preview{margin-top:18px;border:1px solid #d9e0e7;border-radius:8px;background:#f8fafb}.copy-preview-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px;border-bottom:1px solid #dfe5eb}.copy-tabs{display:inline-flex;gap:4px;padding:3px;border:1px solid #d4dce5;border-radius:7px;background:#fff}.copy-tabs button{display:inline-flex;align-items:center;gap:6px;min-height:30px;padding:0 10px;border:0;border-radius:5px;color:#566373;background:transparent;font-size:13px;font-weight:800}.copy-tabs button.active{color:#fff;background:#1b6b65}.copy-preview-content{overflow:auto;min-height:calc(3 * 1.6em + 28px);max-height:calc(25.6em + 28px);margin:0;padding:14px;color:#e5edf6;background:#111827;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere}.request-tester{display:grid;gap:14px;padding:14px;background:#fff}.endpoint-links-config{display:grid;gap:12px;padding:14px;background:#fff}.links-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.links-actions,.link-editor-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.link-editor-panel{min-width:0}.link-button{text-decoration:none}.request-line{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:end;gap:10px}.request-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}.request-line label,.tester-form-grid label,.param-editor label{display:grid;gap:5px;min-width:0;color:#647182;font-size:12px;font-weight:800}.request-line input,.tester-form-grid input,.tester-form-grid select,.param-editor input{width:100%;min-height:36px;padding:0 10px;border:1px solid #cfd7e1;border-radius:6px;outline:0;color:#15202c;background:#fff}.request-preview{display:block;overflow:hidden;padding:9px 10px;border:1px solid #dfe5eb;border-radius:6px;color:#334254;background:#f7f9fb;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.tester-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.tester-panel{min-width:0;padding:12px;border:1px solid #dfe5eb;border-radius:7px;background:#fbfcfd}.tester-panel-title{display:flex;align-items:center;gap:6px;margin-bottom:10px;color:#243242;font-size:13px;font-weight:900}.tester-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.param-editor+.param-editor{margin-top:12px}.param-editor h4{margin:0 0 8px;color:#516070;font-size:12px}.param-editor label+label{margin-top:8px}.param-editor span{display:inline-flex;align-items:center;gap:3px}.param-editor b{color:#c23131}.tester-panel textarea{width:100%;min-height:168px;resize:vertical;padding:10px;border:1px solid #cfd7e1;border-radius:6px;outline:0;color:#1f2b38;background:#fff;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.5}.tester-panel textarea:disabled{color:#8792a1;background:#f2f5f8}.response-panel{background:#fff}.response-meta-line{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.response-meta-line span{padding:5px 8px;border-radius:5px;color:#536171;background:#eef2f6;font-size:12px;font-weight:800}.response-meta-line .status-ok{color:#176b4f;background:#e5f6ef}.response-meta-line .status-error{color:#a8322b;background:#fff0ef}.response-panel pre{overflow:auto;max-height:360px;margin:0;padding:12px;border-radius:6px;color:#202a36;background:#f7f9fb;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.55}.detail-section{padding:20px 0;border-bottom:1px solid #e8edf2}.section-title{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.section-title h3{margin:0;font-size:16px}.section-title span{min-width:28px;padding:3px 8px;border-radius:999px;color:#1b6b65;background:#e7f4f2;text-align:center;font-size:12px;font-weight:800}.media-block+.media-block,.response-block+.response-block{margin-top:18px}.media-block h4{margin:0 0 8px;color:#516070;font-family:SFMono-Regular,Consolas,monospace;font-size:13px}.response-heading{display:flex;align-items:center;gap:10px;margin-bottom:10px}.response-heading strong{padding:4px 8px;border-radius:5px;color:#fff;background:#202a36;font-size:12px}.response-heading span{color:#657181;font-size:13px}.table-wrap{overflow:auto;border:1px solid #dfe5eb;border-radius:7px}table{width:100%;min-width:920px;border-collapse:collapse;font-size:13px}th,td{padding:10px 12px;border-bottom:1px solid #edf1f4;text-align:left;vertical-align:top}th{position:sticky;top:0;z-index:1;color:#526171;background:#f7f9fb;font-size:12px;font-weight:800}tr:last-child td{border-bottom:0}td code{color:#17202b;font-family:SFMono-Regular,Consolas,monospace;font-size:12px}.muted{margin:0;color:#798596}.inline-error{display:flex;align-items:center;gap:8px;margin-top:12px;padding:10px 12px;border:1px solid #f1c1bd;border-radius:7px;color:#9a2d27;background:#fff4f3}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30;display:grid;place-items:center;padding:20px;background:#1219237a}.import-dialog{width:min(720px,100%);max-height:calc(100vh - 40px);overflow:auto;border-radius:8px;border:1px solid #d7dde4;background:#fff;box-shadow:0 18px 60px #12192338}.auth-dialog{width:min(560px,100%);max-height:calc(100vh - 40px);overflow:auto;border-radius:8px;border:1px solid #d7dde4;background:#fff;box-shadow:0 18px 60px #12192338}.api-config-dialog{width:80vw;min-width:1000px;max-width:80vw;max-height:calc(100vh - 40px);overflow:auto;border-radius:8px;border:1px solid #d7dde4;background:#fff;box-shadow:0 18px 60px #12192338}.import-dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 20px 14px;border-bottom:1px solid #e5eaf0}.import-dialog-header h2{margin:0;font-size:20px}.import-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 10px;border-radius:999px;font-size:12px;font-weight:800;white-space:nowrap}.import-badge.running{color:#8a5b00;background:#fff4d8}.import-badge.success{color:#176b4f;background:#e5f6ef}.import-badge.error{color:#a8322b;background:#fff0ef}.progress-track{height:8px;margin:16px 20px 0;overflow:hidden;border-radius:999px;background:#e9eef3}.progress-bar{height:100%;border-radius:inherit;background:#1b6b65;transition:width .24s ease}.progress-bar.running{background:linear-gradient(90deg,#1b6b65,#4f8fcb)}.progress-bar.success{background:#168456}.progress-bar.error{background:#c23131}.import-summary{display:grid;gap:12px;padding:18px 20px}.auth-dialog-body{display:grid;gap:14px;padding:18px 20px}.api-config-body{display:grid;gap:14px;padding:18px 20px;background:#f7f9fb}.api-config-tabs{display:inline-flex;width:fit-content;gap:4px;padding:3px;border:1px solid #d4dce5;border-radius:7px;background:#fff}.api-config-tabs button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:32px;padding:0 12px;border:0;border-radius:5px;color:#566373;background:transparent;font-size:13px;font-weight:800}.api-config-tabs button.active{color:#fff;background:#1b6b65}.api-config-errors{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid #efcbc8;border-radius:7px;color:#8f2f29;background:#fff7f6}.api-config-errors strong{display:block;margin-bottom:4px;font-size:13px}.api-config-errors p{margin:0;font-size:12px;line-height:1.45}.api-cli-editor{width:100%;min-height:calc(4.65em + 24px);max-height:calc(24.8em + 24px);overflow-y:auto;resize:vertical;padding:12px;border:1px solid #334155;border-radius:7px;outline:0;color:#e5edf6;background:#111827;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;line-height:1.55}.api-cli-editor::placeholder{color:#94a3b8}.api-cli-editor:focus{border-color:#5aa69d;box-shadow:0 0 0 3px #5aa69d38}.api-config-section{display:grid;gap:12px;padding:14px;border:1px solid #dfe5eb;border-radius:8px;background:#fff}.section-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.section-title-row h3{margin:0;color:#243242;font-size:15px}.section-title-row p{margin:4px 0 0;color:#657181;font-size:12px}.section-title-row code{max-width:420px;overflow:hidden;padding:5px 7px;border:1px solid #dce2e9;border-radius:6px;color:#415166;background:#f7f9fb;text-overflow:ellipsis;white-space:nowrap}.api-config-grid{display:grid;grid-template-columns:140px repeat(2,minmax(0,1fr));gap:10px}.api-config-grid.compact{grid-template-columns:repeat(3,minmax(0,1fr)) auto}.api-config-grid label,.field-config-row label{display:grid;gap:5px;min-width:0;color:#647182;font-size:12px;font-weight:800}.api-config-grid input,.api-config-grid select,.api-config-grid textarea,.field-config-row input,.field-config-row select{width:100%;min-height:36px;padding:0 10px;border:1px solid #cfd7e1;border-radius:6px;outline:0;color:#15202c;background:#fff}.api-config-grid textarea{min-height:82px;padding:10px;resize:vertical;line-height:1.45}.span-2{grid-column:span 2}.span-all{grid-column:1 / -1}.inline-check{display:inline-flex;align-items:center;gap:6px;min-height:32px;color:#415166;font-size:13px;font-weight:800}.field-config-table{display:grid;gap:8px;overflow-x:auto}.field-config-item{display:grid;gap:8px}.field-config-head,.field-config-row{display:grid;grid-template-columns:minmax(150px,1.1fr) 120px 58px minmax(180px,1.2fr) minmax(120px,.8fr) 38px;gap:8px;align-items:center;min-width:760px}.field-config-head.with-location,.field-config-row.with-location{grid-template-columns:98px minmax(150px,1.1fr) 120px 58px minmax(180px,1.2fr) minmax(120px,.8fr) 38px}.field-config-head{color:#657181;font-size:12px;font-weight:900}.field-check{place-items:center}.field-check input,.inline-check input{width:16px;min-height:16px}.icon-danger-button{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #efcbc8;border-radius:6px;color:#b63831;background:#fff7f6}.field-add-row{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;border:1px dashed #b8c4d0;border-radius:6px;color:#415166;background:#fbfcfd;font-weight:800}.child-field-config{display:grid;gap:8px;margin-left:18px;padding:10px;border-left:3px solid #b9d7d3;border-radius:0 7px 7px 0;background:#f7fbfa}.child-field-title{color:#415166;font-size:12px;font-weight:900}.response-config{display:grid;gap:10px;padding:12px;border:1px solid #e3e8ee;border-radius:7px;background:#fbfcfd}.auth-message{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border:1px solid #d9e0e7;border-radius:7px;color:#2f3d4d;background:#f7f9fb}.auth-target{display:grid;gap:4px}.auth-target span,.auth-fields label{color:#657181;font-size:12px;font-weight:800}.auth-target strong{overflow-wrap:anywhere;color:#1f2b38;font-family:SFMono-Regular,Consolas,monospace;font-size:13px;line-height:1.5}.auth-fields{display:grid;gap:10px}.auth-fields label{display:grid;gap:6px}.auth-fields input{width:100%;min-height:38px;padding:0 10px;border:1px solid #cfd7e1;border-radius:6px;outline:0;color:#15202c;background:#fff}.import-summary div:not(.import-counts):not(.import-error){display:grid;gap:4px}.import-summary span{color:#657181;font-size:12px;font-weight:700}.import-summary strong{overflow-wrap:anywhere;color:#1f2b38;font-family:SFMono-Regular,Consolas,monospace;font-size:13px;line-height:1.5}.import-counts{display:flex;flex-wrap:wrap;gap:8px}.import-counts span{padding:6px 9px;border-radius:6px;color:#1b6b65;background:#e7f4f2}.import-error{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border:1px solid #f1c1bd;border-radius:7px;color:#9a2d27;background:#fff4f3}.import-dialog-actions{display:flex;justify-content:flex-end;padding:0 20px 18px}.state-screen,.empty-state{display:grid;place-items:center;align-content:center;min-height:100vh;padding:24px;text-align:center}.empty-state{min-height:60vh}.state-icon{width:42px;height:42px;margin-bottom:14px;color:#1b6b65}.state-icon.error{color:#b8312d}.state-screen h1,.empty-state h2{margin-bottom:8px}.spin{animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:980px){.app-shell{padding:12px}.topbar{align-items:flex-start;flex-direction:column}.topbar-actions{width:100%;justify-content:space-between}.version-switcher,.version-switcher select{width:100%}.version-manager{width:100%;min-width:0}.version-item-main,.version-env-editor,.version-env-summary{grid-template-columns:1fr}.version-item-stats,.version-item-actions{justify-content:flex-start}.source-panel{grid-template-columns:1fr}.source-panel-header{align-items:stretch;flex-direction:column}.source-panel-header>.secondary-button,.source-panel-actions,.source-tabs{width:100%}.source-panel-actions{justify-content:stretch}.source-panel-actions .secondary-button{flex:1 1 180px}.source-tabs{flex-wrap:wrap}.source-form,.source-auth,.source-auth-fields,.api-config-grid,.api-config-grid.compact{grid-template-columns:1fr}.span-2,.span-all{grid-column:auto}.workspace{grid-template-columns:1fr;height:auto}.sidebar{max-height:46vh}.detail-pane{min-height:60vh}.detail-header{flex-direction:column}.copy-preview-toolbar{align-items:stretch;flex-direction:column}.copy-tabs,.copy-inline-button{width:100%}.copy-tabs button{flex:1;justify-content:center}.request-line,.tester-grid,.links-grid,.tester-form-grid{grid-template-columns:1fr}}@media(max-width:640px){.filters{grid-template-columns:1fr}.method-tabs{grid-template-columns:repeat(3,minmax(0,1fr))}.topbar-actions,.sync-meta{align-items:stretch;flex-direction:column;width:100%}.primary-button,.secondary-button,.copy-inline-button,.source-tabs{width:100%}.source-tabs button{flex:1}.import-dialog-actions .secondary-button{width:100%}.import-dialog-actions{flex-direction:column-reverse;gap:8px}.endpoint-title-line{align-items:flex-start;flex-direction:column}}
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>API Skill Console</title>
7
+ <script type="module" crossorigin src="/assets/index-DH0wsJCI.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-vocUDpcf.css">
9
+ </head>
10
+ <body>
11
+ <div id="root"></div>
12
+ </body>
13
+ </html>
package/docs/cli.ja.md ADDED
@@ -0,0 +1,90 @@
1
+ # API Skill CLI
2
+
3
+ [English](cli.md) / [中文](cli.zh.md) / [한국어](cli.ko.md) / [日本語](cli.ja.md)
4
+
5
+ ## インストールと実行
6
+
7
+ プロジェクトルートで実行します。
8
+
9
+ ```bash
10
+ npm install
11
+ npm run cli -- --help
12
+ ```
13
+
14
+ 実行ファイルを直接実行することもできます。
15
+
16
+ ```bash
17
+ node scripts/apiskill-cli.mjs --help
18
+ ```
19
+
20
+ ## ドキュメントのインポート
21
+
22
+ 利用可能なキャッシュがあるか確認します。
23
+
24
+ ```bash
25
+ npm run cli -- check
26
+ npm run cli -- check --json
27
+ ```
28
+
29
+ 利用可能なキャッシュがない場合、`check` はインポート例を出力します。
30
+
31
+ ```bash
32
+ npm run cli -- import https://example.com/openapi.json
33
+ npm run cli -- crawl https://example.com/swagger
34
+ npm run cli -- import-file ./openapi.yaml
35
+ npm run cli -- import-curl --file ./request.curl
36
+ ```
37
+
38
+ ドキュメントのエンドポイントに basic auth が必要な場合は、`import` または `crawl` に `--auth username:password` を追加します。
39
+
40
+ ## ゼロからドキュメントを作成
41
+
42
+ まだ上流 OpenAPI ドキュメントがない場合は、空白のローカルドキュメントバージョンを作成します。
43
+
44
+ ```bash
45
+ npm run cli -- document create --title "My API" --doc-version 1.0.0
46
+ npm run cli -- document create --title "My API" --doc-version 1.0.0 --description "Internal service contract" --json
47
+ ```
48
+
49
+ 作成されたドキュメントは最新キャッシュバージョンとして保存されます。その後、`api create --version <versionId>` でエンドポイントを追加できます。空白ドキュメントがすでに最新バージョンなら `--version` は省略できます。
50
+
51
+ ## バージョンと API の照会
52
+
53
+ ```bash
54
+ npm run cli -- versions
55
+ npm run cli -- versions --json
56
+ npm run cli -- query /admin/api/v1/user/list --method GET
57
+ npm run cli -- query user --method POST --limit 10
58
+ npm run cli -- api list --query user --method post
59
+ npm run cli -- api query GET /api/v1/user --format cli
60
+ ```
61
+
62
+ `query` は MCP の `apiskill_query_api` ツールと同じ動作です。正確な単一一致では 1 つの API 設定を返し、複数一致では候補一覧を返します。
63
+
64
+ ## 手動 API の作成、編集、削除
65
+
66
+ ```bash
67
+ npm run cli -- api create --file ./api-config.yaml
68
+ npm run cli -- api edit GET /api/v1/user --file ./api-config.json --version 20260429T000000Z-manual-user
69
+ npm run cli -- api delete GET /api/v1/user --version 20260429T000000Z-manual-user
70
+ ```
71
+
72
+ CLI 設定は JSON または YAML を使用でき、ルートキーとして `api`、`config`、`operation` をサポートします。
73
+
74
+ 最小 JSON 例:
75
+
76
+ ```json
77
+ {
78
+ "api": {
79
+ "method": "post",
80
+ "path": "/api/v1/example",
81
+ "summary": "例を作成",
82
+ "responses": [
83
+ {
84
+ "status": "200",
85
+ "description": "Success"
86
+ }
87
+ ]
88
+ }
89
+ }
90
+ ```
package/docs/cli.ko.md ADDED
@@ -0,0 +1,90 @@
1
+ # API Skill CLI
2
+
3
+ [English](cli.md) / [中文](cli.zh.md) / [한국어](cli.ko.md) / [日本語](cli.ja.md)
4
+
5
+ ## 설치 및 실행
6
+
7
+ 프로젝트 루트에서 실행합니다.
8
+
9
+ ```bash
10
+ npm install
11
+ npm run cli -- --help
12
+ ```
13
+
14
+ 실행 파일을 직접 실행할 수도 있습니다.
15
+
16
+ ```bash
17
+ node scripts/apiskill-cli.mjs --help
18
+ ```
19
+
20
+ ## 문서 가져오기
21
+
22
+ 사용 가능한 캐시가 있는지 먼저 확인합니다.
23
+
24
+ ```bash
25
+ npm run cli -- check
26
+ npm run cli -- check --json
27
+ ```
28
+
29
+ 사용 가능한 캐시가 없으면 `check`가 가져오기 예시를 출력합니다.
30
+
31
+ ```bash
32
+ npm run cli -- import https://example.com/openapi.json
33
+ npm run cli -- crawl https://example.com/swagger
34
+ npm run cli -- import-file ./openapi.yaml
35
+ npm run cli -- import-curl --file ./request.curl
36
+ ```
37
+
38
+ 문서 엔드포인트에 basic auth가 필요하면 `import` 또는 `crawl`에 `--auth username:password`를 추가합니다.
39
+
40
+ ## 처음부터 문서 만들기
41
+
42
+ 아직 상위 OpenAPI 문서가 없다면 빈 로컬 문서 버전을 먼저 생성합니다.
43
+
44
+ ```bash
45
+ npm run cli -- document create --title "My API" --doc-version 1.0.0
46
+ npm run cli -- document create --title "My API" --doc-version 1.0.0 --description "Internal service contract" --json
47
+ ```
48
+
49
+ 생성된 문서는 최신 캐시 버전으로 저장됩니다. 이후 `api create --version <versionId>`로 엔드포인트를 추가하거나, 빈 문서가 이미 최신 버전이면 `--version`을 생략할 수 있습니다.
50
+
51
+ ## 버전과 API 조회
52
+
53
+ ```bash
54
+ npm run cli -- versions
55
+ npm run cli -- versions --json
56
+ npm run cli -- query /admin/api/v1/user/list --method GET
57
+ npm run cli -- query user --method POST --limit 10
58
+ npm run cli -- api list --query user --method post
59
+ npm run cli -- api query GET /api/v1/user --format cli
60
+ ```
61
+
62
+ `query`는 MCP의 `apiskill_query_api` 도구와 같은 방식으로 동작합니다. 정확한 단일 매치가 있으면 하나의 API 설정을 반환하고, 여러 개가 매치되면 후보 목록을 반환합니다.
63
+
64
+ ## 수동 API 생성, 편집, 삭제
65
+
66
+ ```bash
67
+ npm run cli -- api create --file ./api-config.yaml
68
+ npm run cli -- api edit GET /api/v1/user --file ./api-config.json --version 20260429T000000Z-manual-user
69
+ npm run cli -- api delete GET /api/v1/user --version 20260429T000000Z-manual-user
70
+ ```
71
+
72
+ CLI 설정은 JSON 또는 YAML을 사용할 수 있으며 루트 키로 `api`, `config`, `operation`을 지원합니다.
73
+
74
+ 최소 JSON 예시:
75
+
76
+ ```json
77
+ {
78
+ "api": {
79
+ "method": "post",
80
+ "path": "/api/v1/example",
81
+ "summary": "예시 생성",
82
+ "responses": [
83
+ {
84
+ "status": "200",
85
+ "description": "Success"
86
+ }
87
+ ]
88
+ }
89
+ }
90
+ ```
package/docs/cli.md ADDED
@@ -0,0 +1,117 @@
1
+ # API Skill CLI
2
+
3
+ [English](cli.md) / [中文](cli.zh.md) / [한국어](cli.ko.md) / [日本語](cli.ja.md)
4
+
5
+ ## Install And Run
6
+
7
+ After installing from npm, use the `apiskill` executable directly:
8
+
9
+ ```bash
10
+ npm install -g apiskill
11
+ apiskill --help
12
+ apiskill run web
13
+ ```
14
+
15
+ `apiskill run web` starts the web console and writes cache data to `cache/` under the current directory by default. Use `--port`, `--host`, `--cwd`, or `--cache-dir` to adjust startup paths:
16
+
17
+ ```bash
18
+ apiskill run web --port 8890
19
+ apiskill run web --cwd /path/to/project --cache-dir .apiskill-cache
20
+ ```
21
+
22
+ From the source project root:
23
+
24
+ ```bash
25
+ npm install
26
+ npm run cli -- --help
27
+ ```
28
+
29
+ You can also run the executable directly:
30
+
31
+ ```bash
32
+ node scripts/apiskill-cli.mjs --help
33
+ ```
34
+
35
+ ## Import Documents
36
+
37
+ Check whether a usable cache is available:
38
+
39
+ ```bash
40
+ npm run cli -- check
41
+ npm run cli -- check --json
42
+ ```
43
+
44
+ If no cache exists, `check` prints import examples.
45
+
46
+ ```bash
47
+ npm run cli -- import https://example.com/openapi.json
48
+ npm run cli -- crawl https://example.com/swagger
49
+ npm run cli -- import-file ./openapi.yaml
50
+ npm run cli -- import-curl --file ./request.curl
51
+ ```
52
+
53
+ Use `--auth username:password` with `import` or `crawl` when the document endpoint requires basic auth.
54
+
55
+ ## Create A Document From Scratch
56
+
57
+ When there is no upstream OpenAPI document yet, create a blank local document version:
58
+
59
+ ```bash
60
+ npm run cli -- document create --title "My API" --doc-version 1.0.0
61
+ npm run cli -- document create --title "My API" --doc-version 1.0.0 --description "Internal service contract" --json
62
+ ```
63
+
64
+ The created document is saved as the latest cached version. Add endpoints to it with `api create --version <versionId>` or omit `--version` when the blank document is already latest.
65
+
66
+ ## Query Versions And APIs
67
+
68
+ ```bash
69
+ npm run cli -- versions
70
+ npm run cli -- versions --json
71
+ npm run cli -- query /admin/api/v1/user/list --method GET
72
+ npm run cli -- query user --method POST --limit 10
73
+ npm run cli -- api list --query user --method post
74
+ npm run cli -- api query GET /api/v1/user --format cli
75
+ ```
76
+
77
+ `query` behaves like the MCP `apiskill_query_api` tool: exact single matches return one API config, while multiple matches return candidates.
78
+
79
+ ## Start A MOCK Server
80
+
81
+ After an API document is cached, start a local MOCK API server:
82
+
83
+ ```bash
84
+ apiskill mock
85
+ apiskill mock --port 4010
86
+ apiskill mock --version <versionId>
87
+ ```
88
+
89
+ The MOCK server generates local API routes from the current OpenAPI paths, HTTP methods, and response schemas. Calling a matching API returns random JSON data. If no API document has been imported, crawled, or created yet, the command prints a friendly setup prompt.
90
+
91
+ ## Create, Edit, And Delete Manual APIs
92
+
93
+ ```bash
94
+ npm run cli -- api create --file ./api-config.yaml
95
+ npm run cli -- api edit GET /api/v1/user --file ./api-config.json --version 20260429T000000Z-manual-user
96
+ npm run cli -- api delete GET /api/v1/user --version 20260429T000000Z-manual-user
97
+ ```
98
+
99
+ CLI config can be JSON or YAML with root key `api`, `config`, or `operation`.
100
+
101
+ Minimal JSON example:
102
+
103
+ ```json
104
+ {
105
+ "api": {
106
+ "method": "post",
107
+ "path": "/api/v1/example",
108
+ "summary": "Create example",
109
+ "responses": [
110
+ {
111
+ "status": "200",
112
+ "description": "Success"
113
+ }
114
+ ]
115
+ }
116
+ }
117
+ ```
package/docs/cli.zh.md ADDED
@@ -0,0 +1,117 @@
1
+ # API Skill CLI
2
+
3
+ [English](cli.md) / [中文](cli.zh.md) / [한국어](cli.ko.md) / [日本語](cli.ja.md)
4
+
5
+ ## 安装和运行
6
+
7
+ 从 npm 安装后可以直接使用 `apiskill`:
8
+
9
+ ```bash
10
+ npm install -g apiskill
11
+ apiskill --help
12
+ apiskill run web
13
+ ```
14
+
15
+ `apiskill run web` 会启动 Web 控制台,默认把缓存写入当前目录的 `cache/`。可以用 `--port`、`--host`、`--cwd` 或 `--cache-dir` 调整启动参数:
16
+
17
+ ```bash
18
+ apiskill run web --port 8890
19
+ apiskill run web --cwd /path/to/project --cache-dir .apiskill-cache
20
+ ```
21
+
22
+ 在源码项目根目录运行:
23
+
24
+ ```bash
25
+ npm install
26
+ npm run cli -- --help
27
+ ```
28
+
29
+ 也可以直接运行:
30
+
31
+ ```bash
32
+ node scripts/apiskill-cli.mjs --help
33
+ ```
34
+
35
+ ## 导入文档
36
+
37
+ 先检查当前是否有可用缓存:
38
+
39
+ ```bash
40
+ npm run cli -- check
41
+ npm run cli -- check --json
42
+ ```
43
+
44
+ 如果没有可用缓存,`check` 会输出导入文档的示例。
45
+
46
+ ```bash
47
+ npm run cli -- import https://example.com/openapi.json
48
+ npm run cli -- crawl https://example.com/swagger
49
+ npm run cli -- import-file ./openapi.yaml
50
+ npm run cli -- import-curl --file ./request.curl
51
+ ```
52
+
53
+ 如果文档地址需要 basic auth,`import` 和 `crawl` 可以加 `--auth username:password`。
54
+
55
+ ## 从零创建文档
56
+
57
+ 如果还没有上游 OpenAPI 文档,可以先创建一份本地空白文档版本:
58
+
59
+ ```bash
60
+ npm run cli -- document create --title "My API" --doc-version 1.0.0
61
+ npm run cli -- document create --title "My API" --doc-version 1.0.0 --description "Internal service contract" --json
62
+ ```
63
+
64
+ 创建后的文档会保存为最新缓存版本。后续可以用 `api create --version <versionId>` 追加接口;如果空白文档已经是最新版本,也可以省略 `--version`。
65
+
66
+ ## 查询版本和接口
67
+
68
+ ```bash
69
+ npm run cli -- versions
70
+ npm run cli -- versions --json
71
+ npm run cli -- query /admin/api/v1/user/list --method GET
72
+ npm run cli -- query user --method POST --limit 10
73
+ npm run cli -- api list --query user --method post
74
+ npm run cli -- api query GET /api/v1/user --format cli
75
+ ```
76
+
77
+ `query` 和 MCP 的 `apiskill_query_api` 行为一致:精确单条匹配时返回一个接口配置,多条匹配时返回候选列表。
78
+
79
+ ## 启动 MOCK 服务
80
+
81
+ 已有 API 文档缓存后,可以启动本地 MOCK API 服务:
82
+
83
+ ```bash
84
+ apiskill mock
85
+ apiskill mock --port 4010
86
+ apiskill mock --version <versionId>
87
+ ```
88
+
89
+ MOCK 服务会根据当前 OpenAPI 文档里的接口路径、HTTP 方法和响应 schema 自动生成本地 API。访问对应接口时会返回随机 JSON 数据;如果还没有导入、爬取或创建 API 文档,会提示先准备文档数据。
90
+
91
+ ## 创建、编辑、删除手动接口
92
+
93
+ ```bash
94
+ npm run cli -- api create --file ./api-config.yaml
95
+ npm run cli -- api edit GET /api/v1/user --file ./api-config.json --version 20260429T000000Z-manual-user
96
+ npm run cli -- api delete GET /api/v1/user --version 20260429T000000Z-manual-user
97
+ ```
98
+
99
+ CLI 配置可以是 JSON 或 YAML,根字段支持 `api`、`config` 或 `operation`。
100
+
101
+ 最小 JSON 示例:
102
+
103
+ ```json
104
+ {
105
+ "api": {
106
+ "method": "post",
107
+ "path": "/api/v1/example",
108
+ "summary": "创建示例",
109
+ "responses": [
110
+ {
111
+ "status": "200",
112
+ "description": "Success"
113
+ }
114
+ ]
115
+ }
116
+ }
117
+ ```
package/docs/mcp.ja.md ADDED
@@ -0,0 +1,79 @@
1
+ # API Skill MCP
2
+
3
+ [English](mcp.md) / [中文](mcp.zh.md) / [한국어](mcp.ko.md) / [日本語](mcp.ja.md)
4
+
5
+ ## ローカル Codex 設定
6
+
7
+ API Skill は stdio MCP サーバーとして実行されます。
8
+
9
+ ```bash
10
+ node /Users/dobby/dev/apiskill/scripts/mcp-server.mjs
11
+ ```
12
+
13
+ 次の設定を `/Users/dobby/.codex/config.toml` に追加します。Codex クライアントがプロジェクト設定を読む場合は、プロジェクトレベルの `.codex/config.toml` をそのまま使うこともできます。
14
+
15
+ ```toml
16
+ [mcp_servers.apiskill]
17
+ command = "node"
18
+ args = ["/Users/dobby/dev/apiskill/scripts/mcp-server.mjs"]
19
+ cwd = "/Users/dobby/dev/apiskill"
20
+ startup_timeout_sec = 10
21
+ tool_timeout_sec = 60
22
+ enabled = true
23
+
24
+ [mcp_servers.apiskill.env]
25
+ APISKILL_ROOT = "/Users/dobby/dev/apiskill"
26
+ APISKILL_CACHE_DIR = "/Users/dobby/dev/apiskill/cache"
27
+ ```
28
+
29
+ Codex を再起動して `/mcp` を実行します。`apiskill` と以下のツールが表示されるはずです。
30
+
31
+ ## 読み取りツール
32
+
33
+ - `apiskill_check`: 利用可能なキャッシュ済み OpenAPI ドキュメントがあるか確認し、ない場合はインポート例を返します。
34
+ - `apiskill_help`: MCP ヘルプ、利用可能なツール、インポート例を表示します。
35
+ - `apiskill_list_versions`: キャッシュ済みバージョンを一覧表示します。
36
+ - `apiskill_search_endpoints`: エンドポイント概要を検索します。
37
+ - `apiskill_query_api`: CLI 相当の query です。単一一致では JSON、raw endpoint data、CLI config を返せます。
38
+ - `apiskill_get_endpoint`: 1 つのエンドポイントについて、パラメータ、リクエストボディ、レスポンス、手動設定、任意の raw operation を取得します。
39
+ - `apiskill_get_ai_context`: AI が使いやすい Markdown を取得します。
40
+ - `apiskill_get_schema`: 指定 schema を展開します。
41
+
42
+ ## 書き込みツール
43
+
44
+ 以下のツールは `cache/latest-import.json` と `cache/versions/` を変更します。
45
+
46
+ - `apiskill_import_url`: 直接 OpenAPI JSON/YAML URL をインポートします。
47
+ - `apiskill_crawl_openapi`: Swagger UI / Knife4j / Redoc をクロールし、見つかったドキュメントをインポートします。
48
+ - `apiskill_import_file`: ローカル JSON/YAML ファイルをインポートします。
49
+ - `apiskill_import_curl`: curl コマンドを実行し、その OpenAPI レスポンスをインポートします。
50
+ - `apiskill_create_document`: ゼロから API ドキュメントを作成するための空白 OpenAPI ドキュメントバージョンを作成します。
51
+ - `apiskill_create_api`: 手動 API 操作を作成します。
52
+ - `apiskill_edit_api`: 手動 API 操作を編集/置換します。
53
+ - `apiskill_delete_api`: API 操作を削除します。
54
+
55
+ ## ゼロから作成
56
+
57
+ プロジェクトにまだ上流ドキュメントがない場合は、まず agent に `apiskill_create_document` を呼び出させます。
58
+
59
+ ```json
60
+ {
61
+ "title": "My API",
62
+ "version": "1.0.0",
63
+ "description": "Internal service contract"
64
+ }
65
+ ```
66
+
67
+ その後、`apiskill_create_api` でエンドポイントを追加し、`apiskill_edit_api` で編集し、`apiskill_get_endpoint` または `apiskill_query_api` で確認します。これにより、第三者の OpenAPI ソースがなくても AI ツールでローカル API 契約を作成し継続管理できます。
68
+
69
+ ## 検証
70
+
71
+ ```bash
72
+ npm run mcp
73
+ ```
74
+
75
+ プロトコルレベルで検証するには、サーバーを initialize し、`tools/list`、`apiskill_check`、`apiskill_list_versions` を順に呼び出します。サーバーは `serverInfo.name = apiskill-mcp` を返し、`apiskill_*` ツールを一覧表示するはずです。
76
+
77
+ ## 将来のサーバー配備
78
+
79
+ 現在の構成はローカル stdio です。サーバー配備では、SSH/リモート実行経由で同じ stdio サーバーを起動し、サーバー側の `APISKILL_ROOT` と `APISKILL_CACHE_DIR` を設定するか、同じ shared core モジュールを呼び出す Streamable HTTP MCP wrapper を追加できます。ツール名と payload の意味は安定させてください。
package/docs/mcp.ko.md ADDED
@@ -0,0 +1,79 @@
1
+ # API Skill MCP
2
+
3
+ [English](mcp.md) / [中文](mcp.zh.md) / [한국어](mcp.ko.md) / [日本語](mcp.ja.md)
4
+
5
+ ## 로컬 Codex 설정
6
+
7
+ API Skill은 stdio MCP 서버로 실행됩니다.
8
+
9
+ ```bash
10
+ node /Users/dobby/dev/apiskill/scripts/mcp-server.mjs
11
+ ```
12
+
13
+ 다음 설정을 `/Users/dobby/.codex/config.toml`에 추가합니다. Codex 클라이언트가 프로젝트 설정을 읽는다면 프로젝트 수준 `.codex/config.toml`을 유지할 수도 있습니다.
14
+
15
+ ```toml
16
+ [mcp_servers.apiskill]
17
+ command = "node"
18
+ args = ["/Users/dobby/dev/apiskill/scripts/mcp-server.mjs"]
19
+ cwd = "/Users/dobby/dev/apiskill"
20
+ startup_timeout_sec = 10
21
+ tool_timeout_sec = 60
22
+ enabled = true
23
+
24
+ [mcp_servers.apiskill.env]
25
+ APISKILL_ROOT = "/Users/dobby/dev/apiskill"
26
+ APISKILL_CACHE_DIR = "/Users/dobby/dev/apiskill/cache"
27
+ ```
28
+
29
+ Codex를 재시작하고 `/mcp`를 실행합니다. `apiskill`과 아래 도구들이 보여야 합니다.
30
+
31
+ ## 읽기 도구
32
+
33
+ - `apiskill_check`: 사용 가능한 캐시된 OpenAPI 문서가 있는지 확인하고, 없으면 가져오기 예시를 반환합니다.
34
+ - `apiskill_help`: MCP 도움말, 사용 가능한 도구, 가져오기 예시를 표시합니다.
35
+ - `apiskill_list_versions`: 캐시된 버전을 나열합니다.
36
+ - `apiskill_search_endpoints`: 엔드포인트 요약을 검색합니다.
37
+ - `apiskill_query_api`: CLI와 같은 query입니다. 단일 매치는 JSON, raw endpoint data, CLI config를 반환할 수 있습니다.
38
+ - `apiskill_get_endpoint`: 하나의 엔드포인트에 대해 파라미터, 요청 본문, 응답, 수동 설정, 선택적 raw operation을 가져옵니다.
39
+ - `apiskill_get_ai_context`: AI가 사용하기 좋은 Markdown을 가져옵니다.
40
+ - `apiskill_get_schema`: 이름 있는 schema를 펼칩니다.
41
+
42
+ ## 쓰기 도구
43
+
44
+ 아래 도구는 `cache/latest-import.json`과 `cache/versions/`를 수정합니다.
45
+
46
+ - `apiskill_import_url`: 직접 OpenAPI JSON/YAML URL을 가져옵니다.
47
+ - `apiskill_crawl_openapi`: Swagger UI / Knife4j / Redoc을 크롤링하고 발견한 문서를 가져옵니다.
48
+ - `apiskill_import_file`: 로컬 JSON/YAML 파일을 가져옵니다.
49
+ - `apiskill_import_curl`: curl 명령을 실행하고 그 OpenAPI 응답을 가져옵니다.
50
+ - `apiskill_create_document`: 처음부터 API 문서를 작성하기 위한 빈 OpenAPI 문서 버전을 생성합니다.
51
+ - `apiskill_create_api`: 수동 API 작업을 생성합니다.
52
+ - `apiskill_edit_api`: 수동 API 작업을 편집/교체합니다.
53
+ - `apiskill_delete_api`: API 작업을 삭제합니다.
54
+
55
+ ## 처음부터 작성하기
56
+
57
+ 프로젝트에 아직 상위 문서가 없다면 agent에게 먼저 `apiskill_create_document`를 호출하게 합니다.
58
+
59
+ ```json
60
+ {
61
+ "title": "My API",
62
+ "version": "1.0.0",
63
+ "description": "Internal service contract"
64
+ }
65
+ ```
66
+
67
+ 그 다음 `apiskill_create_api`로 엔드포인트를 추가하고, `apiskill_edit_api`로 수정하며, `apiskill_get_endpoint` 또는 `apiskill_query_api`로 확인합니다. 이렇게 하면 제3자 OpenAPI 소스가 없어도 AI 도구가 로컬 API 계약을 생성하고 지속적으로 관리할 수 있습니다.
68
+
69
+ ## 검증
70
+
71
+ ```bash
72
+ npm run mcp
73
+ ```
74
+
75
+ 프로토콜 수준 검증은 서버를 initialize한 뒤 `tools/list`, `apiskill_check`, `apiskill_list_versions`를 차례로 호출하면 됩니다. 서버는 `serverInfo.name = apiskill-mcp`를 반환하고 `apiskill_*` 도구를 나열해야 합니다.
76
+
77
+ ## 향후 서버 배포
78
+
79
+ 현재 구성은 로컬 stdio입니다. 서버 배포에서는 SSH/원격 실행기를 통해 같은 stdio 서버를 시작하고 서버 측 `APISKILL_ROOT`와 `APISKILL_CACHE_DIR`를 설정하거나, 같은 shared core 모듈을 호출하는 Streamable HTTP MCP wrapper를 추가할 수 있습니다. 도구 이름과 payload 의미는 안정적으로 유지하세요.