[Fixes #27] Added roadmap

Signed-off-by: Julien Eluard <julien.eluard@gmail.com>
This commit is contained in:
Julien Eluard 2018-07-17 09:50:21 +02:00
parent e2a8de8e76
commit fdd0cfa813
No known key found for this signature in database
GPG Key ID: 6FD7DB5437FCBEF6
12 changed files with 105 additions and 72 deletions

View File

@ -14,7 +14,7 @@ Run figwheel using `clojure -A:figwheel`.
Documentation website is maintained using [docusaurus](https://docusaurus.io). The layout logic can be found in `website` while the content is kept in `docs`. Documentation website is maintained using [docusaurus](https://docusaurus.io). The layout logic can be found in `website` while the content is kept in `docs`.
To hack on the documentation, run `npm run start`. To hack on the documentation, run `npm run start` in `website` folder.
### IPFS ### IPFS

56
docs/Roadmap.md Normal file
View File

@ -0,0 +1,56 @@
Extensions development is currently in progress
## Done
### Pre-MVP
Validate technical feasibility.
* general mechanism (UI, conditionals, queries, events)
* HTML based
* stored in ipfs (via gateway)
* no concept of hooks
* no custom code
* extension are activated when loaded and cannot be deactivated
### MVP
Pre-MVP integrated in Status.
## In progress
### Iteration 1
Migrate old commands to extensions.
* implement hooks and proposed extension points _DONE_
* registry and hooks API _DONE_
* define extensions points for status _DONE_
* implement i18n [#10](https://github.com/status-im/pluto/issues/10)
* query and events API (data can be passed around) [#9](https://github.com/status-im/pluto/issues/9) and [#8](https://github.com/status-im/pluto/issues/8)
* implement destructuring [#28](https://github.com/status-im/pluto/issues/28)
* isolated data per extension [#29](https://github.com/status-im/pluto/issues/29)
## Next
### Iteration 2
Add custom code support.
* implement security mechanism / permissions
* remote code loading
* JavaScript API
### Iteration 3
Persistent extensions.
* implement data persistence
* add extension registry UI
### Iteration 4
Support dependencies.
* add versioning support
* extensions can depend on others extensions

18
docs/concepts/Anatomy.md Normal file
View File

@ -0,0 +1,18 @@
---
sidebar_label: Anatomy
---
A host defines a number of [hooks](Hook) in various parts of the app. Those hooks are contracts that 3rd party devs can
use to extend a host with their own logic / UI.
e.g. custom chat commands, custom chat actions, custom collectible displays.
An `extension` is provided by 3rd party developers and provides one or multiple hooks implementation.
To implement a hook, a 3rd party devs has access to some APIs:
* `view` to create native UI (e.g. text, list)
* `query` to access host data (e.g contacts, whisper key)
* `event` to modify host state (e.g. create a contact, scan a QR code, send a chat message)
Extensions are stored in IPFS or SWARM. They can be identified using ENS names.
A user can discover extensions and decide to install them. Once installed associated hooks become active and modify the host.

View File

@ -1,10 +1,11 @@
--- ---
title: Hook
sidebar_label: Hook sidebar_label: Hook
--- ---
Hook is the mechanism allowing a specific extensions host to define what (and how) can be extended. Hook is the mechanism allowing a specific extensions host to define what (and how) can be extended.
Hooks are defined as part of capacities by maps detailing properties and their associated type. They leverage [references](/reference) to use various extensions elements. Hooks are defined as part of capacities by maps detailing properties and their associated type. They leverage [references](Reference) to use various extensions elements.
```clojure ```clojure
{:capacities {hooks/main {:properties [{:name :view :type :view} {:name :name :type :string}]}}} {:capacities {hooks/main {:properties [{:name :view :type :view} {:name :name :type :string}]}}}

View File

@ -1,54 +0,0 @@
<html>
<head>
<style>
main {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%
}
#selection {
padding: 10px;
}
#extension {
border: 40px solid #ddd;
border-width: 55px 7px;
border-radius: 40px;
margin: 50px auto;
width: 30vh;
height: 50vh;
overflow: hidden;
}
#extension iframe {
border: 0;
height: 100%;
width: 100%
}
</style>
</head>
<body>
<script>
function load(urn) {
pluto.demo.load_and_render(urn, document.getElementById("frame").contentWindow.document.body.firstChild, document.getElementById("errors"));
}
</script>
<main>
<div id="selection">
Load demo extension from
<button disabled onclick="load('ipfs:QmSKP6f2uUsFq4mk1Afe4ZktxwQifrLb4xRQYNE1LxidKz')">IPFS</button>
<button onclick="load('url:assets/extensions/demo')">HTTP</button>
</div>
<div id="extension">
<iframe id="frame" srcdoc="<body><main></main></body>"></iframe>
</div>
<div id="errors"></div>
<video id="preview"></video>
</main>
</body>
</html>
<script src="assets/pluto.js"></script>

View File

@ -4,23 +4,36 @@
"next": "Next", "next": "Next",
"previous": "Previous", "previous": "Previous",
"tagline": "A website for testing", "tagline": "A website for testing",
"Development": "Development", "concepts/Anatomy": "concepts/Anatomy",
"Examples": "Examples", "Anatomy": "Anatomy",
"format/Reference": "format/Reference", "concepts/Hook": "concepts/Hook",
"Hook": "Hook",
"concepts/Reference": "concepts/Reference",
"Reference": "Reference", "Reference": "Reference",
"format/Type": "format/Type", "concepts/Registry": "concepts/Registry",
"format/View": "format/View", "Registry": "Registry",
"Manifesto": "Manifesto", "concepts/Type": "concepts/Type",
"Tutorial": "Tutorial", "concepts/View": "concepts/View",
"Docs": "Docs",
"Try": "Try",
"Concepts": "Concepts",
"Format": "Format",
"Contributing": "Contributing", "Contributing": "Contributing",
"decisions/0001-record-decisions": "decisions/0001-record-decisions", "decisions/0001-record-decisions": "decisions/0001-record-decisions",
"decisions/0002-reader-errors": "decisions/0002-reader-errors", "decisions/0002-reader-errors": "decisions/0002-reader-errors",
"decisions/README": "decisions/README", "decisions/README": "decisions/README",
"decisions/templates/template": "decisions/templates/template", "decisions/templates/template": "decisions/templates/template",
"Development": "Development",
"Examples": "Examples",
"Manifesto": "Manifesto",
"Roadmap": "Roadmap",
"Tutorial": "Tutorial",
"Docs": "Docs",
"Try": "Try",
"Concepts": "Concepts",
"Pluto": "Pluto",
"format/Hook": "format/Hook",
"format/Reference": "format/Reference",
"format/Registry": "format/Registry",
"format/Type": "format/Type",
"format/View": "format/View",
"Format": "Format",
"Getting Started": "Getting Started", "Getting Started": "Getting Started",
"Help": "Help", "Help": "Help",
"Why": "Why", "Why": "Why",

View File

@ -79,8 +79,8 @@ class HomeSplash extends React.Component {
<div className="inner"> <div className="inner">
<ProjectTitle /> <ProjectTitle />
<PromoSection> <PromoSection>
<Button href={docUrl('Tutorial', language)}>Getting started</Button> <Button href={docUrl('Manifesto', language)}>Getting started</Button>
<Button href={docUrl('Try', language)}>Try It Out</Button> <Button href={docUrl('Roadmap', language)}>Roadmap</Button>
</PromoSection> </PromoSection>
</div> </div>
</SplashContainer> </SplashContainer>

View File

@ -1,8 +1,7 @@
{ {
"docs": { "docs": {
"Concepts": ["Manifesto"], "Concepts": ["Manifesto", "concepts/Anatomy", "concepts/Hook", "concepts/Registry"],
"Format": ["format/Reference"],
"Examples": ["Examples"], "Examples": ["Examples"],
"Contributing": ["Development"] "Contributing": ["Development", "Roadmap"]
} }
} }