[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ACVM32H3JCFFPKER3QBAZS":3,"skill-same:01M6ACVM32H3JCFFPKER3QBAZS":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":27,"linkOnly":28,"markdownContent":29,"markdownBody":30,"frontMatter":31,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":38,"ownerHtmlUrl":39,"ownerBlogUrl":40,"ownerDescription":6,"updatedAt":41,"install":42,"resources":54},"01M6ACVM32H3JCFFPKER3QBAZS","apt",null,"Add released versions of Apache SkyWalking AI Sessionizer to its apt repository, static\u002Fapt in apache\u002Fskywalking-website, which the website serves at https:\u002F\u002Fskywalking.apache.org\u002Fapt. Verifies the voted .deb packages, adds them to the index with apt-ftparchive, signs the index with the release manager's key, writes the .htaccess redirects, installs through them with apt, and opens a pull request to apache\u002Fskywalking-website. Use after a version is published.","apache\u002Fskywalking-ai-sessionizer","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6ACVHXQ7BE01KYH7G6ZZ2Y9",7,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-ai-sessionizer\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fapt\u002FSKILL.md",[],[5,19,20,21,22,9,23,24,25,26],"pull request","packages","release","pull","skywalking","index","website","https","2026-11-10 10:12:30",false,"---\nname: apt\ndescription: Add released versions of Apache SkyWalking AI Sessionizer to its apt repository, static\u002Fapt in apache\u002Fskywalking-website, which the website serves at https:\u002F\u002Fskywalking.apache.org\u002Fapt. Verifies the voted .deb packages, adds them to the index with apt-ftparchive, signs the index with the release manager's key, writes the .htaccess redirects, installs through them with apt, and opens a pull request to apache\u002Fskywalking-website. Use after a version is published.\nuser-invocable: true\n---\n\n# apt repository\n\n`static\u002Fapt` in apache\u002Fskywalking-website is served at `https:\u002F\u002Fskywalking.apache.org\u002Fapt`. It\nholds no package, only files that describe them:\n\n- `dists\u002Fstable\u002Fmain\u002Fbinary-amd64\u002FPackages` and `binary-arm64\u002FPackages`, each with `Packages.gz`.\n  They list every released version of each package. The recorder's package is `asz-claude-code` up\n  to 0.4.0 and `asz-changes` from 0.5.0, so a repository that spans the rename lists both. Each\n  entry's `Filename` is\n  `pool\u002F\u003Cpackage>_\u003Cversion>_\u003Carch>.deb`.\n- `dists\u002Fstable\u002FRelease`, which names the hashes of the `Packages` files, and its signatures\n  `InRelease` and `Release.gpg`, by a key in KEYS.\n- `.htaccess`, one redirect for each `pool\u002F` path, to the voted `.deb` on the Apache download sites.\n  The newest version goes through the mirrors. Every older one goes to archive.apache.org, which\n  keeps every version. apt follows the redirect and checks the file against `Packages`.\n\nUsers run:\n\n```sh\nsudo apt install asz asz-changes\nsudo apt install asz=0.4.0 asz-claude-code=0.4.0   # the recorder's package name before 0.5.0\n```\n\nThe user names one version or several. Each must be released and on the download site or the\narchive. 0.4.0 is the first version with Debian packages. Do this at least one hour after the\nversion moved to the release directory, so the mirrors have it. It needs docker, gpg, curl and\nshasum. It changes nothing but a pull request to apache\u002Fskywalking-website.\n\nThe index is signed with the user's own key, which must be in\nhttps:\u002F\u002Fdownloads.apache.org\u002Fskywalking\u002FKEYS. Ask which key to use if the user has not said, and\nnever sign with a key they did not name. gpg may ask for the passphrase in a window of its own.\n\nA local proxy can break HTTPS to Apache hosts, so the commands below go around it.\n\n## 1. Branch the website\n\n```sh\ngit -C ~\u002Fgithub\u002Fskywalking-website fetch origin\ngit -C ~\u002Fgithub\u002Fskywalking-website worktree add -b apt-\u003Cversions> \u003Cscratch dir>\u002Fwebsite origin\u002Fmaster\nAPT=\u003Cscratch dir>\u002Fwebsite\u002Fstatic\u002Fapt\nW=\u003Cscratch dir>\u002Fapt\nmkdir -p \"$W\u002Fpool\"\n```\n\nA version already in the index is never added again, because a published package never changes.\nIf this prints anything, drop that version and tell the user:\n\n```sh\nfor v in \u003Cversions>; do grep -h \"^Filename: pool\u002F.*_${v}_\" \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages 2>\u002Fdev\u002Fnull; done\n```\n\n## 2. Download and verify the packages\n\nEach `.deb` must match its voted `.sha512`, and its `.asc` must be a good signature by a key in\nKEYS. apt reads KEYS the same way the install page has a person read it, with `gpg --dearmor`.\n\n```sh\ncurl --noproxy '*' -fsSL -o \"$W\u002FKEYS\" https:\u002F\u002Fdownloads.apache.org\u002Fskywalking\u002FKEYS\ngpg --dearmor \u003C \"$W\u002FKEYS\" > \"$W\u002Fkeys.gpg\"\n# Which packages a version published depends on when it was released.\n# 0.5.0 renamed the recorder's package: asz-claude-code up to 0.4.x, and\n# asz-changes from 0.5.0. No version publishes both, so asking for both\n# fails the download on every version.\npackages_of() {\n  case \"$1\" in\n    0.1.*|0.2.*|0.3.*|0.4.*) echo \"asz asz-claude-code\" ;;\n    *) echo \"asz asz-changes\" ;;\n  esac\n}\nfor v in \u003Cversions>; do\n  for p in $(packages_of \"$v\"); do\n    for a in amd64 arm64; do\n      f=apache-skywalking-ai-sessionizer-$v-bin-$p-$a.deb\n      for g in \"$f\" \"$f.sha512\" \"$f.asc\"; do\n        curl --noproxy '*' -fsSL -o \"$W\u002F$g\" \"https:\u002F\u002Fdownloads.apache.org\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$g\" ||\n          curl --noproxy '*' -fsSL -o \"$W\u002F$g\" \"https:\u002F\u002Farchive.apache.org\u002Fdist\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$g\"\n      done\n      (cd \"$W\" && shasum -a 512 -c \"$f.sha512\")\n      gpgv --keyring \"$W\u002Fkeys.gpg\" \"$W\u002F$f.asc\" \"$W\u002F$f\"\n      cp \"$W\u002F$f\" \"$W\u002Fpool\u002F${p}_${v}_${a}.deb\"\n    done\n  done\ndone\n```\n\nStop at the first failure and tell the user.\n\n## 3. Add them to the index\n\n`apt-ftparchive`, from Debian's `apt-utils`, writes the entries of the new packages, which are\nadded to each `Packages` file, and then writes `Release` from all of them. The old signatures no\nlonger match, so they go.\n\n```sh\nmkdir -p \"$APT\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-amd64\" \"$APT\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-arm64\"\nrm -f \"$APT\u002Fdists\u002Fstable\u002FRelease\" \"$APT\u002Fdists\u002Fstable\u002FInRelease\" \"$APT\u002Fdists\u002Fstable\u002FRelease.gpg\"\ndocker run --rm -v \"$W:\u002Fwork\" -v \"$APT:\u002Fapt\" debian:stable bash -euc '\n  apt-get update -qq && apt-get install -y -qq apt-utils > \u002Fdev\u002Fnull\n  cd \u002Fwork\n  for a in amd64 arm64; do\n    apt-ftparchive --arch \"$a\" packages pool >> \"\u002Fapt\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-$a\u002FPackages\"\n    gzip -9nc \"\u002Fapt\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-$a\u002FPackages\" > \"\u002Fapt\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-$a\u002FPackages.gz\"\n  done\n  cd \u002Fapt\u002Fdists\u002Fstable\n  apt-ftparchive \\\n    -o APT::FTPArchive::Release::Origin=\"Apache SkyWalking\" \\\n    -o APT::FTPArchive::Release::Label=\"Apache SkyWalking AI Sessionizer\" \\\n    -o APT::FTPArchive::Release::Suite=stable \\\n    -o APT::FTPArchive::Release::Codename=stable \\\n    -o APT::FTPArchive::Release::Architectures=\"amd64 arm64\" \\\n    -o APT::FTPArchive::Release::Components=main \\\n    release . > \u002Fwork\u002FRelease\n  cp \u002Fwork\u002FRelease Release'\ngrep -c '^Package:' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages\n```\n\nEach `Packages` file must have two more entries for each version added.\n\n## 4. Write the redirects\n\n`.htaccess` is written again from the `Packages` files, so every entry has exactly one rule, and\nthe newest version is the one on the mirrors:\n\n```sh\nnewest=$(sed -n 's\u002F^Version: \u002F\u002Fp' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages | sort -uV | tail -1)\n{\n  echo \"# The apt repository of Apache SkyWalking AI Sessionizer. The apt skill in\"\n  echo \"# apache\u002Fskywalking-ai-sessionizer writes this file from the Packages files.\"\n  echo \"# apt asks for each package under pool\u002F, and each rule sends it to the voted\"\n  echo \"# file: the newest version through the mirrors, every older one to the archive.\"\n  echo \"RewriteEngine On\"\n  sed -n 's\u002F^Filename: pool\\\u002F\u002F\u002Fp' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages | sort | while IFS=_ read -r p v a; do\n    a=${a%.deb}\n    f=apache-skywalking-ai-sessionizer-$v-bin-$p-$a.deb\n    if [ \"$v\" = \"$newest\" ]; then\n      url=\"https:\u002F\u002Fwww.apache.org\u002Fdyn\u002Fcloser.lua\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$f?action=download\"\n    else\n      url=\"https:\u002F\u002Farchive.apache.org\u002Fdist\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$f\"\n    fi\n    printf 'RewriteRule ^pool\u002F%s_%s_%s\\\\.deb$ %s [R=302,L]\\n' \"$p\" \"$(printf '%s' \"$v\" | sed 's\u002F\\.\u002F\\\\.\u002Fg')\" \"$a\" \"$url\"\n  done\n} > \"$APT\u002F.htaccess\"\ncat \"$APT\u002F.htaccess\"\n```\n\n## 5. Sign the index\n\n```sh\ncd \"$APT\u002Fdists\u002Fstable\"\ngpg --local-user \u003Ckey> --clearsign -o InRelease Release\ngpg --local-user \u003Ckey> --armor --detach-sign -o Release.gpg Release\ngpgv --keyring \"$W\u002Fkeys.gpg\" InRelease\ngpgv --keyring \"$W\u002Fkeys.gpg\" Release.gpg Release\ncd -\n```\n\nBoth `gpgv` commands must report a good signature. If not, the key is not in KEYS, and apt would\nrefuse the whole repository: stop and tell the user.\n\n## 6. Install through the redirects\n\nApache httpd serves the directory with its `.htaccess`, as the website does. apt in Debian and in\nUbuntu then installs the newest version and every older version in the index, following the\nredirects to the real Apache sites. Not only the versions added: adding a newer version moves the\none that was newest from the mirrors to the archive, so its redirect changed too.\n\n```sh\ndocker run --rm httpd:2.4 cat \u002Fusr\u002Flocal\u002Fapache2\u002Fconf\u002Fhttpd.conf > \"$W\u002Fhttpd.conf\"\nperl -0pi -e 's\u002F^#(LoadModule rewrite_module )\u002F$1\u002Fm; s\u002F(\u003CDirectory \"\\\u002Fusr\\\u002Flocal\\\u002Fapache2\\\u002Fhtdocs\">.*?)AllowOverride None\u002F$1AllowOverride All\u002Fs' \"$W\u002Fhttpd.conf\"\nolder=$(sed -n 's\u002F^Version: \u002F\u002Fp' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages | sort -uV | grep -vxF \"$newest\" | tr '\\n' ' ')\ndocker network create asz-apt\ndocker run -d --name asz-apt-site --network asz-apt -v \"$APT:\u002Fusr\u002Flocal\u002Fapache2\u002Fhtdocs\u002Fapt:ro\" \\\n  -v \"$W\u002Fhttpd.conf:\u002Fusr\u002Flocal\u002Fapache2\u002Fconf\u002Fhttpd.conf:ro\" httpd:2.4\nfor image in debian:stable ubuntu:24.04; do\n  docker run --rm --network asz-apt -v \"$W\u002Fkeys.gpg:\u002Fkeys.gpg:ro\" -e NEWEST=\"$newest\" -e OLDER=\"$older\" \"$image\" bash -euc '\n    # The redirects lead to https, and these images carry no certificates.\n    export DEBIAN_FRONTEND=noninteractive\n    apt-get update -qq && apt-get install -y -qq ca-certificates > \u002Fdev\u002Fnull\n    install -m 644 \u002Fkeys.gpg \u002Fusr\u002Fshare\u002Fkeyrings\u002Fapache-skywalking.gpg\n    echo \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fapache-skywalking.gpg] http:\u002F\u002Fasz-apt-site\u002Fapt stable main\" > \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fapache-skywalking.list\n    apt-get update\n    apt-get install -y asz asz-changes\n    asz version | grep -F \"$NEWEST\"\n    asz-changes version | grep -F \"$NEWEST\"\n    for v in $OLDER; do\n      recorder=asz-changes\n      case \"$v\" in 0.1.*|0.2.*|0.3.*|0.4.*) recorder=asz-claude-code ;; esac\n      apt-get install -y --allow-downgrades \"asz=$v\" \"$recorder=$v\"\n      asz version | grep -F \"$v\"\n    done'\ndone\ndocker logs asz-apt-site 2>&1 | grep 'GET \u002Fapt\u002Fpool\u002F'\ndocker rm -f asz-apt-site\ndocker network rm asz-apt\n```\n\nEach image must install every version, and the log must show a `302` for each package. A download\nthat fails for the newest version means the mirrors do not have it yet: wait and run this step\nagain. A certificate error means `ca-certificates` was not installed in the image first.\n\n## 7. Open the pull request to the website\n\n```sh\ncd \u003Cscratch dir>\u002Fwebsite\ngit status --short\ngit add static\u002Fapt\ngit commit -m \"AI Sessionizer apt repository: add \u003Cversions>\"\ngit push -u origin apt-\u003Cversions>\ngh pr create --repo apache\u002Fskywalking-website --base master --title \"AI Sessionizer apt repository: add \u003Cversions>\"\n```\n\nOnly files under `static\u002Fapt\u002F` may change. The commit message and the pull request carry no AI\nattribution: no Co-Authored-By line and no \"Generated with\" line. Say in the pull request which\nversions were added, which version apt installs by default, which key signed the index, and that\napt installed every version through the redirects.\n\n## 8. After the merge\n\nThe website's CI builds and publishes it on every merge to master. Then users run\n`sudo apt update && sudo apt upgrade`. `tools\u002Frelease\u002Frelease.sh publish VERSION --remove-old` waits\nfor this merge, because until then apt fetches the previous version through the mirrors. Tell the\nuser the pull request link, and remove the worktree and `W` once it is merged.\n","# apt repository\n\n`static\u002Fapt` in apache\u002Fskywalking-website is served at `https:\u002F\u002Fskywalking.apache.org\u002Fapt`. It\nholds no package, only files that describe them:\n\n- `dists\u002Fstable\u002Fmain\u002Fbinary-amd64\u002FPackages` and `binary-arm64\u002FPackages`, each with `Packages.gz`.\n  They list every released version of each package. The recorder's package is `asz-claude-code` up\n  to 0.4.0 and `asz-changes` from 0.5.0, so a repository that spans the rename lists both. Each\n  entry's `Filename` is\n  `pool\u002F\u003Cpackage>_\u003Cversion>_\u003Carch>.deb`.\n- `dists\u002Fstable\u002FRelease`, which names the hashes of the `Packages` files, and its signatures\n  `InRelease` and `Release.gpg`, by a key in KEYS.\n- `.htaccess`, one redirect for each `pool\u002F` path, to the voted `.deb` on the Apache download sites.\n  The newest version goes through the mirrors. Every older one goes to archive.apache.org, which\n  keeps every version. apt follows the redirect and checks the file against `Packages`.\n\nUsers run:\n\n```sh\nsudo apt install asz asz-changes\nsudo apt install asz=0.4.0 asz-claude-code=0.4.0   # the recorder's package name before 0.5.0\n```\n\nThe user names one version or several. Each must be released and on the download site or the\narchive. 0.4.0 is the first version with Debian packages. Do this at least one hour after the\nversion moved to the release directory, so the mirrors have it. It needs docker, gpg, curl and\nshasum. It changes nothing but a pull request to apache\u002Fskywalking-website.\n\nThe index is signed with the user's own key, which must be in\nhttps:\u002F\u002Fdownloads.apache.org\u002Fskywalking\u002FKEYS. Ask which key to use if the user has not said, and\nnever sign with a key they did not name. gpg may ask for the passphrase in a window of its own.\n\nA local proxy can break HTTPS to Apache hosts, so the commands below go around it.\n\n## 1. Branch the website\n\n```sh\ngit -C ~\u002Fgithub\u002Fskywalking-website fetch origin\ngit -C ~\u002Fgithub\u002Fskywalking-website worktree add -b apt-\u003Cversions> \u003Cscratch dir>\u002Fwebsite origin\u002Fmaster\nAPT=\u003Cscratch dir>\u002Fwebsite\u002Fstatic\u002Fapt\nW=\u003Cscratch dir>\u002Fapt\nmkdir -p \"$W\u002Fpool\"\n```\n\nA version already in the index is never added again, because a published package never changes.\nIf this prints anything, drop that version and tell the user:\n\n```sh\nfor v in \u003Cversions>; do grep -h \"^Filename: pool\u002F.*_${v}_\" \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages 2>\u002Fdev\u002Fnull; done\n```\n\n## 2. Download and verify the packages\n\nEach `.deb` must match its voted `.sha512`, and its `.asc` must be a good signature by a key in\nKEYS. apt reads KEYS the same way the install page has a person read it, with `gpg --dearmor`.\n\n```sh\ncurl --noproxy '*' -fsSL -o \"$W\u002FKEYS\" https:\u002F\u002Fdownloads.apache.org\u002Fskywalking\u002FKEYS\ngpg --dearmor \u003C \"$W\u002FKEYS\" > \"$W\u002Fkeys.gpg\"\n# Which packages a version published depends on when it was released.\n# 0.5.0 renamed the recorder's package: asz-claude-code up to 0.4.x, and\n# asz-changes from 0.5.0. No version publishes both, so asking for both\n# fails the download on every version.\npackages_of() {\n  case \"$1\" in\n    0.1.*|0.2.*|0.3.*|0.4.*) echo \"asz asz-claude-code\" ;;\n    *) echo \"asz asz-changes\" ;;\n  esac\n}\nfor v in \u003Cversions>; do\n  for p in $(packages_of \"$v\"); do\n    for a in amd64 arm64; do\n      f=apache-skywalking-ai-sessionizer-$v-bin-$p-$a.deb\n      for g in \"$f\" \"$f.sha512\" \"$f.asc\"; do\n        curl --noproxy '*' -fsSL -o \"$W\u002F$g\" \"https:\u002F\u002Fdownloads.apache.org\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$g\" ||\n          curl --noproxy '*' -fsSL -o \"$W\u002F$g\" \"https:\u002F\u002Farchive.apache.org\u002Fdist\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$g\"\n      done\n      (cd \"$W\" && shasum -a 512 -c \"$f.sha512\")\n      gpgv --keyring \"$W\u002Fkeys.gpg\" \"$W\u002F$f.asc\" \"$W\u002F$f\"\n      cp \"$W\u002F$f\" \"$W\u002Fpool\u002F${p}_${v}_${a}.deb\"\n    done\n  done\ndone\n```\n\nStop at the first failure and tell the user.\n\n## 3. Add them to the index\n\n`apt-ftparchive`, from Debian's `apt-utils`, writes the entries of the new packages, which are\nadded to each `Packages` file, and then writes `Release` from all of them. The old signatures no\nlonger match, so they go.\n\n```sh\nmkdir -p \"$APT\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-amd64\" \"$APT\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-arm64\"\nrm -f \"$APT\u002Fdists\u002Fstable\u002FRelease\" \"$APT\u002Fdists\u002Fstable\u002FInRelease\" \"$APT\u002Fdists\u002Fstable\u002FRelease.gpg\"\ndocker run --rm -v \"$W:\u002Fwork\" -v \"$APT:\u002Fapt\" debian:stable bash -euc '\n  apt-get update -qq && apt-get install -y -qq apt-utils > \u002Fdev\u002Fnull\n  cd \u002Fwork\n  for a in amd64 arm64; do\n    apt-ftparchive --arch \"$a\" packages pool >> \"\u002Fapt\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-$a\u002FPackages\"\n    gzip -9nc \"\u002Fapt\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-$a\u002FPackages\" > \"\u002Fapt\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-$a\u002FPackages.gz\"\n  done\n  cd \u002Fapt\u002Fdists\u002Fstable\n  apt-ftparchive \\\n    -o APT::FTPArchive::Release::Origin=\"Apache SkyWalking\" \\\n    -o APT::FTPArchive::Release::Label=\"Apache SkyWalking AI Sessionizer\" \\\n    -o APT::FTPArchive::Release::Suite=stable \\\n    -o APT::FTPArchive::Release::Codename=stable \\\n    -o APT::FTPArchive::Release::Architectures=\"amd64 arm64\" \\\n    -o APT::FTPArchive::Release::Components=main \\\n    release . > \u002Fwork\u002FRelease\n  cp \u002Fwork\u002FRelease Release'\ngrep -c '^Package:' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages\n```\n\nEach `Packages` file must have two more entries for each version added.\n\n## 4. Write the redirects\n\n`.htaccess` is written again from the `Packages` files, so every entry has exactly one rule, and\nthe newest version is the one on the mirrors:\n\n```sh\nnewest=$(sed -n 's\u002F^Version: \u002F\u002Fp' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages | sort -uV | tail -1)\n{\n  echo \"# The apt repository of Apache SkyWalking AI Sessionizer. The apt skill in\"\n  echo \"# apache\u002Fskywalking-ai-sessionizer writes this file from the Packages files.\"\n  echo \"# apt asks for each package under pool\u002F, and each rule sends it to the voted\"\n  echo \"# file: the newest version through the mirrors, every older one to the archive.\"\n  echo \"RewriteEngine On\"\n  sed -n 's\u002F^Filename: pool\\\u002F\u002F\u002Fp' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages | sort | while IFS=_ read -r p v a; do\n    a=${a%.deb}\n    f=apache-skywalking-ai-sessionizer-$v-bin-$p-$a.deb\n    if [ \"$v\" = \"$newest\" ]; then\n      url=\"https:\u002F\u002Fwww.apache.org\u002Fdyn\u002Fcloser.lua\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$f?action=download\"\n    else\n      url=\"https:\u002F\u002Farchive.apache.org\u002Fdist\u002Fskywalking\u002Fai-sessionizer\u002F$v\u002F$f\"\n    fi\n    printf 'RewriteRule ^pool\u002F%s_%s_%s\\\\.deb$ %s [R=302,L]\\n' \"$p\" \"$(printf '%s' \"$v\" | sed 's\u002F\\.\u002F\\\\.\u002Fg')\" \"$a\" \"$url\"\n  done\n} > \"$APT\u002F.htaccess\"\ncat \"$APT\u002F.htaccess\"\n```\n\n## 5. Sign the index\n\n```sh\ncd \"$APT\u002Fdists\u002Fstable\"\ngpg --local-user \u003Ckey> --clearsign -o InRelease Release\ngpg --local-user \u003Ckey> --armor --detach-sign -o Release.gpg Release\ngpgv --keyring \"$W\u002Fkeys.gpg\" InRelease\ngpgv --keyring \"$W\u002Fkeys.gpg\" Release.gpg Release\ncd -\n```\n\nBoth `gpgv` commands must report a good signature. If not, the key is not in KEYS, and apt would\nrefuse the whole repository: stop and tell the user.\n\n## 6. Install through the redirects\n\nApache httpd serves the directory with its `.htaccess`, as the website does. apt in Debian and in\nUbuntu then installs the newest version and every older version in the index, following the\nredirects to the real Apache sites. Not only the versions added: adding a newer version moves the\none that was newest from the mirrors to the archive, so its redirect changed too.\n\n```sh\ndocker run --rm httpd:2.4 cat \u002Fusr\u002Flocal\u002Fapache2\u002Fconf\u002Fhttpd.conf > \"$W\u002Fhttpd.conf\"\nperl -0pi -e 's\u002F^#(LoadModule rewrite_module )\u002F$1\u002Fm; s\u002F(\u003CDirectory \"\\\u002Fusr\\\u002Flocal\\\u002Fapache2\\\u002Fhtdocs\">.*?)AllowOverride None\u002F$1AllowOverride All\u002Fs' \"$W\u002Fhttpd.conf\"\nolder=$(sed -n 's\u002F^Version: \u002F\u002Fp' \"$APT\"\u002Fdists\u002Fstable\u002Fmain\u002Fbinary-*\u002FPackages | sort -uV | grep -vxF \"$newest\" | tr '\\n' ' ')\ndocker network create asz-apt\ndocker run -d --name asz-apt-site --network asz-apt -v \"$APT:\u002Fusr\u002Flocal\u002Fapache2\u002Fhtdocs\u002Fapt:ro\" \\\n  -v \"$W\u002Fhttpd.conf:\u002Fusr\u002Flocal\u002Fapache2\u002Fconf\u002Fhttpd.conf:ro\" httpd:2.4\nfor image in debian:stable ubuntu:24.04; do\n  docker run --rm --network asz-apt -v \"$W\u002Fkeys.gpg:\u002Fkeys.gpg:ro\" -e NEWEST=\"$newest\" -e OLDER=\"$older\" \"$image\" bash -euc '\n    # The redirects lead to https, and these images carry no certificates.\n    export DEBIAN_FRONTEND=noninteractive\n    apt-get update -qq && apt-get install -y -qq ca-certificates > \u002Fdev\u002Fnull\n    install -m 644 \u002Fkeys.gpg \u002Fusr\u002Fshare\u002Fkeyrings\u002Fapache-skywalking.gpg\n    echo \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fapache-skywalking.gpg] http:\u002F\u002Fasz-apt-site\u002Fapt stable main\" > \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fapache-skywalking.list\n    apt-get update\n    apt-get install -y asz asz-changes\n    asz version | grep -F \"$NEWEST\"\n    asz-changes version | grep -F \"$NEWEST\"\n    for v in $OLDER; do\n      recorder=asz-changes\n      case \"$v\" in 0.1.*|0.2.*|0.3.*|0.4.*) recorder=asz-claude-code ;; esac\n      apt-get install -y --allow-downgrades \"asz=$v\" \"$recorder=$v\"\n      asz version | grep -F \"$v\"\n    done'\ndone\ndocker logs asz-apt-site 2>&1 | grep 'GET \u002Fapt\u002Fpool\u002F'\ndocker rm -f asz-apt-site\ndocker network rm asz-apt\n```\n\nEach image must install every version, and the log must show a `302` for each package. A download\nthat fails for the newest version means the mirrors do not have it yet: wait and run this step\nagain. A certificate error means `ca-certificates` was not installed in the image first.\n\n## 7. Open the pull request to the website\n\n```sh\ncd \u003Cscratch dir>\u002Fwebsite\ngit status --short\ngit add static\u002Fapt\ngit commit -m \"AI Sessionizer apt repository: add \u003Cversions>\"\ngit push -u origin apt-\u003Cversions>\ngh pr create --repo apache\u002Fskywalking-website --base master --title \"AI Sessionizer apt repository: add \u003Cversions>\"\n```\n\nOnly files under `static\u002Fapt\u002F` may change. The commit message and the pull request carry no AI\nattribution: no Co-Authored-By line and no \"Generated with\" line. Say in the pull request which\nversions were added, which version apt installs by default, which key signed the index, and that\napt installed every version through the redirects.\n\n## 8. After the merge\n\nThe website's CI builds and publishes it on every merge to master. Then users run\n`sudo apt update && sudo apt upgrade`. `tools\u002Frelease\u002Frelease.sh publish VERSION --remove-old` waits\nfor this merge, because until then apt fetches the previous version through the mirrors. Tell the\nuser the pull request link, and remove the worktree and `W` once it is merged.\n",{"name":5,"description":7,"user-invocable":32},true,"main","07a2d95fdf9ebd8af1efc06fff6b1c40d5d02e4d",".claude\u002Fskills\u002Fapt",4,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-ai-sessionizer","https:\u002F\u002Fskywalking.apache.org\u002F","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-03 14:47:24",{"source":8,"skillName":5,"commands":43,"prompt":53,"zipAvailable":32},[44,47,50],{"tool":45,"command":46},"npx","npx skills add apache\u002Fskywalking-ai-sessionizer --skill apt",{"tool":48,"command":49},"bunx","bunx skills add apache\u002Fskywalking-ai-sessionizer --skill apt",{"tool":51,"command":52},"pnpm","pnpm dlx skills add apache\u002Fskywalking-ai-sessionizer --skill apt","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-ai-sessionizer\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fapt\u002FSKILL.md",[55,61,65,71,75],{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"references\u002Fazurerm_set_attributes.json","REFERENCE","参考文档",5106,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fterraform-azurerm-set-diff-analyzer\u002Freferences\u002Fazurerm_set_attributes.json",{"path":62,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":63,"sourceHtmlUrl":64},"references\u002Fazurerm_set_attributes.md",3966,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fterraform-azurerm-set-diff-analyzer\u002Freferences\u002Fazurerm_set_attributes.md",{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"scripts\u002F.gitignore","SCRIPT","脚本",742,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fterraform-azurerm-set-diff-analyzer\u002Fscripts\u002F.gitignore",{"path":72,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":73,"sourceHtmlUrl":74},"scripts\u002Fanalyze_plan.py",30996,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fterraform-azurerm-set-diff-analyzer\u002Fscripts\u002Fanalyze_plan.py",{"path":76,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002FREADME.md",5306,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fterraform-azurerm-set-diff-analyzer\u002Fscripts\u002FREADME.md",[80,90,97],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":27},"01M6ACVSR542MXWBEH429FXZH6","pypi","Publish a released version of the Apache SkyWalking AI Sessionizer LangChain plugin, apache-skywalking-asz-langchain, to PyPI. Says what a release manager sets up before the first upload, downloads the voted source package, verifies it, builds the source distribution and the wheel from plugins\u002Flangchain inside it, checks and installs them, and uploads them with twine. Use after a version is published.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-ai-sessionizer\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpypi\u002FSKILL.md",[],[82,87,88,23,9,21,89],"plugins","package","plugin",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":27},"01M6ACVQTQ62BTQX7EXRH7M568","homebrew","Add released versions of Apache SkyWalking AI Sessionizer to its Homebrew tap, Formula\u002F on main in apache\u002Fskywalking-ai-sessionizer. Writes asz@VERSION from the voted packages, moves asz to the newest version, checks every formula with brew, and opens a pull request to main in this repository. Use after a version is published, or to add older released versions.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-ai-sessionizer\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhomebrew\u002FSKILL.md",[],[92,9,23,22,20,19],{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":27},"01M6ACVP5MR5W6M1XSG40JB15T","collect","Collect this machine's local Claude Code conversation data with the asz collector. Resolves the local Claude data directory (honouring CLAUDE_CONFIG_DIR and XDG_CONFIG_HOME), builds the binary, lists what is discoverable, and lands everything into the storage root. Use when asked to collect, backfill, re-collect, or inspect local Claude Code sessions, or to check what the collector can see.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-ai-sessionizer\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcollect\u002FSKILL.md",[],[99,104,105,106,107,108],"directory","code","config","sessions","storage"]