@fermindi/pwn-cli 0.1.1 → 0.3.0
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/LICENSE +21 -21
- package/README.md +265 -251
- package/cli/batch.js +333 -333
- package/cli/codespaces.js +303 -303
- package/cli/index.js +112 -91
- package/cli/inject.js +90 -67
- package/cli/knowledge.js +531 -531
- package/cli/migrate.js +466 -0
- package/cli/notify.js +135 -135
- package/cli/patterns.js +665 -665
- package/cli/save.js +206 -0
- package/cli/status.js +91 -91
- package/cli/update.js +189 -0
- package/cli/validate.js +61 -61
- package/package.json +70 -70
- package/src/core/inject.js +300 -204
- package/src/core/state.js +91 -91
- package/src/core/validate.js +202 -202
- package/src/core/workspace.js +176 -176
- package/src/index.js +20 -20
- package/src/knowledge/gc.js +308 -308
- package/src/knowledge/lifecycle.js +401 -401
- package/src/knowledge/promote.js +364 -364
- package/src/knowledge/references.js +342 -342
- package/src/patterns/matcher.js +218 -218
- package/src/patterns/registry.js +375 -375
- package/src/patterns/triggers.js +423 -423
- package/src/services/batch-service.js +849 -849
- package/src/services/notification-service.js +342 -342
- package/templates/codespaces/devcontainer.json +52 -52
- package/templates/codespaces/setup.sh +70 -70
- package/templates/workspace/.ai/README.md +164 -164
- package/templates/workspace/.ai/agents/README.md +204 -204
- package/templates/workspace/.ai/agents/claude.md +625 -625
- package/templates/workspace/.ai/config/README.md +79 -79
- package/templates/workspace/.ai/config/notifications.template.json +20 -20
- package/templates/workspace/.ai/memory/deadends.md +79 -79
- package/templates/workspace/.ai/memory/decisions.md +58 -58
- package/templates/workspace/.ai/memory/patterns.md +65 -65
- package/templates/workspace/.ai/patterns/backend/README.md +126 -126
- package/templates/workspace/.ai/patterns/frontend/README.md +103 -103
- package/templates/workspace/.ai/patterns/index.md +256 -256
- package/templates/workspace/.ai/patterns/triggers.json +1087 -1087
- package/templates/workspace/.ai/patterns/universal/README.md +141 -141
- package/templates/workspace/.ai/state.template.json +8 -8
- package/templates/workspace/.ai/tasks/active.md +77 -77
- package/templates/workspace/.ai/tasks/backlog.md +95 -95
- package/templates/workspace/.ai/workflows/batch-task.md +356 -356
package/cli/index.js
CHANGED
|
@@ -1,91 +1,112 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync } from 'fs';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { dirname, join } from 'path';
|
|
5
|
-
|
|
6
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
|
|
8
|
-
|
|
9
|
-
const command = process.argv[2];
|
|
10
|
-
const args = process.argv.slice(3);
|
|
11
|
-
|
|
12
|
-
// Show version
|
|
13
|
-
if (command === '--version' || command === '-v') {
|
|
14
|
-
console.log(packageJson.version);
|
|
15
|
-
process.exit(0);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Show help
|
|
19
|
-
if (!command || command === '--help' || command === '-h') {
|
|
20
|
-
console.log('PWN - Professional AI Workspace\n');
|
|
21
|
-
console.log('Usage: pwn <command> [options]\n');
|
|
22
|
-
console.log('Commands:');
|
|
23
|
-
console.log(' inject Inject .ai/ workspace into current project');
|
|
24
|
-
console.log('
|
|
25
|
-
console.log('
|
|
26
|
-
console.log('
|
|
27
|
-
console.log('
|
|
28
|
-
console.log('
|
|
29
|
-
console.log('
|
|
30
|
-
console.log('
|
|
31
|
-
console.log('
|
|
32
|
-
console.log('
|
|
33
|
-
console.log('
|
|
34
|
-
console.log('
|
|
35
|
-
console.log('
|
|
36
|
-
console.log('
|
|
37
|
-
console.log('
|
|
38
|
-
console.log('
|
|
39
|
-
console.log('
|
|
40
|
-
console.log('
|
|
41
|
-
console.log('
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
await
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
await
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
await
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
await
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
await
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
await
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
await
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
|
|
8
|
+
|
|
9
|
+
const command = process.argv[2];
|
|
10
|
+
const args = process.argv.slice(3);
|
|
11
|
+
|
|
12
|
+
// Show version
|
|
13
|
+
if (command === '--version' || command === '-v') {
|
|
14
|
+
console.log(packageJson.version);
|
|
15
|
+
process.exit(0);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Show help
|
|
19
|
+
if (!command || command === '--help' || command === '-h') {
|
|
20
|
+
console.log('PWN - Professional AI Workspace\n');
|
|
21
|
+
console.log('Usage: pwn <command> [options]\n');
|
|
22
|
+
console.log('Commands:');
|
|
23
|
+
console.log(' inject Inject .ai/ workspace into current project');
|
|
24
|
+
console.log(' update Update PWN framework files to latest version');
|
|
25
|
+
console.log(' migrate Migrate existing AI files to PWN structure');
|
|
26
|
+
console.log(' save Save session context to memory');
|
|
27
|
+
console.log(' status Show workspace status');
|
|
28
|
+
console.log(' validate Validate workspace structure');
|
|
29
|
+
console.log(' notify Send notifications (test, send, config)');
|
|
30
|
+
console.log(' batch Execute tasks autonomously');
|
|
31
|
+
console.log(' patterns Manage patterns and triggers');
|
|
32
|
+
console.log(' knowledge Knowledge lifecycle management');
|
|
33
|
+
console.log(' codespaces GitHub Codespaces integration');
|
|
34
|
+
console.log(' --version, -v Show version');
|
|
35
|
+
console.log(' --help, -h Show help\n');
|
|
36
|
+
console.log('Options:');
|
|
37
|
+
console.log(' inject --force Overwrite existing .ai/ directory');
|
|
38
|
+
console.log(' update --dry-run Preview update without changes');
|
|
39
|
+
console.log(' migrate --dry-run Preview migration without changes');
|
|
40
|
+
console.log(' save --message=X Save with custom summary');
|
|
41
|
+
console.log(' validate --verbose Show detailed structure report');
|
|
42
|
+
console.log(' notify test [ch] Test notification channel');
|
|
43
|
+
console.log(' batch --count 5 Execute 5 tasks');
|
|
44
|
+
console.log(' patterns eval <f> Evaluate triggers for file');
|
|
45
|
+
console.log(' knowledge status Show knowledge system status');
|
|
46
|
+
console.log(' codespaces init Add devcontainer config\n');
|
|
47
|
+
console.log('Documentation: https://github.com/anthropics/pwn');
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Route commands
|
|
52
|
+
switch (command) {
|
|
53
|
+
case 'inject':
|
|
54
|
+
const { default: inject } = await import('./inject.js');
|
|
55
|
+
await inject(args);
|
|
56
|
+
break;
|
|
57
|
+
|
|
58
|
+
case 'update':
|
|
59
|
+
const { default: update } = await import('./update.js');
|
|
60
|
+
await update(args);
|
|
61
|
+
break;
|
|
62
|
+
|
|
63
|
+
case 'migrate':
|
|
64
|
+
const { default: migrate } = await import('./migrate.js');
|
|
65
|
+
await migrate(args);
|
|
66
|
+
break;
|
|
67
|
+
|
|
68
|
+
case 'save':
|
|
69
|
+
const { default: save } = await import('./save.js');
|
|
70
|
+
await save(args);
|
|
71
|
+
break;
|
|
72
|
+
|
|
73
|
+
case 'status':
|
|
74
|
+
const { default: status } = await import('./status.js');
|
|
75
|
+
await status();
|
|
76
|
+
break;
|
|
77
|
+
|
|
78
|
+
case 'validate':
|
|
79
|
+
const { default: validate } = await import('./validate.js');
|
|
80
|
+
await validate(args);
|
|
81
|
+
break;
|
|
82
|
+
|
|
83
|
+
case 'notify':
|
|
84
|
+
const { default: notify } = await import('./notify.js');
|
|
85
|
+
await notify(args);
|
|
86
|
+
break;
|
|
87
|
+
|
|
88
|
+
case 'batch':
|
|
89
|
+
const { default: batchCmd } = await import('./batch.js');
|
|
90
|
+
await batchCmd(args);
|
|
91
|
+
break;
|
|
92
|
+
|
|
93
|
+
case 'patterns':
|
|
94
|
+
const { default: patternsCmd } = await import('./patterns.js');
|
|
95
|
+
await patternsCmd(args);
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
case 'knowledge':
|
|
99
|
+
const { default: knowledgeCmd } = await import('./knowledge.js');
|
|
100
|
+
await knowledgeCmd(args);
|
|
101
|
+
break;
|
|
102
|
+
|
|
103
|
+
case 'codespaces':
|
|
104
|
+
const { default: codespacesCmd } = await import('./codespaces.js');
|
|
105
|
+
await codespacesCmd(args);
|
|
106
|
+
break;
|
|
107
|
+
|
|
108
|
+
default:
|
|
109
|
+
console.log(`❌ Unknown command: ${command}`);
|
|
110
|
+
console.log(' Run: pwn --help');
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
package/cli/inject.js
CHANGED
|
@@ -1,67 +1,90 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { existsSync, readFileSync } from 'fs';
|
|
3
|
-
import { join } from 'path';
|
|
4
|
-
import { inject, detectKnownAIFiles } from '../src/core/inject.js';
|
|
5
|
-
|
|
6
|
-
export default async function injectCommand(args = []) {
|
|
7
|
-
const force = args.includes('--force') || args.includes('-f');
|
|
8
|
-
|
|
9
|
-
console.log('🚀 PWN Workspace Injection\n');
|
|
10
|
-
|
|
11
|
-
const result = await inject({ force });
|
|
12
|
-
|
|
13
|
-
// Show detected AI files (before success/failure message)
|
|
14
|
-
if (result.detected && result.detected.length > 0) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
console.log('
|
|
31
|
-
|
|
32
|
-
console.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
console.log('
|
|
65
|
-
console.log('
|
|
66
|
-
console.log('
|
|
67
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { inject, detectKnownAIFiles } from '../src/core/inject.js';
|
|
5
|
+
|
|
6
|
+
export default async function injectCommand(args = []) {
|
|
7
|
+
const force = args.includes('--force') || args.includes('-f');
|
|
8
|
+
|
|
9
|
+
console.log('🚀 PWN Workspace Injection\n');
|
|
10
|
+
|
|
11
|
+
const result = await inject({ force });
|
|
12
|
+
|
|
13
|
+
// Show detected AI files (before success/failure message)
|
|
14
|
+
if (result.detected && result.detected.length > 0) {
|
|
15
|
+
const migratable = result.detected.filter(f => f.migratable);
|
|
16
|
+
const nonMigratable = result.detected.filter(f => !f.migratable);
|
|
17
|
+
|
|
18
|
+
console.log('⚠️ Detected existing AI instruction files:\n');
|
|
19
|
+
for (const file of result.detected) {
|
|
20
|
+
const migratableTag = file.migratable ? ' [migratable]' : '';
|
|
21
|
+
console.log(` 📄 ${file.file}${migratableTag}`);
|
|
22
|
+
console.log(` Type: ${file.type} - ${file.description}`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (migratable.length > 0) {
|
|
26
|
+
console.log('\n 🔄 Run "pwn migrate" to automatically migrate content:');
|
|
27
|
+
console.log(' pwn migrate --dry-run # Preview changes');
|
|
28
|
+
console.log(' pwn migrate # Execute migration\n');
|
|
29
|
+
} else {
|
|
30
|
+
console.log('\n 💡 Consider migrating content manually to .ai/ structure:');
|
|
31
|
+
console.log(' - Instructions → .ai/agents/claude.md');
|
|
32
|
+
console.log(' - Decisions → .ai/memory/decisions.md');
|
|
33
|
+
console.log(' - Patterns → .ai/memory/patterns.md');
|
|
34
|
+
console.log(' - Tasks → .ai/tasks/active.md\n');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (!result.success) {
|
|
39
|
+
if (result.error === 'ALREADY_EXISTS') {
|
|
40
|
+
console.log('❌ .ai/ directory already exists in this project');
|
|
41
|
+
console.log(' Use --force to overwrite: pwn inject --force');
|
|
42
|
+
} else {
|
|
43
|
+
console.error('❌ Injection failed:', result.message);
|
|
44
|
+
}
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
console.log('\n✅ PWN workspace injected successfully!\n');
|
|
49
|
+
|
|
50
|
+
// Show backup info
|
|
51
|
+
if (result.backed_up && result.backed_up.length > 0) {
|
|
52
|
+
console.log('📦 Backed up existing AI files:');
|
|
53
|
+
for (const b of result.backed_up) {
|
|
54
|
+
console.log(` ${b.from} → ${b.to}`);
|
|
55
|
+
}
|
|
56
|
+
console.log('');
|
|
57
|
+
console.log(' 💡 Merge your custom instructions into CLAUDE.md');
|
|
58
|
+
console.log(' 🗑️ Delete the backup files (~CLAUDE.md, etc.) when done\n');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
console.log('📁 Created structure:');
|
|
62
|
+
console.log(' .ai/');
|
|
63
|
+
console.log(' ├── memory/ (decisions, patterns, dead-ends)');
|
|
64
|
+
console.log(' ├── tasks/ (active work, backlog)');
|
|
65
|
+
console.log(' ├── patterns/ (auto-applied patterns)');
|
|
66
|
+
console.log(' ├── workflows/ (batch execution)');
|
|
67
|
+
console.log(' ├── agents/ (AI agent configs)');
|
|
68
|
+
console.log(' └── config/ (notifications, etc)\n');
|
|
69
|
+
|
|
70
|
+
// Show ntfy topic if generated
|
|
71
|
+
const notifyPath = join(process.cwd(), '.ai', 'config', 'notifications.json');
|
|
72
|
+
if (existsSync(notifyPath)) {
|
|
73
|
+
try {
|
|
74
|
+
const config = JSON.parse(readFileSync(notifyPath, 'utf8'));
|
|
75
|
+
const topic = config.channels?.ntfy?.topic;
|
|
76
|
+
if (topic && !topic.includes('your-unique')) {
|
|
77
|
+
console.log('🔔 Notifications:');
|
|
78
|
+
console.log(` ntfy topic: ${topic}`);
|
|
79
|
+
console.log(` Subscribe: https://ntfy.sh/${topic}`);
|
|
80
|
+
console.log(' Enable: Edit .ai/config/notifications.json\n');
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
// Ignore
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
console.log('📖 Next steps:');
|
|
88
|
+
console.log(' 1. Read: .ai/README.md');
|
|
89
|
+
console.log(' 2. Start working with AI assistance\n');
|
|
90
|
+
}
|