@ahmed118glitch/get-shit-done-codex 1.18.3 → 1.18.4
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.
- package/README.md +101 -85
- package/bin/install-codex.js +100 -100
- package/get-shit-done/workflows/help.md +4 -4
- package/get-shit-done/workflows/update.md +10 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,86 +1,102 @@
|
|
|
1
|
-
# Get Shit Done (GSD)
|
|
2
|
-
|
|
3
|
-
Get Shit Done is a planning-first workflow system for AI coding agents. This repository packages the core GSD engine, workflow templates, runtime command surfaces, and a Codex prompt layer.
|
|
4
|
-
|
|
5
|
-
## What Is In This Repository
|
|
6
|
-
|
|
7
|
-
- `commands/gsd/`: command source files used by runtime installers
|
|
8
|
-
- `get-shit-done/bin/gsd-tools.js`: core CLI utilities and state/workflow helpers
|
|
9
|
-
- `get-shit-done/workflows/`: end-to-end command workflows
|
|
10
|
-
- `get-shit-done/templates/`: planning and state templates
|
|
11
|
-
- `get-shit-done/references/`: supporting reference docs
|
|
12
|
-
- `agents/`: role-specific agent instruction files
|
|
13
|
-
- `hooks/` and `scripts/build-hooks.js`: hook sources and build pipeline
|
|
14
|
-
- `.codex/prompts/` and `.codex/skills/`: Codex-native prompt and skill layer
|
|
15
|
-
|
|
16
|
-
## Install
|
|
17
|
-
|
|
18
|
-
Prerequisite: Node.js `>=16.7.0`.
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
npx @ahmed118glitch/get-shit-done-codex@latest --path .
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Common examples:
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
# Install Codex files into the current project directory
|
|
28
|
-
npx @ahmed118glitch/get-shit-done-codex@latest --path .
|
|
29
|
-
|
|
30
|
-
# Install into an explicit target folder:
|
|
31
|
-
npx @ahmed118glitch/get-shit-done-codex@latest --path /path/to/project
|
|
32
|
-
|
|
33
|
-
# Install shared copy under your home directory as well:
|
|
34
|
-
npx @ahmed118glitch/get-shit-done-codex@latest --global
|
|
35
|
-
|
|
36
|
-
# Run the runtime installer
|
|
37
|
-
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
##
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
1
|
+
# Get Shit Done (GSD)
|
|
2
|
+
|
|
3
|
+
Get Shit Done is a planning-first workflow system for AI coding agents. This repository packages the core GSD engine, workflow templates, runtime command surfaces, and a Codex prompt layer.
|
|
4
|
+
|
|
5
|
+
## What Is In This Repository
|
|
6
|
+
|
|
7
|
+
- `commands/gsd/`: command source files used by runtime installers
|
|
8
|
+
- `get-shit-done/bin/gsd-tools.js`: core CLI utilities and state/workflow helpers
|
|
9
|
+
- `get-shit-done/workflows/`: end-to-end command workflows
|
|
10
|
+
- `get-shit-done/templates/`: planning and state templates
|
|
11
|
+
- `get-shit-done/references/`: supporting reference docs
|
|
12
|
+
- `agents/`: role-specific agent instruction files
|
|
13
|
+
- `hooks/` and `scripts/build-hooks.js`: hook sources and build pipeline
|
|
14
|
+
- `.codex/prompts/` and `.codex/skills/`: Codex-native prompt and skill layer
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
Prerequisite: Node.js `>=16.7.0`.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx @ahmed118glitch/get-shit-done-codex@latest --path .
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Common examples:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Install Codex files into the current project directory
|
|
28
|
+
npx @ahmed118glitch/get-shit-done-codex@latest --path .
|
|
29
|
+
|
|
30
|
+
# Install into an explicit target folder:
|
|
31
|
+
npx @ahmed118glitch/get-shit-done-codex@latest --path /path/to/project
|
|
32
|
+
|
|
33
|
+
# Install shared copy under your home directory as well:
|
|
34
|
+
npx @ahmed118glitch/get-shit-done-codex@latest --global
|
|
35
|
+
|
|
36
|
+
# Run the runtime installer from this scoped package (examples):
|
|
37
|
+
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --all --global
|
|
38
|
+
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --claude --local
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Global install writes prompts to `~/.codex/prompts` (not nested).
|
|
42
|
+
|
|
43
|
+
## Verify Install
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Project prompts
|
|
47
|
+
ls ./.codex/prompts/gsd-*.md
|
|
48
|
+
|
|
49
|
+
# Global prompts (if you used --global)
|
|
50
|
+
ls ~/.codex/prompts/gsd-*.md
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Runtime Command Surface
|
|
54
|
+
|
|
55
|
+
- Claude Code and Gemini CLI use `/gsd:<command>` (example: `/gsd:help`)
|
|
56
|
+
- OpenCode uses `/gsd-<command>` (example: `/gsd-help`)
|
|
57
|
+
- Codex prompt files are in `.codex/prompts/gsd-*.md`
|
|
58
|
+
|
|
59
|
+
## Quick Workflow
|
|
60
|
+
|
|
61
|
+
Use the command surface above (`/gsd:<command>`, `/gsd-<command>`, or Codex `gsd-*` prompts).
|
|
62
|
+
|
|
63
|
+
1. Start a project with `new-project`
|
|
64
|
+
2. Plan a phase with `plan-phase`
|
|
65
|
+
3. Execute the phase with `execute-phase`
|
|
66
|
+
4. Verify with `verify-work`
|
|
67
|
+
5. Repeat per phase or milestone
|
|
68
|
+
|
|
69
|
+
Installed commands create and update planning artifacts under `.planning/` (for example: `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, `STATE.md`).
|
|
70
|
+
|
|
71
|
+
## Source Paths vs Installed Paths
|
|
72
|
+
|
|
73
|
+
Repository source paths:
|
|
74
|
+
|
|
75
|
+
- `commands/gsd/*`
|
|
76
|
+
- `get-shit-done/workflows/*`
|
|
77
|
+
- `get-shit-done/templates/*`
|
|
78
|
+
|
|
79
|
+
Installed runtime targets:
|
|
80
|
+
|
|
81
|
+
- Claude global: `~/.claude`
|
|
82
|
+
- OpenCode global: `~/.config/opencode` (or platform XDG equivalent)
|
|
83
|
+
- Gemini global: `~/.gemini`
|
|
84
|
+
- Codex global prompts/skills: `~/.codex/prompts`, `~/.codex/skills`
|
|
85
|
+
- Local mode: runtime folders in the current project
|
|
86
|
+
|
|
87
|
+
## Development
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npm test
|
|
91
|
+
npm run build:hooks
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Keep command and workflow behavior aligned across `commands/gsd/` and `get-shit-done/workflows/` when making changes.
|
|
95
|
+
|
|
96
|
+
## Security
|
|
97
|
+
|
|
98
|
+
Report vulnerabilities privately via `SECURITY.md`.
|
|
99
|
+
|
|
100
|
+
## License
|
|
101
|
+
|
|
86
102
|
MIT (`LICENSE`).
|
package/bin/install-codex.js
CHANGED
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const os = require('os');
|
|
6
|
-
|
|
7
|
-
const args = process.argv.slice(2);
|
|
8
|
-
const pkg = require('../package.json');
|
|
9
|
-
const repoRoot = path.resolve(__dirname, '..');
|
|
10
|
-
|
|
11
|
-
const helpText = `
|
|
12
|
-
${pkg.name} v${pkg.version}
|
|
13
|
-
|
|
14
|
-
Usage:
|
|
15
|
-
get-shit-done-codex [--path <target-dir>] [--help]
|
|
16
|
-
|
|
17
|
-
Options:
|
|
18
|
-
--path <target-dir> Install into this directory (defaults to current directory)
|
|
19
|
-
--global Also install .claude to your home directory (for manual sharing)
|
|
20
|
-
--help, -h Show this help message
|
|
21
|
-
|
|
22
|
-
Examples:
|
|
23
|
-
npx @ahmed118glitch/get-shit-done-codex@latest --path .
|
|
24
|
-
npx @ahmed118glitch/get-shit-done-codex@latest --path ./my-project
|
|
25
|
-
`;
|
|
26
|
-
|
|
27
|
-
if (args.includes('--help') || args.includes('-h')) {
|
|
28
|
-
console.log(helpText);
|
|
29
|
-
process.exit(0);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const pathArgIndex = args.findIndex((arg, index) => {
|
|
33
|
-
if (arg === '--path') return true;
|
|
34
|
-
return false;
|
|
35
|
-
});
|
|
36
|
-
let targetDir = process.cwd();
|
|
37
|
-
if (pathArgIndex !== -1) {
|
|
38
|
-
const userPath = args[pathArgIndex + 1];
|
|
39
|
-
if (!userPath || userPath.startsWith('-')) {
|
|
40
|
-
console.error('Error: --path requires a directory argument.');
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
targetDir = path.resolve(process.cwd(), userPath);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const installGlobal = args.includes('--global');
|
|
47
|
-
|
|
48
|
-
function copyRecursive(source, destination) {
|
|
49
|
-
if (!fs.existsSync(source)) return;
|
|
50
|
-
fs.cpSync(source, destination, { recursive: true, force: true });
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function ensureDir(dirPath) {
|
|
54
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function resolveSourceDir(repoRelative, fallbackRelative) {
|
|
58
|
-
const primary = path.join(repoRoot, repoRelative);
|
|
59
|
-
const fallback = fallbackRelative ? path.join(repoRoot, fallbackRelative) : null;
|
|
60
|
-
|
|
61
|
-
if (fs.existsSync(primary)) return primary;
|
|
62
|
-
if (fallback && fs.existsSync(fallback)) return fallback;
|
|
63
|
-
|
|
64
|
-
const fallbackMessage = fallbackRelative ? ` or ${fallbackRelative}` : '';
|
|
65
|
-
throw new Error(`Missing source directory "${repoRelative}"${fallbackMessage} in repository root ${repoRoot}`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function copyCodexToDirectory(baseDir) {
|
|
69
|
-
const targetCodex = path.join(baseDir, '.codex');
|
|
70
|
-
const targetClaude = path.join(baseDir, '.claude');
|
|
71
|
-
const sourceCodex = path.join(repoRoot, '.codex');
|
|
72
|
-
const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
|
|
73
|
-
const sourceAgents = resolveSourceDir('agents', '.claude/agents');
|
|
74
|
-
|
|
75
|
-
ensureDir(baseDir);
|
|
76
|
-
ensureDir(targetCodex);
|
|
77
|
-
ensureDir(targetClaude);
|
|
78
|
-
|
|
79
|
-
copyRecursive(sourceCodex, targetCodex);
|
|
80
|
-
copyRecursive(sourceGetShitDone, path.join(targetClaude, 'get-shit-done'));
|
|
81
|
-
copyRecursive(sourceAgents, path.join(targetClaude, 'agents'));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
copyCodexToDirectory(targetDir);
|
|
85
|
-
|
|
86
|
-
if (installGlobal) {
|
|
87
|
-
// Global installs should place prompts at ~/.codex/prompts (not ~/.codex/.codex/prompts).
|
|
88
|
-
const globalBase = os.homedir();
|
|
89
|
-
copyCodexToDirectory(globalBase);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
console.log(`\n${pkg.name} installed to:`);
|
|
93
|
-
console.log(` local: ${targetDir}`);
|
|
94
|
-
if (installGlobal) {
|
|
95
|
-
console.log(' global: ~/.codex');
|
|
96
|
-
}
|
|
97
|
-
console.log('\nNext steps:');
|
|
98
|
-
console.log(' 1) Open your project in Codex');
|
|
99
|
-
console.log(' 2) Run prompt gsd-new-project, then gsd-plan-phase, gsd-execute-phase');
|
|
100
|
-
console.log(' 3) Use .codex/prompts/* for all GSD commands in this fork');
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const pkg = require('../package.json');
|
|
9
|
+
const repoRoot = path.resolve(__dirname, '..');
|
|
10
|
+
|
|
11
|
+
const helpText = `
|
|
12
|
+
${pkg.name} v${pkg.version}
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
get-shit-done-codex [--path <target-dir>] [--help]
|
|
16
|
+
|
|
17
|
+
Options:
|
|
18
|
+
--path <target-dir> Install into this directory (defaults to current directory)
|
|
19
|
+
--global Also install .claude to your home directory (for manual sharing)
|
|
20
|
+
--help, -h Show this help message
|
|
21
|
+
|
|
22
|
+
Examples:
|
|
23
|
+
npx @ahmed118glitch/get-shit-done-codex@latest --path .
|
|
24
|
+
npx @ahmed118glitch/get-shit-done-codex@latest --path ./my-project
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
28
|
+
console.log(helpText);
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const pathArgIndex = args.findIndex((arg, index) => {
|
|
33
|
+
if (arg === '--path') return true;
|
|
34
|
+
return false;
|
|
35
|
+
});
|
|
36
|
+
let targetDir = process.cwd();
|
|
37
|
+
if (pathArgIndex !== -1) {
|
|
38
|
+
const userPath = args[pathArgIndex + 1];
|
|
39
|
+
if (!userPath || userPath.startsWith('-')) {
|
|
40
|
+
console.error('Error: --path requires a directory argument.');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
targetDir = path.resolve(process.cwd(), userPath);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const installGlobal = args.includes('--global');
|
|
47
|
+
|
|
48
|
+
function copyRecursive(source, destination) {
|
|
49
|
+
if (!fs.existsSync(source)) return;
|
|
50
|
+
fs.cpSync(source, destination, { recursive: true, force: true });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function ensureDir(dirPath) {
|
|
54
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function resolveSourceDir(repoRelative, fallbackRelative) {
|
|
58
|
+
const primary = path.join(repoRoot, repoRelative);
|
|
59
|
+
const fallback = fallbackRelative ? path.join(repoRoot, fallbackRelative) : null;
|
|
60
|
+
|
|
61
|
+
if (fs.existsSync(primary)) return primary;
|
|
62
|
+
if (fallback && fs.existsSync(fallback)) return fallback;
|
|
63
|
+
|
|
64
|
+
const fallbackMessage = fallbackRelative ? ` or ${fallbackRelative}` : '';
|
|
65
|
+
throw new Error(`Missing source directory "${repoRelative}"${fallbackMessage} in repository root ${repoRoot}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function copyCodexToDirectory(baseDir) {
|
|
69
|
+
const targetCodex = path.join(baseDir, '.codex');
|
|
70
|
+
const targetClaude = path.join(baseDir, '.claude');
|
|
71
|
+
const sourceCodex = path.join(repoRoot, '.codex');
|
|
72
|
+
const sourceGetShitDone = resolveSourceDir('get-shit-done', '.claude/get-shit-done');
|
|
73
|
+
const sourceAgents = resolveSourceDir('agents', '.claude/agents');
|
|
74
|
+
|
|
75
|
+
ensureDir(baseDir);
|
|
76
|
+
ensureDir(targetCodex);
|
|
77
|
+
ensureDir(targetClaude);
|
|
78
|
+
|
|
79
|
+
copyRecursive(sourceCodex, targetCodex);
|
|
80
|
+
copyRecursive(sourceGetShitDone, path.join(targetClaude, 'get-shit-done'));
|
|
81
|
+
copyRecursive(sourceAgents, path.join(targetClaude, 'agents'));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
copyCodexToDirectory(targetDir);
|
|
85
|
+
|
|
86
|
+
if (installGlobal) {
|
|
87
|
+
// Global installs should place prompts at ~/.codex/prompts (not ~/.codex/.codex/prompts).
|
|
88
|
+
const globalBase = os.homedir();
|
|
89
|
+
copyCodexToDirectory(globalBase);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
console.log(`\n${pkg.name} installed to:`);
|
|
93
|
+
console.log(` local: ${targetDir}`);
|
|
94
|
+
if (installGlobal) {
|
|
95
|
+
console.log(' global: ~/.codex');
|
|
96
|
+
}
|
|
97
|
+
console.log('\nNext steps:');
|
|
98
|
+
console.log(' 1) Open your project in Codex');
|
|
99
|
+
console.log(' 2) Run prompt gsd-new-project, then gsd-plan-phase, gsd-execute-phase');
|
|
100
|
+
console.log(' 3) Use .codex/prompts/* for all GSD commands in this fork');
|
|
@@ -17,9 +17,9 @@ Display the complete GSD command reference. Output ONLY the reference content. D
|
|
|
17
17
|
|
|
18
18
|
GSD evolves fast. Update periodically:
|
|
19
19
|
|
|
20
|
-
```bash
|
|
21
|
-
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc
|
|
22
|
-
```
|
|
20
|
+
```bash
|
|
21
|
+
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc
|
|
22
|
+
```
|
|
23
23
|
|
|
24
24
|
## Core Workflow
|
|
25
25
|
|
|
@@ -322,7 +322,7 @@ Update GSD to latest version with changelog preview.
|
|
|
322
322
|
- Displays changelog entries for versions you've missed
|
|
323
323
|
- Highlights breaking changes
|
|
324
324
|
- Confirms before running install
|
|
325
|
-
- Better than raw `npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc`
|
|
325
|
+
- Better than raw `npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc`
|
|
326
326
|
|
|
327
327
|
Usage: `/gsd:update`
|
|
328
328
|
|
|
@@ -46,15 +46,15 @@ Proceed to install step (treat as version 0.0.0 for comparison).
|
|
|
46
46
|
<step name="check_latest_version">
|
|
47
47
|
Check npm for latest version:
|
|
48
48
|
|
|
49
|
-
```bash
|
|
50
|
-
npm view @ahmed118glitch/get-shit-done-codex version 2>/dev/null
|
|
51
|
-
```
|
|
49
|
+
```bash
|
|
50
|
+
npm view @ahmed118glitch/get-shit-done-codex version 2>/dev/null
|
|
51
|
+
```
|
|
52
52
|
|
|
53
53
|
**If npm check fails:**
|
|
54
54
|
```
|
|
55
55
|
Couldn't check for updates (offline or npm unavailable).
|
|
56
56
|
|
|
57
|
-
To update manually: `npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --global`
|
|
57
|
+
To update manually: `npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --global`
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
Exit.
|
|
@@ -145,14 +145,14 @@ Use AskUserQuestion:
|
|
|
145
145
|
Run the update using the install type detected in step 1:
|
|
146
146
|
|
|
147
147
|
**If LOCAL install:**
|
|
148
|
-
```bash
|
|
149
|
-
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --local
|
|
150
|
-
```
|
|
148
|
+
```bash
|
|
149
|
+
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --local
|
|
150
|
+
```
|
|
151
151
|
|
|
152
152
|
**If GLOBAL install (or unknown):**
|
|
153
|
-
```bash
|
|
154
|
-
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --global
|
|
155
|
-
```
|
|
153
|
+
```bash
|
|
154
|
+
npx --yes --package=@ahmed118glitch/get-shit-done-codex@latest get-shit-done-cc --global
|
|
155
|
+
```
|
|
156
156
|
|
|
157
157
|
Capture output. If install fails, show error and exit.
|
|
158
158
|
|
package/package.json
CHANGED