@amityco/social-plus-vise 0.14.12 → 0.14.14

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/CHANGELOG.md CHANGED
@@ -4,6 +4,25 @@ All notable changes to `@amityco/social-plus-vise` are documented in this file.
4
4
 
5
5
  The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 0.14.14 — 2026-06-05
8
+
9
+ ### Fixed
10
+ - **Android poll optional capability:** `post-poll-creation` now recognizes native Android poll post linking via `createPost().poll(pollId)` and `createPollPost(...)`, not only the TypeScript `createPost({ data: { pollId } })` shape.
11
+ - **Native optional sensor wording:** poll composer guidance now names the native post-builder path so agents do not need marker comments to satisfy the selected capability.
12
+
13
+ ### Verified
14
+ - Focused capability/product-flow tests and a marker-free `music-player-android` smoke passed with selected `post-poll-creation`.
15
+
16
+ ## 0.14.13 — 2026-06-05
17
+
18
+ ### Changed
19
+ - **Comment UI-state precision:** `*.comments.ui-states-present` now requires loading/empty/error handling inside the comment surface itself, so unrelated feed/auth/network state words elsewhere in the app do not satisfy the comment tray expectation.
20
+ - **Rich feed rendering grouping:** `feed.rich-post-rendering` now groups both concrete post datatype handling and parent-child post rendering sensors across TypeScript, React Native, Android, Flutter, and iOS.
21
+ - **Repeatable host-agent smoke:** `npm run validate` now includes a temp-project flow that verifies design extraction, plan question surfacing, answered init, optional capability sensors, grouped product expectations, and ambiguous attestation guidance.
22
+
23
+ ### Verified
24
+ - Focused validator coverage and real-project temp-copy smokes covered Android, TypeScript, and iOS host apps without modifying the original projects.
25
+
7
26
  ## 0.14.12 — 2026-06-05
8
27
 
9
28
  ### Changed
@@ -403,14 +403,14 @@ export const OPTIONAL_CAPABILITIES = [
403
403
  { label: "SDK post creation/linking", symbols: [/\bcreatePollPost\b/i, /\bcreatePost\b/i] },
404
404
  ],
