aminet-index

$npx mdskill add Tibsfox/gsd-skill-creator/aminet-index

Manages Aminet INDEX database lifecycle: fetch, parse, cache, and update.

  • Fetches and decompresses INDEX.gz from Aminet mirrors for package data.
  • Depends on Aminet mirrors, gzip decompression, and TextDecoder for ISO-8859-1.
  • Checks freshness against 24-hour threshold and uses RECENT file for incremental updates.
  • Returns parsed entries as structured JSON cache with INDEX.meta.json.

SKILL.md

.github/skills/aminet-indexView on GitHub ↗
---
name: aminet-index
description: "Manages Aminet INDEX infrastructure: fetch, parse, cache, and incremental update of ~84,000-entry package database. Use when managing INDEX data, checking freshness, or parsing .readme files."
metadata:
  extensions:
    gsd-skill-creator:
      triggers:
        intents:
          - "aminet.*index"
          - "aminet.*update"
          - "index.*fetch"
          - "readme.*parse"
        files:
          - "src/aminet/index-fetcher.ts"
          - "src/aminet/index-parser.ts"
          - "src/aminet/index-freshness.ts"
          - "src/aminet/readme-parser.ts"
        contexts:
          - "aminet index management"
          - "package database"
        threshold: 0.7
      token_budget: "1.5%"
      version: 1
      enabled: true
      plan_origin: "242-aminet-integration"
      phase_origin: "242"
---

# Aminet Index

## Purpose

Manages the complete lifecycle of the Aminet INDEX database: fetching INDEX.gz from mirrors, parsing ~84,000 package entries into structured data, caching results for offline use, checking freshness against 24-hour thresholds, and performing incremental updates via RECENT file diffing. Also handles .readme metadata extraction for individual package detail views.

## Capabilities

- Fetch INDEX.gz from Aminet mirrors with gzip decompression
- Parse ~84,000 INDEX entries using token-based regex in ~114ms
- ISO-8859-1 decoding via TextDecoder for correct character handling
- JSON cache with INDEX + INDEX.meta.json sidecar for offline access
- K=1x and M=1000x size suffix normalization
- 24-hour freshness detection with configurable thresholds
- RECENT-based incremental merge by fullPath for efficient updates
- Parse .readme files extracting raw headers (lowercase keys, multi-value split on comma+semicolon)
- Barrel file exporting complete public API

## Key Modules

| Module | Purpose |
|--------|---------|
| `src/aminet/index-fetcher.ts` | Fetches INDEX.gz from Aminet mirrors with gzip decompression |
| `src/aminet/index-parser.ts` | Parses INDEX entries into structured PackageEntry objects |
| `src/aminet/readme-parser.ts` | Extracts metadata from .readme files with header parsing |
| `src/aminet/index-freshness.ts` | Checks INDEX age against 24h threshold, triggers RECENT-based incremental merge |

## Usage Examples

**Fetch and parse the INDEX:**
```typescript
import { fetchIndex } from './index-fetcher.js';
import { parseIndex } from './index-parser.js';

const raw = await fetchIndex({ mirrorUrl: 'https://aminet.net' });
const entries = parseIndex(raw);
// entries: PackageEntry[] with ~84,000 items
```

**Check freshness and update incrementally:**
```typescript
import { checkFreshness } from './index-freshness.js';

const result = await checkFreshness({ cacheDir: './cache', maxAgeMs: 86400000 });
if (!result.fresh) {
  // Fetch RECENT, merge new entries by fullPath
}
```

**Parse a .readme file:**
```typescript
import { parseReadme } from './readme-parser.js';

const metadata = parseReadme(readmeText);
// metadata.short, metadata.author, metadata.uploader, metadata.type, etc.
```

## Dependencies

- Node.js `node:zlib` for gzip decompression
- Node.js `node:fs` for cache persistence
- Aminet mirror network for INDEX.gz and RECENT files

## Token Budget Rationale

