Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions skills/working-with-claude-code/scripts/update_docs.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,38 @@ const https = require('https');
const fs = require('fs');
const path = require('path');

const LLMS_TXT_URL = 'https://docs.claude.com/llms.txt';
const CLAUDE_CODE_PATTERN = /https:\/\/docs\.claude\.com\/en\/docs\/claude-code\/[^\s)]+\.md/g;
const LLMS_TXT_URL = 'https://code.claude.com/llms.txt';
const CLAUDE_CODE_PATTERN = /https:\/\/code\.claude\.com\/docs\/en\/[^\s)]+\.md/g;
const DOC_PATH_PREFIX = '/docs/en/';
const REFERENCES_DIR = path.join(__dirname, '..', 'references');

/**
* Fetch content from a URL using https module
*/
function fetchUrl(url) {
function fetchUrl(url, redirectsLeft = 5) {
return new Promise((resolve, reject) => {
https.get(url, (res) => {
const { statusCode, headers } = res;

// Follow redirects - docs.claude.com moved to code.claude.com
if (statusCode >= 300 && statusCode < 400 && headers.location) {
res.resume();
if (redirectsLeft === 0) {
reject(new Error(`Too many redirects for ${url}`));
return;
}
const next = new URL(headers.location, url).toString();
resolve(fetchUrl(next, redirectsLeft - 1));
return;
}

let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
if (res.statusCode >= 200 && res.statusCode < 300) {
if (statusCode >= 200 && statusCode < 300) {
resolve(data);
} else {
reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`));
reject(new Error(`HTTP ${statusCode}: ${res.statusMessage}`));
}
});
}).on('error', reject);
Expand Down Expand Up @@ -57,7 +72,12 @@ async function getClaudeCodeUrls() {
* Fetch and save a single documentation page
*/
async function fetchAndSaveDoc(url) {
const filename = path.basename(url);
// Flatten nested doc paths (agent-sdk/hooks.md -> agent-sdk-hooks.md) so
// sibling sections don't clobber each other's basenames.
const idx = url.indexOf(DOC_PATH_PREFIX);
const filename = idx === -1
? path.basename(url)
: url.slice(idx + DOC_PATH_PREFIX.length).replace(/\//g, '-');
const filepath = path.join(REFERENCES_DIR, filename);

try {
Expand Down