@phantom-pm/feedback-hub 3.2.1 → 4.0.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 ADDED
@@ -0,0 +1,32 @@
1
+ # @phantom-pm/feedback-hub
2
+
3
+ Feedback ingestion and theme-extraction engine for Phantom PM workflows.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @phantom-pm/feedback-hub
9
+ ```
10
+
11
+ ## Minimal Usage
12
+
13
+ This package is primarily composed into the Phantom runtime. The stable end-to-end entrypoint is the CLI:
14
+
15
+ ```bash
16
+ npm install -g @phantom-pm/cli
17
+ phantom doctor --json
18
+ ```
19
+
20
+ ## Status
21
+
22
+ Published for advanced integrators and monorepo consumers. Feedback provenance and sync behavior surface through Phantom’s dashboard and mission flows; lower-level library APIs may evolve.
23
+
24
+ ## Links
25
+
26
+ - Docs: https://sir-ad.github.io/Phantom/
27
+ - Source: https://github.com/sir-ad/Phantom/tree/main/packages/feedback-hub
28
+ - Issues: https://github.com/sir-ad/Phantom/issues
29
+
30
+ ## License
31
+
32
+ MIT
@@ -1 +1 @@
1
- {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAErE,qBAAa,cAAe,YAAW,SAAS;IAGhC,OAAO,CAAC,MAAM;IAF1B,IAAI,EAAE,OAAO,CAAW;gBAEJ,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;IAEpD,cAAc,IAAI,OAAO;IAInB,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAwB3C;AAED,qBAAa,wBAAwB;IACjC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS;CAQnD"}
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAErE,qBAAa,cAAe,YAAW,SAAS;IAGhC,OAAO,CAAC,MAAM;IAF1B,IAAI,EAAE,OAAO,CAAW;gBAEJ,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC;IAEpD,cAAc,IAAI,OAAO;IAInB,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAyD3C;AAED,qBAAa,wBAAwB;IACjC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS;CAQnD"}
package/dist/collector.js CHANGED
@@ -5,30 +5,47 @@ export class SlackCollector {
5
5
  this.config = config;
6
6
  }
7
7
  validateConfig() {
8
- return !!this.config.channel_id; // Minimal validation
8
+ return Boolean(this.config.channel_id && (this.config.api_key || this.config.bot_token));
9
9
  }
10
10
  async collect() {
11
- // TODO: Implement real Slack API client
12
- // For now, return mock data
13
- console.log(`Collecting feedback from Slack channel: ${this.config.channel_id}`);
14
- return [
15
- {
16
- id: `slack_${Date.now()}_1`,
17
- source: 'slack',
18
- content: "I wish I could export this report to PDF directly.",
19
- author: "@jane_doe",
20
- timestamp: new Date().toISOString(),
21
- metadata: { channel: this.config.channel_id }
11
+ const token = this.config.api_key || this.config.bot_token;
12
+ const channel = this.config.channel_id;
13
+ const limit = Number(this.config.limit || 25);
14
+ if (!token || !channel) {
15
+ throw new Error('Slack collector requires channel_id and api_key/bot_token.');
16
+ }
17
+ const params = new URLSearchParams({
18
+ channel,
19
+ limit: String(Number.isFinite(limit) ? Math.max(1, Math.min(limit, 200)) : 25),
20
+ });
21
+ const response = await fetch(`https://slack.com/api/conversations.history?${params.toString()}`, {
22
+ headers: {
23
+ Authorization: `Bearer ${token}`,
24
+ },
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`Slack API request failed with ${response.status}`);
28
+ }
29
+ const payload = await response.json();
30
+ if (!payload.ok) {
31
+ throw new Error(payload.error || 'Slack API returned an unknown error.');
32
+ }
33
+ return (payload.messages || [])
34
+ .filter((message) => message.text && message.subtype !== 'channel_join' && message.subtype !== 'channel_leave')
35
+ .map((message, index) => ({
36
+ id: `slack_${channel}_${message.ts || Date.now()}_${index}`,
37
+ source: 'slack',
38
+ content: message.text.trim(),
39
+ author: message.username || message.user,
40
+ timestamp: message.ts
41
+ ? new Date(Math.floor(Number(message.ts.split('.')[0])) * 1000).toISOString()
42
+ : new Date().toISOString(),
43
+ metadata: {
44
+ channel,
45
+ thread_ts: message.thread_ts,
46
+ collectedVia: 'slack-api',
22
47
  },
23
- {
24
- id: `slack_${Date.now()}_2`,
25
- source: 'slack',
26
- content: "The dark mode contrast is a bit too low on the dashboard.",
27
- author: "@dev_dave",
28
- timestamp: new Date().toISOString(),
29
- metadata: { channel: this.config.channel_id }
30
- }
31
- ];
48
+ }));
32
49
  }