1.5% budget reflects the 4 modules covering INDEX fetch, parse, freshness, and readme extraction. The ~84,000-entry parsing logic with ISO-8859-1 handling, size suffix normalization, and incremental merge via RECENT requires comprehensive context for correct operation and troubleshooting.

More from Tibsfox/gsd-skill-creator

SkillDescription
3d-interaction-designDesign heuristics for three-dimensional interaction — input modalities (6DoF controllers, gaze, gesture, voice), selection and manipulation techniques (ray-cast, virtual hand, go-go, world-in-miniature), navigation (teleport, continuous, redirected walking), and feedback loops (haptic, audio, visual). Covers Fitts' law in 3D, discoverability vs affordance, safe-zone design, and comfort/simulator sickness mitigation. Use when designing VR/AR interactions, immersive walkthroughs, or any input system where the user's body is the controller.
accessibility-patternsProvides web accessibility best practices for semantic HTML, ARIA, keyboard navigation, color contrast, and screen reader patterns. Use when building UI components, reviewing accessibility, or when user mentions 'a11y', 'accessibility', 'ARIA', 'screen reader', 'keyboard navigation', 'WCAG'.
active-listeningActive listening techniques for effective communication. Covers attending behaviors, paraphrasing, reflective listening, clarifying questions, empathic response, barriers to listening, listening in conflict, and cross-cultural listening. Use when building listening skills, improving understanding in conversation, mediating disputes, or analyzing communication breakdowns.
adversarial-pr-reviewAdversarial spec-compliance PR review — cross-references diffs against approved specs, verifies runtime claims against source, detects competing PRs, audits scope/convention compliance. Use before merging.
agile-methodsAgile and Lean software development methodologies for iterative, adaptive project execution. Covers Scrum (roles, ceremonies, artifacts), Kanban (WIP limits, flow metrics), XP (TDD, pair programming, CI), SAFe overview, Lean Software Development (Poppendieck's 7 principles), user stories (INVEST criteria), estimation via story points and velocity, and the Agile Manifesto's values and principles. Includes Cynefin framework for methodology selection and GSD's relationship to Agile as a structured Lean variant.
algebraic-reasoningSymbolic manipulation, equation solving, and algebraic structures for mathematical reasoning. Covers distributive law, factoring, completing the square, linear through polynomial equation solving, systems of equations (substitution, elimination, Gaussian elimination, matrix methods), algebraic structures (groups, rings, fields), modular arithmetic, polynomial theory, and inequalities. Use when solving equations, simplifying expressions, working with algebraic structures, or performing symbolic manipulation.
algorithmic-awarenessUnderstanding how algorithmic systems shape what users see, know, and do -- from recommendation feeds to search ranking to credit scoring to hiring software. Covers the mechanics of recommendation systems, algorithmic bias and its sources, personalization's effects on information diets, opacity and accountability, AI limitations (hallucination, confident wrongness), and the human-in-the-loop question. Use when a learner needs to think critically about why particular content reached them.
algorithms-data-structuresAlgorithms and data structures from first principles through advanced analysis. Covers sorting (bubble, insertion, selection, merge, quick, heap, radix), searching (linear, binary, BFS, DFS, Dijkstra, A*), fundamental data structures (arrays, linked lists, stacks, queues, hash tables, trees, heaps, graphs, tries), complexity analysis (Big-O, Big-Omega, Big-Theta, amortized), recurrence relations, and algorithm design paradigms (divide-and-conquer, greedy, dynamic programming, backtracking). Use when analyzing, selecting, implementing, or comparing algorithms and data structures.
aminet-browserAminet search and browse: full-text search, category tree navigation, architecture filtering, package detail, and curated collections. Use when searching, browsing, or managing package collections.
aminet-emulatorFS-UAE emulator configuration and launch: hardware profiles, ROM management, WHDLoad integration, config generation, and state snapshots. Use when configuring emulation, managing ROMs, or launching Amiga software.