[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CAZT73T2Z4RDBXTKWD6KMB":3,"skill-same:01M6CAZT73T2Z4RDBXTKWD6KMB":65},{"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":23,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6CAZT73T2Z4RDBXTKWD6KMB","rollback-workspace",null,"Restore the .aiwg\u002F directory from a migrate-workspace backup, listing available backups when none is specified","jmagly\u002Faiwg","jmagly","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1159087?v=4","01M6C10AK8N2WCSQN11FYGTJWN","Joseph Magly","01M6C10AQ8A2RMED1Y1BSVY7NF",229,"MIT","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Futils\u002Fskills\u002Frollback-workspace\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32],"rollback","workspace","rollback workspace","directory","backup","migrate","restore","when","listing","2026-11-10 10:12:30",false,"---\nnamespace: aiwg\nname: rollback-workspace\nplatforms: [all]\ndescription: Restore the .aiwg\u002F directory from a migrate-workspace backup, listing available backups when none is specified\n---\n\n# Rollback Workspace\n\nYou restore the `.aiwg\u002F` directory from a backup created by `migrate-workspace`. Lists available backups when no specific backup is named. The restore is safe — it will not overwrite artifacts that were created after the migration.\n\n## Triggers\n\nAlternate expressions and non-obvious activations (primary phrases are matched automatically from the skill description):\n\n- \"undo the migration\" → rollback to most recent backup\n- \"restore my workspace\" → rollback to most recent backup\n- \"what backups do I have?\" → list available backups\n- \"revert aiwg directory\" → rollback to most recent backup\n\n## Trigger Patterns Reference\n\n| Pattern | Example | Action |\n|---------|---------|--------|\n| Rollback latest | \"roll back the workspace migration\" | Run `aiwg rollback-workspace` |\n| List backups | \"what workspace backups exist?\" | Run `aiwg rollback-workspace --list` |\n| Specific backup | \"restore from the backup made on April 1st\" | Run `aiwg rollback-workspace --from .aiwg\u002F.backup-20260401-1423` |\n| Dry run | \"preview the rollback\" | Run `aiwg rollback-workspace --dry-run` |\n| Force | \"rollback workspace, skip confirmation\" | Run `aiwg rollback-workspace --yes` |\n\n## Behavior\n\nWhen triggered:\n\n1. **List backups before restoring** unless a specific backup is named or the user has already confirmed:\n   - Run `aiwg rollback-workspace --list` to show what is available.\n   - If only one backup exists, propose it directly.\n   - If multiple backups exist, ask which one to restore.\n\n2. **Extract arguments**:\n   - Is `--list` requested? Show backups and stop.\n   - Is a specific `--from \u003Cpath>` given? Use that backup.\n   - Is `--dry-run` requested? Show what would be restored, no changes.\n   - Has the user confirmed? Use `--yes` to skip the interactive prompt.\n\n3. **Run the appropriate command**:\n\n   ```bash\n   # List available backups\n   aiwg rollback-workspace --list\n\n   # Preview rollback (no changes)\n   aiwg rollback-workspace --dry-run\n\n   # Rollback to most recent backup (prompts for confirmation)\n   aiwg rollback-workspace\n\n   # Rollback to specific backup\n   aiwg rollback-workspace --from .aiwg\u002F.backup-20260401-1423\n\n   # Rollback, skip prompt\n   aiwg rollback-workspace --yes\n   ```\n\n4. **Safety behaviour**:\n   - Will not overwrite files that were created **after** the backup timestamp (new artifacts added post-migration are preserved).\n   - Conflicting files (same path, newer mtime) are reported rather than silently overwritten — the user decides.\n   - If no backup exists, reports clearly and suggests contacting support.\n\n5. **Report the result** — confirm what was restored, list any skipped conflicts, and remind the user to run `aiwg status` to verify.\n\n## Examples\n\n### Example 1: List backups first\n\n**User**: \"Roll back my workspace migration\"\n\n**Extraction**: Rollback requested — list backups before applying\n\n**Action** (step 1):\n```bash\naiwg rollback-workspace --list\n```\n\n**Response**:\n```\nAvailable workspace backups:\n\n  1. .aiwg\u002F.backup-20260401-1423   (created 2026-04-01 14:23 UTC — before migration)\n  2. .aiwg\u002F.backup-20260320-0900   (created 2026-03-20 09:00 UTC — before migration)\n\nWhich backup would you like to restore from? (default: 1 — most recent)\n```\n\nAfter user selects → run `aiwg rollback-workspace --from .aiwg\u002F.backup-20260401-1423`.\n\n### Example 2: Single backup, confirm and restore\n\n**User**: \"Undo the migration\"\n\n**Extraction**: One backup found, propose it\n\n**Action**:\n```bash\naiwg rollback-workspace --list\n# One result → propose it\naiwg rollback-workspace --dry-run\n```\n\n**Preview response**:\n```\nRollback Preview (from .aiwg\u002F.backup-20260401-1423)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nWould restore:\n  .aiwg\u002Fframeworks\u002Fsdlc-complete\u002Frequirements\u002F → .aiwg\u002Frequirements\u002F\n  .aiwg\u002Fframeworks\u002Fsdlc-complete\u002Farchitecture\u002F → .aiwg\u002Farchitecture\u002F\n  (+ 6 more directories)\n\nFiles added after migration (will NOT be overwritten):\n  .aiwg\u002Frequirements\u002FUC-015.md  (newer than backup)\n\nProceed? [y\u002FN]\n```\n\nAfter user confirms → `aiwg rollback-workspace --yes`.\n\n### Example 3: Dry run only\n\n**User**: \"Preview a workspace rollback\"\n\n**Extraction**: Dry-run only\n\n**Action**:\n```bash\naiwg rollback-workspace --dry-run\n```\n\n**Response**: Shows the planned restore table (as above) and stops. Does not prompt for confirmation.\n\n### Example 4: No backups available\n\n**User**: \"Roll back my workspace\"\n\n**Extraction**: No backups found\n\n**Action**:\n```bash\naiwg rollback-workspace --list\n```\n\n**Response**: \"No workspace backups found in `.aiwg\u002F`. Backups are created automatically when you run `aiwg migrate-workspace`. If you have a manual backup, specify its path with `aiwg rollback-workspace --from \u003Cpath>`.\"\n\n### Example 5: Specific backup path\n\n**User**: \"Restore from the backup at .aiwg\u002F.backup-20260320-0900\"\n\n**Extraction**: Explicit backup path given\n\n**Action**:\n```bash\naiwg rollback-workspace --from .aiwg\u002F.backup-20260320-0900\n```\n\n**Response**: Runs the restore, reports what was moved back and any skipped conflicts. Confirms with `aiwg status` recommendation.\n\n## Clarification Prompts\n\nIf the user's intent is ambiguous:\n\n- \"Which backup would you like to restore from? I found: `.backup-20260401-1423`, `.backup-20260320-0900`.\"\n- \"Would you like me to preview the rollback first before applying it?\"\n- \"Files created after the migration will not be overwritten — is that OK, or do you need to handle those manually?\"\n\n## References\n\n- @$AIWG_ROOT\u002Fsrc\u002Fcli\u002Fhandlers\u002Fworkspace.ts — `rollback-workspace` command handler\n- @$AIWG_ROOT\u002Fdocs\u002Fcli-reference.md — CLI reference\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Fskills\u002Fmigrate-workspace\u002FSKILL.md — The migration this reverses\n","# Rollback Workspace\n\nYou restore the `.aiwg\u002F` directory from a backup created by `migrate-workspace`. Lists available backups when no specific backup is named. The restore is safe — it will not overwrite artifacts that were created after the migration.\n\n## Triggers\n\nAlternate expressions and non-obvious activations (primary phrases are matched automatically from the skill description):\n\n- \"undo the migration\" → rollback to most recent backup\n- \"restore my workspace\" → rollback to most recent backup\n- \"what backups do I have?\" → list available backups\n- \"revert aiwg directory\" → rollback to most recent backup\n\n## Trigger Patterns Reference\n\n| Pattern | Example | Action |\n|---------|---------|--------|\n| Rollback latest | \"roll back the workspace migration\" | Run `aiwg rollback-workspace` |\n| List backups | \"what workspace backups exist?\" | Run `aiwg rollback-workspace --list` |\n| Specific backup | \"restore from the backup made on April 1st\" | Run `aiwg rollback-workspace --from .aiwg\u002F.backup-20260401-1423` |\n| Dry run | \"preview the rollback\" | Run `aiwg rollback-workspace --dry-run` |\n| Force | \"rollback workspace, skip confirmation\" | Run `aiwg rollback-workspace --yes` |\n\n## Behavior\n\nWhen triggered:\n\n1. **List backups before restoring** unless a specific backup is named or the user has already confirmed:\n   - Run `aiwg rollback-workspace --list` to show what is available.\n   - If only one backup exists, propose it directly.\n   - If multiple backups exist, ask which one to restore.\n\n2. **Extract arguments**:\n   - Is `--list` requested? Show backups and stop.\n   - Is a specific `--from \u003Cpath>` given? Use that backup.\n   - Is `--dry-run` requested? Show what would be restored, no changes.\n   - Has the user confirmed? Use `--yes` to skip the interactive prompt.\n\n3. **Run the appropriate command**:\n\n   ```bash\n   # List available backups\n   aiwg rollback-workspace --list\n\n   # Preview rollback (no changes)\n   aiwg rollback-workspace --dry-run\n\n   # Rollback to most recent backup (prompts for confirmation)\n   aiwg rollback-workspace\n\n   # Rollback to specific backup\n   aiwg rollback-workspace --from .aiwg\u002F.backup-20260401-1423\n\n   # Rollback, skip prompt\n   aiwg rollback-workspace --yes\n   ```\n\n4. **Safety behaviour**:\n   - Will not overwrite files that were created **after** the backup timestamp (new artifacts added post-migration are preserved).\n   - Conflicting files (same path, newer mtime) are reported rather than silently overwritten — the user decides.\n   - If no backup exists, reports clearly and suggests contacting support.\n\n5. **Report the result** — confirm what was restored, list any skipped conflicts, and remind the user to run `aiwg status` to verify.\n\n## Examples\n\n### Example 1: List backups first\n\n**User**: \"Roll back my workspace migration\"\n\n**Extraction**: Rollback requested — list backups before applying\n\n**Action** (step 1):\n```bash\naiwg rollback-workspace --list\n```\n\n**Response**:\n```\nAvailable workspace backups:\n\n  1. .aiwg\u002F.backup-20260401-1423   (created 2026-04-01 14:23 UTC — before migration)\n  2. .aiwg\u002F.backup-20260320-0900   (created 2026-03-20 09:00 UTC — before migration)\n\nWhich backup would you like to restore from? (default: 1 — most recent)\n```\n\nAfter user selects → run `aiwg rollback-workspace --from .aiwg\u002F.backup-20260401-1423`.\n\n### Example 2: Single backup, confirm and restore\n\n**User**: \"Undo the migration\"\n\n**Extraction**: One backup found, propose it\n\n**Action**:\n```bash\naiwg rollback-workspace --list\n# One result → propose it\naiwg rollback-workspace --dry-run\n```\n\n**Preview response**:\n```\nRollback Preview (from .aiwg\u002F.backup-20260401-1423)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nWould restore:\n  .aiwg\u002Fframeworks\u002Fsdlc-complete\u002Frequirements\u002F → .aiwg\u002Frequirements\u002F\n  .aiwg\u002Fframeworks\u002Fsdlc-complete\u002Farchitecture\u002F → .aiwg\u002Farchitecture\u002F\n  (+ 6 more directories)\n\nFiles added after migration (will NOT be overwritten):\n  .aiwg\u002Frequirements\u002FUC-015.md  (newer than backup)\n\nProceed? [y\u002FN]\n```\n\nAfter user confirms → `aiwg rollback-workspace --yes`.\n\n### Example 3: Dry run only\n\n**User**: \"Preview a workspace rollback\"\n\n**Extraction**: Dry-run only\n\n**Action**:\n```bash\naiwg rollback-workspace --dry-run\n```\n\n**Response**: Shows the planned restore table (as above) and stops. Does not prompt for confirmation.\n\n### Example 4: No backups available\n\n**User**: \"Roll back my workspace\"\n\n**Extraction**: No backups found\n\n**Action**:\n```bash\naiwg rollback-workspace --list\n```\n\n**Response**: \"No workspace backups found in `.aiwg\u002F`. Backups are created automatically when you run `aiwg migrate-workspace`. If you have a manual backup, specify its path with `aiwg rollback-workspace --from \u003Cpath>`.\"\n\n### Example 5: Specific backup path\n\n**User**: \"Restore from the backup at .aiwg\u002F.backup-20260320-0900\"\n\n**Extraction**: Explicit backup path given\n\n**Action**:\n```bash\naiwg rollback-workspace --from .aiwg\u002F.backup-20260320-0900\n```\n\n**Response**: Runs the restore, reports what was moved back and any skipped conflicts. Confirms with `aiwg status` recommendation.\n\n## Clarification Prompts\n\nIf the user's intent is ambiguous:\n\n- \"Which backup would you like to restore from? I found: `.backup-20260401-1423`, `.backup-20260320-0900`.\"\n- \"Would you like me to preview the rollback first before applying it?\"\n- \"Files created after the migration will not be overwritten — is that OK, or do you need to handle those manually?\"\n\n## References\n\n- @$AIWG_ROOT\u002Fsrc\u002Fcli\u002Fhandlers\u002Fworkspace.ts — `rollback-workspace` command handler\n- @$AIWG_ROOT\u002Fdocs\u002Fcli-reference.md — CLI reference\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Fskills\u002Fmigrate-workspace\u002FSKILL.md — The migration this reverses\n",{"name":5,"namespace":38,"platforms":39,"description":7},"aiwg",[40],"all","main","6754967c344ccb087a8de06972f55a41067b291b","agentic\u002Fcode\u002Fplugins\u002Futils\u002Fskills\u002Frollback-workspace",36,"https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg","https:\u002F\u002Faiwg.io","https:\u002F\u002Fgithub.com\u002Fjmagly","https:\u002F\u002Fintegrolabs.io","ml\u002Fai, industrial automation, safety\u002Fsecurity, ssi\r\n\r\nmagly.net\r\nintegrolabs.io\r\naiwg.io\r\nfortemi.com\r\npagenary.com\r\nbytecask.com","2026-11-14 02:10:01",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add jmagly\u002Faiwg --skill rollback-workspace",{"tool":57,"command":58},"bunx","bunx skills add jmagly\u002Faiwg --skill rollback-workspace",{"tool":60,"command":61},"pnpm","pnpm dlx skills add jmagly\u002Faiwg --skill rollback-workspace","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Futils\u002Fskills\u002Frollback-workspace\u002FSKILL.md",true,[],[66,94,118,124,131,145],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":73,"publishedAt":33},"01M70QA0BSYJ49EES9V4RE8QH1","host-hardening","Read-only system hardening baseline and plan-first host hardening recommendations for SSH, Docker bind addresses, firewall persistence, datastores, exporters and audit retention.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[72],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93],"host","host hardening","hardening","read","re","recommendations","remediation","plan","port","verification","Bash","access","only","retention","audit","never","firewall","bind","secrets","request",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":104,"publishedAt":33},"01M70PNT2Z4HMZPRBTAF6073NN","exposure-analysis","Read-only firewall analysis and effective host exposure reconstruction for Docker published ports, UFW bypass, stale rules, CDN scope, IPv6 asymmetry and external probe allowlists.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fforensics\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[100,103],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[105,106,107,77,108,82,109,110,84,111,74,112,86,113,114,89,90,115,116,117],"exposure analysis","analysis","unknown","credentials","collection","ufw","ports","internet","local","scope","reconstruction","operator","write",{"skillNo":119,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":33},"01M70P8QATMPKA78E4FT5D2TNA","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[122],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[76,74,75,85,77,93,80,79,88,81,82,83,84,92,86,87,78,89,90,91],{"skillNo":125,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":130,"publishedAt":33},"01M70NMPVJ5H0JH131P60FW4R8","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fforensics-complete\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[128,129],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[106,105,89,108,82,109,84,107,74,112,86,113,114,77,90,111,110,115,116,117],{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":138,"publishedAt":33},"01M6CB4DDR0B4NNCFK7ZK7449H","fixture-skill","Exercise rule delivery.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frule-delivery\u002Fskills\u002Ffixture-skill\u002FSKILL.md",[137],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[139,140,141,142,143,144],"fixture skill","fixture","rule","delivery","true","exercise",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":152,"publishedAt":33},"01M6CB4AVK1W76MFMPP0JP32CJ","pi-local","Pi-local duplicate-precedence fixture.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fproviders\u002Fpi\u002Fproject\u002F.pi\u002Fskills\u002Fpi-local\u002FSKILL.md",[151],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[153,154,113,155,140],"pi","pi local","duplicate"]