33
50
  }
34
51
  export class FeedbackCollectorFactory {
@@ -1 +1 @@
1
- {"version":3,"file":"collector.js","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IAGH;IAFpB,IAAI,GAAY,OAAO,CAAC;IAExB,YAAoB,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;IAAI,CAAC;IAEzD,cAAc;QACV,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB;IAC1D,CAAC;IAED,KAAK,CAAC,OAAO;QACT,wCAAwC;QACxC,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAEjF,OAAO;YACH;gBACI,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI;gBAC3B,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,oDAAoD;gBAC7D,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;aAChD;YACD;gBACI,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI;gBAC3B,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,2DAA2D;gBACpE,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;aAChD;SACJ,CAAC;IACN,CAAC;CACJ;AAED,MAAM,OAAO,wBAAwB;IACjC,MAAM,CAAC,MAAM,CAAC,MAAsB;QAChC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO;gBACR,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7C;gBACI,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAO7B,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAwC5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAiB7B,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAuD5E"}
package/dist/index.js CHANGED
@@ -3,42 +3,66 @@ import { FeedbackStorage } from './storage.js';
3
3
  export * from './types.js';
4
4
  export * from './collector.js';
5
5
  export * from './storage.js';
6
- // Configuration for active collectors (could come from config file/DB)
7
- const ACTIVE_SOURCES = [
8
- { type: 'slack', config: { channel_id: 'C123456' } }
9
- ];
6
+ function getActiveSources() {
7
+ const sources = [];
8
+ if (process.env.PHANTOM_FEEDBACK_SLACK_CHANNEL && (process.env.PHANTOM_FEEDBACK_SLACK_TOKEN || process.env.SLACK_BOT_TOKEN)) {
9
+ sources.push({
10
+ type: 'slack',
11
+ config: {
12
+ channel_id: process.env.PHANTOM_FEEDBACK_SLACK_CHANNEL,
13
+ api_key: process.env.PHANTOM_FEEDBACK_SLACK_TOKEN || process.env.SLACK_BOT_TOKEN,
14
+ limit: process.env.PHANTOM_FEEDBACK_SLACK_LIMIT,
15
+ },
16
+ });
17
+ }
18
+ return sources;
19
+ }
10
20
  export async function runFeedbackHub(args) {
11
21
  const command = args._?.[0] || 'sync';
12
22
  if (command === 'sync') {
13
- console.log('Syncing feedback from all sources...');
23
+ const activeSources = getActiveSources();
24
+ if (activeSources.length === 0) {
25
+ return {
26
+ success: false,
27
+ message: 'No feedback sources configured. Set PHANTOM_FEEDBACK_SLACK_CHANNEL and PHANTOM_FEEDBACK_SLACK_TOKEN to enable Slack sync.',
28
+ stats: { totalCollected: 0, configuredSources: 0 },
29
+ };
30
+ }
31
+ console.log('Syncing feedback from configured sources...');
14
32
  const storage = new FeedbackStorage();
15
33
  let totalCollected = 0;
16
- for (const source of ACTIVE_SOURCES) {
34
+ const sourceResults = [];
35
+ for (const source of activeSources) {
17
36
  try {
18
37
  const collector = FeedbackCollectorFactory.create(source);
38
+ if (!collector.validateConfig()) {
39
+ throw new Error('Invalid collector configuration.');
40
+ }
19
41
  const items = await collector.collect();
20
42
  storage.saveFeedback(items);
21
43
  totalCollected += items.length;
22
44
  console.log(` - ${source.type}: Collected ${items.length} items`);
45
+ sourceResults.push({ source: source.type, success: true, collected: items.length });
23
46
  }
24
47
  catch (err) {
25
48
  console.error(` - ${source.type}: Failed to collect - ${err.message}`);
49
+ sourceResults.push({ source: source.type, success: false, error: err.message });
26
50
  }
27
51
  }
28
52
  return {
29
- success: true,
53
+ success: sourceResults.some((result) => result.success),
30
54
  message: `Sync complete. ${totalCollected} new items processed.`,
31
- stats: { totalCollected }
55
+ stats: { totalCollected, configuredSources: activeSources.length },
56
+ sources: sourceResults,
32
57
  };
33
58
  }
34
59
  if (command === 'themes') {
35
60
  const storage = new FeedbackStorage();
36
- // TODO: Implement AI theme extraction here (Processor)
37
- // For now, return stored themes (mock or empty)
38
61
  const themes = storage.getAllThemes();
39
62
  return {
40
63
  success: true,
41
- themes
64
+ derivationMode: 'stored',
65
+ themes,
42
66
  };
43
67
  }
44
68
  throw new Error(`Unknown command: ${command}`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAE7B,uEAAuE;AACvE,MAAM,cAAc,GAAqB;IACrC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE;CACvD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAyB;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAEtC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC;gBACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC5B,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,eAAe,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,IAAI,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QAED,OAAO;YACH,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,kBAAkB,cAAc,uBAAuB;YAChE,KAAK,EAAE,EAAE,cAAc,EAAE;SAC5B,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,uDAAuD;QACvD,gDAAgD;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QACtC,OAAO;YACH,OAAO,EAAE,IAAI;YACb,MAAM;SACT,CAAC;IACN,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/storage.d.ts CHANGED
@@ -5,6 +5,7 @@ export declare class FeedbackStorage {
5
5
  private init;
6
6
  saveFeedback(items: FeedbackItem[]): void;
7
7
  saveThemes(themes: FeedbackTheme[]): void;
8
+ replaceThemes(themes: FeedbackTheme[]): void;
8
9
  getAllFeedback(): FeedbackItem[];
9
10
  getAllThemes(): FeedbackTheme[];
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,eAAe;IACxB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,GAAE,MAAqB;IAKzC,OAAO,CAAC,IAAI;IAyBZ,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAsBzC,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAuBzC,cAAc,IAAI,YAAY,EAAE;IAYhC,YAAY,IAAI,aAAa,EAAE;CAYlC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,eAAe;IACxB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,GAAE,MAAqB;IAKzC,OAAO,CAAC,IAAI;IAyBZ,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAsBzC,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAuBzC,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAyB5C,cAAc,IAAI,YAAY,EAAE;IAYhC,YAAY,IAAI,aAAa,EAAE;CAYlC"}
package/dist/storage.js CHANGED
@@ -53,6 +53,20 @@ export class FeedbackStorage {
53
53
  });
54
54
  tx(themes);
55
55
  }
56
+ replaceThemes(themes) {
57
+ const clearStmt = this.db.prepare('DELETE FROM feedback_themes');
58
+ const insertStmt = this.db.prepare(`
59
+ INSERT OR REPLACE INTO feedback_themes (id, name, description, sentiment, frequency, sources, related_feedback_ids)
60
+ VALUES (?, ?, ?, ?, ?, ?, ?)
61
+ `);
62
+ const tx = this.db.transaction((items) => {
63
+ clearStmt.run();
64
+ for (const theme of items) {
65
+ insertStmt.run(theme.id, theme.name, theme.description, theme.sentiment, theme.frequency, JSON.stringify(theme.sources), JSON.stringify(theme.related_feedback_ids));
66
+ }
67
+ });
68
+ tx(themes);
69
+ }
56
70
  getAllFeedback() {
57
71
  const rows = this.db.prepare('SELECT * FROM feedback_items ORDER BY timestamp DESC').all();
58
72
  return rows.map(row => ({
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phantom-pm/feedback-hub",
3
- "version": "3.2.1",
3
+ "version": "4.0.4",
4
4
  "description": "Feedback Hub module for Phantom - Aggregates feedback from multiple sources",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -15,7 +15,7 @@
15
15
  "lint": "eslint src --ext .ts"
16
16
  },
17
17
  "dependencies": {
18
- "@phantom-pm/core": "3.2.1",
18
+ "@phantom-pm/core": "4.0.4",
19
19
  "better-sqlite3": "^11.1.0",
20
20
  "discord.js": "14.25.1",
21
21
  "zod": "^3.23.8"
@@ -28,5 +28,15 @@
28
28
  },
29
29
  "publishConfig": {
30
30
  "access": "public"
31
+ },
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/sir-ad/Phantom.git",
36
+ "directory": "packages/feedback-hub"
37
+ },
38
+ "homepage": "https://sir-ad.github.io/Phantom/",
39
+ "bugs": {
40
+ "url": "https://github.com/sir-ad/Phantom/issues"
31
41
  }
32
42
  }