@higrowth/cli 0.3.3 → 0.3.5
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/dist/index.js +332 -28
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -703,7 +703,7 @@ just say which one \u2014 you don't have to redo the whole interview."*
|
|
|
703
703
|
// src/skills/marketing-strategy.ts
|
|
704
704
|
var MARKETING_STRATEGY = `---
|
|
705
705
|
name: higrowth-marketing-strategy
|
|
706
|
-
description: Helps the user interpret a Higrowth diagnostic, choose a bounded scoped-plan area, review imagination hypotheses, and shape the next 2-4 week sprint. Use when the user wants to talk through their report, decide what to ship, ask what can be fixed in an area, or plan.
|
|
706
|
+
description: Helps the user interpret a Higrowth diagnostic, choose a bounded scoped-plan or topic-roadmap area, review imagination hypotheses, and shape the next 2-4 week sprint. Use when the user wants to talk through their report, decide what to ship, ask what can be fixed in an area, create/update content from roadmap gaps, or plan.
|
|
707
707
|
allowed-tools: mcp__higrowth__execute_typescript
|
|
708
708
|
---
|
|
709
709
|
|
|
@@ -717,7 +717,8 @@ measurable scoped plan that can move the needle.
|
|
|
717
717
|
|
|
718
718
|
Trigger on: "what should I focus on", "walk me through my report",
|
|
719
719
|
"prioritize this", "what's the move", "plan my sprint", "what can we
|
|
720
|
-
fix in [area/topic/page]"
|
|
720
|
+
fix in [area/topic/page]", "what are the gaps in this topic", "plan this
|
|
721
|
+
roadmap", "what new pages or updates should we create".
|
|
721
722
|
|
|
722
723
|
## Mental model
|
|
723
724
|
|
|
@@ -725,20 +726,32 @@ Plans are not giant backlogs. A good plan is a scoped intervention:
|
|
|
725
726
|
one topic area, page cluster, gap type, or conversion slice with enough
|
|
726
727
|
evidence to act and narrow enough boundaries to avoid conflicting work.
|
|
727
728
|
|
|
728
|
-
The planning stack has
|
|
729
|
+
The planning stack has six layers:
|
|
729
730
|
|
|
730
731
|
1. **Answer map** \u2014 what questions the site answers for which persona
|
|
731
732
|
and decision stage.
|
|
732
733
|
2. **Decision candidates** \u2014 executable moves grounded in answer cells,
|
|
733
734
|
gaps, GSC, GA, strategy, and conflict checks.
|
|
734
|
-
3. **
|
|
735
|
+
3. **Topic roadmap** \u2014 the topic-area execution ledger: new pages to
|
|
736
|
+
create, pages to refresh, consolidation/removal, internal links, and
|
|
737
|
+
measurement/setup rows. When the user asks about a topic's gaps or
|
|
738
|
+
roadmap, these rows are a first-class planning source.
|
|
739
|
+
4. **Imagination candidates** \u2014 adjacent hypotheses HG can infer from
|
|
735
740
|
weak or missing answers. They are ideas only.
|
|
736
|
-
|
|
737
|
-
items from decision
|
|
741
|
+
5. **Scoped plans** \u2014 a small selected scope that generates execution
|
|
742
|
+
items from roadmap rows, scoped gaps, pages, answer cells, or decision
|
|
743
|
+
candidates.
|
|
744
|
+
6. **Authored plans** \u2014 when the harness can synthesize the right
|
|
745
|
+
strategic shape better than the built-in generator, it may write the
|
|
746
|
+
staging plan artifact directly into HG via the authored-plan API,
|
|
747
|
+
using HG signals as evidence.
|
|
738
748
|
|
|
739
749
|
Rank by **leverage, evidence, and executability**, not raw opportunity count.
|
|
740
750
|
Never create work orders directly from imagination candidates. Promote
|
|
741
751
|
good imagination candidates into decision candidates first, then plan.
|
|
752
|
+
Roadmap rows do not need promotion: use them directly when the user's
|
|
753
|
+
intent is to execute a topic roadmap. Authored plans do not bypass
|
|
754
|
+
review or execution approval: they create/edit staging plan artifacts.
|
|
742
755
|
|
|
743
756
|
## The conversation
|
|
744
757
|
|
|
@@ -818,6 +831,31 @@ If answer-map compute still returns little or no signal, say so. The
|
|
|
818
831
|
right prerequisite may be a scan, GSC/GA connection, KB population, or
|
|
819
832
|
pillar analysis. Do not fabricate a strategic plan from thin data.
|
|
820
833
|
|
|
834
|
+
Also check the topic roadmap when the user asks about a topic, gaps,
|
|
835
|
+
new content, content updates, or comprehensiveness:
|
|
836
|
+
|
|
837
|
+
\`\`\`ts
|
|
838
|
+
const roadmap = topicId
|
|
839
|
+
? await api.get(\`/api/topics/\${topicId}/roadmap\`)
|
|
840
|
+
: null;
|
|
841
|
+
const openRoadmapItems =
|
|
842
|
+
roadmap?.items?.filter(item => item.status === 'open') ?? [];
|
|
843
|
+
|
|
844
|
+
console.log(openRoadmapItems.map(item => ({
|
|
845
|
+
id: item.id,
|
|
846
|
+
actionType: item.actionType,
|
|
847
|
+
title: item.title,
|
|
848
|
+
targetPageUrl: item.targetPageUrl,
|
|
849
|
+
queries: item.queries?.slice(0, 5) ?? [],
|
|
850
|
+
existingCoverage: item.coverage?.length ?? 0,
|
|
851
|
+
})));
|
|
852
|
+
\`\`\`
|
|
853
|
+
|
|
854
|
+
Roadmap rows answer: what new pages to create, which pages to update,
|
|
855
|
+
what to consolidate or remove, where internal links are missing, and
|
|
856
|
+
what measurement/setup work blocks confidence. Treat open roadmap rows
|
|
857
|
+
as source evidence, not as loose suggestions.
|
|
858
|
+
|
|
821
859
|
### Step 4 \u2014 Use imagination only when useful
|
|
822
860
|
|
|
823
861
|
When the user asks "what else could we do here?", "what are we missing?",
|
|
@@ -857,6 +895,97 @@ with observed-gap candidates.
|
|
|
857
895
|
|
|
858
896
|
### Step 5 \u2014 Choose a bounded scope
|
|
859
897
|
|
|
898
|
+
If the user explicitly asked to execute a topic roadmap, prefer a
|
|
899
|
+
roadmap-derived scope over a generic candidate. The open roadmap rows
|
|
900
|
+
are the scope thesis.
|
|
901
|
+
|
|
902
|
+
\`\`\`ts
|
|
903
|
+
function compactRoadmapSourceId(topicId, items) {
|
|
904
|
+
const key = (items ?? [])
|
|
905
|
+
.map(item => item.id)
|
|
906
|
+
.sort()
|
|
907
|
+
.join('_')
|
|
908
|
+
.replace(/[^a-zA-Z0-9_-]/g, '')
|
|
909
|
+
.slice(0, 96) || 'open';
|
|
910
|
+
return \`roadmap_topic_v6_\${topicId}_\${key}\`;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
function analysisTypesFromRoadmap(items) {
|
|
914
|
+
const types = new Set(['supply_tactical']);
|
|
915
|
+
for (const item of items ?? []) {
|
|
916
|
+
if (item.actionType === 'new_content') types.add('demand_pull');
|
|
917
|
+
if (item.actionType === 'internal_linking') types.add('structural');
|
|
918
|
+
if (item.actionType === 'page_refresh') types.add('positioning');
|
|
919
|
+
if (item.actionType === 'measurement') types.add('conversion');
|
|
920
|
+
}
|
|
921
|
+
return [...types];
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
function roadmapScope(topicId, topicName, entityId, openItems) {
|
|
925
|
+
const analysisTypes = analysisTypesFromRoadmap(openItems);
|
|
926
|
+
return {
|
|
927
|
+
version: 1,
|
|
928
|
+
selectedAt: new Date().toISOString(),
|
|
929
|
+
selectedBy: 'agent',
|
|
930
|
+
sourceCandidateId: compactRoadmapSourceId(topicId, openItems),
|
|
931
|
+
entityId,
|
|
932
|
+
label: \`\${topicName ?? 'Topic'} roadmap execution scope\`,
|
|
933
|
+
scopeType: 'subtopic',
|
|
934
|
+
topicId,
|
|
935
|
+
subtopicIds: [],
|
|
936
|
+
pageIds: [],
|
|
937
|
+
gapIds: [],
|
|
938
|
+
answerCellIds: [],
|
|
939
|
+
decisionCandidateIds: [],
|
|
940
|
+
primaryPersonaIds: [],
|
|
941
|
+
decisionStages: [],
|
|
942
|
+
scopeThesis: [
|
|
943
|
+
\`Use the \${topicName ?? 'selected topic'} roadmap as the execution source of truth.\`,
|
|
944
|
+
...openItems.slice(0, 8).map((item, index) =>
|
|
945
|
+
[
|
|
946
|
+
\`\${index + 1}. \${item.title}\`,
|
|
947
|
+
\`Action: \${item.actionType} (\${item.priority} priority).\`,
|
|
948
|
+
item.recommendedAction ? \`Recommended move: \${item.recommendedAction}\` : null,
|
|
949
|
+
item.targetPageUrl ? \`Target page: \${item.targetPageUrl}\` : null,
|
|
950
|
+
item.queries?.length ? \`Queries/questions: \${item.queries.join('; ')}\` : null,
|
|
951
|
+
item.why ? \`Why: \${item.why}\` : null,
|
|
952
|
+
].filter(Boolean).join(' ')
|
|
953
|
+
),
|
|
954
|
+
].join('\\n'),
|
|
955
|
+
analysisTypes,
|
|
956
|
+
includedSignals: [
|
|
957
|
+
'topic_roadmap',
|
|
958
|
+
'gap_inventory',
|
|
959
|
+
'question_pool',
|
|
960
|
+
'page_summaries',
|
|
961
|
+
'serp_opportunities',
|
|
962
|
+
...analysisTypes,
|
|
963
|
+
],
|
|
964
|
+
excludedAdjacentScopes: [],
|
|
965
|
+
reasonForScope:
|
|
966
|
+
'The user requested a plan that executes the currently open roadmap gaps for this topic.',
|
|
967
|
+
expectedOutcome:
|
|
968
|
+
'Generate concrete plan items to create, refresh, consolidate, remove, link, or measure the pages called out by the open roadmap rows without cannibalizing existing topic coverage.',
|
|
969
|
+
};
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
const useRoadmapScope = topicId && openRoadmapItems.length > 0 &&
|
|
973
|
+
/roadmap|gaps|gap|new pages|new content|updates|refresh|comprehensive/i.test(userIntent ?? '');
|
|
974
|
+
|
|
975
|
+
let selected = null;
|
|
976
|
+
let preview = null;
|
|
977
|
+
if (useRoadmapScope) {
|
|
978
|
+
const scope = roadmapScope(topicId, topicName, entityId, openRoadmapItems);
|
|
979
|
+
preview = await api.post(\`/api/entities/\${entityId}/plan-scopes/preview\`, {
|
|
980
|
+
selectedBy: 'agent',
|
|
981
|
+
userIntent: q,
|
|
982
|
+
scope,
|
|
983
|
+
});
|
|
984
|
+
}
|
|
985
|
+
\`\`\`
|
|
986
|
+
|
|
987
|
+
If you are not in roadmap mode, use ranked scoped candidates:
|
|
988
|
+
|
|
860
989
|
\`\`\`ts
|
|
861
990
|
const candidates = await api.get(
|
|
862
991
|
\`/api/entities/\${entityId}/plan-scopes/candidates?q=\${encodeURIComponent(q)}&limit=8&maxItems=8\`
|
|
@@ -866,14 +995,14 @@ const candidates = await api.get(
|
|
|
866
995
|
Show the top 3 candidates with:
|
|
867
996
|
- label
|
|
868
997
|
- scope type
|
|
869
|
-
- pages, gaps, answer cells, and decision candidates included
|
|
998
|
+
- pages, gaps, answer cells, roadmap rows, and decision candidates included
|
|
870
999
|
- personas and decision stages if present
|
|
871
1000
|
- expected outcome
|
|
872
1001
|
- conflict state and warnings
|
|
873
1002
|
- why you prefer one
|
|
874
1003
|
|
|
875
1004
|
Prefer scopes that are:
|
|
876
|
-
- decision-backed
|
|
1005
|
+
- roadmap-backed or decision-backed
|
|
877
1006
|
- page-bounded or small topic-bounded
|
|
878
1007
|
- clear about persona x decision stage x question
|
|
879
1008
|
- conflict-clear
|
|
@@ -881,17 +1010,18 @@ Prefer scopes that are:
|
|
|
881
1010
|
|
|
882
1011
|
If every candidate is weak, broaden the query once. If candidates are
|
|
883
1012
|
still thin, say the source data is missing and suggest the prerequisite
|
|
884
|
-
connection, scan, or
|
|
1013
|
+
connection, scan, KB work, or roadmap generation.
|
|
885
1014
|
|
|
886
1015
|
### Step 6 \u2014 Inspect conflicts before committing
|
|
887
1016
|
|
|
888
1017
|
Never stage a scope blindly. Use preview when the user is leaning toward
|
|
889
1018
|
a candidate or asks why it is safe.
|
|
890
1019
|
|
|
891
|
-
|
|
892
|
-
bindings:
|
|
1020
|
+
For non-roadmap scopes, convert the candidate to a full scope without
|
|
1021
|
+
dropping the evidence bindings:
|
|
893
1022
|
|
|
894
1023
|
\`\`\`ts
|
|
1024
|
+
selected = candidates.candidates[0];
|
|
895
1025
|
function toScope(selected) {
|
|
896
1026
|
return {
|
|
897
1027
|
version: 1,
|
|
@@ -923,12 +1053,13 @@ function toScope(selected) {
|
|
|
923
1053
|
};
|
|
924
1054
|
}
|
|
925
1055
|
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
});
|
|
1056
|
+
if (!preview) {
|
|
1057
|
+
preview = await api.post(\`/api/entities/\${entityId}/plan-scopes/preview\`, {
|
|
1058
|
+
selectedBy: 'agent',
|
|
1059
|
+
userIntent: q,
|
|
1060
|
+
scope: toScope(selected),
|
|
1061
|
+
});
|
|
1062
|
+
}
|
|
932
1063
|
\`\`\`
|
|
933
1064
|
|
|
934
1065
|
If preview returns blocked conflicts, do not create the plan. Explain
|
|
@@ -956,9 +1087,11 @@ Create from the selected scope. Do not use legacy topic-plan or
|
|
|
956
1087
|
opportunity-basket endpoints.
|
|
957
1088
|
|
|
958
1089
|
\`\`\`ts
|
|
1090
|
+
const planLabel = selected?.label ?? preview.scope.label;
|
|
1091
|
+
const planDescription = selected?.expectedOutcome ?? preview.scope.expectedOutcome;
|
|
959
1092
|
const plan = await api.post(\`/api/entities/\${entityId}/plans/from-scope\`, {
|
|
960
|
-
name:
|
|
961
|
-
description:
|
|
1093
|
+
name: planLabel,
|
|
1094
|
+
description: planDescription,
|
|
962
1095
|
scope: preview.scope,
|
|
963
1096
|
conflictOverride:
|
|
964
1097
|
preview.conflicts.some(c => c.severity === 'warn')
|
|
@@ -975,9 +1108,11 @@ console.log(generation);
|
|
|
975
1108
|
\`\`\`
|
|
976
1109
|
|
|
977
1110
|
Generation must stay inside the selected scope. It should claim only
|
|
978
|
-
the gaps and pages in the scope, cite
|
|
979
|
-
|
|
980
|
-
|
|
1111
|
+
the gaps and pages in the scope, cite the selected evidence spine
|
|
1112
|
+
(\`topic_roadmap\` rows, scoped gaps, pages, answer cells, or
|
|
1113
|
+
\`decisionCandidateIds\`), carry conflict warnings into the audit, and
|
|
1114
|
+
return deferred or not-recommended items instead of stretching the scope
|
|
1115
|
+
to look productive.
|
|
981
1116
|
|
|
982
1117
|
After generation, read the plan and verify it stayed grounded:
|
|
983
1118
|
|
|
@@ -992,7 +1127,155 @@ console.log(detail.items.map(i => ({
|
|
|
992
1127
|
Explain what to review and which first 1-3 items are safest to move into
|
|
993
1128
|
execution.
|
|
994
1129
|
|
|
995
|
-
### Step 10 \u2014
|
|
1130
|
+
### Step 10 \u2014 Or hand-author the plan when the harness can do better
|
|
1131
|
+
|
|
1132
|
+
If the user wants a specific strategic outcome and the built-in plan
|
|
1133
|
+
generator is producing the wrong shape, the harness may directly author
|
|
1134
|
+
the plan into HG. This is allowed. Do it only after reading enough HG
|
|
1135
|
+
context to make the plan useful: diagnostic narrative, topic/pillar ids,
|
|
1136
|
+
topic roadmap rows, decision candidates, gaps, page signals,
|
|
1137
|
+
strategy/KB facts, and user constraints from the conversation.
|
|
1138
|
+
|
|
1139
|
+
Use this path when the outcome is "get the right plan artifact into HG"
|
|
1140
|
+
rather than "let HG generate whatever it thinks is next." The import
|
|
1141
|
+
creates a staging plan with provenance; it does not dispatch work.
|
|
1142
|
+
|
|
1143
|
+
\`\`\`ts
|
|
1144
|
+
const imported = await api.post(\`/api/entities/\${entityId}/plans/import\`, {
|
|
1145
|
+
source: 'codex-harness',
|
|
1146
|
+
name: 'Decision-stage proof sprint',
|
|
1147
|
+
description: 'Tighten evaluation pages around buyer objections and proof gaps.',
|
|
1148
|
+
narrative: [
|
|
1149
|
+
'The strategic bet is...',
|
|
1150
|
+
'The evidence says...',
|
|
1151
|
+
'The execution risk is...',
|
|
1152
|
+
'The expected outcome is...',
|
|
1153
|
+
].join('
|
|
1154
|
+
|
|
1155
|
+
'),
|
|
1156
|
+
kind: 'scoped_plan',
|
|
1157
|
+
topicId,
|
|
1158
|
+
mode: 'grow',
|
|
1159
|
+
contextManifest: {
|
|
1160
|
+
diagnosticId,
|
|
1161
|
+
topicId,
|
|
1162
|
+
roadmapItemIds: openRoadmapItems.map(item => item.id),
|
|
1163
|
+
decisionCandidateIds: selected?.decisionCandidateIds ?? [],
|
|
1164
|
+
gapIds: selected?.gapIds ?? [],
|
|
1165
|
+
pageIds: selected?.pageIds ?? [],
|
|
1166
|
+
},
|
|
1167
|
+
inputSnapshot: {
|
|
1168
|
+
userIntent: q,
|
|
1169
|
+
selectedScope: selected ?? null,
|
|
1170
|
+
preview: preview ?? null,
|
|
1171
|
+
openRoadmapItems,
|
|
1172
|
+
topDecisionCandidates: decisions.candidates.slice(0, 10),
|
|
1173
|
+
},
|
|
1174
|
+
items: [
|
|
1175
|
+
{
|
|
1176
|
+
type: 'manual',
|
|
1177
|
+
kind: 'page_overhaul',
|
|
1178
|
+
title: 'Rewrite the comparison proof section',
|
|
1179
|
+
description: 'Make the evaluation page answer the buyer objection directly.',
|
|
1180
|
+
rationale: 'Grounded in the decision-stage answer gap and weak proof coverage.',
|
|
1181
|
+
pillarId: topicId,
|
|
1182
|
+
pillarName: topicName,
|
|
1183
|
+
targetPageUrl: 'https://example.com/product/comparison',
|
|
1184
|
+
sequence: 1,
|
|
1185
|
+
addressesLenses: ['conversion', 'supply'],
|
|
1186
|
+
brief: {
|
|
1187
|
+
objective: 'Win evaluation-stage trust for the selected persona.',
|
|
1188
|
+
acceptance: [
|
|
1189
|
+
'Lead with a direct answer in the first 100 words',
|
|
1190
|
+
'Add proof points tied to the named persona',
|
|
1191
|
+
],
|
|
1192
|
+
evidence: {
|
|
1193
|
+
roadmapItemIds: openRoadmapItems.map(item => item.id),
|
|
1194
|
+
decisionCandidateIds: selected?.decisionCandidateIds ?? [],
|
|
1195
|
+
gapIds: selected?.gapIds ?? [],
|
|
1196
|
+
},
|
|
1197
|
+
},
|
|
1198
|
+
},
|
|
1199
|
+
],
|
|
1200
|
+
});
|
|
1201
|
+
|
|
1202
|
+
console.log(imported.plan.id, imported.itemIds);
|
|
1203
|
+
\`\`\`
|
|
1204
|
+
|
|
1205
|
+
If the user has delegated the strategy call and the imported plan is
|
|
1206
|
+
ready for the team to use, inspect it and accept it:
|
|
1207
|
+
|
|
1208
|
+
\`\`\`ts
|
|
1209
|
+
const accepted = await api.post(\`/api/plans/\${imported.plan.id}/accept\`, {});
|
|
1210
|
+
|
|
1211
|
+
console.log(accepted.plan.id, accepted.plan.status);
|
|
1212
|
+
\`\`\`
|
|
1213
|
+
|
|
1214
|
+
Accepting promotes the plan artifact to \`active\`. It still does not
|
|
1215
|
+
dispatch work orders; item execution remains on the normal review/status
|
|
1216
|
+
path.
|
|
1217
|
+
|
|
1218
|
+
Use follow-up authoring endpoints when the user wants refinement:
|
|
1219
|
+
|
|
1220
|
+
\`\`\`ts
|
|
1221
|
+
await api.patch(\`/api/plans/\${planId}/authoring\`, {
|
|
1222
|
+
narrative: revisedNarrative,
|
|
1223
|
+
mode: 'defend',
|
|
1224
|
+
});
|
|
1225
|
+
|
|
1226
|
+
await api.patch(\`/api/plans/\${planId}/items/\${itemId}/authoring\`, {
|
|
1227
|
+
title: revisedTitle,
|
|
1228
|
+
rationale: revisedRationale,
|
|
1229
|
+
addressesLenses: ['conversion'],
|
|
1230
|
+
});
|
|
1231
|
+
|
|
1232
|
+
await api.put(\`/api/plans/\${planId}/items/\${itemId}/brief\`, {
|
|
1233
|
+
brief: revisedBrief,
|
|
1234
|
+
});
|
|
1235
|
+
\`\`\`
|
|
1236
|
+
|
|
1237
|
+
Important boundaries:
|
|
1238
|
+
- Direct-authored plans are imported as \`staging\`. Accept them only when
|
|
1239
|
+
the user has delegated that decision or after the user reviews the
|
|
1240
|
+
artifact.
|
|
1241
|
+
- Only edit/delete authored items while they are \`todo\` or \`review\`.
|
|
1242
|
+
Once an item is in progress, treat it as execution state.
|
|
1243
|
+
- Do not bypass conflict thinking. If you skipped scoped generation
|
|
1244
|
+
because the harness authored the strategy, still read existing plans
|
|
1245
|
+
and explain overlap risks.
|
|
1246
|
+
- Do not create work orders directly from the authored plan. Work orders
|
|
1247
|
+
are projected by HG when plan items move through the normal approval path.
|
|
1248
|
+
|
|
1249
|
+
### Step 11 \u2014 Generate content briefs when the plan item is ready
|
|
1250
|
+
|
|
1251
|
+
For roadmap new-page rows or plan items that need a writer-ready brief,
|
|
1252
|
+
use the brief generator only when you can resolve a source question id
|
|
1253
|
+
from the roadmap row or its covered opportunity keys. Let the user add a
|
|
1254
|
+
thesis, proof point, competitor angle, product workflow, related product,
|
|
1255
|
+
use case, benefit, or unique take as \`guidance\`.
|
|
1256
|
+
|
|
1257
|
+
\`\`\`ts
|
|
1258
|
+
const brief = await api.post(
|
|
1259
|
+
\`/api/diagnostics/\${diagnosticId}/questions/\${questionId}/generate-brief\`,
|
|
1260
|
+
{
|
|
1261
|
+
targetPlanItemId: planItemId ?? null,
|
|
1262
|
+
guidance: userBriefGuidance ?? null,
|
|
1263
|
+
previousFailure: previousBriefFailure ?? null,
|
|
1264
|
+
}
|
|
1265
|
+
);
|
|
1266
|
+
console.log(brief);
|
|
1267
|
+
\`\`\`
|
|
1268
|
+
|
|
1269
|
+
A useful brief should cover focus keyword, secondary keywords, target
|
|
1270
|
+
questions, competitor/SERP and AEO shape, related products, use cases,
|
|
1271
|
+
benefits to include, the company's unique angle or thesis, outline, and
|
|
1272
|
+
key facts/proof the writer can cite.
|
|
1273
|
+
|
|
1274
|
+
If the generator asks for missing inputs, do not invent them. Surface the
|
|
1275
|
+
open questions to the user and use the brief chat/context flow to fill
|
|
1276
|
+
only those blanks. Then regenerate with the user's guidance.
|
|
1277
|
+
|
|
1278
|
+
### Step 12 \u2014 Set expectations
|
|
996
1279
|
|
|
997
1280
|
End with reality:
|
|
998
1281
|
|
|
@@ -1004,7 +1287,11 @@ End with reality:
|
|
|
1004
1287
|
|
|
1005
1288
|
- **One bounded scope per plan.** Always.
|
|
1006
1289
|
- **Decision candidates are the execution menu.** If a plan ignores them,
|
|
1007
|
-
stop and investigate
|
|
1290
|
+
stop and investigate, unless this is a roadmap-derived scope whose
|
|
1291
|
+
execution menu is the open roadmap rows.
|
|
1292
|
+
- **Topic roadmap rows are execution evidence.** Use them directly for
|
|
1293
|
+
topic-gap, new-page, page-refresh, consolidation, internal-link, and
|
|
1294
|
+
measurement planning.
|
|
1008
1295
|
- **Imagination is hypothesis generation.** Promote it before planning;
|
|
1009
1296
|
never execute it directly.
|
|
1010
1297
|
- **Prefer conflict-clear scopes.** Warning scopes require explicit user acceptance.
|
|
@@ -1019,13 +1306,18 @@ End with reality:
|
|
|
1019
1306
|
## What success looks like
|
|
1020
1307
|
|
|
1021
1308
|
- Source signal checked
|
|
1309
|
+
- Topic roadmap checked when the user asks about topic gaps, new pages,
|
|
1310
|
+
updates, or comprehensiveness
|
|
1022
1311
|
- Decision candidates refreshed
|
|
1023
1312
|
- Imagination candidates reviewed when useful
|
|
1024
1313
|
- One bounded scope picked
|
|
1025
1314
|
- Conflicts reviewed
|
|
1026
1315
|
- One scoped plan created
|
|
1027
|
-
- Scoped generation run
|
|
1028
|
-
|
|
1316
|
+
- Scoped generation run, or a hand-authored staging plan imported when
|
|
1317
|
+
the harness can produce the better strategic shape
|
|
1318
|
+
- Generated or authored items cite the selected evidence spine
|
|
1319
|
+
- Content briefs generated only from resolvable roadmap/plan-item source
|
|
1320
|
+
questions, with user guidance captured when needed
|
|
1029
1321
|
- First execution items are obvious
|
|
1030
1322
|
- User knows when to come back: 14 days for outcomes, sooner for approvals
|
|
1031
1323
|
|
|
@@ -1037,10 +1329,22 @@ End with reality:
|
|
|
1037
1329
|
or \`POST /api/plans/:id/generate-topic\`.
|
|
1038
1330
|
- Don't sort opportunities by score and list the top 10. That's not strategy.
|
|
1039
1331
|
- Don't let URLs alone classify scope. Use the evidence Higrowth gathered.
|
|
1332
|
+
- Don't ignore open topic roadmap rows when the user asks for topic gaps,
|
|
1333
|
+
comprehensiveness, new pages, or content updates.
|
|
1040
1334
|
- Don't drop \`answerCellIds\`, \`decisionCandidateIds\`, \`primaryPersonaIds\`,
|
|
1041
1335
|
\`decisionStages\`, or \`scopeThesis\` when previewing or creating a scope.
|
|
1336
|
+
For roadmap scopes, preserve the roadmap rows in \`scopeThesis\` and
|
|
1337
|
+
include \`topic_roadmap\` in \`includedSignals\`.
|
|
1042
1338
|
- Don't create a plan that overlaps blocked active work.
|
|
1043
1339
|
- Don't create work orders from imagination candidates.
|
|
1340
|
+
- Don't use the authored-plan API as a shortcut around evidence. It is
|
|
1341
|
+
for writing a better plan artifact into HG after reading HG context,
|
|
1342
|
+
not for making up work.
|
|
1343
|
+
- Don't edit in-progress/published/verified plan items through authoring
|
|
1344
|
+
endpoints. Those are execution state.
|
|
1345
|
+
- Don't hand-write content briefs when the brief generator has a source
|
|
1346
|
+
question. Generate, inspect open questions, collect guidance, then
|
|
1347
|
+
regenerate.
|
|
1044
1348
|
- Don't run a new scan by default. Check answer map, decision candidates,
|
|
1045
1349
|
GSC, GA, and KB first; scan only when source signal is missing or stale.
|
|
1046
1350
|
- Don't gloss over the KB. If the KB is empty, stop and run the
|
|
@@ -1228,7 +1532,7 @@ var SKILLS = [
|
|
|
1228
1532
|
{
|
|
1229
1533
|
slug: "higrowth-marketing-strategy",
|
|
1230
1534
|
title: "Marketing strategy chat",
|
|
1231
|
-
description: "Walk a diagnostic, pick a
|
|
1535
|
+
description: "Walk a diagnostic, pick a scoped topic or roadmap, generate or hand-author the staging plan.",
|
|
1232
1536
|
body: MARKETING_STRATEGY
|
|
1233
1537
|
},
|
|
1234
1538
|
{
|
|
@@ -1473,7 +1777,7 @@ function beginUpdateCheck(currentVersion) {
|
|
|
1473
1777
|
// package.json
|
|
1474
1778
|
var package_default = {
|
|
1475
1779
|
name: "@higrowth/cli",
|
|
1476
|
-
version: "0.3.
|
|
1780
|
+
version: "0.3.5",
|
|
1477
1781
|
description: "Higrowth CLI \u2014 log in via browser, install Claude Code / Codex skills, manage the MCP connection.",
|
|
1478
1782
|
type: "module",
|
|
1479
1783
|
license: "Apache-2.0",
|