405
405
  sensors: [
406
- { label: "PollRepository.createPoll", regex: /PollRepository\.createPoll\s*\(|(?<![.\w])createPoll\s*\(/ },
406
+ { label: "PollRepository.createPoll", regex: /PollRepository\.createPoll\s*\(|(?<![\w])createPoll\s*\(/ },
407
407
  {
408
408
  label: "createPost links pollId",
409
- regex: /createPost\s*\(\s*\{[\s\S]*?data\s*:\s*\{[\s\S]*?\bpollId\b\s*(?::|[,}])/,
409
+ regex: /createPost\s*\(\s*\{[\s\S]*?data\s*:\s*\{[\s\S]*?\bpollId\b\s*(?::|[,}])|\bcreatePollPost\s*\(|\.createPost\s*\(\s*\)[\s\S]{0,1200}?\.poll\s*\(\s*pollId\b/,
410
410
  },
411
- { label: "PollRepository.votePoll", regex: /PollRepository\.votePoll\s*\(|(?<![.\w])votePoll\s*\(/ },
411
+ { label: "PollRepository.votePoll", regex: /PollRepository\.votePoll\s*\(|(?<![\w])votePoll\s*\(/ },
412
412
  ],
413
- hint: "If the user opts into polls, implement the createPoll -> createPost({ data: { pollId } }) chain and the votePoll read-side interaction.",
413
+ hint: "If the user opts into polls, implement the platform poll creation -> poll post linking chain, for example createPoll -> createPost({ data: { pollId } }) on TypeScript or createPost().poll(pollId) / createPollPost on native SDKs, plus the votePoll read-side interaction.",
414
414
  },
415
415
  {
416
416
  id: "post-edit",
package/dist/outcomes.js CHANGED
@@ -629,7 +629,7 @@ const addFeed = {
629
629
  evidence: ["social-plus-sdk/social/content-management/posts/creation/poll-post"],
630
630
  },
631
631
  {
632
- step: "If the post composer supports poll creation, implement the two-step creation chain: (1) `PollRepository.createPoll({ question, answers: [{ data: text }], answerType: 'single'|'multiple', closedIn? })` — returns a Poll with a pollId; (2) `PostRepository.createPost({ targetType, targetId, data: { text: '', pollId } })` links the poll to the feed post. Rendering poll answers (votePoll/unvotePoll) is the read-side; without both creation steps the poll composer silently does nothing. Offer a dedicated poll-builder UI (question input + dynamic answer list) so users can author polls inline.",
632
+ step: "If the post composer supports poll creation, implement the two-step creation chain: (1) create the poll with the platform SDK poll repository — returns a Poll/pollId; (2) link that poll into a post with the platform post builder, for example `PostRepository.createPost({ targetType, targetId, data: { text: '', pollId } })` on TypeScript/React Native or `createPost().poll(pollId)` / `createPollPost(...)` on native SDKs. Rendering poll answers (votePoll/unvotePoll) is the read-side; without both creation steps the poll composer silently does nothing. Offer a dedicated poll-builder UI (question input + dynamic answer list) so users can author polls inline.",
633
633
  evidence: [
634
634
  "social-plus-sdk/social/content-management/posts/creation/poll-post",
635
635
  "social-plus-sdk/social/posts",
@@ -4,26 +4,51 @@ export const PRODUCT_EXPECTATION_BINDINGS = [
4
4
  sensorId: "typescript.feed.post-datatype-handled",
5
5
  platform: "typescript",
6
6
  },
7
+ {
8
+ expectationId: "feed.rich-post-rendering",
9
+ sensorId: "typescript.posts.parent-child-rendered",
10
+ platform: "typescript",
11
+ },
7
12
  {
8
13
  expectationId: "feed.rich-post-rendering",
9
14
  sensorId: "react-native.feed.post-datatype-handled",
10
15
  platform: "react-native",
11
16
  },
17
+ {
18
+ expectationId: "feed.rich-post-rendering",
19
+ sensorId: "react-native.posts.parent-child-rendered",
20
+ platform: "react-native",
21
+ },
12
22
  {
13
23
  expectationId: "feed.rich-post-rendering",
14
24
  sensorId: "android.feed.post-datatype-handled",
15
25
  platform: "android",
16
26
  },
27
+ {
28
+ expectationId: "feed.rich-post-rendering",
29
+ sensorId: "android.posts.parent-child-rendered",
30
+ platform: "android",
31
+ },
17
32
  {
18
33
  expectationId: "feed.rich-post-rendering",
19
34
  sensorId: "flutter.feed.post-datatype-handled",
20
35
  platform: "flutter",
21
36
  },
37
+ {
38
+ expectationId: "feed.rich-post-rendering",
39
+ sensorId: "flutter.posts.parent-child-rendered",
40
+ platform: "flutter",
41
+ },
22
42
  {
23
43
  expectationId: "feed.rich-post-rendering",
24
44
  sensorId: "ios.feed.post-datatype-handled",
25
45
  platform: "ios",
26
46
  },
47
+ {
48
+ expectationId: "feed.rich-post-rendering",
49
+ sensorId: "ios.posts.parent-child-rendered",
50
+ platform: "ios",
51
+ },
27
52
  {
28
53
  expectationId: "feed.rich-post-composer-scope",
29
54
  sensorId: "typescript.feed.rich-post-composer-surfaced",
@@ -1022,8 +1022,9 @@ function validateComments(root, platform, sourceContent) {
1022
1022
  if (commentFiles.length > 0 && hasReactiveCommentObserver && !containsAny(sourceContent, cleanupMarkers)) {
1023
1023
  findings.push(finding(`${platform}.comments.observer-cleanup`, "warning", "Comment observer/subscription was found but no obvious cleanup was detected.", relativeFile(root, commentFiles[0]), "Dispose or unsubscribe comment observers when the lifecycle owner is destroyed."));
1024
1024
  }
1025
- // ui-states-present: require loading/empty/error states
1026
- if (!containsAny(sourceContent, COMMENT_UI_STATE_MARKERS)) {
1025
+ // ui-states-present: require loading/empty/error states in the comment surface itself.
1026
+ // Unrelated feed/auth/network state markers elsewhere in the project do not make a comment UI complete.
1027
+ if (!containsAnyForFiles(sourceContent, commentFiles, COMMENT_UI_STATE_MARKERS)) {
1027
1028
  findings.push(finding(`${platform}.comments.ui-states-present`, "warning", "Comment UI is present but no loading, empty, or error state handling was detected.", relativeFile(root, commentFiles[0]), "Handle loading, empty, and error states in the comment UI for a complete user experience."));
1028
1029
  }
1029
1030
  // moderation-affordance-present: require moderation on comments (scoped to comment files)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/social-plus-vise",
3
- "version": "0.14.12",
3
+ "version": "0.14.14",
4
4
  "description": "Skill-guided deterministic CLI for social.plus SDK integration assistance.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -68,7 +68,7 @@
68
68
  "test:blocks-installer": "npm run build && node test/run-blocks-installer.mjs",
69
69
  "typecheck": "tsc -p tsconfig.json --noEmit",
70
70
  "test:e2e-package": "npm run build && node test/run-e2e-package.mjs",
71
- "validate": "npm run typecheck && npm test && npm run test:mcp && npm run test:cli && npm run test:docs && npm run test:ast && npm run test:design-extract && npm run test:design-brief && npm run test:capabilities && npm run test:classify && npm run test:compliance && npm run test:product-flow && npm run test:rule-coverage && npm run test:readme-coverage && npm run test:happy-path-clean && npm run test:fixture-symmetry && npm run test:nonui-skip && npm run test:sdk-version && npm run test:sdk-surface && npm run test:sdk-facts && npm run test:blocks-installer && npm run test:native-idioms && npm run test:grader-facts && npm run test:ground-truth && npm run test:improvements && npm run test:debug && npm run test:preflight && npm run test:e2e-package && npm run bench:symbols-drift && npm run pack:check",
71
+ "validate": "npm run typecheck && npm test && npm run test:mcp && npm run test:cli && npm run test:docs && npm run test:ast && npm run test:design-extract && npm run test:design-brief && npm run test:capabilities && npm run test:classify && npm run test:compliance && npm run test:product-flow && npm run test:agent-flow && npm run test:rule-coverage && npm run test:readme-coverage && npm run test:happy-path-clean && npm run test:fixture-symmetry && npm run test:nonui-skip && npm run test:sdk-version && npm run test:sdk-surface && npm run test:sdk-facts && npm run test:blocks-installer && npm run test:native-idioms && npm run test:grader-facts && npm run test:ground-truth && npm run test:improvements && npm run test:debug && npm run test:preflight && npm run test:e2e-package && npm run bench:symbols-drift && npm run pack:check",
72
72
  "test:ast": "node test/run-ast-helpers.mjs",
73
73
  "test:design-extract": "npm run build && node test/run-design-extract.mjs",
74
74
  "test:design-brief": "npm run build && node test/run-design-brief.mjs",
@@ -77,6 +77,7 @@
77
77
  "test:debug": "npm run build && node test/run-debug.mjs",
78
78
  "test:preflight": "npm run build && node test/run-preflight.mjs",
79
79
  "test:product-flow": "npm run build && node test/run-product-flow.mjs",
80
+ "test:agent-flow": "npm run build && node test/run-agent-flow-smoke.mjs",
80
81
  "test:native-idioms": "npm run build && node test/run-native-idioms.mjs",
81
82
  "test:grader-facts": "node test/run-grader-facts.mjs",
82
83
  "test:ground-truth": "node test/run-ground-truth.mjs",